DjangoアプリのSECRET_KEYやAPIKeyといった機密情報を別のファイルに分離して管理してみましょう。
目次
機密情報の扱い
DjangoアプリにはSECRET_KEYが定義されているほか、データベースの設定値、制作するアプリによってはAPIの認証キーなども扱うことになります。
こういった機密情報はアプリのソースコードにハードコーディングしてはいけません。
また、アプリのソースコードをGitHubにプッシュする際もこれらの機密情報はアップしてはいけません。
こうした情報を隠ぺいする手段としてDjangoはdjango-environというモジュールを用意してくれているのですが、今回はもっと単純に別ファイルに分離して管理してみます。
Djangoで扱う機密情報
と、その前に、Djangoで扱う機密情報にはどのようなものがあって、それが漏れると何がまずいのかについて簡単に知っておきましょう。
SECRET_KEY
Djangoアプリのsettings.pyにデフォルトで生成されているキーです。
Djangoアプリはこのキーを使ってユーザーが登録するパスワードを暗号化したり、パスワード変更用のURLを生成したり、トークンを生成しています。
つまりこのキーが攻撃者に知られてしまった場合、そこからトークンなどの生成アルゴリズムが割り出され、ユーザーのパスワードが漏れたり、POSTデータを偽造されてしまう危険があります。
データベースの設定値
デフォルトのsqlite3を使っている場合は気にする必要はありませんが、MySQLやPostgresqlなどのRDBMSを使っている場合、settings.pyにはデータベースの名前やユーザー名、パスワードなどを記述する必要があります。
これらが攻撃者に知られるとデータベースに侵入されてしまう危険があります。
APIの認証キー
制作するアプリによってはAPIを使用するために認証キーが必要になります。
これが攻撃者に知られるとあなたのキーでAPIが不正利用されてしまう危険があり、最悪の場合API使用料として多額の請求をされる危険もあります。
隠ぺいすると何がいいのか
機密情報を別のファイルや環境変数にして隠ぺいすることでsettings.pyなどのファイルにハードコーディングしなくて良くなります。
settings.pyなどで必要な場合にはそのファイルをインポートして変数として記述するため、settings.pyを見られただけでは機密情報が知られません。
また、GitHubにプッシュする際も、密情報を記述したファイルは .gitignore に書いておいて除外することができます。
※まぁこの方法だと結局機密情報ファイルを見られるとアウトなので、settings.pyをGitHubにプッシュするために別ファイルに分ける、といった認識。
機密情報専用の設定ファイルを作成
ということで機密情報専用のファイルを作成しましょう。
機密情報専用のファイルを作成
settings.py と同じ階層に settings_sercret.py という名前でファイルを作成します。
※名前は任意ですが、settings_○○.pyとしておくとファイル一覧でsettings.pyと並んで表示されるのでおすすめです。
作成できたらこのファイルに隠ぺいしたい機密情報をコピペします。
SECRET_KEY = 'django-insecure-xxxx' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'データベース名', 'USER': 'ユーザー名', 'PASSWORD': 'パスワード', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS':{ 'init_command':"SET sql_mode='STRICT_TRANS_TABLES'", }, } }
settings.pyから機密情報を削除
元のsettings.pyからは機密情報を削除し、settings_sercret.pyをインポートする一文を追加します。
from .settings_sercret import *
settings_sercret.pyを.gitignoreに追加
機密情報ファイルを.gitignoreに追加してgitの管理下から除外します。
settings_sercret.py