21
27

More than 5 years have passed since last update.

Webアプリが利用するパスワードどこに保存しよう?

Last updated at Posted at 2015-04-02

要約

いまどきのWebアプリでは、twitter/facebookを始め様々な外部WebAPIと連携して利用する事がよくあります。外部APIにはAPI呼び出し用のキーやトークンを必要とするものも多く、それらの扱いに毎回なんとなく引っかかるものを感じていたので、Keystorageというコマンドを書きました。

背景

Railsのシークレットキー(secret_key_base)や外部APIのトークンを
そのままハードコーディングして、プライベートとはいえgitリモートリポジトリにpushするのは抵抗ありますよね?

よくあるのは、コードの中では環境変数を参照するようにしていて、
その環境変数を起動時に設定してやることで秘密鍵のハードコーディングを避ける方法です。

私は長年この方法を使ってきましたが問題点がありました。

この環境変数に秘密鍵を何処かで設定する必要があり、往々にしてWebサーバの起動スクリプトにハードコーディングすることになります。この設定ファイルのバックアップやサーバ間同期が確実にできるか?という問題です。AnsibleのVaultはこの問題を解決できますが、デプロイ手段毎に保管方法を変えるのは面倒です。(CIツールも使いますよね?)

「キーをすこしでもマシな方法でリポジトリに入れたい。そのキーから秘密鍵を一つの環境変数で取り出したい。」という要求からkeystorageというコマンドを作りました。

インストール

KeystorageRubyのスクリプトでrubygemsで配布されていますので、そこからインストールするのが簡単です。コマンドが実装されているので、Rubyアプリ以外にも利用できます。

gem install keystorage

使い方

keystorageというコマンドがインストールされるのでこれを使います。まず、キーを設定します。そのまえにキーファイルの保管場所(PATH)とパスワードを決めておいて下さい。以下では、/app/.keystorageP@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あたりを御覧ください。:grinning:

21
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
27