Рассмотрим типовую схему веб-сервера: nginx используется в качестве фронтэнда (front-end), apache2 — бэкэнда (back-end). Установка пакетов из репозитариев дает стандартную конфигурацию, которая применима для сервера разработки и тестирования. Однако, стоковая конфигурация изначально подстроена под большой класс задач и требует доработки. В частности, в плане безопасности. Опишем минимум настроек, которые необходимо сделать, если настраиваемый сервер выходит в интернет для широкого использования.
apache2
Отключаем потенциально опасные и просто неиспользуемые модули, а также неиспользуемые подконфиги. Почти всегда можно (и нужно) отключить:
- модуль autoindex, позволяющий просматривать содержимое директории при отсутствии индексного файла,
- обработку cgi-bin, которая в deb-based системах лежит в конфиге
serve-cgi-bin.conf
и используется очень редко, - Другие неиспользуемые модули (список которых зависит от выкладываемого кода). Т.е. необходимо перешерстить директории
mods-enabled
,conf-enabled
На продакшн-сервере пользователю не нужно знать точную версию апача. Вообще, подобной информации должно отдаваться как можно меньше. Формат этой информации регулируется параметром ServerTokens
, который по умолчанию обычно выставлен в OS
и в результате веб-сервер выдает что-то вроде
Apache/2.4.10 (Debian) Server at ...
Этот параметр, как и некоторые другие настройки безопасности в debian-системах обычно находится в конфиге /etc/apache2/conf-available/security.conf
. Переключаем в менее информативную и, соответственно, более безопасную версию:
#ServerTokens Minimal #ServerTokens OS #ServerTokens Full ServerTokens Prod
Аналогичным образом стоит поступить с подписью сервера на «ошибочных» страницах
ServerSignature Off #ServerSignature On
и трассировкой
TraceEnable Off
Последняя обычно уже отключена, но в этом необходимо убедиться.
Код некоторых выкладываемых сайтов может содержать скрытые файлы, вроде .gitignore
, .svn
и других, раскрывающих стуктуру кода. Их желательно отключить здесь же, в апаче, или в фронт-энде. Можно отключить сразу все скрытые файлы:
<DirectoryMatch "/\."> Require all denied </DirectoryMatch>
Полезную информацию можно также подчерпнуть из первоисточников: апачевского, дебиановского. При этом, последняя статья несколько выходит за пределы настроек самого апача.
Некоторые из правил для бэкэнда закрывают те же места, что и в фронтэнде. Даже если каким-то образом будет поломана конфигурация nginx, уязвимость все равно не реализуется.
Отключим доступ к скрытым файлам — в секции виртуалхоста добавляем:
RedirectMatch 404 /\..*$
Такие файлы нередко встречаются в проектах. В частности, системы контроля версий вроде git
, svn
. Эта метаинформация не должна попадать в прошакш, тем не менее следует превентивно защититься от такой возможности.
Если VirtualHost на сервере не один, то также не плохо будет раскомментировать секцию
AllowOverride None Order Deny,Allow Deny from all
которая отключает доступ ко всем файлам из корня. Естественно, чтобы виртуалхост работал нужно включить доступ к самой директории виртуалхоста по типу
AllowOverride All Order Deny,Allow Allow from all
Я не описываю настройку прав доступа (пользователь:группа) на уровне ОС и файловой системы и использование модуля mpm_itk
с директивой AssignUserID
. Это тоже должно быть сделано для серверов, на которых такое разделение требуется.
nginx
Отключим отображение скрытых файлов:
location ~ /\. { deny all; }
nginx используется как frontend, и если на нем отдается контент по https, то повышаем его безопасность. Для начала отключаем SSLv3 и другие небезопасные протоколы. Если nginx свежий, то в нем это уже и так отключено, поэтому лучше просто обновиться.
Генерируем параметры обмена ключами Diffie-Hellman (которые могут генерироваться достаточно долго, запаситесь временем)
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
и затем подключаем их в энжинксе
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
Можно оставить только сильные шифры, но при этом старые браузеры могут не поддерживаться. Если на совместимость с ними не ориентироваться, то можно смело включать
ssl_ciphers 'AES256+EECDH:AES256+EDH:!aNULL';
Также имеет смысл включить кеширование
ssl_session_cache shared:SSL:10m;
После всех настроек желательно проверить их корректность в каком-нибудь сервисе, например, этом.
PHP
Как и в случае апача скрываем версию
expose_php = Off
В зависимости от задач можно отключить вывод ошибок:
error_reporting = 0 display_errors = Off
Проверки
Получим заголовки с сайта и проверим, что важные параметры действительно не раскрываются:
HEAD example.com
Также побродим по сайту, в том числе по страницам, которые генерируют 4xx и 5xx ошибки, проверим, что версии софта не раскрываются и тем более не раскрывается внутренняя структура сервиса.
Завершающие замечания
Если на сервере хостится несколько сайтов, то многие из приведённых выше настроек повышают безопасность лишь частично. Сделать хорошую защиту между виртуалхостами на одной машине принципиально будет достаточно сложно. Если такое требуется — лучше смотреть в сторону виртуализации уровня операционной системы, по образцу OpenVZ
или lxc
.
Со временем пост будет пополняться.