Пункт 25. Поддержка suEXEC
Функция suEXEC предоставляет пользователям HTTP-сервера Apache возможность запускать программы CGI и SSI под идентификаторами пользователей, отличными от идентификаторов пользователя вызывающего веб-сервера. Обычно, когда программа CGI или SSI выполняется, она запускается от имени того же пользователя, который запускает веб-сервер.
При правильном использовании эта функция может значительно снизить риски безопасности, связанные с предоставлением пользователям возможности разрабатывать и запускать частные программы CGI или SSI. Однако, если suEXEC настроен неправильно, это может вызвать множество проблем и, возможно, создать новые дыры в безопасности вашего компьютера. Если вы не знакомы с управлением корневыми программами setuid и связанными с ними проблемами безопасности, мы настоятельно рекомендуем вам не использовать suEXEC.
Прежде чем мы начнем
Прежде чем с головой погрузиться в этот документ, вы должны знать, что в отношении вас и среды, в которой вы будете использовать suexec, делаются определенные предположения.
Во-первых, предполагается, что вы используете производную от UNIX операционную систему, поддерживающую
операции setuid и setgid . Все примеры команд приведены в связи с этим. Другие платформы, если они поддерживают suEXEC, могут отличаться по своей конфигурации.
Во-вторых, предполагается, что вы знакомы с некоторыми основными понятиями безопасности вашего компьютера и его администрирования. Это включает в себя понимание
операций setuid/setgid и различных эффектов, которые они могут оказывать на вашу систему и ее уровень безопасности.
В-третьих, предполагается, что вы используете
немодифицированную версию кода suEXEC. Весь код для suEXEC был тщательно изучен и протестирован разработчиками, а также многочисленными бета-тестерами. Были приняты все меры предосторожности для обеспечения простой, но надежной базы кода. Изменение этого кода может привести к непредвиденным проблемам и новым угрозам безопасности. Настоятельно рекомендуется не изменять код suEXEC, если вы хорошо не разбираетесь в особенностях программирования безопасности и готовы поделиться своей работой с командой разработчиков HTTP-сервера Apache для рассмотрения .
В-четвертых, и последнее, это было решение группы разработчиков Apache HTTP Server НЕ делать suEXEC частью установки Apache httpd по умолчанию. С этой целью конфигурация suEXEC требует от администратора особого внимания к деталям. После должного рассмотрения различных настроек suEXEC администратор может установить suEXEC обычными методами установки. Значения этих параметров должны быть тщательно определены и указаны администратором для надлежащего обеспечения безопасности системы при использовании функций suEXEC. Именно с помощью этого подробного процесса мы надеемся ограничить установку suEXEC только теми, кто достаточно осторожен и решителен, чтобы использовать его.
Все еще с нами? Да? Хороший. Давайте двигаться дальше!
Модель безопасности suEXEC
Прежде чем мы начнем настройку и установку suEXEC, мы сначала обсудим модель безопасности, которую вы собираетесь внедрить. Таким образом вы сможете лучше понять, что именно происходит внутри suEXEC и какие меры предосторожности принимаются для обеспечения безопасности вашей системы.
suEXEC основан на программе-оболочке setuid, которая вызывается основным HTTP-сервером Apache. Эта оболочка вызывается при выполнении HTTP-запроса для программы CGI или SSI, которую администратор назначил для запуска с идентификатором пользователя, отличным от идентификатора главного сервера. Когда делается такой запрос, Apache httpd предоставляет оболочке suEXEC имя программы, а также идентификаторы пользователя и группы, под которыми должна выполняться программа.
Затем оболочка использует следующий процесс для определения успеха или неудачи — если какое-либо из этих условий не выполняется, программа регистрирует ошибку и завершает работу с ошибкой, в противном случае она продолжит работу:
-
Является ли пользователь, выполняющий эту оболочку, действительным пользователем этой системы?
Это делается для того, чтобы пользователь, выполняющий оболочку, действительно был пользователем системы.
-
Была ли оболочка вызвана с правильным количеством аргументов?
Оболочка будет выполняться только в том случае, если ей задано правильное количество аргументов. Правильный формат аргумента известен HTTP-серверу Apache. Если оболочка не получает нужное количество аргументов, она либо взломана, либо что-то не так с частью suEXEC вашего бинарного файла Apache httpd.
-
Разрешено ли этому действительному пользователю запускать оболочку?
Является ли этот пользователь пользователем, которому разрешено запускать эту оболочку? Только один пользователь (пользователь Apache) может выполнять эту программу.
-
Имеет ли целевая программа CGI или SSI небезопасную иерархическую ссылку?
Содержит ли путь к целевой программе CGI или SSI начальный символ «/» или обратную ссылку «..»? Это не разрешено; целевая программа CGI/SSI должна находиться в корне документа suEXEC (см.
ниже).
--with-suexec-docroot=DIR
-
Допустимо ли имя целевого пользователя?
Целевой пользователь существует?
-
Является ли имя целевой группы действительным?
Существует ли целевая группа?
-
Является ли целевой пользователь НЕ суперпользователем?
suEXEC не позволяет
выполнять программы CGI/SSI.
root
-
Целевой идентификатор пользователя ВЫШЕ минимального идентификационного номера?
Минимальный идентификационный номер пользователя указывается во время настройки. Это позволяет вам установить наименьший возможный идентификатор пользователя, которому будет разрешено выполнять программы CGI/SSI. Это полезно для блокировки «системных» учетных записей.
-
Является ли целевая группа НЕ группой суперпользователей?
В настоящее время suEXEC не позволяет
группе выполнять программы CGI/SSI.
root
-
Идентификатор целевой группы ВЫШЕ минимального идентификационного номера?
Минимальный идентификационный номер группы указывается во время настройки. Это позволяет установить наименьший возможный идентификатор группы, которому будет разрешено выполнять программы CGI/SSI. Это полезно для блокировки «системных» групп.
-
Может ли оболочка успешно стать целевым пользователем и группой?
Здесь программа становится целевым пользователем и группой через вызовы setuid и setgid. Список группового доступа также инициализируется всеми группами, членом которых является пользователь.
-
Можем ли мы изменить каталог на тот, в котором находится целевая программа CGI/SSI?
Если он не существует, он не может содержать файлы. Если мы не можем сменить каталог на него, то он может и не существовать.
-
Находится ли каталог в веб-пространстве httpd?
Если запрос относится к обычной части сервера, находится ли запрошенный каталог в корне документа suEXEC? Если запрос для UserDir
, настроен ли запрошенный каталог внутри каталога как каталог пользователя suEXEC (см. параметры конфигурации suEXEC)?
-
Является ли каталог НЕ доступным для записи кем-либо еще?
Мы не хотим открывать каталог другим; только пользователь-владелец может изменять содержимое этих каталогов.
-
Существует ли целевая программа CGI/SSI?
Если он не существует, он не может быть очень хорошо выполнен.
-
Является ли целевая программа CGI/SSI НЕ доступной для записи кем-либо еще?
Мы не хотим давать никому, кроме владельца, возможность изменять программу CGI/SSI.
-
Является ли целевая программа CGI/SSI НЕ setuid или setgid?
Мы не хотим выполнять программы, которые затем снова изменят наш UID/GID.
-
Целевой пользователь/группа совпадает с пользователем/группой программы?
Является ли пользователь владельцем файла?
-
Можем ли мы успешно очистить технологическую среду, чтобы обеспечить безопасность операций?
suEXEC очищает среду процесса, устанавливая ПУТЬ безопасного выполнения (определяемый во время настройки), а также пропуская только те переменные, имена которых указаны в списке безопасной среды (также созданном во время настройки).
-
Можем ли мы успешно стать целевой программой 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
s), которую можно использовать для поведения 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 . Чтобы оболочка могла установить идентификатор пользователя, она должна быть установлена как владелец и должна иметь установленный бит выполнения setuserid для файловых режимов. root
Установка параноидальных разрешений
Хотя оболочка suEXEC проверит, что ее вызывающий пользователь является правильным пользователем, как указано в параметре
--with-suexec-caller
configure
, всегда существует вероятность того, что системный или библиотечный вызов, который suEXEC использует перед этой проверкой, может быть использован в вашей системе. Чтобы противостоять этому и потому, что это в целом является передовой практикой, вы должны использовать разрешения файловой системы, чтобы гарантировать, что работает только группа httpd, которая может выполнять suEXEC.
Если, например, ваш веб-сервер настроен на работу как:
Пользователь www
Групповая веб-группа
и 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 в первый раз, а HTTP-сервер Apache уже запущен, вы должны убить и перезапустить httpd. Перезапуска простым сигналом HUP или USR1 будет недостаточно.
Если вы хотите отключить suEXEC, вы должны убить и перезапустить httpd после удаления файла suexec
.
Использование suEXEC
Запросы для программ CGI будут вызывать оболочку suEXEC, только если они предназначены для виртуального хоста, содержащего директиву SuexecUserGroup
, или если они обрабатываются mod_userdir
.
Виртуальные хосты:
один из способов использования оболочки suEXEC — через SuexecUserGroup
директиву в
VirtualHost
определениях. Установив для этой директивы значения, отличные от идентификатора пользователя основного сервера, все запросы на ресурсы CGI будут выполняться как Пользователь
и Группа , определенные для этого <VirtualHost>
. Если эта директива не указана для a, <VirtualHost>
то предполагается идентификатор пользователя основного сервера.
Пользовательские каталоги:
запросы, которые обрабатываются, mod_userdir
будут вызывать оболочку suEXEC для выполнения программ CGI под идентификатором пользователя запрошенного пользовательского каталога. Единственным требованием, необходимым для работы этой функции, является разрешение выполнения CGI для пользователя и соответствие сценария проверкам безопасности, указанным выше. См. также
--with-suexec-userdir
параметр времени компиляции.
Отладка suEXEC
Оболочка suEXEC будет записывать информацию журнала в файл, определенный с помощью --with-suexec-logfile
параметра, как указано выше. Если вы считаете, что правильно настроили и установили оболочку, просмотрите этот журнал и журнал ошибок для сервера, чтобы увидеть, где вы, возможно, сбились с пути.
Остерегайтесь бармаглота: предупреждения и примеры
ПРИМЕЧАНИЕ! Этот раздел может быть неполным. Последнюю редакцию этого раздела документации см. в версии онлайн-документации.
Есть несколько интересных моментов, касающихся оболочки, которые могут вызвать ограничения при настройке сервера. Пожалуйста, ознакомьтесь с ними, прежде чем отправлять какие-либо «ошибки» относительно suEXEC.
- Достопримечательности suEXEC
-
Ограничения иерархии
По соображениям безопасности и эффективности все запросы suEXEC должны оставаться либо в корневом каталоге документов верхнего уровня для запросов виртуального хоста, либо в одном корневом каталоге личных документов верхнего уровня для запросов userdir. Например, если у вас настроено четыре виртуальных хоста, вам потребуется структурировать все корни документов ваших виртуальных хостов из одной основной иерархии документов httpd, чтобы воспользоваться преимуществами suEXEC для виртуальных хостов. (Пример ожидается.)
-
переменная среды PATH suEXEC
Менять это может быть опасно. Убедитесь, что каждый путь, который вы включаете в это определение, является
доверенным каталогом. Вы же не хотите открывать людей для того, чтобы кто-то со всего мира запускал на них троянского коня.
-
Изменение кода suEXEC
Опять же, это может вызвать большие проблемы , если вы попробуете это, не зная, что делаете. Держитесь подальше от него, если это вообще возможно.