要約
いまどきのWebアプリでは、twitter/facebookを始め様々な外部WebAPIと連携して利用する事がよくあります。外部APIにはAPI呼び出し用のキーやトークンを必要とするものも多く、それらの扱いに毎回なんとなく引っかかるものを感じていたので、Keystorage
というコマンドを書きました。
背景
Railsのシークレットキー(secret_key_base)や外部APIのトークンを
そのままハードコーディングして、プライベートとはいえgitリモートリポジトリにpushするのは抵抗ありますよね?
よくあるのは、コードの中では環境変数を参照するようにしていて、
その環境変数を起動時に設定してやることで秘密鍵のハードコーディングを避ける方法です。
私は長年この方法を使ってきましたが問題点がありました。
この環境変数に秘密鍵を何処かで設定する必要があり、往々にしてWebサーバの起動スクリプトにハードコーディングすることになります。この設定ファイルのバックアップやサーバ間同期が確実にできるか?という問題です。AnsibleのVaultはこの問題を解決できますが、デプロイ手段毎に保管方法を変えるのは面倒です。(CIツールも使いますよね?)
「キーをすこしでもマシな方法でリポジトリに入れたい。そのキーから秘密鍵を一つの環境変数で取り出したい。」という要求からkeystorage
というコマンドを作りました。
インストール
Keystorage
はRuby
のスクリプトでrubygems
で配布されていますので、そこからインストールするのが簡単です。コマンドが実装されているので、Rubyアプリ以外にも利用できます。
gem install keystorage
使い方
keystorage
というコマンドがインストールされるのでこれを使います。まず、キーを設定します。そのまえにキーファイルの保管場所(PATH)とパスワードを決めておいて下さい。以下では、/app/.keystorage
にP@ssw0rd
とパスワードを掛けてけて保管します。
$ keystorage -f /app/.keystorage -s P@ssw0rd set TWITTER API 1a024ce7f0fa1f2bffd7
上の例でTWITTERはグループ名、APIはキー、1a024ce7f0fa1f2bffd7
の部分は保管するAPIキーです。
このコマンドで以下のようなキーファイルが/app/.keystorage
に生成されます。
---
'@':
token: POUpeMM6eKCO48Wdk6-JFg
sig: afdf2f9c9c63fcf0d65eaf0c9c86f7e04c970d06056f641e0ffe1f1ff3c981f20b4e3da719fee7159c770dfa5a7a99c8f3eb688bb760a4d24103c83b62e25528
TWITTER:
API: 736901b66dc3981edccf23c672f852f416b15a54d9ab92d9912288e47faf39cb
このファイルと、パスワードがあればキーの内容を読むことができるようになります。
キーの内容を取り出すには以下のようにします。
$ keystorage -f /app/.keystorage -s P@ssw0rd get TWITTER API
1a024ce7f0fa1f2bffd7
この調子で必要なグループ名、キーを設定してきます。
$ keystorage -f /app/.keystorage -s P@ssw0rd set TWITTER SECRET fa1f2bffd71a024ce7f0
$ keystorage -f /app/.keystorage -s P@ssw0rd set FACEBOOK KEY a024ce7f0fa1f2bffd71
$ keystorage -f /app/.keystorage -s P@ssw0rd set FACEBOOK SECRET a024ce7f0fa1f2bffd71
キーファイルは以下のようになりました。(通常はいちいち中見ることはありません)
---
'@':
token: POUpeMM6eKCO48Wdk6-JFg
sig: afdf2f9c9c63fcf0d65eaf0c9c86f7e04c970d06056f641e0ffe1f1ff3c981f20b4e3da719fee7159c770dfa5a7a99c8f3eb688bb760a4d24103c83b62e25528
TWITTER:
API: 736901b66dc3981edccf23c672f852f416b15a54d9ab92d9912288e47faf39cb
SECRET: f814eac8d80e41d8e56efd0ad17a462d74e10cc16fdc53717cfe7ab37eb780df
FACEBOOK:
KEY: 6f8c3fee96c321c5f4c128fa9f38ddd36e5a91a00fbda9624aa8f8bdc72de00f
SECRET: 6f8c3fee96c321c5f4c128fa9f38ddd36e5a91a00fbda9624aa8f8bdc72de00f
このファイルの内容を環境変数に指定して子プロセスを立ちあげることが出来ます。printenv
すると以下のように設定されています。
-> % keystorage -f /app/.keystorage -s P@ssw0rd exec printenv
FACEBOOK_KEY=a024ce7f0fa1f2bffd71
TWITTER_SECRET=fa1f2bffd71a024ce7f0
TWITTER_API=1a024ce7f0fa1f2bffd7
FACEBOOK_SECRET=a024ce7f0fa1f2bffd71
...
実際にはhttpdとか指定してあげて以下のように使うのかなっと
$ keystorage -f /app/.keystorage -s P@ssw0rd exec httpd
これで、httpdの中身で環境変数が参照できます。その他の使い方は、githubのtumf/keystorage README.mdあたりを御覧ください。