Knowledge Base

Базовая защита Nginx

nginx.conf — базовые настройки безопасности

Категория: Server Hardening · Риск: low

nginx.conf — базовые настройки безопасности

http {
    # Скрыть версию
    server_tokens off;

    # Ограничения
    client_max_body_size 10m;
    client_body_timeout 10;
    client_header_timeout 10;
    keepalive_timeout 5 5;
    send_timeout 10;

    # Rate limiting зоны
    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
    limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
    limit_conn_zone $binary_remote_addr zone=addr:10m;
}

Security Headers (добавить в server блок)

# HSTS — принудительный HTTPS на 1 год
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

# Запрет встраивания в iframe с чужих сайтов
add_header X-Frame-Options "SAMEORIGIN" always;

# Запрет MIME-sniffing
add_header X-Content-Type-Options "nosniff" always;

# Базовый CSP
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none';" always;

# Referrer Policy
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

# Permissions Policy
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;

Rate Limiting для эндпоинтов

location /api/ {
    limit_req zone=api burst=20 nodelay;
    limit_conn addr 10;
    proxy_pass http://backend;
}

location /login {
    limit_req zone=login burst=3 nodelay;
    proxy_pass http://backend;
}

Отключить лишние HTTP-методы

if ($request_method !~ ^(GET|POST|HEAD)$) {
    return 405;
}

Блокировка доступа к скрытым файлам

location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
}

Проверка результата

# Проверить все security headers онлайн
# https://securityheaders.com/?q=example.com

# Локальная проверка
curl -sI https://example.com | grep -iE \
  'strict-transport|x-frame|x-content|content-security|referrer|permissions'

Права на конфигурационные файлы

chown root:root /etc/nginx/nginx.conf
chmod 644 /etc/nginx/nginx.conf

# Приватный ключ TLS
chown root:root /etc/ssl/private/example.key
chmod 600 /etc/ssl/private/example.key