Итак, у меня есть PHP-скрипт, который должен программно изменять пароль пользователя Linux.
Скрипт работает как www-data
(это имя пользователя, данное apache2). Я исполняю chpasswd
с popen
, а потом fwrite
пара имя пользователя: пароль. Это вызывает ошибку.
Опускаясь до оболочки bash, я пытаюсь увидеть, что здесь происходит. Естественно, я подозреваю, что это какая-то проблема с разрешениями. Итак, я меняю пользователей на www-data
и попытаться выполнить chpasswd
вручную:
# su www-data
$ /usr/sbin/chpasswd
jsmith:mysecretpassword
Changing password for jsmith.
chpasswd: (user jsmith) pam_chauthtok() failed, error:
Authentication token manipulation error
chpasswd: (line 1, user jsmith) password not changed
Таким образом, это показывает, почему PHP не может выполнить команду. Сообщение об ошибке не совсем простое, но я предполагаю, что суть в том, что PAM-аутентификация возникла проблема (которая, как я полагаю, в основном означает проблему с разрешениями в Linux). Итак, если я su
root, я успешно могу сменить пароль через chpasswd
,
Очевидно, проблема в том, что apache2 (user www-data
) не имеет sudo
привилегии. Единственное решение здесь, чтобы добавить www-data
к sudo
группа? Потому что я бы предпочел не делать этого. Но я не вижу здесь другого варианта.
Говоря в более общем плане — помимо особенностей этой ситуации — как это даже теоретически возможный для веб-программы, которая может потребоваться изменить пароли пользователей, чтобы иметь возможность сделать это без sudo
привилегии? Но если веб-программа имеет sudo
привилегии, разве это не главная проблема безопасности?
Скорее всего, я бы настроил систему очередей, которая запускается с правами root и добавил в очередь сценарий php вместо того, чтобы PHP имел доступ к любому повышению привилегий. Это также закроет некоторые дыры в безопасности, хотя веб-интерфейс для изменения паролей пользователей в Linux все равно звучит как плохая идея.