chefで秘密情報を暗号化するencrypted data bagsを使う
About
今更感ありますが、いろいろなSaaSを利用し始めると鍵の扱いをどうするかの問題が出てきます。生のままリポジトリに含めるのは言語道断なので、最低限の対策としてデータを暗号化できるencrypted data bags
を試してみます。
使い方
秘密鍵を用意する
暗号化に利用する鍵を作成します。下記コマンドで鍵を作ることができます。
$ openssl rand -base64 512 > .chef/data_bag_key
作成したら、鍵を利用できるようにknife.rb
に鍵のパスを指定します。
$ cat .chef/knife.rb ... data_bag_path "data_bags" encrypted_data_bag_secret ".chef/data_bag_key"
これで準備は完成です。
新規作成
それでは機密情報をdata_bags配下に作成していきます。
$ knife data bag create credentials aria --secret-file .chef/data_bag_key --local # editorが開く
credentialsがdata_bags配下にできるディレクトリ、ariaがその下にできるjsonファイルです。editorが開くので、ここで暗号化したい機密情報を生のまま書き込みます。
{ "id": "aria", "secret": "ARIAが好きです" }
謎のエラーが出ますが、安心して下さい、更新できてます。(エラーの調査はまだ…)
この状態で作成したファイルを確認してみると、
$ cat data_bags/test/aria.json { "id": "aria", "secret": { "encrypted_data": "EXqJtCfJhj7fU9nxjc17o4J0muWYNX64Vz1T1HaN2s+NEYvVXnd1bpDedZBH\nIEVQ\n", "iv": "yb2ZgPssv2JkLu5876W0jA==\n", "version": 1, "cipher": "aes-256-cbc" } }
しっかり暗号化されています。中身を確認したい場合は以下のコマンドで。
$ knife data bag show test aria --secret-file .chef/data_bag_key --local
中身の更新は下記コマンドで実行します。
$ knife data bag show test aria --secret-file .chef/data_bag_key --local # editorが開く
レシピ内でのデータの参照の仕方
下記のような形で参照できます。
test = Chef::EncryptedDataBagItem.load('test', 'aria') aaa = test['secret']
あとは通常のレシピと同じように扱っていけばよさそうです。
注意点
CircleCIなどでサーバCIをしている場合、cook時に鍵によって機密情報が復号されて実行されるので、実行ログに生の機密情報が出てしまいますのでpublicな場所では要注意です。