Это не возможно снаружи самого процесса. Посмотрите этот вопрос о SuperUser для большего количества обсуждения и вовлечения ответа с помощью отладчика, чтобы присоединить к процессу и работать setgid()
из него.
Причина это берет новый вход в систему для выполнения получения новых составов группы, является этим login
(или sshd
или безотносительно) выполнения как корень, и должны установить, обрабатывают UID и GID для Вашего процесса оболочки, что означает, что он уже звонит setuid
и setgid
.
Рождество, www-data
пользователь является пользователем, от того, Apache имени которого выполняет Ваш код WordPress (и любой другой код, генерируя Веб-страницы для Ваших пользователей, например, код Django - механизм веб-сайта Python).
www-data
пользователь создается, чтобы иметь минимальные возможные полномочия, потому что это может возможно выполнить вредоносный код и взять на себя столько управления Вашей системой, сколько позволяется взять. Предположим, что механизм WordPress содержит уязвимость. Скажите, это позволяет пользователю преобразовывать файл изображения из .jpg
кому: .gif
формат путем выполнения convert
от Imagemagick. Уязвимость - то, что это не проверяет, что имя файла содержит имя файла и только имя файла.
Если злорадный взломщик предоставляет "image.png; ldd image.png" и WordPress выполняются convert image.png; ldd image.png
в оболочке без отфильтровывания "; ldd image.png"
часть (эта часть была добавлена к имени файла взломщиком, чтобы быть exectued в оболочке), Ваш апач будет работать ldd image.png
в дополнение к преобразованию изображения. Если image.png
на самом деле исполняемый файл, названный image.png, который взломщик предоставил Вам (если Вы позволяете другим людям публиковать на Вашем сайте, с помощью механизма WordPress), ldd image.png
может привести к выполнению произвольного кода, с помощью 'ldd' уязвимость, как описано здесь: http://www.catonmat.net/blog/ldd-arbitrary-code-execution/.
Очевидно, если тот код выполняется как пользователь root, он может заразить все программы в Вашей системе и взять на себя полное управление его. Затем Вы завинчены (Ваш виртуальный хостинг может начать отправлять спам, пытаясь заразить всех вирусами, съесть весь Ваш бюджет на хостинг и т.д.).
Таким образом WordPress должен быть запущен с минимальными возможными полномочиями для уменьшения повреждения от потенциальной уязвимости. Таким образом, любой файл, это www-data
может записать в, должен рассматриваться, как возможно поставленный под угрозу.
Почему Вы не запускаете WordPress как Ваш foo
пользователь? Предположим, у Вас есть установка в расчете на пользователя программ (например, в /home/foo/bin
), и запущенный WordPress как foo
пользователь. Затем уязвимость в WordPress может заразить те программы. Если Вы позже запускаете одну из тех программ с sudo
, Вы завинчены - это возьмет на себя полное управление над системой. Если Вы храните какой-либо пароль или закрытый ключ и foo
пользователь может считать его, затем взломщик, который взломал Ваш WordPress, сможет считать его, также.
Что касается полного механизма функционирования Apache, вот сводка:
1) На Вашем компьютере VPS существует единственный процесс Apache2, который работает как корень. Это должно работать как корень, вызвать его, нуждается в полномочиях пользователя root попросить, чтобы ядро Linux создало сокет на порте TCP 80.
Сокет (см. Сокеты Berkley) является Операционными системами, Программируя абстракцию, используемую современными ядрами Операционных систем (OS) для представления сетевых соединений с приложениями. Разработчики WordPress могут думать о сокете с файла. Когда 2 программы, клиент и сервер, на 2 различных компьютерах говорят друг с другом по сети, с помощью протокола TCP/IP, ядра ОС обрабатывают детали TCP/IP собой, и программы просто думают, что у них есть подобный файлу объект - сокет. Когда Клиентская программа (например, Mozilla) пишет что-то в свой сокет, ядро клиентского компьютера, ОС поставляет те данные ядру ОС сервера, с помощью протокола TCP/IP. Затем программа Сервера (Apache2 от имени WordPress) может считать те данные со своего сокета.
Как клиент находит сервер и как сервер различает клиенты? И сервер и клиент определяются парой (IP-адрес, номер порта TCP). Существуют закрепленные порты для известных протоколов, такой как 80 для http, 443 для https, 22 для ssh и т.д. Закрепленные порты используются серверами для ожидания соединений на них. ЗНАЧИТЕЛЬНО, только пользователь root может создать сокеты на закрепленных портах. Вот почему первая инстанция Apache2 выполняется как корень.
Когда сервер (Apache2), программа хочет начать слушать порт, она создает так называемое passive
сокет на порте 80 с несколькими system calls
(сокет (), свяжите (), послушайте () и примите ()). Системный вызов является запросом от программы до ее ядра ОС. Для чтения о системных вызовах используйте, например. man 2 socket
(здесь 2
означает раздел 2 из страниц справочника - системные вызовы, посмотрите man man
для чисел раздела). Passive
сокет не может действительно передать данные. Единственная вещь, которую это делает, устанавливают соединение с клиентом - вкладка Mozilla.
2) Клиент (вкладка Mozilla) хочет установить соединение TCP/IP с Вашим сервером. Это создает сокет на НЕСТАНДАРТНОМ ПОРТЕ 14369, которому не нужны полномочия пользователя root. Затем это обменивается с 3 сообщениями с Apache через пассивный сокет на 80-м порте Вашего сервера. Этот процесс (устанавливающий соединение TCP/IP с 3 сообщениями) называют трехсторонним квитированием, см.:
3) Когда соединение TCP/IP успешно устанавливается, Apache2 (выполненный как корень) вызывает accept()
ядро системного вызова и Linux создает active
сокет на 80-м порте сервера, соответствуя соединению с вкладкой Mozilla. Через этот активный сокет будет Ваше приложение WordPress говорить с клиентом.
4) Apache2 (выполненный как корень) ветвления другой экземпляр Apache2 для выполнения кода WordPress с более низкими полномочиями. Тот экземпляр выполнит Ваш код WordPress как a www-data
пользователь.
5) Mozilla и Apache2, под управлением код WordPress как www-data
пользователь начинает обмениваться http данными по установленному соединению, пишущий и читая в их соответствующие разъемы через send()/recv()
системные вызовы.
В основном WordPress является просто программой, вывод которой является страницей HTML, таким образом, Apache2, работая как a www-data
просто запускает ту программу и пишет ее вывод (страница HTML) в активный сокет, и Mozilla на стороне клиента получает ту страницу и показывает его.
Веб-сервер точно так же, как обычный пользователь (здесь, www-data
пользователь):
Если Вы хотите более "безопасную" установку, в случае, если Ваш веб-сервер (или php или Wordpress) подвергается нападению, необходимо определить, какие части веб-дерева должны быть только для чтения, и гарантировать, что веб-сервер не владеет ими, ни может записать в них.
Чтобы знать, что, необходимо прочитать эту документацию Wordpress: http://codex.wordpress.org/Changing_File_Permissions
Можно также взглянуть на этот ответ.
www-data
может записать в, мог потенциально быть поставлен под угрозу, там путь вокруг этого? Некоторые каталоги должны быть перезаписываемым сервером, таким как темы и загрузки. Имело бы смысл заставлять их сгруппироваться перезаписываемый? Вы также упоминаете, что могло бы быть лучше запустить WordPress какfoo
пользователь, делая все файлы WordPress принадлежавшимиfoo
, но затем апач не сможет записать, так как полномочия были бы установлены в 755. – Noel Forte 21.12.2013, 21:02www-data
сUser
инструкция (или другая инструкция, специфичная дляmod
Вы используете, например, дляmod-wsgi
существует специальное предложениеWSGIProcessGroup
инструкция, позволяя пользователю аппарата). Вы решили создать отдельного пользователяfoo
, выделенный под управлением WordPress и ничему иному, так, чтобы при выполнении нескольких механизмов на машине WordPress был подfoo
и другие находятся под, например.www-data
? Хорошо. Можно сохранить все содержание WordPress в папке, принадлежавшейfoo
. – Boris Burkov 21.12.2013, 22:36wiki
, кто владеет/home/wiki
папка. Все содержание, сгенерированное моими пользователями Wiki, хранится в подкаталогах/home/wiki
, который является 755. Сам механизм хранится в/usr/share/pyshared
. Если механизм будет поставлен под угрозу (и это было однажды, прямо в "счастливом в новогоднем 2013" :)), то взломщик получит полный контроль/home/wiki
, будет знать пароли пользователей Wiki, сохраненной там, смог бы отредактировать все страницы Wiki, но не сможет коснуться чего-либо в самой системе. Я теряю Wiki, но не теряю систему. – Boris Burkov 21.12.2013, 22:44ldd
на Хрипящем Debian не выполнит программу, если она не будет распознанаld-linux.so.2
, функция, используемая затем:nonelf(){return 1;}
. Кроме того, основноеapache
для процесса не нужно к bu, выполненному как корень, ему просто нужна возможность CAP_NET_ADMIN. Я даже задаюсь вопросом, может ли это отбросить то полномочие, после того как сокет слушания был настроен. – Totor 22.12.2013, 03:55