Руководство по усилению безопасности Nginx веб-сервера

Nginx - самый быстрорастущий веб-сервер в отрасли, и в настоящее время он занимает 31% доли рынка.

Первоначально он был выпущен в 2004 году, и с тех пор заработал отличную репутацию и обслуживает серверы многих высоконагруженных российских сайтов, таких как Яндекс, ВКонтакте, Mail.Ru, Рамблер и т.д

Nginx

Для этого есть причина - 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 успешно внедрен.
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
цепной сертификат (Chain Certificate)
  • Сохраните файл и перезапустите 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.