スクリプトから生パスワードを追い出す - Python Advent Calendar 2013

2013/12/02 00:00

DevOpsですね!CIですね!botですね!

Python Advent Calendar 2013 の2日目です。

スクリプトにパスワードを書きたくないときのお話。

鍵でノーパスワードログインできるなら良いですが、ID/Password渡さないといけない場合もありますよね。

本エントリはOS X 10.9、Python3.3.3rc1で確認しています。

実行時に入力してもらう

書きたくないのであれば、入力してもらえば良いですね。

ビルトイン関数のinputでどうでしょう。

>>> pswd = input('input your passowrd: ') #python2では raw_input でした
input your passowrd: password

おっと、入力してるときに丸見えじゃありませんか。

では、getpassモジュールのgetpass関数を使いましょう。

>>> pswd = getpass('input your password: ')
input your password:

ふむ。

何度も入力したくない

Pitを使ってみましょう。毎回入れてもらうのは自動化できませんからね。

https://pypi.python.org/pypi/pit/

Python3でも https://gist.github.com/tsuyukimakoto/7728056 な感じで動きますね。

利用する前に、EDITOR環境変数に好きなエディタを入れておきましょう。

$ export EDITOR='vi'

必要な情報を得ようとしたときに未設定の場合には、エディタが起動します。保存して終了すると、値が戻ります。

>>> from pit import Pit
>>> Pit.get('spamname',{'require': {'email':'your email','password':'your password'}})
{'email': 'mtsuyuki@gmail.com', 'password': 'passwd'}

プレーンテキストだけど一回入れれば保存されて便利です。消したいときもファイル消すだけですし。 id:Yoshiori がPython3対応してくれないかなー

OSのパスワード保存機構を利用する

OSの機能をラップしてくれます。コマンドラインでも使えます。

https://pypi.python.org/pypi/keyring

>>> import keyring
>>> keyring.set_password('spamservice', 'tsuyukimakoto', 'passwd')
>>> keyring.get_password('spamservice', 'tsuyukimakoto')
'passwd'

OSXの場合には、keychainに保存されます。なんとなく安心ですね。

Ubuntuとかでも動くらしいですが、残念なことにGnomeの機能をラップしているのでサーバインストールだと使えないことが多いようです。

しっかりした風にする

コードを見れば戻せてしまうので、このシチュエーションでは果たして頑張る意味があるのかはなぞですね。

https://pypi.python.org/pypi/pycrypto

Python 1.5.2 is not supported. がウケます。頑張り過ぎでしょう。

秘密のkeyとIVで暗号化して

>>> from Crypto.Cipher import AES
>>> obj = AES.new('16 or 24 or 32 bytes key', AES.MODE_CBC, 'sixteen bytes IV')
>>> obj.encrypt('my password_____')
b'\xe1\xc6\x00^\xce\x0c\xb0\rE[\xdc\xba\xbc\xdb\xd9U'

秘密のkeyとIVで戻す

>>> from Crypto.Cipher import AES
>>> encrypted = b'\xe1\xc6\x00^\xce\x0c\xb0\rE[\xdc\xba\xbc\xdb\xd9U'
>>> obj2 = AES.new('16 or 24 or 32 bytes key', AES.MODE_CBC, 'sixteen bytes IV')
>>> obj2.decrypt(encrypted)
b'my password_____'

暗号化する文字列長に制限があるので、うまいこと考えないといけない。

現実的には?

サーバで使う場合には、Pitとpycryptoを組み合わせると幸せかもしれませんね。結局見えるんですが。

OS側の機能が使えるマシンの場合にはkeyring便利です。

明日は?

パーフェクトPython を一緒に書いた しょーま さんです!