Djangoのセキュリティ設定「settings.SECURE_HSTS_INCLUDE_SUBDOMAINS」を徹底解説


settings.SECURE_HSTS_INCLUDE_SUBDOMAINS は、Django の SecurityMiddleware が生成する Strict-Transport-Security ヘッダーに includeSubDomains ディレクティブを含めるかどうかを制御する設定です。このディレクティブが設定されると、ブラウザは、設定されたドメイン名とすべてのサブドメインへのアクセスを HTTPS 接続に強制します。

設定方法

settings.py ファイルで以下の設定を追加することで、settings.SECURE_HSTS_INCLUDE_SUBDOMAINS を有効化できます。

SECURE_HSTS_INCLUDE_SUBDOMAINS = True

動作

settings.SECURE_HSTS_INCLUDE_SUBDOMAINSTrue に設定されている場合、SecurityMiddleware は以下の動作を行います。

  1. リクエストされたホスト名が ALLOWED_HOSTS 設定に含まれていることを確認します。
  2. リクエストされたホスト名が SECURE_SSL_HOST 設定と一致するかどうかを確認します。
  3. 上記の条件を満たす場合、以下の Strict-Transport-Security ヘッダーをレスポンスに追加します。
Strict-Transport-Security: max-age=31536000; includeSubDomains

このヘッダーは、ブラウザに対して以下の指示を与えます。

  • この指示を 31536000 秒間 (約 1 年) 記憶する。
  • 設定されたドメイン名とすべてのサブドメインへのアクセスを HTTPS 接続に強制する。

以下の例では、example.com とすべてのサブドメインへのアクセスを HTTPS 接続に強制します。

ALLOWED_HOSTS = [
    'example.com',
    '*.example.com',
]

SECURE_SSL_HOST = 'example.com'
SECURE_HSTS_INCLUDE_SUBDOMAINS = True

注意点

  • 一部の古いブラウザは Strict-Transport-Security ヘッダーをサポートしていないため、これらのブラウザでは HTTPS 接続が強制されない場合があります。
  • この設定を有効にすると、HTTP 接続でサブドメインにアクセスしようとすると、ブラウザはエラーを表示します。
  • settings.SECURE_HSTS_INCLUDE_SUBDOMAINS を有効にする前に、すべてのサブドメインが HTTPS でアクセスできることを確認する必要があります。

セキュリティ上の利点

settings.SECURE_HSTS_INCLUDE_SUBDOMAINS を有効にすることで、以下のセキュリティ上の利点を享受できます。

  • フィッシング攻撃の防止: HTTPS 接続は、偽の Web サイトを本物の Web サイトに見せかけるフィッシング攻撃を防ぐのに役立ちます。
  • Cookie ハイジャックの防止: HTTPS 接続は暗号化されているため、攻撃者が Cookie を盗み見るのを防ぐことができます。
  • Man-in-the-Middle 攻撃からの保護: この設定は、攻撃者がユーザーの HTTP リクエストを傍受して HTTPS 接続にリダイレクトするのを防ぐのに役立ちます。

settings.SECURE_HSTS_INCLUDE_SUBDOMAINS は、Django で HTTPS セキュリティを強化するための重要な設定です。すべてのサブドメインが HTTPS でアクセスできることを確認した上で、この設定を有効にすることをお勧めします。



# settings.py

ALLOWED_HOSTS = [
    'example.com',
    '*.example.com',
]

SECURE_SSL_HOST = 'example.com'
SECURE_HSTS_INCLUDE_SUBDOMAINS = True

例2:特定のサブドメインのみを含む

この例では、sub1.example.comsub2.example.com サブドメインのみHTTPS接続を強制します。

# settings.py

ALLOWED_HOSTS = [
    'example.com',
    'sub1.example.com',
    'sub2.example.com',
]

SECURE_SSL_HOST = 'example.com'
SECURE_HSTS_INCLUDE_SUBDOMAINS = True

例3:サブドメインとワイルドカードを利用する

この例では、*.sub1.example.com サブドメイン全てと sub2.example.com サブドメインに対してHTTPS接続を強制します。

# settings.py

