Руководство по усилению безопасности Nginx веб-сервера
Nginx - самый быстрорастущий веб-сервер в отрасли, и в настоящее время он занимает 31% доли рынка.
Первоначально он был выпущен в 2004 году, и с тех пор заработал отличную репутацию и обслуживает серверы многих высоконагруженных российских сайтов, таких как Яндекс, ВКонтакте, Mail.Ru, Рамблер и т.д
Для этого есть причина - Nginx работает быстро.
В этой статье я расскажу о некоторых важных руководствах по защите веб-сервера Nginx. Итак, начнем.
SSL/TLS
Внедрение SSL-сертификата
Первым шагом в веб-безопасности является внедрение SSL, чтобы вы могли получить доступ к веб-приложениям по протоколу https и добавить уровень шифрования при общении.
- Используйте OpenSSL для генерации CSR с 2048 битами и sha-2
openssl req -nodes -new -sha256 -newkey rsa:2048 -keyout bestflare.key -out bestflare.csr
- Приведенная выше команда сгенерирует файлы CSR и файлы ключей при текущей работе напрямую. Не забудьте изменить имя файла .csr и .key.
Получите CSR, подписанный центром сертификации, и, получив сертификат, вы можете реализовать его в Nginx, как показано ниже.
- Вход на сервер Nginx
- Перейдите в папку conf, где у вас есть файл ssl.conf.
Примечание. При установке по умолчанию в Linux этот файл будет находиться в /etc/nginx/conf.d.
- Отредактируйте файл и добавьте следующее, что позволит Nginx прослушивать порт 443
server {
listen 443 ssl;
server_name bestflare.com;
ssl on;
ssl_certificate /opt/cert/bestflare.pem;
ssl_certificate_key /opt/cert/bestflare.key;
}
Примечание: не забудьте изменить путь к сертификату и файлу ключа.
- Сохраните конфигурацию и перезапустите Nginx. Сертификат SSL успешно внедрен.
Отключите SSL 3 и оставьте только TLS
SSL 3 уязвим, и мы допустим только надежный протокол TLS.
- Отредактируйте файл ssl.conf и добавьте ниже в блоке сервера
ssl_protocols TLSv1.2;
Сохраните файл ssl.conf и перезапустите Nginx
Отключить слабые комплекты шифрования
Слабые комплекты шифров могут привести к уязвимости, например, к перебою и поэтому нам нужно разрешить только надежный шифр.
- Добавьте следующее в блок сервера в файле ssl.conf
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
- Сохраните файл и перезапустите Nginx
Установить цепной сертификат (Chain Certificate)
Отсутствие цепного сертификата также влияет на общий рейтинг, и это может привести к ошибке при просмотре в современном браузере, таком как Chrome. Вам необходимо получить цепной сертификат.
- Добавьте содержимое сертификата цепочки в сертификат сайта, как показано ниже. В моем примере это будет /opt/cert/bestflare.pem
- Сохраните файл и перезапустите Nginx
Безопасность веб-приложений
Конфигурация Nginx по умолчанию не идеальна и может иметь много уязвимостей, поэтому мы укрепляем их, чтобы сделать ее безопасной.
Отключить нежелательные методы HTTP
В большинстве случаев вам нужно просто получить HTTP-запрос GET, HEAD & POST в вашем веб-приложении. Разрешение TRACE или DELETE сопряжено с риском, так как может разрешить атаку по межсайтовому отслеживанию и потенциально позволить хакеру украсть информацию о cookie.
- Измените default.conf и добавьте следующее под блоком сервера
if ($request_method !~ ^(GET|HEAD|POST)$ )
{
return 405;
}
Сохраните файл и перезапустите Nginx. Теперь будет отображаться 405 Not Allowed, если кто-то пытается использовать TRACE, DELETE, PUT, OPTIONS.
Chandans-iMac:~ chandan$ telnet bestflare.com 80
Trying 128.199.100.162...
Connected to bestflare.com.
Escape character is '^]'.
TRACE / HTTP/1.1
Host: testing
HTTP/1.1 405 Not Allowed
Server: nginx
Date: Sat, 11 Jul 2015 06:04:34 GMT
Content-Type: text/html
Content-Length: 166
Connection: close
Кликджекинг (Clickjacking) атака
Вы можете ввести X-FRAME-OPTIONS в заголовок HTTP, чтобы предотвратить атаку с помощью кликджекинга.
Это достигается путем добавления ниже в файл nginx.conf
add_header X-Frame-Options "SAMEORIGIN";
Заголовок будет указывать браузеру загружать ресурсы ТОЛЬКО из того же источника.
X-XSS Защита
Внедрить HTTP-заголовок с защитой X-XSS для предотвращения атаки межсайтовых скриптов.
Измените файл default.conf или ssl.conf, чтобы добавить следующее
add_header X-XSS-Protection "1; mode=block";
- Сохраните файл конфигурации и перезапустите Nginx.