Я пытаюсь интегрировать некоторые сценарии bash в админку сайта.
Я запускаю apache на сервере Ubuntu. Предоставление прав sudo для apache (www-data) далеко от идеала, поэтому я не собираюсь. Однако можно указать доступ sudo для пользователей, отличных от sudo.
По ряду причин безопасности apache не должен иметь никакого доступа к sudo или, в худшем случае, иметь строго ограниченный доступ к sudo ... Таким образом, подходящим решением будет указать конкретные сценарии, которые www-data могут sudo.
Чтобы контролировать это, я создал и отредактировал etc/sudoers.tmp
с помощью visudo
.
Я добавил тестовый сценарий в var/www/html/scripts
называется sudoscripts.sh
.
Это просто:
#!/bin/sh
sudo whoami
Итак, в качестве теста я добавил строку:
www-data ALL=(ALL) NOPASSWD: ALL
Это работает, как ожидалось. Однако это дает доступ ко всем скриптам в любом месте.
Затем я заменил это на:
www-data ALL=(ALL) NOPASSWD: /var/www/html/scripts/sudoscript.sh
Это не дает ошибки (в пределах моего исключения приложения):
sudo: no tty present and no askpass program specified
... то есть: нет доступа к sudo.
Может ли кто-нибудь указать на то, что я сделал не так? Я просмотрел несколько примеров / других потоков переполнения стека, и они либо плохо совпадают, либо остаются без ответа.
Вот полный файл:
Defaults env_reset
Defaults exempt_group=sudo
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL) NOPASSWD:ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
# Apache using /var/www/html/scripts
# (doesnt work)
www-data ALL=(ALL) NOPASSWD: /var/www/html/scripts/sudoscript.sh
# (works)
# www-data ALL=(ALL) NOPASSWD: ALL
Спасибо
Проблема в том, что вы не выполняете команду, введенную в файл sudoers с помощью sudo.
Ты бежишь /var/www/html/scripts/sudoscript.sh
прямо с вашего веб-сервера. Затем сценарий вызывает sudo с whoami
, но whoami
не допускается в вашем файле sudoers. Вам нужно будет установить whoami
в sudoers вместо местоположения скрипта.
Конечно, в этом нет особого смысла.
Что имело бы больше смысла:
/var/www/html/scripts/sudoscript.sh
#!/bin/sh
whoami
/ и т.д. / sudoers
www-data ALL=(ALL) NOPASSWD: /var/www/html/scripts/sudoscript.sh
А затем запустите сценарий с помощью sudo со своего веб-сервера:
sudo /var/www/html/scripts/sudoscript.sh
закомментируйте requiretty в visudo или поставьте! перед ним вроде:
По умолчанию! Requiretty