自分だけのクイズ作成 - Quipha公開中

【Django】SECRET_KEYなどの機密情報を別ファイルで管理

Django
スポンサーリンク

はじめに

Djangoのsettings.pyにはSECRET_KEYという機密情報が定義されています。
他にも、APIの認証キーなどアプリケーションを作成する上で、機密情報をソースコード上で扱う場合があると思います。

今回は、Djangoにおける機密情報の扱い方について解説しています。

Djangoの環境とプロジェクトの作成方法は以下をご覧ください。

使用するバージョン
  • Windows 11 / 10
  • macOS Monterey (M1)
  • Python 3.10.2
  • Django 4.0.2

WindowsでもMacでも同様に作成できます。

他にも私のブログで、Djangoについて解説している記事がありますのでご覧ください。

スポンサーリンク

機密情報について

Djangoの場合、プロジェクトのsettings.pyファイルがありますが、その中にSECRET_KEYという機密情報が含まれています。

SECRET_KEYはセキュリティに関する情報を生成するために使われます。
そのため、この情報は公開してはいけません。

例えば、GitHubへソースコードをプッシュする際にも気を付けなければなりません。
公開リポジトリへプッシュした場合、不特定多数の人に見られてしまいます。

また、以下の記事でも解説した認証キーなど、認証情報をハードコーディングして公開してはいけません
それにより、不正にAPIを利用されてしまいます。

最悪の場合、多額の請求をされる可能性もあります。

ちなみに、GitHubへSECRET_KEYが含まれたままソースをプッシュすると、GitGuardianからメールが届きます。

GitGuardian has detected the following Django Secret Key exposed within your GitHub account.

Djangoプロジェクトの作成

以下のコマンドで、Djangoプロジェクトを作成します。
最後にドットを付けて、同じ階層にプロジェクトファイルを作成します。

$ django-admin startproject sampleApp .

「sampleApp」はプロジェクト名ですので、任意で指定してください。

機密情報専用の設定ファイルを作成

以下のファイルを確認しましょう。
SECRET_KEYDATABASESという設定値が含まれています。
この値を別ファイルで管理しましょう。

sampleApp/settings.py
..
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-xxxx'
..
DATABASES = {
    'default': {
    }
}
..

DATABASESに関しては、sqlite3の場合は対応不要ですが、MySQLなどの接続情報を設定する場合は、移動した方が良いと思います。

django-environを使ったやり方もありますが、今回は外部のライブラリを使用せず、別ファイルを作成して管理します。

以下のファイルを作成し、SECRET_KEYの定義をこちらに移動します。
このファイルは機密情報を扱う目的で作成し、Git管理の対象外とします。

sampleApp/settings_local.py
SECRET_KEY = 'django-insecure-xxxx'

「local_settings.py」というファイル名の解説も多いですが、個人的にはファイルの一覧で並んでいた方が良いので、この名前にしました。

settings.pyの方は、SECRET_KEYの定義を削除し、以下のimport文を追加します。

sampleApp/settings.py
from .settings_local import *

.gitignoreファイルに以下を追加しておきましょう。
Gitの管理対象外とします。

.gitignore
settings_local.py

このファイルはSECRET_KEY以外にも、認証キーなどの機密情報を定義して使用する想定です。

Gitの管理対象外となると、リモートリポジトリを確認しても、もともと何の値が定義されていか分からなくなります

必須ではありませんが、サンプルファイルを用意して、こちらはプッシュすると良いでしょう。

sampleApp/settings_local_sample.py
# Djangoの秘密キー
SECRET_KEY = ''

# DB接続情報
DATABASES = {
    'default': {
    }
}

# XXのキー
XXX =  ''

プルした際に、このサンプル設定ファイルをコピーしてsettings_local.pyファイルを作成し、値を定義し使用することができます。

スポンサーリンク

SECRET_KEYの再生成

プロジェクトをプルした時など、SECRET_KEYを再生成する必要があります。

プロジェクト直下で以下のコマンドを実行します。

$ python manage.py shell

対話モードで以下のコードを実行します。

>>> from django.core.management.utils import get_random_secret_key
>>> get_random_secret_key()
'xxx-xxxx'

出力された文字列を、SECRET_KEYに設定します。

認証キーを定義

以下の記事で、アプリを作成する際に認証キーをハードコーディングしていました。

認証キーは以下のファイルの方へ定義します。

sampleApp/settings_local.py
SECRET_KEY = 'django-insecure-xxxx'

DEEPL_API_KEY = 'xxx'

定数を使用する場合は、settingsをインポートし「settings.DEEPL_API_KEY」のようにアクセスします。

translation/views.py
..
from django.conf import settings

# Create your views here.


def index(request):
    """
    翻訳画面
    """

    # 翻訳結果
    translation_results = ""

    if request.method == "POST":
        # 翻訳ボタン押下時

        form = TranslationForm(request.POST)

        # バリデーションチェック
        if form.is_valid():
            # 翻訳
            translator = deepl.Translator(settings.DEEPL_API_KEY)

これで認証キーをハードコーディングせずに済みます。

その他

外部サーバーへ公開

作成したアプリは公開して使ってもらいましょう!
Djangoアプリケーションを外部公開する方法をまとめました。

脆弱性対策

脆弱性を抱えたアプリケーションの場合、攻撃を受ける可能性があり大変危険です。
作成したアプリケーションは、脆弱性対策も意識しましょう。

GitHubと連携

GitHubと連携する方法を解説しました。
プロジェクトの管理はGitHubを活用しましょう。

さいごに

今回はDjangoにおける、機密情報の管理の方法を解説しました。
Djangoに限らず、APIキーなどの機密情報を埋め込まないように注意しましょう。

他にも私のブログで、Djangoについて解説している記事がありますのでご覧ください。

\オススメ/

コメント

タイトルとURLをコピーしました