広告

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

Django

当サイトではアフィリエイト広告を利用しています。

広告

はじめに

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

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

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

【Python+Django4】VS Code+Dockerで簡単構築【Dev Containers】【Win/Mac】
Djangoの開発環境を、VS CodeとDockerを使用して簡単に構築し、リモート開発を行います。
使用するバージョン
  • 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を利用されてしまいます。

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

【Django】翻訳できるWebアプリを作ろう【DeepL】
DjangoでWebアプリケーションを作成し、DeepLを利用して翻訳を行います。

ちなみに、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に設定します。

認証キーを定義

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

【Django】翻訳できるWebアプリを作ろう【DeepL】
DjangoでWebアプリケーションを作成し、DeepLを利用して翻訳を行います。

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

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を活用しましょう。

GitHub Copilot

GitHub Copilotを導入し、AIにコーディングをサポートしてもらうこともできます。

さいごに

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

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

DjangoPythonプログラミング
広告

個人開発

千草 @chigusaweb

現役のITエンジニア。 気ままにコードを書いたり技術情報を発信しています。 Webアプリ/Windows・Macアプリ/モバイルアプリなど。 (Java, PHP, Javascript, Swift, Python, C#, 他) 個人開発:Clibor, Quipha, TXT-Crypter, 符計算特訓, チグサツール Kindle本: Laravel9 実践入門, 他

クリップボード履歴

Clibor

Windows

Cliborはシンプルで高機能なクリップボード履歴ソフトです。
また普段よく使うワードを定型文として登録し、いつでもクリップボードに保存することができます。高度なテキスト整形・FIFOモード・ホットキーに対応。

クリップボード履歴

Windows版Cliborの利便性を、そのままMacでも。
定型文登録、高度なテキスト整形、FIFOモードなど、便利なクリップボード履歴機能を利用できます。macOS最新のTahoeにも対応。

テキスト暗号化

テキストを暗号化してURLで共有・保存できる無料サービスです。
パスフレーズを知る人だけが復号できます。登録不要、データはサーバーに保存されません。
Notionでも利用できます。

学習

Quipha

Web / iOS

自分だけの問題集や問題を作成し、クイズを行い、学習に活用することができるアプリです。
例えば、学校の授業、語学学習、IT資格やその他の資格など多彩な分野での学習を支援します。
いつでも、どこでも、あなたの学習をサポート。

ツール

日常の「ちょっとした効率化」をサポートするWeb便利ツール集。
テキスト・データ処理から最新のAI連携まで、日々のちょっとした手間でググりがちなユーティリティを1つの場所に集約。

麻雀

麻雀の符計算をひたすら特訓しマスターしましょう。
初心者の方はもちろん、もっと速く計算したい方にも役立ちます。
5万対局以上の実践から問題を収録。

コメント

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