Php зайти по root

Shell script с root правами из PHP?

с помощью приложения на PHP порождать некие процессы, работающие от конкретного (отличного от пользователя, от которого работает web-сервер) пользователя.

Сейчас, как вы можете догадаться, от apache отпочковываются процессы, работающие под его же пользователем, что естественно не есть гуд по нескольким причинам: 1) если понадобилось ребутнуть apache (или он не дай бог крэшнется сам), то упадут все процессы, порожденные от него 2) кривые права доступа для учетки www-data в связи с тем, что ей тоже нужны права на запуск экземпляров приложения, лежащего вне директории web-сервера. Хватит это терпеть, подумал я…

Был написан shell script, который умеет запускать приложение от конкретного пользователя. Он был протестирован от root-а через консольку — работет. Через PHP выполняем shell_exec(), который запускает наш скрипт с некоторыми параметрами (условно, для простоты понимания, с сетевым портом, который будет слушать экземпляр приложения). Осталось разобраться с правами www-data на запуск скрипта от root-а. Ну так же ж есть sudo, подумал я… Вот тут-то и возникли сложности.

Положим, что бинарник приложения лежит (условно) тут /home/app/bin. Пользователь username, от которого мы собираемся запускать экземпляры, имеет полный доступ (rwx) как к директории так и к бинарнику.

Читайте также:  Дизайн для кнопок css

Файлы web-сервера как и положено валяются где-то в /var/www. Apache работает от пользователя www-data.

Shell script лежит (условно) в /var/www/script.sh. Полные права доступа (rwx) к нему имеет только root, все остальные делать с ним ни чего не могут. Он тщательно проверяет входные параметры (существование пути, существование бинарника и другие проверки) и запускает экземпляр приложения следующей командой:

su -s /bin/bash -c "cd $APP_PATH; ./$APP_BIN $APP_PARAMS > /dev/null 2>&1 &" "$USER_NAME"
su -s /bin/bash -c "cd /home/app/; ./bin -p 27100 > /dev/null 2>&1 &" username

Остается позволить www-data запускать script.sh от root-а. Ставим sudo,

идем в /etc/sudoers и добавляем:

По ощущениям этого достаточно и по тем же ощущениям подозрения — слишком просто.

Теперь из PHP вызываем наш скрипт:

shell_exec("cd /var/www/; sudo ./script.sh -p 27100");

Пробуем по другому (через консоль):

su -s /bin/bash www-data cd /var/www/ sudo ./script.sh -p 27100

Появляется мало ожидаемое приглашение ввести пароль пользователя www-data:
[sudo] password for www-data:

А NOPASSWD на что? Да и вообще какого хрена пароль у www-data? 🙁

Собственно, что я делаю не так?

Понятное дело, что православность решения мягко говоря под сомнением, но пока хочется «добить» хотя бы его (силы-то и время уже потрачены). Другие решения придут (надеюсь) позднее с новым опытом.

Простой 2 комментария

Источник

How to run a PHP script as root

This post shows how to execute PHP scripts as a root user on Ubuntu/Linux using visudo.

What do you need to run PHP as root?

You will need to use visudo and edit the sudoers file.

The visudo command is available on all UNIX and Linux systems. It provides a safe of editing the /etc/sudoers file. The sudoers file determines exactly ‘who’ can run commands. It also controls what commands a user can run. Most notably for our purpose, it identifies whether you need a password for particular commands.

How not to run PHP scripts as root!

It is not a good idea to give root permissions to the Apache user, which runs your PHP scripts. The Apache user must always request elevated permissions when it’s about to perform an action that could potentially harm your server.

DO NOT use visudo to prevent the Apache user from elevating permissions (using the sudo command).

Why not? Well, a user could upload a malicious PHP script to your site. This PHP script can run a command that would usually require you to use sudo in Linux. The uploaded PHP script can then try to install malicious software.

The install will typically fail because Apache would need to request elevated permissions. Believe me when I say that this is a good thing.

The install will succeed if the Apace user is added to the sudoers file. This will only happen if you effectively give the Apache user permission to run PHP scripts as root. Adding the Apache user to the sudoers file is not a good idea.

Latest Posts

Scan Your Docker Images and Containers with VirusTotal: A Step-by-Step Guide

Источник

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

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

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

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

и я попытался выполнить эту команду с помощью функции 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.

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 #include #include 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 без пароля:

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

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

Недавно я опубликовал проект, который позволяет 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 ] 

Источник

Как запустить PHP скрипта с правами root?

Начну сразу по сути. У меня Os X Yosemite. Включил встроенный Apache и разблокировал встроенный же PHP.

При выполнении скриптов, работающих с файлами на компьютере, выскакивает ошибка доступа. Она благополучно лечится, если в папке, с которой работаю, указать права на чтение и запись (если второй требуется).
Скрипт запускаю из браузера Mozilla последней версии (хотя в Safari тоже самое).

Опытным путем было замечено, что скрипт запускается от имени Любых Пользователей. (собственно их права и переназначаю)

Отсюда суть вопроса. Как мне запускать php скрипт от имени меня, пользователя данной системы, у которого по умолчанию стоят права на чтение и запись, чтобы вручную не приходилось постоянно менять права доступа Любых Пользователей, от чьего имени запускается скрипт?
И почему он запускается от имени Любых Пользователей, ведь я его в системе запускаю через браузер вручную? (наверняка, это связано с политикой безопасности, но я пока не проникся всеми нюансами, если не сложно, кратко расскажите)

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

Заранее спасибо за ответы и теплого Вам солнца.

UPD — раскрытое решение для не посвященных

Мне сложно было применить все то, что ниже описали, так как я видимо еще совсем нуб.
Оба решения были верные, я выбрал запуск сервера Apache от имени пользователя
Для этого я в конфигурации php посмотрел под каким именем пользователя запускается мой сервер Apache (создаем файл php c функцией phpinfo() и открываем его в браузере, в таблице Configuration ищем колонку User/Group, в ней прописано имя пользователя, в моем случае это был _www)
Далее заходим в файл /etc/apache2/httpd.conf и ищем там ваше имя пользователя. У меня это была строка 181 User _www
строка 182 Group _www
Значение _www изменил на свое имя пользователя, сохранил и перезагрузил Apache.
Все, теперь он работает с правами read/write
ВНИМАНИЕ 1 — пишите имя пользователя без лишних знаков, так, как оно есть, моя первая ошибка была, прописать _имяпользователя. Разумеется сервер даже не запустился. Убрав подчеркивание, все получилось.
ВНИМАНИЕ 2 — осознавайте, что вы делаете. Дело в том, что ниже правильно написали, данные права, в моем случае администратора, дают вам запись и чтение почти всех файлов на компьютере, и если вас взломают, то злоумышленник получит почти полный доступ к компьютеру. У меня локальный сервер, и мне это нужно, плюс после конца работы, я выключаю Apache. Однако, безопасность Unix систем в первую очередь гарантируется жестким разграничением чего можно, а чего нельзя. Не стоит лишний раз нарушать это правило.

Источник

Оцените статью