web-dev-qa-db-ja.com

Chefにパスワードを保存しますか?

ChefでパスワードとAPIキーを保存するためのベストプラクティスは何ですか?レシピで使用するためにデータベースパスワード、AWS APIキー、その他の機密情報をChef Server属性として保存するのは本当に魅力的ですが、セキュリティに関する考慮事項はどうでしょうか。このためのベストプラクティスは何ですか?

55
erikcw

#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

27
jtimberman

この質問は古く、受け入れられた回答はありませんが、この質問に対する正しい答えは、Chefが機密データを Data Bags に格納するために Encrypted Data Bags の使用を許可することです。

13
warwickp

HashicorpのVaultは、暗号化された情報を動的に取得し、この領域のChefワークフローの奇妙な点をいくつか残す方法として本当に有望だと思います。

これは主題に触れ始める興味深い投稿です。 https://www.hashicorp.com/blog/using-hashicorp-vault-with-chef.html

4
Ross Edman

ベストプラクティスは、キーとパスワードを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
2
Innocent Anigbo

Chef Encrypted data_bagsは確かに正当なソリューションです。これに加えて、Ruby Gemを使用して、Chefノードのリストの公開鍵を使用してChef Data Bag Itemを暗号化できます。これにより、それらのChefノードのみが暗号化された値cf. https://github.com/Nordstrom/chef-vault

2
Francois

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' ]
2
yurinnick

現在最も広く使用されているアプローチで、ほとんどの場合、十分に安全な方法は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.rbdepends 'chef-vault', '1.3.0'

詳細はこちら: https://blog.chef.io/2016/01/21/chef-vault-what-is-it-and-what-c​​an-it-do-for-you/ =

そしてここ: https://github.com/chef/chef-vault

1
MAXIDAVIDPL

私はデータバッグを試したことはありませんが、それはおそらくシェフソロ以外のすべてが少し複雑すぎることに気付いたためです。そのため、シェフのレシピを 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]で引き続き利用可能であり、私のレシピなどが機能することを意味します。レシピがスカラリウムのコンテキストで実行される場合、レシピが提供するものをオーバーライドしません。

1
Till

シェフプロビジョニングで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 }
)
0
nitheeshp