У меня следующая проблема: мои скрипты Apache и PHP работают как пользовательские www-данные.
Я хочу вызвать сценарий, который может быть выполнен только как root, поэтому я добавил новый файл в /etc/sudoers.d, чтобы разрешить эту команду для пользователя www-data:
echo390:/var/www/html# cat /etc/sudoers.d/iptables
www-data ALL= NOPASSWD: /sbin/iptables
мой PHP-скрипт выглядит следующим образом:
<?php
$command = '"/usr/bin/sudo" "/sbin/iptables" -L -v -n | grep "220.177.198.43"';
echo 'Benutzer: '.exec('whoami').'<br/>';
echo 'Command: '.$command.'<br/>';
$result = array();
exec($command,$result);
print_r($result);
?>
, если я вызываю скрипт из командной строки с помощью: sudo -u www-data / usr / bin / php test.php, все работает, как и ожидалось, но когда я вызываю скрипт через Apache, я получаю следующую ошибку в apache2 / error.log:
sudo: PERM_ROOT: setresuid(0, -1, -1): Operation not permitted
Я обновил Ubuntu с 12.02 по 14.04. Тот же скрипт выполнялся в Ubuntu 12.02 без проблем. , Кто-нибудь может мне помочь? где здесь ошибка?
групп для www-данных:
echo390:~$ groups www-data
показывает
www-data : www-data
как info:
Я использую модуль Apache-mpm-itk , чтобы каждый виртуальный хост apache работал под отдельным идентификатором пользователя. Итак, как вы позволяете конкретному пользователю Apache выполнять определенный скрипт оболочки с привилегиями root (в php и т. Д.)?
Заранее спасибо и с уважением Ravermeister
Я нахожу довольно странным предложить отключить mpm-itk, поскольку могла бы быть причина, почему это на самом деле используется.
Мы используем mpm-itk (версия 2.4.7-02) с апачскими 2.4, и это работает отлично. Единственной вещью рассмотреть вот являются новые конфигурационные директивы
LimitUIDRange
и
LimitGIDRange
, Эти директивы определяют, который UIDs и ЦЕНУРОЗЫ mpm-itk могут использовать (через setuid/setguid). Поскольку Вы, очевидно, хотите, чтобы он был в состоянии стать корнем, Ваш более низкий диапазон должен быть идентификатором 0. Следующая конфигурация будет работать здесь:
<IfModule mpm_itk_module>
LimitUIDRange 0 6000
LimitGIDRange 0 6000
</IfModule>
знать, верхняя граница должна включать все пользовательские комбинации UID/GID, которые Вы хотите использовать в своей конфигурации через AssignUserID.
Примечание, что можно настроить это для каждого виртуального хоста, который Вы имеете. Отметьте также, что Вам нужно ядро Linux 3.5.0 или выше для этого.
Ваша sudoers конфигурация является правильной, на самом деле когда Вы должностное лицо:
sudo -u www-data /usr/bin/php test.php
это работает как ожидалось.
В нормальном функционировании Ваш апач работает как корень и использование mpm-itk модуль. Вот проблема.
Согласно mpm-itk документации:
Так как mpm-itk должен смочь к setuid (), он работает как корень (хотя ограничено с возможностями POSIX и seccomp v2, где возможный), пока запрос не анализируется, и vhost полон решимости.
и:
mpm-itk основан на традиционном предварительном ветвлении MPM, что означает, что это является нерезьбовым;.... Вы также получите дополнительный удар производительности по предварительному ветвлению, так как существует дополнительное ветвление на запрос.
Это означает, что mpm-itk апачский процесс ветвления и использование setuid () для присвоения требуемого пользователя каждому виртуальному хосту.
Согласно setuid руководству:
setuid () функция проверяет эффективный идентификатор пользователя вызывающей стороны и если это - суперпользователь, весь связанный с процессом идентификатор пользователя установлены на uid. После того, как это произошло, для программы невозможно возвратить полномочия пользователя root.
Это уже могло объяснить, но не убежденное, я загрузил источник mpm-itk, и я замечаю, что он изменяет разрешение на возможность и ограничивает диапазон uid от 1 до UINT_MAX.
Если поток отбрасывает возможность от своего разрешенного набора, он никогда не может повторно получать ту возможность
Мое заключение состоит в том, что при помощи mpm-itk Ваши сценарии PHP не могут получить корневое разрешение.
Если у Вас есть шанс, можно проверить если рабочий апач как www-данные и отключающий mpm-itk модуль работы test.php.
Зафиксируйте для apache2.4
и mpm-itk
Место это в /etc/apache2/conf-enabled/security.conf
<IfModule mpm_itk_module>
LimitUIDRange 0 6000
LimitGIDRange 0 6000
</IfModule>
и перезапустите apache
.
Это не нужно на apache2.2
, но как только я обновил до apache2.4
мои Сценарии PHP, которые использовали shell_exec
, и sudo
прекратил работать.