Что я пытаюсь сделать:
Разрешить пользователю веб-сервера (http) запускать явную команду iptables или (предпочтительно) скрипт, который проверяет ввод на синтаксисперед передачей его в iptables без необходимости ввода пароля.
Проблема:
Несмотря на все мои поиски рассматриваемой проблемы, никаких изменений в visudo нет,Конфигурации sudoers.d или php меняют то, что я пытаюсь сделать.
Соответствующие условия моего сервера:
[weasel@darwyn ~]$ uname -a
Linux darwyn 5.3.7-arch1-1-ARCH #1 SMP PREEMPT Fri Oct 18 00:17:03 UTC 2019 x86_64 GNU/Linux
nginx version: nginx/1.16.1
PHP 7.3.10 (cli) (built: Sep 26 2019 13:40:03) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies
Username: http
UID: 33
Gecos field:
Home directory: /srv/http
Shell: /usr/bin/nologin
No login: yes
Primary group: http
GID: 33
Hushed: no
Running processes: 3
Last logs:
09:29 sudo[648]: pam_unix(sudo:auth): auth could not identify password for [http]
09:29 sudo[649]: pam_unix(sudo:account): account http has expired (account expired)
09:29 sudo[650]: pam_unix(sudo:account): account http has expired (account expired)
Шаги, предпринятые для устранения проблемы:
- Я включил отладку в PHP-FPM.
/ var / log / php-fpm.log сообщает, что звонки инициируются, но ожидается пароль:
"sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper"
- Я внес изменения в visudo.
Из похожих вопросов я узнал, что файл sudoers отдает приоритет последней конфигурации, связанной с пользователем. Поэтому, где у меня впервые было
root ALL=(ALL) ALL
weasel ALL=(ALL) ALL
http ALL=(ALL) NOPASSWD: /usr/local/bin/blacklist_ip, /usr/bin/iptables
, я переместил запись вниз до
root ALL=(ALL) ALL
weasel ALL=(ALL) ALL
## Uncomment to allow members of group wheel to execute any command
# %wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
## Uncomment to allow members of group sudo to execute any command
# %sudo ALL=(ALL) ALL
## Uncomment to allow any user to run sudo if they know the password
## of the user they are running the command as (root by default).
# Defaults targetpw # Ask for the password of the target user
# ALL ALL=(ALL) ALL # WARNING: only use this together with 'Defaults targetpw'
##
## Relocated user http permissions for testing
##
http ALL=(ALL) NOPASSWD: /usr/local/bin/blacklist_ip, /usr/bin/iptables
## Read drop-in files from /etc/sudoers.d
## (the '#' here does not indicate a comment)
#includedir /etc/sudoers.d
- Я внес изменения в /etc/sudoers.d/90-MyOverrides.
Я удалил запись http в visudo и переместил ее в /etc/sudoers.d/90-MyOverrides.
- Я пробовал варианты правил sudoers.
http ALL=(ALL) NOPASSWD: /usr/local/bin/blacklist_ip, /usr/bin/iptables
http ALL=NOPASSWD: /usr/local/bin/blacklist_ip, /usr/bin/iptables
http ALL=(http:http) NOPASSWD: /usr/local/bin/blacklist_ip, /usr/bin/iptables
http ALL=(ALL) NOPASSWD: /usr/local/bin/blacklist_ip *, /usr/bin/iptables *
http ALL=NOPASSWD: /usr/local/bin/blacklist_ip *, /usr/bin/iptables *
http ALL=(http:http) NOPASSWD: /usr/local/bin/blacklist_ip *, /usr/bin/iptables *
http ALL=(ALL) NOPASSWD: /usr/bin/iptables -L
http ALL=NOPASSWD: /usr/bin/iptables -L
http ALL=(http:http) NOPASSWD: /usr/bin/iptables -L
Чтобы убедиться, что это дает какой-то эффект, я протестировал его самостоятельноuser
weasel ALL=(ALL) NOPASSWD: /usr/bin/iptables
Мне удалось выполнить команды iptables без пароля в качестве пользовательской ласки, но для журнала php-fpm по-прежнему требовался пароль для пользователя http. Я также попытался выполнить команду, используя 'sudo -S', в надежде, что будет работать нулевое значение для пароля, однако он также выдает ошибку.
"[sudo] password for http: "
"sudo: no password was provided"
- У меня естьдважды проверил доступ к функциям exec / shell_exec в конфигурациях php.
Я проверил как /etc/php/php.ini, так и / etc / php / php-fpm.conf, чтобы убедиться, что команды exec / shell_exec не были отключены и безопасный режим не был активен. Полученная отладочная информация в /var/log/php-fpm.log уже доказывает это, но я хотел быть внимательным.
- Я временно прервал сценарий для пользователя http.
Это было немного избыточно, но просто чтобы исключить возможность того, что это имело значение.
- У меня естьпробовал варианты вызовов exec / shell_exec.
exec("sudo blacklist_ip 185.189.12.135");
shell_exec("sudo blacklist_ip 185.189.12.135");
return:
"sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper"
exec("blacklist_ip 185.189.12.135");
shell_exec("blacklist_ip 185.189.12.135");
exec("/usr/bin/iptables -A INPUT -s 185.189.12.135 -j DROP");
shell_exec("/usr/bin/iptables -A INPUT -s 185.189.12.135 -j DROP");
return:
"Fatal: can't open lock file /run/xtables.lock: Permission denied"
exec("sudo /usr/bin/iptables -A INPUT -s 185.189.12.135 -j DROP");
shell_exec("sudo /usr/bin/iptables -A INPUT -s 185.189.12.135 -j DROP");
return:
"sudo: Account expired or PAM config lacks an "account" section for sudo, contact your system administrator"
- Я заметил ошибку конфигурации PAM.
И с небольшим поиском обнаружил, что согласно https://www.sudo.ws/troubleshooting.html:
В) Судо говорит: «Учетная запись истекла или в конфигурации PAM отсутствует раздел« Учетная запись »для sudo, обратитесь к системному администратору» и завершите работу. но я знаю, что срок действия моей учетной записи не истек.
A) В вашей конфигурации PAM отсутствует спецификация «учетной записи». В Linux это обычно означает, что вам не хватает строки вроде:
требуется учетная запись pam_unix.so
в /etc/pam.d/sudo.
Никто никогда не упоминал об этом как о причинев любых других вопросах и ответах, связанных с этой темой. Тем не менее, ради тщательности Я просмотрел информацию о PAM и sudo :
#%PAM-1.0
auth include system-auth
account required pam_unix.so
#account include system-auth
session include system-auth
Ничего не изменилось.
У меня нет идей. Мне нужна дополнительная информация о соответствующем модуле PAM, что делает пользователя http доступным для PAM, или мне нужно некоторое перенаправление для дальнейшей оценки.
EDIT Обновлено для упрощения информации для краткости.
РЕДАКТИРОВАТЬ Добавлено содержимое /etc/php/php-fpm.d/www.conf
[www]
user = http
group = http
listen = /run/php-fpm/php-fpm.sock
listen.owner = http
listen.group = http
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
access.log = /var/log/php/$pool.access.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
catch_workers_output = yes
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/php/fpm-php.www.log
php_admin_flag[log_errors] = on