Djangoの「settings.SECRET_KEY」を安全に守る!環境変数、ローカル設定ファイル、専用ツール徹底比較
settings.SECRET_KEY とは?
settings.SECRET_KEY
は、Django アプリケーションが以下の機能を実行するために使用するランダムな文字列です。
- メッセージ署名
メッセージの改ざん防止 - CSRF 保護
偽造リクエストの防止 - パスワードのリセット
パスワード再設定トークンの生成 - セッション管理
ユーザー認証やログイン状態の維持
settings.SECRET_KEY の重要性
settings.SECRET_KEY
が漏洩した場合、以下の深刻な被害が発生する可能性があります。
- メッセージの改ざん
送受信されるメッセージの内容が改ざんされる - 偽造リクエストの送信
攻撃者が不正な操作を実行 - パスワードの推測
攻撃者がパスワード再設定トークンを利用してパスワードを推測 - セッションハイジャック
攻撃者がユーザーになりすまし、不正な操作を実行
これらの被害を防ぐために、settings.SECRET_KEY
は絶対に漏洩しないよう厳重に管理する必要があります。
settings.SECRET_KEY の設定方法
settings.SECRET_KEY
は、settings.py
ファイル内に直接記述するのではなく、環境変数として設定することを推奨します。これにより、コードを公開しても settings.SECRET_KEY
が漏洩するリスクを軽減できます。
環境変数の設定方法は、使用しているサーバー環境によって異なりますが、一般的には以下のコマンドを使用します。
export SECRET_KEY="ランダムな文字列"
安全な settings.SECRET_KEY の作成方法
settings.SECRET_KEY
は、以下の要件を満たすランダムな文字列である必要があります。
- 予測困難性
辞書に載っているような単語やフレーズを含まない - ランダム性
英数字、記号などを含むランダムな文字列 - 十分な長さ
最低 50 文字以上
安全な settings.SECRET_KEY
を作成するには、以下のツールを使用できます。
- オンラインのランダム文字列生成ツール
多くのウェブサイトで、ランダムな文字列を生成するツールを提供しています。 - Django の django-admin コマンド
django-admin generate_secret_key
コマンドを実行すると、ランダムなsettings.SECRET_KEY
を生成できます。
- 定期的に
settings.SECRET_KEY
を変更することを検討してください。 settings.SECRET_KEY
をログ出力したり、他の誰かと共有したりしないでください。settings.SECRET_KEY
は、バージョン管理システム (Git など) に含めないようにしてください。
# settings.py
# ...
# 環境変数から SECRET_KEY を読み込む
from django.core.env import environ
environ.setdefault('SECRET_KEY', os.environ.get('SECRET_KEY'))
.env ファイルによる設定
# .env ファイル
SECRET_KEY="ランダムな文字列"
# settings.py
# ...
# .env ファイルから環境変数を読み込む
import dotenv
dotenv.load_dotenv()
django-admin コマンドによる生成
django-admin generate_secret_key > secret_key.txt
ランダム文字列生成ツール
settings.SECRET_KEY
は、必ず本番環境では設定し、バージョン管理システムに含めないようにしてください。- 上記のコード例はあくまでも例であり、実際の環境に合わせて変更する必要があります。
環境変数による設定
最も安全かつ推奨される方法が、環境変数を使ってsettings.SECRET_KEY
を設定する方法です。この方法では、settings.py
ファイルに直接記述することなく、OSやアプリケーションサーバーの設定でSECRET_KEY
を定義できます。
具体的には、以下の手順で設定します。
1 設定方法
- Dockerの場合
docker-compose.yml
ファイルに以下の設定を追加します。environment: SECRET_KEY: "ランダムな文字列"
- Windowsの場合
- システム環境変数に
SECRET_KEY
を設定します。- コントロールパネルを開き、「システムとセキュリティ」→「システム」→「システムの詳細設定」→「環境変数」へ移動します。
- 「システム環境変数」または「現在のユーザーの環境変数」タブを選択し、「新規」ボタンをクリックします。
- 変数名に
SECRET_KEY
、変数値にランダムな文字列
を入力し、「OK」ボタンをクリックします。
- システム環境変数に
- Linux/macOSの場合
bash
などのシェルで以下のコマンドを実行します。export SECRET_KEY="ランダムな文字列"
- 設定を永続化するために、以下の方法で
.bashrc
や.zshrc
などのシェル設定ファイルに上記のコマンドを追加します。- 最後の行に
source ~/.bashrc
などのコマンドを追加する - 専用の設定ファイル (例:
.envrc
) を作成し、そこにexport SECRET_KEY="ランダムな文字列"
を記述し、.bashrc
などのシェル設定ファイルからソースする
- 最後の行に
2 動作仕組み
上記の設定により、Djangoアプリケーション起動時に、以下の順序でSECRET_KEY
が読み込まれます。
os.environ
からSECRET_KEY
を取得する- 設定ファイル (例:
settings.py
) からSECRET_KEY
を取得する (推奨されない方法)
3 利点
- 複数の環境 (開発環境、本番環境など) で異なる
SECRET_KEY
を設定できる settings.py
ファイルに直接記述しないため、バージョン管理システムで漏洩するリスクがなくなる
4 課題
- 環境変数の設定内容によっては、セキュリティリスクが発生する可能性がある
- 設定方法がやや複雑
ローカル設定ファイルによる設定
settings.py
ファイルとは別のローカル設定ファイルを作成し、そこにSECRET_KEY
を記述する方法です。この方法は、環境変数よりも簡便ですが、バージョン管理システムに含めてしまうリスクがあるため注意が必要です。
1 設定方法
settings.py
と同階層にlocal_settings.py
などの名前でファイルを新規作成します。local_settings.py
ファイルに以下のコードを記述します。from . import base # プロジェクトの設定ファイル (settings.py) をインポート # SECRET_KEY を設定 SECRET_KEY = "ランダムな文字列" # settings.py の設定を local_settings.py で上書き # 上書きしたい設定項目をここに記述
settings.py
ファイルで以下のコードを追記します。# local_settings.py をインポート from .local_settings import *
2 動作仕組み
Djangoアプリケーション起動時に、まず settings.py
ファイルが読み込まれます。その後、local_settings.py
ファイルが存在する場合、その内容が settings.py
の設定を上書きします。
3 利点
settings.py
ファイルをそのまま記述できる- 環境変数を使用するよりも簡便
4 課題
- 複数の環境で異なる設定を使用したい場合は、設定ファイルを複製する必要がある
- バージョン管理システムに含めてしまうと、漏洩のリスクがある