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_SUBDOMAINS
が True
に設定されている場合、SecurityMiddleware
は以下の動作を行います。
- リクエストされたホスト名が
ALLOWED_HOSTS
設定に含まれていることを確認します。 - リクエストされたホスト名が
SECURE_SSL_HOST
設定と一致するかどうかを確認します。 - 上記の条件を満たす場合、以下の
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.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
例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台のリバースプロキシサーバーで全てのサブドメインを処理する必要がある
方法
- リバースプロキシサーバー(例:HAProxy、Nginx)を導入する
- リバースプロキシサーバーの設定で、全てのサブドメインに対して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で配信する方法です。この方法には、以下の利点と欠点があります。
利点
- セキュリティが強化される
- 高速・安定なコンテンツ配信が可能
欠点
- ランニングコストが発生する
- 設定や運用が複雑になる
方法
- CDNサービスに登録する(例:Cloudflare、Amazon CloudFront)
- CDNサービスの設定で、全てのサブドメインに対してHTTPS配信を有効にする
例:Cloudflareの場合
- Cloudflareダッシュボードにログインし、対象となるドメインを追加する
- "SSL/HTTPS"タブをクリックし、「エッジ証明書」を「フル」に設定する
例:Amazon CloudFrontの場合
- AWS Management Consoleにログインし、CloudFrontコンソールを開く
- 新しいディストリビューションを作成し、「Web」配信を選択する
- オリジン設定で、HTTPS配信を有効にする
個別の認証基盤を構築する
個別の認証基盤を構築することで、より高度なアクセス制御を実現できます。この方法には、以下の利点と欠点があります。