Моя ситуация такова: я пытаюсь дать пользователю www-данных возможность sudo-выполнять некоторые сценарии оболочки, чтобы на моем веб-сервере была страница, отображающая системную информацию (в PHP с использованием shell_exec () ). С этой целью я отредактировал файл sudoers со следующей строкой
www-data ALL=(ALL:ALL) NOPASSWD: /home/evermind/scripts/*
, чтобы дать Apache возможность запускать сценарии в этом каталоге без необходимости ввода пароля для suoo. К сожалению, это не работает, а также (как проверка работоспособности) не определяет специфический скрипт в этом каталоге. shell_exec не может выполнить команду и выдает следующую ошибку:
sudo: отсутствует tty и не указана программа askpass
Здесь все становится ... странно. Если я заменю спецификацию пути на «ВСЕ», то все работает отлично. Почему это? Есть ли причина, по которой я не могу указать NOPASSWD для отдельных файлов или каталогов?
Из соображений безопасности я крайне сомневаюсь, чтобы разрешить без www-данных свободно управлять всем, даже если веб-приложение чрезвычайно безопасно и существует. неочевидный способ, которым кто-либо может выполнять произвольные команды.
Как насчет того, чтобы добавить просто использование пути к каталогу без подстановочного знака?
www-data ALL=(ALL:ALL) NOPASSWD: /home/evermind/scripts/
Согласно страница справочника sudoers :
A Cmnd_List is a list of one or more
commandnames, directories, and
other aliases. ... A directory is a fully
qualified path name ending in a '/'.
When you specify a directory in a
Cmnd_List, the user will be able to
run any file within that directory (but
not in any subdirectories therein).
Хорошо, после продвижения далеко от проблемы в течение дня и возвращения к нему, я, кажется, более или менее решил свою собственную проблему.
Ранее, терминальная команда я выполнялся через shell_exec (), был
sudo sh <path to my script>
Сегодня, более или менее ради просто попытки что-то , я chmod'd мой сценарий для создания этого исполняемым файлом непосредственно. Затем я изменил shell_exec () строка, чтобы быть
sudo <path to my script>
И voilГ, это начало работать. Логика, казалось бы, предположила бы, что преступник был на самом деле sh служебным объявлением, так как это было ключевым различием в командах. Если кто-либо будет знать то, чем соглашение с этим было, тем не менее, то мне действительно будет интересно знать.
Идеально, если Вы настраиваете, какие команды могут быть выполнены через sudo
, необходимо вносить эти изменения в отдельном файле под /etc/sudoers.d/
вместо того, чтобы редактировать sudoers
файл непосредственно. Необходимо также всегда использовать visudo
для редактирования файла (файлов). Вы никогда не должны предоставлять NOPASSWD
на ALL
команды.
Пример: sudo visudo -f /etc/sudoers.d/myWebScript
Вставляют Ваш разрешения предоставления строки: www-data ALL= NOPASSWD: /home/evermind/scripts/
способ, которым Вы называли его, если бы Вы хотели ограничить, конкретно к каталогу для sh
, Вы использовали бы: www-data ALL= NOPASSWD: /bin/sh /home/evermind/scripts/
я не уверен, почему эти сценарии потребовали бы sudo
доступ, обычно Вы могли всего chmod o+x scriptname.sh
и удостоверяться, что они были в каталоге, принадлежавшем www-data
пользователь.
Затем сохраняют и выходят, и visudo
предупредит Вас, если у Вас будут какие-либо синтаксические ошибки.
можно работать sudo -l
для наблюдения полномочий, которые предоставили пользователя, если какой-либо пользователь, конкретный NOPASSWD
, команды появятся то ПЕРЕД любым %groupyouarein ALL=(ALL) ALL
команда в выводе Вам предложат Ваш пароль.
при нахождении большого количества этих sudoers.d файлов затем, возможно, Вы захотите создать их названный на пользователя, таким образом, их будет легче визуализировать. Следует иметь в виду, что упорядочивание ИМЕН ФАЙЛОВ и ПРАВИЛ в файле очень важно, ПОСЛЕДНИЙ загрузил победы, является ли это БОЛЕЕ ИЛИ МЕНЕЕ разрешающим, чем предыдущие записи.
можно управлять упорядочиванием имени файла при помощи префикса 00-99 или aa/bb/cc, хотя также имеют в виду, что, если у Вас есть КАКИЕ-ЛИБО файлы, которые не имеют числового префикса, они загрузятся после пронумерованных файлов, переопределяя настройки. Это вызвано тем, что в зависимости от Ваших настроек языка "лексическая сортировка" оболочки использует числа видов сначала и затем может чередоваться верхний и строчный при сортировке в "возрастающем" порядке.
Попытка, работающая printf '%s\n' {{0..99},{A-Z},{a-z}} | sort
и printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort
, чтобы видеть, печатает ли Ваш текущий язык AaBbCc
и т.д. или ABC
затем abc
для определения, что лучший "последний" префикс буквы, который будет использовать, был бы.