Прочитайте весь этот пост перед тем, как попробовать его, есть выбор.
Прочитайте весь этот пост, прежде чем попробовать его, есть выбор.
Я знаю риски, связанные с запуском php-fpm как root.
Однако бывают ситуации, когда нужно это делать, например, приборы,
доступ к ресурсам операционной системы или даже для целей тестирования.
Я попытался сменить пользователя и группу php-fpm.d/www.conf на root
когда я перезапускаю процесс php-fpm, он вызывает ошибку:
Что мне делать. Кто-нибудь поможет?
25 июнь 2014, в 11:47
Вам может не понадобиться PHP или Apache для запуска от имени root. Если у вас есть контроль над вашим сервером, вы можете использовать модуль Apache, называемый suPHP, и указать пользователя, который вы хотите запустить Apache, как для ваших php-скриптов в конфиге. Вы можете сделать это на сайте по базе сайта, поэтому вам нужно всего лишь запустить suPHP для скриптов в определенном домене. Мне не хватает опыта, чтобы сообщить вам о том, как его установить, но у меня была выделенная серверная компания, чтобы я разрешил github post-receive hook вызывать script на моем dev-сервере, чтобы вызвать git pull to сервер dev в любое время, когда кто-то подталкивает репозитории github. Мне не удалось заставить его работать каким-либо другим способом, так как Apache должен запускаться как владелец локальных репозиториев для его работы.
Я просто подумал о другом возможном решении, основанном на других комментариях здесь, — вы можете написать простой php script, чтобы получить запрос от github hook и записать какую-то произвольную информацию в файл в каталоге с 777 или в db. Затем выполните задание cron, которое проверяет этот файл или db каждую минуту, чтобы увидеть, изменилось ли оно, и если да, выполните запрос на вывод git напрямую, так как cron обычно выполняется как root. Вы даже можете увидеть, изменилась ли временная метка файла, чтобы определить, нужно ли делать git pull. Вы могли бы получить свой cron script su любому пользователю, которому принадлежит репозиторий, и затем вытащить git pull. Не настоящее решение в реальном времени, но если cron script очень прост, на самом деле это не приведет к тому, что ваша система вызовет его каждую минуту или две. Надеюсь, это поможет.
dobsСообщения: 175ОС: Fedora
Контактная информация:
Php от рута
Задача
Надо веб сервер чтоб работал на каком то порте, к примеру 81, и запускал php скрипты от рута. apache и nginx не катят, т.к. php скрипт поидее должен управлять ими и если какой то сервер ребутится то надо чтоб тот скрипт продолжал работать.
Зачем
Написать пхп скрипт аля панель управления хостом
Не предлагать
php под рутом опасно
писать все на баш
Юзать ISPConfig
lighthttpd — он морозится запускаться под рутом
Ленивая БестолочьБывший модераторСообщения: 2760ОС: Debian; gentoo
Ленивая Бестолочь » 28.08.2009 16:00
dobs писал(а): ↑
как-то вы не с той стороны подходите к вопросу.
у вас и апач и нгинкс будут одновременно использоваться, чтоли?
думаю — вряли, соответственно один из них — в «производство», а другой на 81 порт.
ввобще никто не запрещает вам назапускать кучу копий того же апача и перезапускать только нужные.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
а как вам такой вариант:
юзать апач, и разрешить ему(апачу) нужные команды исполнять через sudo?
И каким образом можно исполнить комманду похожую на
Сообщения: 600ОС: Debian Stable
Контактная информация:
остается только написать простенький WEB сервер на PHP (:
И каким образом можно исполнить комманду похожую на
su
это вы меня спрашиваете?
легко!
/etc/sudoers
Во первых — в логе пропишется, во вторых апачу можно будет только КОМАНДУ выполнить. И — всё.
PS: да, вместо ALL лучше прописать localhost.
2 drBatty
Ну тут остается трабла с ребутом
nadgeСообщения: 1519ОС: ArchLinux, Ubuntu 10.10
Чем плох вариант apache + nginx? К нему вроде бы можно прикрутить php и тогда получится как раз как вы хотите. А из скрипта уже запуск sudo /etc/init.d/apache restart.
Говорю же нгинх уже юзается но для другой цели, если апач замутить от рута а к нгинх прикрутить пхп то тогда будут траблы с .htaccess. тобиш надо еще один веб сервер кроме апача, lighthttpd, нгинх
Ленивая Бестолочь » 06.09.2009 11:41
ну запустите ещё один апач или нгинкс.
SubDeviLСообщения: 31ОС: Mandriva 2010+
apache_mod_suphp модуль на апач, создаёте юзверя с правами рута, и всё) скрипты будут выполнятся от этого юзверя.
apache-mod_suphp — DSO module for the apache web server
suPHP is a tool for executing PHP scripts with the permissions of their owners. It consists of an Apache module (mod_suphp) and a setuid root binary (suphp) that is called by the Apache module to change the uid of the process executing the PHP interpreter.
Могу ли я запускать сценарий оболочки как root из сценария PHP с помощью exec ()?
В частности, я пытаюсь запустить и остановить фоновый скрипт.
В настоящее время у меня есть сценарий оболочки, который просто запускает приложение, start.sh:
Вы не можете просто так судиться, вам нужно сначала настроить sudo без пароля в файле / etc / sudoers. Это можно сделать с помощью команды visudo, например. Убедитесь, что вы настроили привилегии в файле sudoers таким образом, чтобы ограничить пользователя apache той единственной командой, которую вы хотите запустить (т. Е. Скриптом оболочки).
Даже тогда он создает угрозу безопасности, потому что любой может создать скрипт PHP и запустить сценарий оболочки по очереди. Поэтому убедитесь, что сам сценарий оболочки защищен от изменения пользователем Apache.
Вторая часть, killall , еще более проблематична. Вы не должны просто разрешать Apache запускать killall с привилегиями root. Вы должны обернуть killall в другой сценарий оболочки и предоставить доступ к этому в sudoers.
В конце концов: не запускайте Apache с учетной записью root и не используйте setuid. Как открыть банку червей, так как вы новичок (учитывая заданный вами вопрос), вы, скорее всего, пропустите некоторые мелкие детали, которые создадут потенциальные проблемы.
Я не профессионал в этой области, но похоже, что вам нужен флаг SUID.
Ознакомьтесь с примерами или google
То, как я это делаю, – написать простой UDP-сервер * с корневыми привилегиями в Python, который: следит за входящими пакетами UDP на данном порту, сравнивает их с белым списком, если они совпадают, выполняют операцию
Сервер python наблюдает за пакетами на порту 12345, но просто игнорирует любые, которые не являются «Start Script» или «Stop Script», так как он запускается с правами root, он может с радостью запустить ваш скрипт bash. Вы, АБСОЛЮТНО ДОЛЖНЫ использовать белую листинг, хотя, ДЕЙСТВИТЕЛЬНО НЕ БЕЗОПАСНО отправлять ЛЮБОЙ вход из гнезда UDP в командную строку напрямую!
Обратите внимание, что UDP может быть подделан, поэтому, если ваш брандмауэр разрешает поддельный входящий трафик (он действительно не должен!), Кто-то мог отправлять поддельные пакеты на ваш сервер Python и останавливать / запускать вашу службу. Это вряд ли будет проблемой, но если вы не можете исправить свой брандмауэр, и вы хотите защитить его, вы можете переработать выше, используя TCP / IP, который нельзя подделать.
* Это действительно тривиальный сервер для написания (~ 20 строк), но если вы не знаете, как тогда просто отправить сообщение мне, и я отправлю его вам или отправлю его здесь.
Вы не хотите давать Apache root.
Есть еще одно решение вашей проблемы. Проблема в том, что Apache не может убить процесс, потому что он принадлежит root. Что вы можете сделать, так это изменить владельца на «www-data», который идентифицирует Apache.
Если процесс является сервисом и запускается при загрузке, вы можете добавить
так что www-data будет являться владельцем этого процесса и, следовательно, будет работать сценарий shut-down.
Конфигурационный файл «actions.txt» использует формат «action-name: соответствующий-shell-command», т.е.
# Hash denotes a comment webroot:nautilus /var/www ftp:filezilla edit_homepage:gedit /var/www/homepage/htdocs/index.php
У меня нет времени переписывать его для использования TCP / IP, но Python – это язык, который стоит узнать, поэтому, если вы действительно хотите эту функциональность, я оставлю это вам, чтобы иметь Google для «Python» и «SOCK_STREAM», , Вероятно, это не стоит вашей проблемы, проще настроить брандмауэр, чтобы никакие поддельные пакеты localhost не могли пройти и изменить код, чтобы убедиться, что он только прослушивает пакеты из loopback.
Вы можете рассмотреть возможность подключения ssh к localhost с помощью проверки подлинности keepair учетной записи с правами root. В такой настройке вам не нужен root-доступ для вашего веб-сервера.
Конечно, PHP и Apache не должны запускаться от имени root, и в лучшем случае только сценарий может выполняться с правами root. Есть идеи?
Любое решение на базе PHP, которое дает права root в какой-либо точке цепи, опасно: злоумышленник, имеющий доступ к пользователю PHP, может получить доступ к пользователю root, что неприемлемо с точки зрения безопасности.
Я никогда не реализовывал это сам, но я предлагаю то, что я предложил здесь : иметь задание сценария / cron с правами root часто просматривает какое-то место для знака из скрипта PHP, что должно выполняться задание – например, файл с определенным именем или записью в базе данных заданий.
Если этот файл существует, корневой скрипт выполняет свою работу и снова удаляет файл.
Если ваш PHP-скрипт не нуждается в прямом ответе от корневого скрипта, я думаю, что это был бы лучший способ. (Ответ может также быть облегчен корневым скриптом, который, естественно, записывает сообщение о статусе в файл).
Пока вы строго ограничиваете, какие задания PHP могут писать для корневого сценария, это водонепроницаемое решение, так как оно не приводит пользователя root в бизнес PHP.
Если вы не хотите ждать cron, вот простая обертка в C, что вы вызовете из php.
Эта скомпилированная обертка должна принадлежать как root, group «www» и должна иметь «s-бит». chwon root.www wrapper; chmod 4440 wrapper chwon root.www wrapper; chmod 4440 wrapper , поэтому
Вам нужно взглянуть на incron (cron для событий файловой системы). Попросите php записать в файл и установить incron для запуска вашего скрипта при закрытии записанного файла (incron очень специфичен). Вероятно, ваш скрипт также будет дезинфицировать входной файл для предотвращения ввода кода и использовать команду lockfile, чтобы предотвратить любые условия гонки между несколькими веб-пользователями.
У меня есть мини-веб-интерфейс, где можно включить анонимный FTP или другие службы в течение 1 часа с паролем. www работает с обычными привилегиями, как и www-data (пользователь php), но incron вызывает сценарий обработки ввода как root.
Вам может не понадобиться PHP или Apache для запуска от имени root. Если у вас есть контроль над вашим сервером, вы можете использовать модуль Apache, называемый suPHP, и указать пользователя, который вы хотите запустить Apache, как для ваших php-скриптов в конфиге. Вы можете сделать это на сайте по базе сайта, поэтому вам нужно всего лишь запустить suPHP для скриптов в определенном домене. Мне не хватает опыта, чтобы посоветовать вам, как его установить, но у меня была выделенная серверная компания для меня, чтобы я позволил github post-receive hook вызвать сценарий на моем dev-сервере, чтобы вызвать git pull на dev-сервер любой время кто-то подталкивает к репозиториям github. Я не смог заставить его работать каким-либо другим способом, поскольку Apache должен работать как владелец локальных репозиториев для его работы.
Я просто подумал о другом возможном решении, основанном на других комментариях здесь, – вы могли бы написать простой скрипт php, чтобы получить запрос от github hook и записать произвольную информацию в файл в каталоге с 777 правами или дб. Затем выполните задание cron, которое проверяет этот файл или db каждую минуту, чтобы увидеть, изменилось ли оно, и если это так, выпустите запрос git pull напрямую, поскольку cron обычно запускается с правами root. Вы даже можете увидеть, изменилась ли временная метка файла, чтобы определить, нужно ли делать git pull. Вы могли бы использовать ваш cron-скрипт для любого пользователя, которому принадлежит репозиторий, и затем выпустить git pull. Не настоящее решение в реальном времени, но если скрипт cron очень прост, он бы не повредил вашу систему, чтобы называть ее каждую минуту или две. Надеюсь, это поможет.
Используйте демон, выполняемый как root (возможно, написанный на C), который запускает сценарии оболочки для вас. Чтобы запустить выполнение сценария оболочки из сценария PHP, просто используйте IPC (очереди сообщений).
Взгляните сюда, чтобы понять, о чем я говорю: http://php.net/manual/en/function.msg-send.php#114831
Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash (по запросу root), она решает ограничения exec () и shell_exec (). Получить его здесь: https://github.com/merlinthemagic/MTS
После загрузки вы просто используете следующий код:
С точки зрения безопасности это намного лучше, чем запуск apache как root. Но позволить PHP где-нибудь рядом с корнем всегда сложно.
Проект, который я построил, обеспечивает корневую оболочку bash одним из двух способов:
1) Вы разрешаете apache право sudo python.
2) Вы передаете корневые учетные данные объекту каждый раз, когда вам нужна оболочка с корневой установкой.
Выбрать свой яд. 🙂 Прочитайте документацию.
Ответа
Однако бывают ситуации, когда это нужно сделать, например, устройства, доступ к ресурсам операционной системы.
Вам никогда не нужно это делать. Это. Если вы управляете системными ресурсами, предоставляйте разрешения для пользователя php-fpm на эти ресурсы, а не выполняйте весь процесс с правами root. Если бы ваш вопрос был более конкретным, я мог бы показать, как это сделать в определенной ситуации.
Ещё вопросы

