tjinjin's blog

インフラ要素多めの個人メモ

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な場所では要注意です。