itamae-plugin-resource-encrypted_remote_file (0.0.1): encrypt secret data, and forward decrypted file to remote. http://t.co/te4q9nPRtV
— RubyGems (@rubygems) 2015, 5月 9
概要
暗号化されているファイル復号化してサーバに転送するための itamae で Resourceプラグインです
作った経緯
アプリのデプロイサーバの構築をitamaeでやっていたのですが、デプロイユーザのsshの秘密鍵をどうサーバに転送するかという問題がありました。
普通にやるのであれば remote_file
でよかったのですが、そのためには秘密鍵をそのままリポジトリにコミットする必要があり悩ましいところでした
社内リポジトリでかつそのデプロイユーザもデプロイに関連する操作以外ができない権限を持っているとは言え、秘密鍵をそのままの状態でリポジトリにコミットしたくないという思いがありました。
社内でchef使ってる人に知見を聞いたところ「chefだと暗号化できるよ」ということで、リポジトリには暗号化した状態のファイルをコミットしつつ、転送時に復号化してサーバに配置するためのプラグインを作りました。
使い方
暗号化の方法
reversible_cryptography で暗号化します。
gem install reversible_cryptography reversible_cryptography encrypt --password=PASSWORD --src-file=/path/to/secret_file.txt --dst-file=/pass/to/encrypted_file.txt
余談ですが同僚氏が社内週次MTGの「今週のgem *1 」のコーナーで紹介してたのを覚えていなかったらこのプラグインはできませんでした。マジ感謝
レシピの記載方法
encrypted_remote_file "/home/deployer/.ssh/id_rsa" do owner "root" group "root" source "remote_files/id_rsa.encrypted" password ENV["ID_RSA_PASSWORD"] end
source
にはさっき暗号化したファイルのパスを渡します。
password
以外は remote_file
と全く同じですが、 password
は暗号化の時と同じものを渡す必要があります。ただしパスワードを文字列で直接渡すと意味が無いので環境変数経由で渡すのが望ましいです
dotenvとセットで使う
パスワードを毎回入力するのは煩わしいと思うので dotenv と組み合わせるのがお勧めです
.env
ファイルに
ID_RSA_PASSWORD=12345678
のように書いておいてレシピの上の方に
require 'dotenv' Dotenv.load
を書いておくだけで .env
に書いた環境変数が使われます。あとは .env
を .gitignore
に追加してコミットしないようにすればknpk(完璧)です
その他細かいこと
今回itamaeプラグインのユニットテストを書いてみたのですが、モックを使わざるを得ないので実装に密結合してしまうのが難点でした。
fluentd みたいな TestDriver の仕組みがあればもっとテスト書きやすいんだけどなぁ(チラチラッ