【初心者向け】DBの認証情報を環境変数から読み込む


はじめに

初投稿です。年末なので今年やり残したことを考えたら、まず【Qiitaに投稿】が思い浮かんだ気がするので自分用のメモ&アウトプットとして書いてみようと思います。
今回はPythonのフレームワーク、Djangoでウェブアプリ開発を行った際に学んだことをアウトプットしようと思いますが他言語, 他フレームワークでも考え方は一緒なので試してみてください。
今回は環境変数に認証情報類の値を設定することで、ソースコードに認証情報を直接書かないことにより認証情報の秘匿性を向上させる方法ついて書きます。

認証情報類を環境変数から読み取ると何が嬉しいか

  • ソースコードをGithubなどにアップした際に認証情報が外部に漏れない
  • 環境ごとに認証情報を設定できるのでソースコードを変更せずに実行できる

認証情報ベタ書き → コード内に認証情報が埋め込まれているため、他人に共有する際に、そのまま認証情報を公開してしまうということが考えられる。AWSのインスタンスが乗っ取られて多額の請求がきたという事例もあるとのこと。。
初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。

そこで 、、、
OS依存の環境変数から読み取ることでソースコード上には認証情報をベタ書きせずに、安全性を保つことが本稿の一番の目的!

手順

  • 環境変数を設定
  • 認証情報を環境変数を読み込む

環境変数を設定

設定方法は2通り
・【システム環境変数の編集】画面から登録
・Terminalからコマンド入力で登録
* Python上で環境変数を設定することもできますがプログラム内でしか使えない一時的な環境変数なので永続的に登録できる方法を紹介していきます。

今回は2つめの、Terminalから設定する方法を紹介します。
Terminalから永続的に使える環境変数を設定するときは SETX コマンドを使います。
Ctrl+Shiftを押しながら、管理者モードでコマンドプロンプトを実行してください。

terminal
SETX 環境変数名 値     #ユーザー環境変数
SETX /M 環境変数名 値   #システム環境変数

環境変数を設定した後は一度IDEを閉じてからじゃないと新たに設定した環境変数を読み取れないので注意!  ←筆者はこれにハマりました。。

認証情報を環境変数から読み込む

下記のどちらの記法でも同じ値が取得できますが、
存在しない環境変数を呼び出した際に前者だとデフォルト値の"None", 後者だとエラーが返ってきます。

test.py
import os
os.environ.get('環境変数名') # '環境変数名'の環境変数を取得
os.environ['環境変数名']   # '環境変数名'の環境変数を取得

これが認証情報がべた書きになっているケース

setting.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'sample', # 作成したデータベース名
        'USER': 'root', # ログインユーザー名,
     'PASSWORD':'root', #ログインパスワード名,
        'HOST': '',
        'PORT': '', 
    }
}

上記のソースコードを下記のように、環境変数から読み取るように書き換えることで
認証情報を隠しています。

setting.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'sample', # 作成したデータベース名
        'USER': os.environ.get('DB_USERNAME'), # ログインユーザー名
        'PASSWORD': os.environ.get('DB_PASSWORD'), #ログインパスワード
        'HOST': os.environ.get('DB_HOST'),
        'PORT': os.environ.get('DB_PORT'),
    }
}

おわりに

初投稿&知識も浅いので書き方、誤った部分がありましたらお知らせいただけると幸いです。
最後までお読み下さいましてありがとうございました。