GitHub時代のパスワードを管理する技術

  • 54
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

パスワードを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 に生パスワードが保存されます。

install
pip install pit
export EDITOR="vim"
利用例,a.py
# -*- 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 に保存されます。
スクリーンショット 2015-12-24 17.36.16.png

2回目以降、パスワードを入力後は次の結果が返却されます。

実行結果
>>>python a.py 
{'token': 'your token'}

2.gitignoreと importを使ってパスワードを管理する

password.py をサーバに設置して、.gitignore に設定しておいてconfファイルから読み込みを行います。

スクリーンショット 2015-12-24 17.45.05.png

password.py
# -*- coding: utf-8 -*-
PASSWORD = "HOGEHOGE"
production_config.py
# -*- coding: utf-8 -*-
from password.password import *
print(PASSWORD)
実行結果
>>> python production_config.py 
HOGEHOGE

3.環境変数でパスワードを管理する

環境変数にパスワードを設定しておいて、os.env コマンドで読む方法です。利便性を考えると.bash_profile でパスワードを管理することになります。

パスワード設定
export PASSWORD="aiueo"
production_config.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os

print(os.environ.get('PASSWORD'))
実行結果
>>> python production_config.py
aiueo