Поддержка suEXEC
Функция suEXEC предоставляет пользователям Apache HTTP Server возможность запускать программы CGI и SSI под идентификаторами пользователей, отличными от идентификатора пользователя веб-сервера. Обычно, когда программа CGI или SSI выполняется, она работает под тем же пользователем, что и веб-сервер.
При правильном использовании эта функция значительно снижает риски безопасности, связанные с предоставлением пользователям возможности разработки и запуска собственных программ CGI или SSI. Однако, если suEXEC неправильно настроено, это может привести к различным проблемам и, возможно, создать новые уязвимости в системе. Если вы не знакомы с управлением программами с setuid root и проблемами безопасности, связанными с ними, мы настоятельно рекомендуем не использовать suEXEC.
Перед началом
Прежде чем углубляться в этот документ, вы должны понимать, что делаются определенные предположения о вас и среде, в которой вы будете использовать suexec.
Во-первых, предполагается, что вы используете операционную систему, производную от UNIX, способную выполнять операции setuid и setgid. Все примеры команд представлены в этом контексте. Другие платформы, если они способны поддерживать suEXEC, могут отличаться в настройках.
Во-вторых, предполагается, что вы знакомы с некоторыми основными концепциями безопасности и администрирования вашей системы. Это включает в себя понимание операций setuid/setgid и их влияния на систему и уровень её безопасности.
В-третьих, предполагается, что вы используете немодифицированную версию кода suEXEC. Весь код suEXEC тщательно проверен и протестирован разработчиками, а также многочисленными бета-тестерами. Приняты все меры предосторожности для обеспечения простого и надёжного кода. Изменение этого кода может привести к непредвиденным проблемам и новым рискам безопасности. Настоятельно рекомендуется не изменять код suEXEC, если вы не являетесь экспертом в программировании безопасности и не готовы поделиться своей работой с командой разработчиков Apache HTTP Server для рассмотрения.
В-четвертых, и наконец, команда разработчиков Apache HTTP Server приняла решение НЕ включать suEXEC в стандартную установку Apache httpd. В связи с этим, настройка suEXEC требует от администратора внимательного отношения к деталям. После тщательного рассмотрения различных настроек suEXEC администратор может установить suEXEC стандартными методами. Значения этих настроек должны быть тщательно определены и указаны администратором для надёжной защиты системы при использовании функциональности suEXEC. Мы надеемся, что этот подробный процесс позволит ограничить установку suEXEC только тем, кто достаточно внимателен и решителен для её использования.
Всё ещё с нами? Хорошо. Перейдём дальше!
Модель безопасности suEXEC
Перед началом настройки и установки suEXEC мы обсудим модель безопасности, которую вы собираетесь реализовать. Это позволит лучше понять, что происходит внутри suEXEC и какие меры предосторожности принимаются для обеспечения безопасности вашей системы.
suEXEC основан на программе-обёртке setuid, которая вызывается основным Apache HTTP Server. Эта обёртка вызывается при поступлении HTTP-запроса на программу CGI или SSI, которую администратор назначил для выполнения под другим идентификатором пользователя, отличным от основного сервера. При получении такого запроса Apache httpd предоставляет обёртке suEXEC имя программы и идентификаторы пользователя и группы, под которыми программа должна выполняться.
Затем обёртка использует следующий процесс для определения успеха или неудачи — если любое из этих условий не выполняется, программа записывает ошибку и завершается с ошибкой, в противном случае продолжит выполнение:
- Является ли пользователь, выполняющий эту обёртку, валидным пользователем данной системы?
Это гарантирует, что пользователь, выполняющий обёртку, действительно является пользователем системы.
- Была ли обёртка вызвана с правильным количеством аргументов?
Обёртка будет выполнена только в случае передачи правильного количества аргументов. Правильный формат аргументов известен Apache HTTP Server. Если обёртка получает неверное количество аргументов, это либо взлом, либо проблема с частью suEXEC вашего бинарного файла Apache httpd.
- Разрешено ли этому валидному пользователю выполнять обёртку?
Является ли этот пользователь пользователем, разрешённым для выполнения этой обёртки? Только один пользователь (пользователь Apache) имеет право выполнять эту программу.
- Содержит ли целевая программа CGI или SSI небезопасную иерархическую ссылку?
Содержит ли путь целевой программы CGI или SSI ведущий '/' или обратную ссылку '..'? Это не допускается; целевая программа CGI/SSI должна находиться в корневом каталоге suEXEC (см.
--with-suexec-docroot=DIRниже). - Является ли имя целевого пользователя валидным?
Существует ли целевой пользователь?
- Является ли имя целевой группы валидным?
Существует ли целевая группа?
- Целевой пользователь НЕ является суперпользователем?
suEXEC не позволяет
rootзапускать программы CGI/SSI. - Идентификатор целевого пользователя БОЛЬШЕ минимального значения?
Минимальный номер идентификатора пользователя задаётся при настройке. Это позволяет установить наименьший возможный идентификатор пользователя, которому будет разрешено запускать программы CGI/SSI. Это полезно для блокировки «системных» учётных записей.
- Целевая группа НЕ является группой суперпользователя?
В настоящее время suEXEC не позволяет группе
rootзапускать программы CGI/SSI. - Идентификатор целевой группы БОЛЬШЕ минимального значения?
Минимальный номер идентификатора группы задаётся при настройке. Это позволяет установить наименьший возможный идентификатор группы, которому будет разрешено запускать программы CGI/SSI. Это полезно для блокировки «системных» групп.
- Может ли обёртка успешно перейти к целевому пользователю и группе?
Именно здесь программа становится целевым пользователем и группой посредством вызовов setuid и setgid. Список доступа к группе также инициализируется всеми группами, членами которых является пользователь.
- Можем ли мы изменить каталог на тот, в котором находится целевая программа CGI/SSI?
Если его нет, то в нём не может быть файлов. Если мы не можем перейти в этот каталог, то он, по сути, не существует.
- Директория находится в пределах веб-пространства httpd?
Если запрос относится к обычной части сервера, находится ли запрашиваемая директория в корневом каталоге suEXEC? Если запрос относится к
UserDir, находится ли запрашиваемая директория в каталоге, настроенном как userdir suEXEC (см. Параметры конфигурации suEXEC)? - Директория НЕ доступна для записи другими пользователями?
Мы не хотим открывать директорию для других пользователей; только владелец пользователя может изменять содержимое этой директории.
- Существует ли целевая программа CGI/SSI?
Если её нет, то её нельзя выполнить.
- Целевая программа CGI/SSI НЕ доступна для записи другими пользователями?
Мы не хотим предоставлять другим пользователям возможность изменять программу CGI/SSI.
- Целевая программа CGI/SSI НЕ имеет setuid или setgid?
Мы не хотим запускать программы, которые затем снова изменят наши UID/GID.
- Целевой пользователь/группа совпадают с пользователем/группой программы?
Является ли пользователь владельцем файла?
- Можем ли мы успешно очистить среду процесса для обеспечения безопасной работы?
suEXEC очищает среду процесса, устанавливая безопасный PATH (определённый во время конфигурации), а также передавая только те переменные, имена которых присутствуют в безопасном списке переменных (также созданном во время конфигурации).
- Можем ли мы успешно стать целевой программой CGI/SSI и выполнить её?
Здесь suEXEC заканчивается, и начинается целевая программа CGI/SSI.
Это стандартная работа модели безопасности обёртки suEXEC. Она довольно жёсткая и может накладывать новые ограничения и руководящие принципы для разработки CGI/SSI, но она была разработана тщательно, шаг за шагом, с учётом безопасности.
Для получения дополнительной информации о том, как эта модель безопасности может ограничивать ваши возможности в отношении конфигурации сервера, а также о том, какие риски безопасности можно избежать с правильной настройкой suEXEC, см. раздел "Осторожно: Джаббервокк" в этом документе.
Настройка и установка suEXEC
Вот где начинается самое интересное.
Параметры конфигурации suEXEC
--enable-suexec- Этот параметр включает функцию suEXEC, которая никогда не устанавливается или не активируется по умолчанию. По крайней мере, один параметр
--with-suexec-xxxxxдолжен быть предоставлен вместе с параметром--enable-suexec, чтобы APACI принял ваш запрос на использование функции suEXEC. --with-suexec-bin=PATH- Путь к двоичному файлу
suexecдолжен быть жестко закодирован в сервере по соображениям безопасности. Используйте этот параметр для переопределения стандартного пути. Например--with-suexec-bin=/usr/sbin/suexec --with-suexec-caller=UID- Имя пользователя, под которым обычно работает httpd. Это единственный пользователь, которому разрешено выполнять оболочку suEXEC.
--with-suexec-userdir=DIR- Определите подкаталог в домашнем каталоге пользователей, где должен быть разрешен доступ suEXEC. Все исполняемые файлы в этом каталоге будут исполняемыми для suEXEC как пользователем, поэтому они должны быть «безопасными» программами. Если вы используете директиву
UserDir(т.е. без «*» в ней), это значение должно быть установлено одинаково. suEXEC не будет работать должным образом, если директиваUserDirуказывает на местоположение, которое не совпадает с домашним каталогом пользователя, как указано в файлеpasswd. Значение по умолчанию — "public_html".
Если у вас есть виртуальные хосты с разнымиUserDirдля каждого, вам нужно определить, чтобы они все находились в одном родительском каталоге; затем укажите имя этого родительского каталога здесь. Если это не настроено должным образом, запросы CGI «~userdir» не будут работать! --with-suexec-docroot=DIR- Определите это как DocumentRoot, заданный для httpd. Это будет единственная иерархия (кроме
UserDir), которая может использоваться для поведения suEXEC. Каталог по умолчанию — значение--datadirс суффиксом "/htdocs", например, если вы настраиваете с "--datadir=/home/apache", каталог "/home/apache/htdocs" используется как корень документа для оболочки suEXEC. --with-suexec-uidmin=UID- Определите это как наименьший UID, разрешенный в качестве целевого пользователя для suEXEC. Для большинства систем обычно используются значения 500 или 100. Значение по умолчанию — 100.
--with-suexec-gidmin=GID- Определите это как наименьший GID, разрешенный в качестве целевой группы для suEXEC. Для большинства систем обычно используется значение 100, и поэтому оно используется в качестве значения по умолчанию.
--with-suexec-logfile=FILE- Это определяет имя файла, в который записываются все транзакции и ошибки suEXEC (полезно для аудита и отладки). По умолчанию имя файла журнала — "
suexec_log", и он находится в вашем стандартном каталоге журналов (--logfiledir). --with-suexec-safepath=PATH- Определите безопасную переменную среды PATH для передачи исполняемым файлам CGI. Значение по умолчанию — "
/usr/local/bin:/usr/bin:/bin".
Компиляция и установка оболочки suEXEC
Если вы включили функцию suEXEC с параметром --enable-suexec, двоичный файл suexec (вместе с самим httpd) автоматически скомпилируется, если вы выполните команду make.
После компиляции всех компонентов вы можете выполнить команду make install для их установки. Двоичный образ suexec устанавливается в каталог, определенный параметром --sbindir. По умолчанию это расположение — "/usr/local/apache2/bin/suexec".
Обратите внимание, что для этапа установки вам потребуются права root. Для корректного установки идентификатора пользователя оболочка должна устанавливаться как владелец root и должна иметь установленный бит выполнения setuserid для режимов файлов.
Настройка строгих разрешений
Хотя оболочка suEXEC проверит, чтобы вызывающий ее пользователь соответствовал указанному с параметром --with-suexec-caller configure пользователю, всегда существует возможность того, что вызов системы или библиотечной функции, используемой suEXEC до этой проверки, может быть уязвим в вашей системе. Для противодействия этому и в качестве лучшей практики в целом, вы должны использовать разрешения файловой системы, чтобы гарантировать, что только группа httpd может выполнять suEXEC.
Например, если ваш веб-сервер настроен на работу от имени:
User www Group webgroup
и suexec установлен по пути "/usr/local/apache2/bin/suexec", вы должны выполнить:
chgrp webgroup /usr/local/apache2/bin/suexec chmod 4750 /usr/local/apache2/bin/suexec
Это гарантирует, что только группа httpd может запускать оболочку suEXEC.
Включение и отключение suEXEC
При запуске httpd он ищет файл suexec в каталоге, определенном параметром --sbindir (по умолчанию — "/usr/local/apache/sbin/suexec"). Если httpd находит правильно настроенную оболочку suEXEC, он выведет следующее сообщение в журнал ошибок:
[notice] suEXEC mechanism enabled (wrapper: /path/to/suexec)
Если вы не видите этого сообщения при запуске сервера, сервер, скорее всего, не находит программу оболочки в ожидаемом месте или исполняемый файл не установлен с setuid root.
Если вы хотите впервые включить механизм suEXEC, а сервер Apache HTTP уже запущен, вам необходимо остановить и перезапустить httpd. Перезапуск с помощью простого сигнала HUP или USR1 будет недостаточно.
Если вы хотите отключить suEXEC, вы должны остановить и перезапустить httpd после удаления файла suexec.
Использование suEXEC
Запросы к программам CGI вызовут оболочку suEXEC только если они предназначены для виртуального хоста, содержащего директиву SuexecUserGroup или если они обрабатываются mod_userdir.
Виртуальные хосты:
Один из способов использования оболочки suEXEC — через директиву SuexecUserGroup в определениях VirtualHost. Установив эту директиву на значения, отличные от идентификатора пользователя основного сервера, все запросы к ресурсам CGI будут выполняться от имени пользователя и группы, определенных для этого <VirtualHost>. Если эта директива не указана для <VirtualHost>, предполагается идентификатор пользователя основного сервера.
Каталоги пользователей:
Запросы, обрабатываемые mod_userdir будут вызывать оболочку suEXEC для выполнения программ CGI от имени пользователя запрашиваемого каталога пользователя. Единственное требование для работы этой функции — разрешение выполнения CGI для пользователя, и сценарий должен пройти проверку безопасности, описанную выше. См. также --with-suexec-userdir параметр времени компиляции.
Отладка suEXEC
Оболочка suEXEC будет записывать информацию журнала в файл, определенный параметром --with-suexec-logfile, как указано выше. Если вы считаете, что оболочка на настроена и установлена правильно, проверьте этот журнал и журнал ошибок сервера, чтобы понять, где вы допустили ошибку.
Осторожно: предупреждения и примеры
ПРИМЕЧАНИЕ! Этот раздел может быть неполным.
Существуют некоторые моменты, связанные с оболочкой, которые могут ограничить настройку сервера. Проверьте их, прежде чем сообщать о «багах» в suEXEC.
Важные моменты suEXEC
- Ограничения иерархии
По соображениям безопасности и эффективности, все запросы suEXEC должны оставаться либо в корневом каталоге верхнего уровня для запросов виртуальных хостов, либо в корневом каталоге верхнего уровня личного каталога для запросов userdir. Например, если у вас четыре настроенных VirtualHost, вам необходимо структурировать все каталоги документов ваших VHost из одной основной иерархии каталогов httpd, чтобы использовать suEXEC для VirtualHost. (Пример будет предоставлен.)
- Переменная среды PATH suEXEC
Это может быть опасно для изменения. Убедитесь, что каждый путь, который вы включаете в это определение, является доверенным каталогом. Вы не хотите открыть людям доступ к тому, чтобы кто-то из другой страны запустил у них троянского коня.
- Изменение кода suEXEC
Опять же, это может привести к серьезным проблемам, если вы это сделаете, не понимая, что делаете. Старайтесь избегать этого, если это возможно.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/suexec.html