Безопасность
1.Блокировка определенных User-Agents.
Создаем файл с запрещенными User-Agent-ами
1 |
# nano /etc/nginx/blockuseragents.rules |
1 2 3 4 5 6 7 8 |
map $http_user_agent $blockedagent { default 0; ~*malicious 1; ~*bot 1; ~*backdoor 1; ~*crawler 1; ~*bandit 1; } |
Подключаем файл с запрещенными User-Agent-ами(вставляем перед секцией server)
1 |
include /etc/nginx/blockuseragents.rules; |
Добавляем в секцию server запрет для указанных в файле User-Agents
1 2 3 4 5 6 |
server { if ($blockedagent) { return 444; } …… } |
Либо второй вариант.
Например , защита от сканеров
1 2 3 4 5 |
server { if ( $http_user_agent ~* (nmap|nikto|wikto|sf|sqlmap|bsqlbf|w3af|acunetix|havij|appscan) ) { return 444; } } |
Тестируем
1 |
# wget --user-agent "I am a bandit" http://example.com/index.html |
2.Защита от HotLink.
Для конкретного location
1 2 3 4 5 6 7 8 |
location /images/ { # Или для определенных типов файлов #location ~ .(gif|png|jpe?g)$ { valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 444; } } |
3.Защита от реферального спама.
1 2 3 |
if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) ) { return 444; } |
4. Отключение нежелательных HTTP-методов.
1 2 3 |
if ($request_method !~ ^(GET|HEAD|POST)$) { return 444; } |
Тестируем
1 |
# curl -X DELETE https://kamaok.org.ua/index.html |
5.Запрет выполнения скриптов внутри каталогов с правом записи
1 2 3 |
location ~* /(images|cache|media|logs|tmp)/.*.(php|pl|py|jsp|asp|sh|cgi)$ { return 403; } |
6.Запрет доступа к скрытым файлам/каталогам
1 2 3 |
location ~ /\. { deny all; } |
7. Ограничение доступа по IP-адресам и по паролю
Разрешить доступ по IP-адресам.
1 2 3 4 5 6 |
location / { allow 127.0.0.1; allow 192.168.1.0/24; allow WWW.XXX.YYY.ZZZ; deny all; } |
Разрешить доступ по паролю
1 2 3 4 |
location / { auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; } |
Разрешить доступ ИЛИ по IP-адресам ИЛИ по паролю
(т.е для доступа достаточно выполнить ОДНО из условий)
1 2 3 4 5 6 7 8 9 |
location / { allow 127.0.0.1; allow 192.168.1.0/24; allow WWW.XXX.YYY.ZZZ; deny all; auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; satisfy any; } |
Разрешить доступ по IP-адресам И по паролю
(т.е для доступа нужно выполнить ДВА условия одновременно)
1 2 3 4 5 6 7 8 9 |
location / { allow 127.0.0.1; allow 192.168.1.0/24; allow WWW.XXX.YYY.ZZZ; deny all; auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; satisfy all; } |
8.Wordpress — усиление безопасности.
1 2 3 4 5 6 7 8 |
location ~* wp-admin/includes { deny all; } location ~* wp-includes/theme-compat/ { deny all; } location ~* wp-includes/js/tinymce/langs/.*.php { deny all; } #location /wp-includes/ { internal; } location ~* ^/wp-content/uploads/.*.(php|pl|py|jsp|asp|htm|html|shtml|sh|cgi)$ { types { } default_type text/plain; } |
9.Добавление заголовков для отладки/получения дополнительной информации
В секцию server
1 2 3 |
add_header X-Host $hostname; add_header X-Request-ID $request_id; add_header X-TCP-RTT $tcpinfo_rtt; |
1 |
# curl --head https://mydomain.com |
1 2 3 4 |
……… X-Host: servername.com X-Request-ID: e6bda10f25288238d1de877b75050c8a X-TCP-RTT: 6250 |
1 2 3 |
X-Host – имя сервера,который отдал ответ клиенту X-TCP-RTT-Round Trip Time(RTT) – время(в микросекундах),показывающее сетевую производительность между сервером и клиентом X-Request-ID – 16-и байтный уникальный идентификатор для удобства отслеживания логов |
По умолчанию эти дополнительные заголовки будут добавляться только для ответов с кодом 20x и 30x . Если необходимо добавлять для страниц ошибок(код ответа 404), необходимо добавить опцию always в конец каждой директивы add_header
1 2 3 |
add_header X-Host $hostname always; add_header X-Request-ID $request_id always; add_header X-TCP-RTT $tcpinfo_rtt always; |
Перенаправления
1.Перенаправление с non-www на www.
1 2 3 4 5 6 7 8 9 10 |
server { listen 80; server_name example.org; return 301 $scheme://www.example.org$request_uri; } server { listen 80; server_name www.example.org; ... } |
2.Перенаправление с www на non-www.
1 2 3 4 5 6 7 8 9 10 |
server { listen 80; server_name www.example.org; return 301 $scheme://example.org$request_uri; } server { listen 80; server_name example.org; … } |
3.Перенаправление с HTTP на HTTPS.
1 2 3 4 5 |
server { listen 80; server_name example.org www.example.org; return 301 https://$host$request_uri; } |
SSL для Nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
server { listen 443 ssl; server_name example.org www.example.org; ssl_certificate /path/to/signed_cert_plus_intermediates; ssl_certificate_key /path/to/private_key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_dhparam /etc/ssl/certs/dhparam.pem; # https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ## Improves TTFB by using a smaller SSL buffer than the nginx default ssl_buffer_size 8k; ## Enables OCSP stapling ssl_stapling on; resolver 8.8.8.8; ssl_stapling_verify on; # Enable this if your want HSTS (recommended) # add_header Strict-Transport-Security max-age=15768000; … } |
Создаем ключ Диффи-Хельдмана.
1 |
# openssl dhparam -out /etc/ssl/certs /dhparam.pem 2048 |
4.Перенаправление на страницу.
1 2 3 4 5 |
server { location = /oldpage.html { return 301 http://example.org/newpage.html; } } |
5.Перенаправление на сайт
1 2 3 4 |
server { server_name old-site.com return 301 $scheme://new-site.com$request_uri; } |
Источник:
http://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html
http://www.tecmint.com/nginx-web-server-security-hardening-and-performance-tips/
http://habrahabr.ru/post/272381/