Nginx セキュリティ強化ガイド
本番環境でそのまま使える Nginx セキュリティ設定テンプレート。セキュリティヘッダー、SSL強化、gzip圧縮、ACME自動更新をカバー。
1. セキュリティヘッダー
HSTS — HTTPS強制
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
X-Frame-Options — クリックジャッキング防止
add_header X-Frame-Options "SAMEORIGIN" always;
CSP — コンテンツセキュリティポリシー
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://giscus.app; style-src 'self' 'unsafe-inline' https://giscus.app; img-src 'self' data: https:; font-src 'self'; connect-src 'self' https://giscus.app; frame-src https://giscus.app; frame-ancestors 'self';" always;
ポイント: Giscus などのサードパーティコンポーネントがある場合、ドメインを明示的に許可する必要がある。
2. SSL 強化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
3. Gzip 圧縮
13種類のMIMEタイプ。HTML圧縮率81%(29KB → 5.6KB)。
4. ACME 自動更新
HTTP 80 ポート設定
server {
listen 80;
server_name example.com www.example.com;
# ACME challenge — リダイレクトしない
location /.well-known/acme-challenge/ {
root /var/www/example.com;
default_type "text/plain";
}
location / {
return 301 https://www.example.com$request_uri;
}
}
⚠️ 重要: ベアドメインをwwwに301リダイレクトする場合、ACME検証リクエストもリダイレクトされて失敗する。/.well-known/acme-challenge/ を個別に許可する必要がある。
5. Nginx アップグレード
1.30 の構文変更
# 旧構文(非推奨)
listen 443 ssl http2;
# 新構文
listen 443 ssl;
http2 on;