Решение с использованием бинарной оболочки (с битом 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 .
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, но не будет в рамках вашего процесса веб-сервера.
Я знаю, что это немного расплывчато, и его можно решить по-разному с помощью различных технологий, но я думаю, что это лучший и безопасный способ.
Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash, он легко даст вам оболочку, зарегистрированную как root. Затем вы можете просто выполнить отдельные команды bash, а не связывать их в скрипте. Таким образом, вы также можете справиться с возвратом. Получить его здесь: https://github.com/merlinthemagic/MTS
Решение с использованием бинарной оболочки (с suid-битом)
1) Создайте script (желательно .sh), который содержит то, что вы хотите запустить с правами root.
2) Этот файл должен принадлежать root, а поскольку он будет работать с правами root, убедитесь, что только root имеет разрешение на запись в файл.
# chown root php_shell.sh
# chmod u=rwx,go=xr php_shell.sh
3) Чтобы запустить script как root, независимо от того, какой пользователь выполняет его, нам понадобится двоичная оболочка. Создайте тот, который выполнит наш php_shell.sh.
# 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. Тогда вам не нужно иметь двоичный файл, выполняющий внешний script выполнение соответствующих команд.
В wrapper.c используйте system («your shell command here»);, чтобы указать, какие команды вы хотите выполнить.






