くりにっき

フルスタックキュアエンジニアです

itamae-plugin-resource-encrypted_remote_file を作った

github.com

概要

暗号化されているファイル復号化してサーバに転送するための 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 の仕組みがあればもっとテスト書きやすいんだけどなぁ(チラチラッ