Операция setresuid запрещена при вызове через php

У меня следующая проблема: мои скрипты 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

1
задан 12 July 2014 в 05:34

3 ответа

Я нахожу довольно странным предложить отключить 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 или выше для этого.

1
ответ дан 12 July 2014 в 05:34

Ваша 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.

0
ответ дан 12 July 2014 в 05:34

Зафиксируйте для 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 прекратил работать.

4
ответ дан 12 July 2014 в 05:34

Другие вопросы по тегам:

Похожие вопросы: