パスワードをgit commit
する前に検討したい、3つの回避方法
GitHub便利ですね。無料で自身のソースコードを管理できます。しかし無料プランだとソースコードは全世界に公開されてしまいます。有料プランですと月7 USドルでソースコードを非公開にできますが、結構お高めなので払っている人は少ないのではないでしょうか?
外部リソースにアクセスするプログラムを書いていると、config にパスワードを書いてしまいたい衝動に駆られます。しかし過去の事件について思いを馳せてみてください。クラウドサーバを生成する権限はお金になります。BitCoinマイニング目的でEC2 インスタンスを不正利用された事例は国内でも数件発生しています。本当にそのパスワードをconfig に書いて大丈夫でしょうか。
この記事ではgit にcommit しないで上手にパスワードを管理する技術について考えていきます。
awsコマンドを使っている人は次のコマンドを試してみよう
Amazon Web Service ではローカルから簡単に各サービスを利用するためにawsコマンドが提供されています。利用している人は、次のコマンドを打ってみましょう。cat ~/.aws/credentials
>>> cat ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXXXZQ
aws_secret_access_key = XXXXXXXXXXXXXXXXXX8a
生パスワードで保存されています。何故でしょうか?これを単純に暗号化したところで難読化にしかならずセキュリティが担保されないためです。なぜならローカルで暗号化して保存したところで、AWSと通信してコマンドを送信する段階では手元で復号化して送信しているわけですから、技術的には誰でも容易に復号化可能なので暗号化する意味がないのです。
~/.aws/credentials
にパスワードを記録しない方法
export AWS_CONFIG_FILE=~/path/to/aws.confg
と環境変数を利用すると安全に管理できるみたいです。(社内の有識者に教えてもらいました!)
参考:HowTo: Install AWS CLI - Security Credentials
パスワードをソースコードに記述しない3つの方法
pitライブラリを利用する方法、.gitignoreを利用する方法、環境変数にパスワードを書く方法の3つをリストアップしてみました。
1.pitを使ってパスワードを管理する
pit は有名なアカウント管理ライブラリです。Python Ruby perlでライブラリが存在します。pythonだと~/.pit/default.yaml
に生パスワードが保存されます。
pip install pit
export EDITOR="vim"
# -*- coding: utf-8 -*-
from pit import Pit
token = Pit.get('hipchat_v1',
{'require': {'token': 'your hipchat access token API v1'}})
print(token)
最初に実行するとVimが起動されてパスワードの入力を求められます。入力したパスワードは~/.pit/default.yaml
に保存されます。
2回目以降、パスワードを入力後は次の結果が返却されます。
>>>python a.py
{'token': 'your token'}
2.gitignoreと importを使ってパスワードを管理する
password.py をサーバに設置して、.gitignore に設定しておいてconfファイルから読み込みを行います。
# -*- coding: utf-8 -*-
PASSWORD = "HOGEHOGE"
# -*- coding: utf-8 -*-
from password.password import *
print(PASSWORD)
>>> python production_config.py
HOGEHOGE
3.環境変数でパスワードを管理する
環境変数にパスワードを設定しておいて、os.env コマンドで読む方法です。利便性を考えると.bash_profile
でパスワードを管理することになります。
export PASSWORD="aiueo"
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
print(os.environ.get('PASSWORD'))
>>> python production_config.py
aiueo