はじめに
Djangoのsettings.pyにはSECRET_KEYという機密情報が定義されています。
他にも、APIの認証キーなどアプリケーションを作成する上で、機密情報をソースコード上で扱う場合があると思います。
今回は、Djangoにおける機密情報の扱い方について解説しています。
Djangoの環境とプロジェクトの作成方法は以下をご覧ください。
他にも私のブログで、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 .
機密情報専用の設定ファイルを作成
以下のファイルを確認しましょう。
SECRET_KEYやDATABASESという設定値が含まれています。
この値を別ファイルで管理しましょう。
..
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-xxxx'
..
DATABASES = {
'default': {
}
}
..
django-environを使ったやり方もありますが、今回は外部のライブラリを使用せず、別ファイルを作成して管理します。
以下のファイルを作成し、SECRET_KEYの定義をこちらに移動します。
このファイルは機密情報を扱う目的で作成し、Git管理の対象外とします。
SECRET_KEY = 'django-insecure-xxxx'
settings.pyの方は、SECRET_KEYの定義を削除し、以下のimport文を追加します。
from .settings_local import *
.gitignoreファイルに以下を追加しておきましょう。
Gitの管理対象外とします。
settings_local.py
このファイルはSECRET_KEY以外にも、認証キーなどの機密情報を定義して使用する想定です。
Gitの管理対象外となると、リモートリポジトリを確認しても、もともと何の値が定義されていたのか分からなくなります。
必須ではありませんが、サンプルファイルを用意して、こちらはプッシュすると良いでしょう。
# Djangoの秘密キー
SECRET_KEY = ''
# DB接続情報
DATABASES = {
'default': {
}
}
# XXのキー
XXX = ''
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 = 'django-insecure-xxxx'
DEEPL_API_KEY = 'xxx'
定数を使用する場合は、settingsをインポートし「settings.DEEPL_API_KEY」のようにアクセスします。
..
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を活用しましょう。
GitHub Copilot
GitHub Copilotを導入し、AIにコーディングをサポートしてもらうこともできます。
さいごに
今回はDjangoにおける、機密情報の管理の方法を解説しました。
Djangoに限らず、APIキーなどの機密情報を埋め込まないように注意しましょう。
他にも私のブログで、Djangoについて解説している記事がありますのでご覧ください。
コメント