У меня есть сценарий веб-перехватчика, написанный на Python на моем сервере Debian / Apache2.4, так что он запускает сценарий развертывания .sh при нажатии на GitHub. Итак, скрипт выполняется стандартным пользователем Apache "www-data". Моему сценарию необходимо перезапустить или перезагрузить Apache, но в выходных данных указано, что у пользователя нет разрешения на это: Reloading apache2 configuration (via systemctl): apache2.serviceFailed to reload apache2.service: Access denied
. Такое же поведение при выполнении вручную как www-data (sudo -u www-data /etc/init.d/apache2 reload
).
Итак, я попытался сделать www-data разрешениями на перезагрузку или перезапуск Apache, добавив следующую строку в свой visudo: www-data ALL = NOPASSWD: /etc/init.d/apache2
(в соответствии с этот документ).
Но это ничего не меняет. Зачем? Это потому, что Apache не может перезагрузиться? Как я могу изменить разрешения для этого? Или мне нужно, чтобы скрипт выполнял другой пользователь, и как?
Поскольку httpd привязывается к портам 80 и 443, которые зарезервированы, вам нужны привилегии root для их перезапуска. Это означает, что пользователь www-data
не имеет для этого достаточных прав.
Итак, что вам нужно сделать, это разрешить пользователю www-data
чтобы запустить эту команду как root. Вы делаете это, добавляя эту строку в конфигурацию sudo (или в отдельный файл в /etc/sudoers.d
, если ваша система это использует):
www-data ALL = (root) NOPASSWD: /etc/init.d/apache2 reload
Ваш www-data
Теперь пользователь сможет запускать эту единственную команду как root. Вам нужно будет отредактировать свой скрипт, чтобы он содержал
sudo /etc/init.d/apache2 reload
вместо просто
/etc/init.d/apache2 reload.
Возможно, ваша система настроена на использование tty при использовании sudo. Часто это делается специально для предотвращения сценариев, использующих sudo, поскольку это вектор атаки. Если это так, ваш файл sudoers должен быть немного более сложным:
Cmnd_Alias APACHERELOAD = /etc/init.d/apache2 reload
Defaults!APACHERELOAD !requiretty
www-data ALL = (root) NOPASSWD: APACHERELOAD
Это означает, что только команда /etc/init.d/apache2 reload
может быть запущен без необходимости в tty.