Выполнение команд root через PHP

У меня есть сервер CentOS 5.7 linux и используйте php5.3.x.

В системе pfSense вы можете перезапустить службы, требующие прав root с помощью веб-страницы php.

Я пытаюсь сделать что-то подобное, я написал код php для выполнения команд оболочки. Например, чтобы перезапустить службу sshd:

<?php exec('/sbin/service sshd restart'); ?> 

и я попытался выполнить эту команду с помощью функции exec, но для этого требуется разрешение root, но у нас есть полномочия пользователя apache.

Я столкнулся с несколькими решениями:

  1. «запустить apache с пользователем root» действительно небезопасно. Я не хочу этого делать.
  2. "apache ALL = NOPASSWD: / sbin / service в / etc / sudoers" Я пробовал, но все еще есть проблема.

Любые другие решения? Спасибо за ответы.


теперь .. это интересно. Я попытался отправить сообщение @refp, и он работал на моем локальном сервере ubuntu. Но когда я пробовал то же самое на моем cenOS-сервере vps. Это не работает. И это журнал ошибок apache: «rm: не удается удалить« / var / lock / subsys / vsftpd »: Permission denied"

Прочитайте весь этот пост, прежде чем попробовать его, есть выбор.


Решение с использованием бинарной оболочки (с битом suid)

1) Создайте сценарий (желательно .sh ), который содержит то, что вы хотите запустить с правами root.

 # cat > php_shell.sh <<CONTENT #!/bin/sh /sbin/service sshd restart CONTENT 

2) Этот файл должен принадлежать root, и поскольку он будет работать с правами root, убедитесь, что только root имеет разрешение на запись в файл.

 # chown root php_shell.sh # chmod u=rwx,go=xr php_shell.sh 

3) Чтобы запустить скрипт как root, независимо от того, какой пользователь его выполняет, нам понадобится бинарная оболочка. Создайте тот, который выполнит наш php_shell.sh .

 # cat > wrapper.c <<CONTENT #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main (int argc, char *argv[]) { setuid (0); /* WARNING: Only use an absolute path to the script to execute, * a malicious user might fool the binary and execute * arbitary commands if not. * */ system ("/bin/sh /path/to/php_shell.sh"); return 0; } CONTENT 

4) Скомпилируйте и установите правильные разрешения, включая бит suid (говоря, что он должен запускаться с правами root):

 # gcc wrapper.c -o php_root # chown root php_root # chmod u=rwx,go=xr,+s php_root 

php_root теперь будет запускаться с правами root и выполнять команды, указанные в php_root.sh .


Если вам не нужно легко изменять какие команды, которые будут выполняться, я бы рекомендовал вам написать команды непосредственно в wrapper.c в шаге 4 . Тогда вам не нужно иметь бинарный исполняющий внешний скрипт, выполняющий соответствующие команды.

В wrapper.c используйте system ("your shell command here"); чтобы указать, какие команды вы хотите выполнить.

У меня не было бы PHP выполнять любые команды sudo. Для меня это звучит как просить неприятностей. Вместо этого я бы создал две отдельные системы.

Первая система в PHP (веб-уровне) будет обрабатывать запросы пользователей. Когда делается запрос, который требует команды sudo, я бы разместил этот запрос в некоторой очереди. Это может быть база данных какого-то рода или среднего уровня, такого как ZeroMQ.

Вторая система (бизнес-уровень) будет читать или получать сообщения из этой очереди и будет иметь возможность выполнять команды sudo, но не будет в рамках вашего процесса веб-сервера.

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

Разрешить пользователю www-data запускать program1 и program2 без пароля:

 sudo visudo 

Добавить в содержимое файла sudoers:

 User_Alias WWW_USER = www-data Cmnd_Alias WWW_COMMANDS = /sbin/program1, /sbin/program2 WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS 

Сохранить.

от https://askubuntu.com/questions/76920/call-a-shell-script-from-php-run-as-root

Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash, он легко даст вам оболочку, зарегистрированную как root. Затем вы можете просто выполнить отдельные команды bash, а не связывать их в скрипте. Таким образом, вы также можете справиться с возвратом. Получить его здесь: https://github.com/merlinthemagic/MTS

После загрузки вы просто используете следующий код:

 $shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); $return1 = $shell->exeCmd('service sshd restart'); echo $return1; //On CentOS 7 output would be like: //Redirecting to /bin/systemctl restart sshd.service //On CentOS 6 and lower output would be like: //Stopping sshd: [ OK ] //Starting sshd: [ OK ]