Поддержка 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. - Превышает ли идентификатор целевого пользователя минимальный номер ID?
Минимальный номер идентификатора пользователя задаётся при настройке. Это позволяет указать наименьший идентификатор пользователя, которому будет разрешено выполнять программы CGI/SSI. Это полезно для блокировки системных учётных записей.
- Не является ли целевая группа группой суперпользователя?
В настоящее время suEXEC не разрешает группе
rootвыполнять программы CGI/SSI. - Превышает ли идентификатор целевой группы минимальный номер ID?
Минимальный номер идентификатора группы задаётся при настройке. Это позволяет указать наименьший идентификатор группы, которому будет разрешено выполнять программы 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, которая по умолчанию никогда не устанавливается и не активируется. Чтобы APACI принял запрос на использование функции suEXEC, вместе с параметром
--enable-suexecнеобходимо указать хотя бы один параметр--with-suexec-xxxxx. --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», в качестве корневого каталога документов для обёртки suEXEC будет использоваться каталог «/home/apache/htdocs». --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.
Настройка максимально строгих прав доступа
Хотя обёртка suEXEC проверяет, что её вызывают от имени правильного пользователя, заданного параметрами --with-suexec-caller configure, всегда существует вероятность, что системный вызов или вызов библиотеки, используемый suEXEC до этой проверки, можно использовать для атаки на вашу систему. Чтобы предотвратить это и следовать общепринятой практике, следует использовать права доступа к файловой системе, чтобы запускать suEXEC могла только группа, от имени которой работает httpd.
Например, если ваш веб-сервер настроен на запуск от имени:
User www Group webgroup
и suexec установлен в «/usr/local/apache2/bin/suexec», выполните команду:
chgrp webgroup /usr/local/apache2/bin/suexec chmod 4750 /usr/local/apache2/bin/suexec
Это гарантирует, что запускать обёртку suEXEC сможет только группа, от имени которой работает httpd.
Включение и отключение suEXEC
При запуске httpd ищет файл suexec в каталоге, заданном параметром --sbindir (по умолчанию — «/usr/local/apache/sbin/suexec»). Если httpd обнаружит правильно настроенную обёртку suEXEC, в журнал ошибок будет выведено следующее сообщение:
[notice] suEXEC mechanism enabled (wrapper: /path/to/suexec)
Если при запуске сервера вы не видите этого сообщения, скорее всего, сервер не находит программу-обёртку в ожидаемом месте или исполняемый файл установлен без бита setuid root.
Если вы хотите впервые включить механизм suEXEC, когда Apache HTTP Server уже работает, необходимо завершить процесс 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 должны оставаться либо внутри корневого каталога документов верхнего уровня для запросов к виртуальным хостам, либо внутри одного личного корневого каталога документов верхнего уровня для запросов к каталогам пользователей. Например, если настроено четыре VirtualHost, для использования suEXEC с виртуальными хостами необходимо организовать корневые каталоги документов всех ваших виртуальных хостов в единой основной иерархии документов httpd. (Пример будет добавлен позже.)
- Переменная среды 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