ChefでパスワードとAPIキーを保存するためのベストプラクティスは何ですか?レシピで使用するためにデータベースパスワード、AWS APIキー、その他の機密情報をChef Server属性として保存するのは本当に魅力的ですが、セキュリティに関する考慮事項はどうでしょうか。このためのベストプラクティスは何ですか?
#chef IRCチャネルから、多くの人々がこの種のデータをchefサーバーのデータバッグに保存します。
たとえば、データバッグは「aws」で、アイテムは「main」で、プライマリAWSアカウントを参照している場合があります。アイテムの個別のキーは、特定の値ごとにあります。例えば。:
{
"id": "main",
"aws_secret_key": "The secret access key",
"aws_access_key": "The access key"
}
暗号化されたデータバッグ にも興味があるかもしれません。 postfix SASL authentication を管理するために、それらについて詳しく説明しました。
更新: Chef Vault に関するブログ投稿を myに書きましたブログ と sysadvent 。
この質問は古く、受け入れられた回答はありませんが、この質問に対する正しい答えは、Chefが機密データを Data Bags に格納するために Encrypted Data Bags の使用を許可することです。
HashicorpのVaultは、暗号化された情報を動的に取得し、この領域のChefワークフローの奇妙な点をいくつか残す方法として本当に有望だと思います。
これは主題に触れ始める興味深い投稿です。 https://www.hashicorp.com/blog/using-hashicorp-vault-with-chef.html
ベストプラクティスは、キーとパスワードをchef data_bagsに保持することです。データバッグには、データバッグアイテムが含まれます。個々のdata_bagアイテムはjson形式です。
例:
{
/* This is a supported comment style */
// This style is also supported
"id": "ITEM_NAME",
"key": "value"
}
データバッグアイテムの暗号化:データバッグアイテムは、共有シークレット暗号化を使用して暗号化できます。これにより、各データバッグアイテムは機密情報(データベースパスワードやSSHキーなど)を保存したり、ソース管理システムで管理したりできます(変更履歴にプレーンテキストデータが表示されません)。これは次のように実行できます。
Crete Secret Keys:たとえば、encrypted_data_bag_secretという秘密鍵を作成します
$ openssl Rand -base64 512 | tr -d '\r\n' > encrypted_data_bag_secret
encrypted_data_bag_secretは、秘密鍵を含むファイルの名前です
data_bagの暗号化:データバッグアイテムは、次のようなナイフコマンドを使用して暗号化されます。
$ knife data bag create passwords mysql --secret-file /tmp/my_data_bag_key
ここで、「passwords」はデータバッグの名前、「mysql」はデータバッグアイテムの名前、「/ tmp/my_data_bag_key」は秘密鍵を含むファイルが置かれている場所へのパスです
暗号化の検証:データバッグアイテムのコンテンツが暗号化されると、復号化されるまで読み取ることができません。暗号化は、次のようなナイフコマンドで確認できます。
$ knife data bag show passwords mysql
データバッグの復号化:暗号化されたデータバッグアイテムは、次のようなナイフコマンドで復号化されます。
$ knife data bag show --secret-file /tmp/my_data_bag_key passwords mysql
Chef Encrypted data_bagsは確かに正当なソリューションです。これに加えて、Ruby Gemを使用して、Chefノードのリストの公開鍵を使用してChef Data Bag Itemを暗号化できます。これにより、それらのChefノードのみが暗号化された値cf. https://github.com/Nordstrom/chef-vault
Chef Vault は良い選択です。暗号化されたデータをchef-server、アクセス管理に保存するためのシンプルなインターフェースを提供します。 knife vault ...
コマンドを使用して、データをアップロード、編集、更新します。
レシピからデータを取得するには、ChefVault::Item.load
コマンドを使用します
chef_gem "chef-vault"
require 'chef-vault'
item = ChefVault::Item.load("passwords", "root")
item["password"]
データを更新できるユーザーを設定するには、knife vault_admins
プロパティを使用します。
knife[:vault_admins] = [ 'example-alice', 'example-bob', 'example-carol' ]
現在最も広く使用されているアプローチで、ほとんどの場合、十分に安全な方法はchef-vaultを使用することです。
共有シークレットを使用してデータを暗号化します(chefで暗号化されたデータバッグと類似しています)。この共有シークレットは、それを使用するすべてのクライアントやユーザーに対して暗号化されます(使用を許可する場合)。
利点:
export EDITOR=vi #sets your favourite text editor
knife vault create secret_data john_doe --admins "admin" --search "*:*" --mode client
上記のコマンドはsecret_data
データバッグアイテム:john_doe
を作成し、admin
によって変更され、すべてのクライアントで使用できます。そのコマンドの後にEDITOR
が開きますので、秘密のデータを貼り付けることができます(json内)。
検索クエリは次のようになります:"role:basic"
-これは、役割basic
を持つサーバーのみがこのデータを読み取ることができることを意味しますknife vault
追加のインストールが必要です
chef_gem 'chef-vault' do
compile_time true if respond_to?(:compile_time)
end
require 'chef-vault'
item = ChefVault::Item.load("secret_data", "john_doe")
item["password"]
およびmetadata.rb
:depends 'chef-vault', '1.3.0'
詳細はこちら: https://blog.chef.io/2016/01/21/chef-vault-what-is-it-and-what-can-it-do-for-you/ =
私はデータバッグを試したことはありませんが、それはおそらくシェフソロ以外のすべてが少し複雑すぎることに気付いたためです。そのため、シェフのレシピを Scalarium というサービスで使用しています。
したがって、パスワードの問題、または秘密鍵やその他のあらゆる種類の資格情報は、かなり難しいものです。私もパスワードを作成するか、正しく設定する必要のあるレシピがたくさんあります。
通常私がすることは、スカラリウムの人々がcustom jsonと呼ぶものを指定することです。このjsonはnode.json
に似ています。一部の人々はchef-solo -j node.json
を使用してシェフソロに寄付します。
したがって、たとえばScalarium Webインターフェースのcustom jsonには、次のようになっています。
{"super_secure_password":"foobar"}
これは、シェフがnode[:super_secure_password]
で実行しているときに、スーパー安全なパスワードが利用可能になり、レシピやテンプレートで使用できるようになります。
これは、Scalariumを使用してサーバーを展開するだけで問題なく機能しますが、開発環境と簡単なテストのためにローカルのvagrantボックスでレシピを使用します。そして、私が放浪者(またはそれだけでchef-solo)を使用する場合、Scalariumのcustom jsonにアクセスできません。
これを修正するために、my_recipe/attributes/default
で行います。
set_unless[:super_secure_password] = "test123"
これは、私のレシピがスカラリウムの外で実行されている場合でも、パスワードはnode[:super_secure_password]
で引き続き利用可能であり、私のレシピなどが機能することを意味します。レシピがスカラリウムのコンテキストで実行される場合、レシピが提供するものをオーバーライドしません。
シェフプロビジョニングでIAMロールを使用することをお勧めします
require 'chef/provisioning/aws_driver'
iam = AWS::Core::CredentialProviders::EC2Provider.new
puts iam.credentials.inspect
with_driver(
'aws:IAM:eu-west-1',
:aws_credentials => { 'IAM' => iam.credentials }
)