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が読み込まれます。

  1. os.environ から SECRET_KEY を取得する
  2. 設定ファイル (例: settings.py) から SECRET_KEY を取得する (推奨されない方法)

3 利点

  • 複数の環境 (開発環境、本番環境など) で異なる SECRET_KEY を設定できる
  • settings.py ファイルに直接記述しないため、バージョン管理システムで漏洩するリスクがなくなる

4 課題

  • 環境変数の設定内容によっては、セキュリティリスクが発生する可能性がある
  • 設定方法がやや複雑

ローカル設定ファイルによる設定

settings.py ファイルとは別のローカル設定ファイルを作成し、そこにSECRET_KEYを記述する方法です。この方法は、環境変数よりも簡便ですが、バージョン管理システムに含めてしまうリスクがあるため注意が必要です。

1 設定方法

  1. settings.pyと同階層に local_settings.py などの名前でファイルを新規作成します。
  2. local_settings.py ファイルに以下のコードを記述します。
    from . import base  # プロジェクトの設定ファイル (settings.py) をインポート
    
    # SECRET_KEY を設定
    SECRET_KEY = "ランダムな文字列"
    
    # settings.py の設定を local_settings.py で上書き
    # 上書きしたい設定項目をここに記述
    
  3. settings.py ファイルで以下のコードを追記します。
    # local_settings.py をインポート
    from .local_settings import *
    

2 動作仕組み

Djangoアプリケーション起動時に、まず settings.py ファイルが読み込まれます。その後、local_settings.py ファイルが存在する場合、その内容が settings.py の設定を上書きします。

3 利点

  • settings.py ファイルをそのまま記述できる
  • 環境変数を使用するよりも簡便

4 課題

  • 複数の環境で異なる設定を使用したい場合は、設定ファイルを複製する必要がある
  • バージョン管理システムに含めてしまうと、漏洩のリスクがある