Полное руководство по защите, усилению защиты и повышению производительности веб-сервера Nginx
Учитывая то замечательное, что вы слышали о Nginx, возможно, вы решили попробовать. Возможно, вам он настолько понравился, что вы подумываете о замене ваших установок Apache на Nginx после прочтения некоторых статей по этой теме, которые мы опубликовали на этом сайте.
Если да, то я уверен, что вы примете это руководство с распростертыми объятиями, поскольку мы собираемся рассмотреть 12 советов по повышению безопасности ваших серверов Nginx (от обновления Nginx до используя TLS и перенаправляя HTTP на HTTPS), и вы заметите, что некоторые из них очень похожи на то, что вы бы сделали с Apache.
Не пропустите:
13 советов по безопасности и усилению безопасности веб-сервера Apache
25 приемов Apache Htaccess для защиты веб-сервера Apache
Среда тестирования Nginx
В этом руководстве мы будем использовать следующую среду:
- Debian GNU/Linux 8.1 (Джесси).
-
IP-адрес: 192.168.0.25 (tecmintlovesnginx.com) и 192.168.0.26 (nginxmeanspower.com), как описано в виртуальном IP-интерфейсе. раздел хостов на
- «Как настроить виртуальные хосты на основе имени и IP (серверные блоки) с помощью Nginx»
Имея это в виду, давайте начнем.
СОВЕТ №1: Поддерживайте актуальность Nginx
На момент написания этой статьи последними версиями Nginx в репозиториях CentOS (в EPEL) и Debian являются 1.6.3 и 1.6.2-5 . соответственно.
Не пропустите: Установите последнюю стабильную версию Nginx из репозиториев и исходных кодов.
Хотя устанавливать программное обеспечение из репозиториев проще, чем компилировать программу из исходного кода, последний вариант имеет два преимущества: 1) он позволяет встраивать в Nginx дополнительные модули (например, mod_security) и 2) он всегда предоставляет более новую версию. чем репозитории (1.9.9 на сегодняшний день). Примечания к выпуску всегда доступны на веб-сайте Nginx.
Не пропустите:
Защитите Apache от грубой силы и DDoS-атак с помощью Mod_Security и Mod_Evasive
СОВЕТ №2: удалите ненужные модули в Nginx
Чтобы явно удалить модули из Nginx при установке из исходного кода, выполните:
./configure --without-module1 --without-module2 --without-module3
Например:
./configure --without-http_dav_module --withouthttp_spdy_module
Как вы, вероятно, догадались, удаление модулей из предыдущей установки Nginx из исходного кода требует повторной компиляции.
Предостережение: директивы конфигурации предоставляются модулями. Убедитесь, что вы не отключили модуль, содержащий директиву, которая вам понадобится в будущем! Прежде чем принимать решение об отключении модулей, вам следует проверить документацию nginx на наличие списка директив, доступных в каждом модуле.
СОВЕТ №3: Отключите директиву server_tokens в Nginx
Директива server_tokens
сообщает Nginx отображать текущую версию на страницах ошибок. Это нежелательно, поскольку вы не хотите делиться этой информацией со всем миром, чтобы предотвратить атаки на ваш веб-сервер, вызванные известными уязвимостями в этой конкретной версии.
Чтобы отключить директиву server_tokens
, установите ее значение off внутри блока сервера:
server {
listen 192.168.0.25:80;
server_tokens off;
server_name tecmintlovesnginx.com www.tecmintlovesnginx.com;
access_log /var/www/logs/tecmintlovesnginx.access.log;
error_log /var/www/logs/tecmintlovesnginx.error.log error;
root /var/www/tecmintlovesnginx.com/public_html;
index index.html index.htm;
}
Перезапустите nginx и проверьте изменения:
СОВЕТ № 4: Запретите HTTP-агенты пользователя в Nginx
Пользовательский агент HTTP — это программное обеспечение, которое используется для согласования контента с веб-сервером. Сюда также входят вредоносные боты и сканеры, которые могут в конечном итоге повлиять на производительность вашего веб-сервера, тратя системные ресурсы.
Чтобы упростить ведение списка нежелательных пользовательских агентов, создайте файл (например, /etc/nginx/blockuseragents.rules
) со следующим содержимым:
map $http_user_agent $blockedagent {
default 0;
~*malicious 1;
~*bot 1;
~*backdoor 1;
~*crawler 1;
~*bandit 1;
}
Затем поместите следующую строку перед определением блока сервера:
include /etc/nginx/blockuseragents.rules;
И оператор if для возврата ответа 403, если строка пользовательского агента находится в черном списке, определенном выше:
Перезапустите nginx, и всем пользовательским агентам, чья строка соответствует указанной выше, будет заблокирован доступ к вашему веб-серверу. Замените 192.168.0.25 на IP-адрес вашего сервера и смело выбирайте другую строку для переключателя --user-agent
wget:
wget http://192.168.0.25/index.html
wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html
СОВЕТ №5: отключите нежелательные методы HTTP в Nginx
Методы HTTP, также известные как глаголы, указывают желаемое действие, которое необходимо выполнить над ресурсом, обслуживаемым Nginx. Для обычных веб-сайтов и приложений следует разрешить только GET, POST и HEAD и отключить все остальные.
Для этого поместите следующие строки внутри блока сервера. HTTP-ответ 444 означает пустой ответ и часто используется в Nginx для обмана атак вредоносных программ:
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 444;
}
Для проверки используйте curl, чтобы отправить запрос DELETE, и сравните результат с обычным запросом GET:
curl -X DELETE http://192.168.0.25/index.html
curl -X POST http://192.168.0.25/index.html
СОВЕТ №6: Установите ограничения размера буфера в Nginx
Чтобы предотвратить атаки переполнения буфера на ваш веб-сервер Nginx, установите следующие директивы в отдельном файле (например, создайте новый файл с именем /etc/nginx/conf.d/buffer.conf
):
client_body_buffer_size 1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
Приведенные выше директивы гарантируют, что запросы к вашему веб-серверу не вызовут переполнение буфера в вашей системе. Еще раз обратитесь к документации для получения более подробной информации о том, что делает каждый из них.
Затем добавьте директиву include в файл конфигурации:
include /etc/nginx/conf.d/*.conf;
СОВЕТ №7: Ограничьте количество подключений по IP в Nginx
Чтобы ограничить соединения по IP, используйте директивы limit_conn_zone
(в контексте http или, по крайней мере, вне блока сервера) и limit_conn (в контексте http, блока сервера или контекста местоположения).
Однако имейте в виду, что учитываются не все соединения — а только те, у которых запрос обработан сервером и прочитан весь его заголовок запроса.
Например, давайте установим максимальное количество подключений равным 1
(да, это преувеличение, но в данном случае оно отлично справится со своей задачей) в зоне с именем addr (вы можете установить любое значение имя по вашему желанию):
limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 1;
Простой тест с использованием Apache Benchmark (выполнение загрузки Nginx), в котором всего 10
соединений выполняется с 2
одновременными запросами, поможет нам продемонстрировать нашу точку зрения:
ab -n 10 -c 2 http://192.168.0.25/index.html
Дополнительную информацию смотрите в следующем совете.
СОВЕТ № 8: Настройка журналов монитора для Nginx
После выполнения теста, описанного в предыдущем совете, проверьте журнал ошибок, определенный для блока сервера:
Вы можете использовать grep для фильтрации журналов неудачных запросов, отправленных в зону addr, определенную в СОВЕТ № 7:
grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto
Аналогичным образом вы можете отфильтровать журнал доступа на предмет интересующей информации, например:
- IP-адрес клиента
- Тип браузера
- Тип HTTP-запроса
- Запрошенный ресурс
- Блокировка сервера, отвечающая на запрос (полезно, если несколько виртуальных хостов регистрируются в одном файле).
И примите соответствующие меры, если обнаружите какую-либо необычную или нежелательную активность.
СОВЕТ №9: предотвратите хотлинкинг изображений в Nginx
Хотлинкинг изображений происходит, когда человек отображает на другом сайте изображение, размещенное на вашем. Это приводит к увеличению использования вами полосы пропускания (за что вы платите), в то время как другой человек с радостью отображает изображение, как если бы оно было его или ее собственностью. Другими словами, для вас это двойная потеря.
Например, предположим, что у вас есть подкаталог с именем img
внутри вашего серверного блока, где вы храните все изображения, используемые на этом виртуальном хосте. Чтобы запретить другим сайтам использовать ваши изображения, вам необходимо вставить следующий блок местоположения в определение вашего виртуального хоста:
location /img/ {
valid_referers none blocked 192.168.0.25;
if ($invalid_referer) {
return 403;
}
}
Затем измените файл index.html
на каждом виртуальном хосте следующим образом:
-
192.168.0.26
192.168.0.25
- <!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Nginx means power</title>
</head>
<body>
<h1>Nginx means power!</h1>
<img src=”http://192.168.0.25/img/nginx.png” />
</body>
</html>
<head>
Tecmint любит Nginx
<body>
Tecmint любит Nginx!