Владение Apache и полномочия для Wordpress

Это не возможно снаружи самого процесса. Посмотрите этот вопрос о SuperUser для большего количества обсуждения и вовлечения ответа с помощью отладчика, чтобы присоединить к процессу и работать setgid() из него.

Причина это берет новый вход в систему для выполнения получения новых составов группы, является этим login (или sshd или безотносительно) выполнения как корень, и должны установить, обрабатывают UID и GID для Вашего процесса оболочки, что означает, что он уже звонит setuid и setgid.

4
21.08.2018, 04:54
2 ответа

Рождество, 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, вот сводка:

enter image description here

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 сообщениями) называют трехсторонним квитированием, см.:

enter image description here

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 на стороне клиента получает ту страницу и показывает его.

4
27.01.2020, 20:54
  • 1
    за это объяснение! Когда Вы говорите что любой каталог это www-data может записать в, мог потенциально быть поставлен под угрозу, там путь вокруг этого? Некоторые каталоги должны быть перезаписываемым сервером, таким как темы и загрузки. Имело бы смысл заставлять их сгруппироваться перезаписываемый? Вы также упоминаете, что могло бы быть лучше запустить WordPress как foo пользователь, делая все файлы WordPress принадлежавшими foo, но затем апач не сможет записать, так как полномочия были бы установлены в 755. –  Noel Forte 21.12.2013, 21:02
  • 2
    @NoelForte Извиняет меня, я не могу понять идею о группе writability. Можно настроить апача для выполнения при пользователях, кроме www-data с User инструкция (или другая инструкция, специфичная для mod Вы используете, например, для mod-wsgi существует специальное предложение WSGIProcessGroup инструкция, позволяя пользователю аппарата). Вы решили создать отдельного пользователя foo, выделенный под управлением WordPress и ничему иному, так, чтобы при выполнении нескольких механизмов на машине WordPress был под foo и другие находятся под, например. www-data? Хорошо. Можно сохранить все содержание WordPress в папке, принадлежавшей foo. –  Boris Burkov 21.12.2013, 22:36
  • 3
  • 4
    @NoelForte ненавистника: Я запускаю Python механизм Wiki при отдельном пользователе wiki, кто владеет /home/wiki папка. Все содержание, сгенерированное моими пользователями Wiki, хранится в подкаталогах /home/wiki, который является 755. Сам механизм хранится в /usr/share/pyshared. Если механизм будет поставлен под угрозу (и это было однажды, прямо в "счастливом в новогоднем 2013" :)), то взломщик получит полный контроль /home/wiki, будет знать пароли пользователей Wiki, сохраненной там, смог бы отредактировать все страницы Wiki, но не сможет коснуться чего-либо в самой системе. Я теряю Wiki, но не теряю систему. –  Boris Burkov 21.12.2013, 22:44
  • 5
    Мой ldd на Хрипящем Debian не выполнит программу, если она не будет распознана ld-linux.so.2, функция, используемая затем: nonelf(){return 1;}. Кроме того, основное apache для процесса не нужно к bu, выполненному как корень, ему просто нужна возможность CAP_NET_ADMIN. Я даже задаюсь вопросом, может ли это отбросить то полномочие, после того как сокет слушания был настроен. –  Totor 22.12.2013, 03:55

Веб-сервер точно так же, как обычный пользователь (здесь, www-data пользователь):

  • Если Вы даете ему владение на некоторых каталогах/файлах, это может сделать то, что это хочет с ним,
  • Если Вы даете ему полномочия записи на каталогах/файлах, которыми это не обладает, это может изменить их, освободить их и т.д.

Если Вы хотите более "безопасную" установку, в случае, если Ваш веб-сервер (или php или Wordpress) подвергается нападению, необходимо определить, какие части веб-дерева должны быть только для чтения, и гарантировать, что веб-сервер не владеет ими, ни может записать в них.

Чтобы знать, что, необходимо прочитать эту документацию Wordpress: http://codex.wordpress.org/Changing_File_Permissions

Можно также взглянуть на этот ответ.

1
27.01.2020, 20:54

Теги

Похожие вопросы