ALLOWED_HOSTS = [
    'example.com',
    '*.sub1.example.com',
    'sub2.example.com',
]

SECURE_SSL_HOST = 'example.com'
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
  • この設定を有効にすると、HTTP接続でサブドメインにアクセスしようとすると、ブラウザはエラーを表示します。
  • settings.SECURE_HSTS_INCLUDE_SUBDOMAINS 設定を有効にする前に、全てのサブドメインがHTTPSでアクセスできることを確認してください。
  • 上記の例では、ALLOWED_HOSTS 設定と SECURE_SSL_HOST 設定も併せて記述しています。これらの設定は、settings.SECURE_HSTS_INCLUDE_SUBDOMAINS 設定と合わせて使用することで、より強固なHTTPSセキュリティを実現できます。


個別のサブドメインにHTTPS設定を適用する

サブドメインごとにHTTPS設定を個別に適用する方法です。この方法には、以下の利点と欠点があります。

利点

  • 特定のサブドメインのみHTTPS接続を強制できる
  • 個々のサブドメインに対して柔軟な設定が可能

欠点

  • サブドメインが増えると管理が煩雑になる
  • 設定が複雑になる

方法

各サブドメインに対応するWebサーバー設定ファイル(例:Apacheのhttpd.conf、Nginxのnginx.conf)で、HTTPS設定を個別に記述します。具体的な設定方法は、Webサーバーの種類によって異なります。

例:Apacheの場合

<VirtualHost *:443>
    ServerName sub1.example.com
    ServerAlias *.sub1.example.com
    SSLEngine on
    SSLCertificateFile /path/to/your/certificate.pem
    SSLCertificateKeyFile /path/to/your/private_key.pem
</VirtualHost>

例:Nginxの場合

server {
    listen 443 ssl;
    server_name sub1.example.com *.sub1.example.com;
    ssl_certificate /path/to/your/certificate.pem;
    ssl_certificate_key /path/to/your/private_key.pem;
}

リバースプロキシサーバーを利用する

リバースプロキシサーバーを介してHTTPS接続を制御する方法です。この方法には、以下の利点と欠点があります。

利点

  • サブドメインの追加・削除が容易
  • 設定が比較的簡単

欠点

  • パフォーマンスへの影響が懸念される場合がある
  • 1台のリバースプロキシサーバーで全てのサブドメインを処理する必要がある

方法

  1. リバースプロキシサーバー(例:HAProxy、Nginx)を導入する
  2. リバースプロキシサーバーの設定で、全てのサブドメインに対してHTTPS接続を強制する

例:HAProxyの場合

frontend https
    bind *:443
    default_backend webservers
    use_backend webservers if { ssl }

backend webservers
    balance roundrobin
    server sub1.example.com 192.0.2.1:80 check
    server sub2.example.com 192.0.2.2:80 check

例:Nginxの場合

server {
    listen 443 ssl;
    server_name example.com *.example.com;
    location / {
        proxy_pass http://backend:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

CDN(Content Delivery Network)を利用する

CDNを利用して、静的コンテンツをHTTPSで配信する方法です。この方法には、以下の利点と欠点があります。

利点

  • セキュリティが強化される
  • 高速・安定なコンテンツ配信が可能

欠点

  • ランニングコストが発生する
  • 設定や運用が複雑になる

方法

  1. CDNサービスに登録する(例:Cloudflare、Amazon CloudFront)
  2. CDNサービスの設定で、全てのサブドメインに対してHTTPS配信を有効にする

例:Cloudflareの場合

  1. Cloudflareダッシュボードにログインし、対象となるドメインを追加する
  2. "SSL/HTTPS"タブをクリックし、「エッジ証明書」を「フル」に設定する

例:Amazon CloudFrontの場合

  1. AWS Management Consoleにログインし、CloudFrontコンソールを開く
  2. 新しいディストリビューションを作成し、「Web」配信を選択する
  3. オリジン設定で、HTTPS配信を有効にする

個別の認証基盤を構築する

個別の認証基盤を構築することで、より高度なアクセス制御を実現できます。この方法には、以下の利点と欠点があります。