Как sudo или su другому пользователю как www-data

Я пытаюсь настроить веб-страницу, которая запускает сценарии. Дело в том, что эти сценарии должны запускаться с использованием другого пользователя. Это не проблема с разрешениями, я могу физически запускать сценарии как www-данные, но сценарии зависят от целой среды и переменных среды, установленных пользователем.

Я надеюсь sudo или su для пользователя и запустить сценарии после.

Веб-страница вызывает php-файл, который запускается:

$cmd1 = "sudo login -f otheruser";
$cmd2 = "whoami";
echo exec(escapeshellcmd($cmd1), $output, $status);
foreach($output as $line) echo "$line\n";
echo exec(escapeshellcmd($cmd2), $output, $status);
foreach($output as $line) echo "$line\n";

Я попытался использовать «sudo login -f otheruser» и «su — otheruser», и я установил его так, чтобы при входе с www-data в otheruser пароль не требовался (/etc/pam.d/su)

Первая команда ничего не возвращает, вторая возвращает: www-data, так что очевидно, что она не входит в другого пользователя.

Любые идеи о том, как это можно сделать, или альтернативы, как я могу запускать скрипты от имени другого пользователя?

0

Решение

РЕДАКТИРОВАТЬ:
Поэтому, посмотрев на это еще немного, это из-за ряда вещей.

Прежде всего, позвольте мне сказать, что, скорее всего, есть лучшее решение, чем предоставление доступа Apache HTTPD sudoers.

Во-вторых, я собираюсь сделать некоторые предположения, что вы используете какую-то разновидность Ubuntu, если ваш пользователь www-data,

Так вот, как заставить это работать …
Первым местом, где я посмотрел, были файлы журналов. journalctl -u apache2 -f Хвост файла журнала httpd. Вы увидите много таких записей:

Nov 02 15:27:17 ubuntu sudo[23541]: pam_unix(sudo:auth): conversation failed
Nov 02 15:27:17 ubuntu sudo[23541]: pam_unix(sudo:auth): auth could not identify password for [www-data]
Nov 02 15:27:17 ubuntu sudo[23541]: www-data : command not allowed ; TTY=unknown ; PWD=/var/www/html ; USER=postgres ; COMMAND=/var/www/html/test2.sh

Итак, давайте сначала создадим пару файлов для тестирования. Мы собираемся вдаваться в это с мыслью о том, чтобы обеспечить как можно больше. Поэтому я создам два тестовых файла, один из которых мы хотим дать разрешение на выполнение, а другой нет.

cd /var/www/html
echo -e "#\x21/bin/bash\necho \"Running command: \$0\"\n"  | tee test.sh test2.sh
chown postgres:postgres test*.sh
chmod 700 test*.sh

Теперь мы хотим дать www-data доступ пользователя к sudo, Однако мы только хотим, чтобы он мог выполнять команду /var/www/html/test.sh и не /var/www/html/test2.sh, Итак, давайте создадим следующий файл:

www-data ALL=(ALL) NOPASSWD:/var/www/html/test.sh
echo 'www-data ALL=(ALL) NOPASSWD:/var/www/html/test.sh' > /etc/sudoers.d/www-data

Я немного обновил ваш пример PHP-скрипта, чтобы получить больше вывода:

<?php
$cmd1 = "sudo -u postgres /var/www/html/test.sh";
$cmd2 = "sudo -u postgres /var/www/html/test2.sh";
$cmd3 = "whoami";
echo "Executing command 1: $cmd1\n";
exec(escapeshellcmd($cmd1), $output, $status);
foreach($output as $line) echo "$line\n";
unset($output);
echo "\nExecuting command 2: $cmd2\n";
exec(escapeshellcmd($cmd2), $output, $status);
foreach($output as $line) echo "$line\n";
unset($output);
echo "\nExecuting command 3: $cmd3\n";
exec(escapeshellcmd($cmd3), $output, $status);
foreach($output as $line) echo "$line\n";
?>

Теперь я получаю следующее:

$ curl localhost
Executing command 1: sudo -u postgres /var/www/html/test.sh
Running command: /var/www/html/test.sh

Executing command 2: sudo -u postgres /var/www/html/test2.sh

Executing command 3: whoami
www-data

Команда 2 не генерирует выходные данные, потому что у пользователя www-данных нет прав на его выполнение. Вы должны увидеть следующее в записи журнала:

Nov 02 15:27:17 ubuntu sudo[23541]: pam_unix(sudo:auth): conversation failed
Nov 02 15:27:17 ubuntu sudo[23541]: pam_unix(sudo:auth): auth could not identify password for [www-data]
Nov 02 15:27:17 ubuntu sudo[23541]: www-data : command not allowed ; TTY=unknown ; PWD=/var/www/html ; USER=postgres ; COMMAND=/var/www/html/test2.sh

Оригинальный ответ:

я использовал sudo su -c и я смог получить ожидаемый результат. Смотрите следующее:

$cmd1 = "sudo su -c 'whoami' postgres";
$cmd2 = "whoami";
echo exec(escapeshellcmd($cmd1), $output, $status);
foreach($output as $line) echo "$line\n";
echo exec(escapeshellcmd($cmd2), $output, $status);
foreach($output as $line) echo "$line\n";

Выходы

$ ./test.php
postgrespostgres
myuserpostgres
myuser
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector