在厨师存储密码?

厨师存储密码和API密钥的最佳做法是什么? 将数据库密码,AWS api密钥和其他敏感凭据存储为Chef Server属性以供在配方中使用是非常诱人的 – 但是安全考虑呢? 最佳做法是什么?

从#chef IRC频道,很多人将这种数据存储在厨师服务器上的数据包中。

例如,数据包可能是'aws',其中的项目'main'指的是主AWS账户。 项目中的单独的键将是针对每个特定的值。 例如:

{ "id": "main", "aws_secret_key": "The secret access key", "aws_access_key": "The access key" } 

您也可能对encryption的数据包感兴趣。 我更详细地写了关于pipe理postfix SASLauthentication的细节。

更新 :我已经在博客和sysadvent上写了关于Chef Vault的 博客 文章 。

这个问题很老,没有被接受的答案,但是,对于这个问题的正确答案是,厨师允许使用encryption数据包来存储数据包中的敏感数据。

我认为Hashicorp的Vault非常有希望作为一种dynamic检索encryption信息的方式,并留下Chef工作stream在这个领域的一些怪异之处。

这是一个有趣的post,开始触及这个话题。 https://www.hashicorp.com/blog/using-hashicorp-vault-with-chef.html

厨师encryptiondata_bags确实是一个合法的解决scheme。 除此之外,您还可以使用ruby Gem,它允许您使用主厨节点列表的公钥来encryption厨师数据袋子项目。 这只允许那些厨师节点解密encryption的值。 比照 https://github.com/Nordstrom/chef-vault

我从来没有尝试过数据包,但这可能是因为我觉得除了厨师独奏之外,一切都太复杂了。 这就是为什么我使用名为Scalarium的服务使用厨师收款人 。

所以密码的问题,或者私人密钥和各种其他凭证是一个相当困难的问题。 我也有一堆食谱的密码需要创build,或正确设置。

通常我所做的是,我指定了什么scalarium人称为自定义JSON 。 这个json与使用chef-solo -j node.json

所以,例如在我的Scalarium Web界面上的自定义JSON ,我有以下几点:

 {"super_secure_password":"foobar"} 

这样做的是,我的超级安全密码在我的厨师在node[:super_secure_password]运行时可用,我可以在食谱或模板中使用它。

这只要我只使用Scalarium部署我的服务器就可以正常工作,但是我们也可以在本地的stream浪盒中使用我们的配方来获得开发环境和更简单的testing。 而当我使用stream浪汉(甚至独自一人)时,我无法使用Scalarium上的定制json

这就是我在my_recipe/attributes/default修复这个问题的方法:

 set_unless[:super_secure_password] = "test123" 

这意味着当我的配方在scalarium之外运行时,密码仍然可以在node[:super_secure_password]而且我的配方工作等等。 当配方在scalarium上下文中执行时,它不会覆盖它们提供的内容。

厨师保险柜可以是一个不错的select。 它提供了一个简单的界面,用于在厨师服务器上存储encryption数据,访问pipe理。 使用knife vault ...命令上传,编辑和更新数据。

要从配方中获取数据,请使用ChefVault::Item.load命令

 chef_gem "chef-vault" require 'chef-vault' item = ChefVault::Item.load("passwords", "root") item["password"] 

要设置用户,可以使用刀vault_admins属性更新数据。

 knife[:vault_admins] = [ 'example-alice', 'example-bob', 'example-carol' ] 

我会build议使用IAMangular色与厨师供应

 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 } ) 

目前最广泛使用的方法,大多数情况下安全的是使用厨师。

它使用共享密钥来encryption你的数据(类似于厨师encryption的数据包)。 这个共享的秘密是encryption的每个客户端和/或用户将使用它(如果您允许使用它)。

优点:

  • 在testing环境中,您可以使用未encryption的数据
  • 一个不会将共享密码存储为纯文本
  • 人们可能只允许访问他们的服务器来读取和写入一些数据库

 export EDITOR=vi #sets your favourite text editor knife vault create secret_data john_doe --admins "admin" --search "*:*" --mode client 

上面的命令在secret_data块项目中创build: john_doe ,可以由admin修改并由所有客户端使用。 之后, EDITOR命令将打开,所以你可以inputo粘贴你的秘密数据(在JSON中)。

search查询可以是: "role:basic" – 这意味着只有angular色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

最好的做法是将密码和密码保存在主厨data_bags中。 数据包包含数据包项目。 个人data_bag项目是json格式。

例如:

 { /* This is a supported comment style */ // This style is also supported "id": "ITEM_NAME", "key": "value" } 

encryption数据包项目:数据包项目可以使用共享的秘密encryption进行encryption。 这允许每个数据包项目存储机密信息(例如数据库密码或ssh密钥)或者在源控制系统中pipe理(没有出现在修订历史中的纯文本数据)。 这可以按照如下方式完成:

克里特岛密钥:例如,创build一个名为encrypted_data_bag_secret的密钥

 $ openssl rand -base64 512 | tr -d '\r\n' > encrypted_data_bag_secret 

其中encrypted_data_bag_secret是将包含密钥的文件的名称

encryptiondata_bag:使用类似于以下命令的knife命令对数据包项目进行encryption:

 $ knife data bag create passwords mysql --secret-file /tmp/my_data_bag_key 

其中“密码”是数据包的名称,“mysql”是数据包项目的名称,“/ tmp / my_data_bag_key”是包含秘密密钥的文件所在位置的path

validationencryption:当数据包项目的内容被encryption时,它们在被解密之前不会被读取。 encryption可以通过类似于以下命令的刀形命令进行validation:

 $ knife data bag show passwords mysql 

解密数据Bag:一个encryption的数据包项目被一个类似于下面的刀子命令解密:

 $ knife data bag show --secret-file /tmp/my_data_bag_key passwords mysql