PAM требует пароль для exec / shell_exec даже с NOPASSWD в / etc / sudoers - PullRequest
1 голос
/ 22 октября 2019

Что я пытаюсь сделать:

Разрешить пользователю веб-сервера (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

1 Ответ

0 голосов
/ 22 октября 2019

В соответствии с предложением Даана в комментариях оказывается, что в какой-то момент срок действия учетной записи http был установлен на далекое время в прошлом, так что он никогда не мог быть функционально использован для команд sudo. Возможно, это было решение защитить систему от возможных инъекций exec / shell_exec с помощью PHP на веб-сервере.

Решение:

Затем Daan порекомендовал решение

chage -E -1 http

Это установило срок действия пользователя на «никогда» и сделало его пригодным для повторного использования. Настройки sudo теперь работают как положено.

...