Deployment 在Chef中存储密码?

Deployment 在Chef中存储密码?,deployment,configuration,chef-infra,Deployment,Configuration,Chef Infra,使用Chef存储密码和API密钥的最佳实践是什么?将数据库密码、AWS api密钥和其他敏感凭据存储为Chef服务器属性以在菜谱中使用确实很吸引人,但安全性方面的考虑又如何呢?这方面的最佳实践是什么?从#chef IRC频道,许多人将此类数据存储在chef服务器上的数据包中 例如,数据包可能是“aws”,其中有一个项目“main”,指的是主aws帐户。项目中的单独键将用于每个特定值。例如: { "id": "main", "aws_secret_key": "The secret acc

使用Chef存储密码和API密钥的最佳实践是什么?将数据库密码、AWS api密钥和其他敏感凭据存储为Chef服务器属性以在菜谱中使用确实很吸引人,但安全性方面的考虑又如何呢?这方面的最佳实践是什么?

从#chef IRC频道,许多人将此类数据存储在chef服务器上的数据包中

例如,数据包可能是“aws”,其中有一个项目“main”,指的是主aws帐户。项目中的单独键将用于每个特定值。例如:

{
  "id": "main",
  "aws_secret_key": "The secret access key",
  "aws_access_key": "The access key"
}
你也可能对这一点感兴趣。我写了更多关于他们的细节,以便于管理


更新:我写过关于和的博客帖子。

我从未尝试过数据包,但这可能是因为我发现除了chef solo之外的所有东西都有点太复杂了。这就是为什么我要用一种叫“厨师回赠”的服务

因此,密码(例如私钥和各种其他凭证)的问题相当棘手。我也有一大堆需要创建密码或正确设置密码的方法

通常我要做的是,我指定scalarium称之为定制json的内容。这个json类似于一些人使用
chef solo-j node.json
给chef solo的
node.json

例如,在Scalarium web界面上的自定义json中,我有以下内容:

{"super_secure_password":"foobar"}
这样做的目的是,我的超级安全密码在我的厨师运行
节点[:super\u secure\u password]
期间可用,我可以在食谱或模板中使用它

只要我只使用Scalarium部署我的服务器,而且我们还使用本地vagrant Box中的方法来开发环境和简化测试,这就可以很好地工作。当我使用vagrant(甚至是chef solo本身)时,我无法访问Scalarium上的自定义json

这就是我在
my_recipe/attributes/default
中修复的方法:

set_unless[:super_secure_password] = "test123"

这意味着,当我的配方在scalarium之外运行时,密码仍然在
节点[:super\u secure\u password]
中可用,我的配方可以工作,依此类推。当配方在scalarium上下文中执行时,它不会覆盖它们提供的内容。

这个问题很老,没有公认的答案,但是,这个问题的正确答案是Chef允许使用来存储敏感数据。

Chef加密数据包确实是一个合法的解决方案。 除此之外,还可以使用RubyGem,它允许您使用Chef节点列表的公钥加密Chef数据包项。这只允许那些chef节点解密加密的值。 cf.

可能是一个不错的选择。它为在chef服务器上存储加密数据、访问管理提供了简单的接口。使用
刀库…
命令上载、编辑、更新数据

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

chef_gem "chef-vault"
require 'chef-vault'
item = ChefVault::Item.load("passwords", "root")
item["password"]
要设置可以更新数据的用户,请使用knife
vault\u admins
属性

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

我建议与厨师一起使用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 }
)

我认为Hashicorp的Vault作为一种动态检索加密信息并在这一领域留下厨师工作流程中的一些奇怪之处的方法是非常有前途的

这是一篇有趣的文章,开始触及主题。

目前使用最广泛且在大多数情况下足够安全的方法是使用chef vault

它使用共享秘密加密您的数据(类似于chef加密的数据包)。此共享机密对将使用它的每个客户端和/或用户进行加密(如果您允许使用)

好处:

  • 在测试环境中,您可以使用未加密的数据
  • 不能将共享秘密存储为纯文本
  • 人们可能只允许少数人访问他们的服务器来读写一些数据包
例子 上面的命令在
secret\u data
databag项中创建:
john\u doe
,可由
admin
修改并由所有客户端使用。之后,命令
编辑器将打开,这样您就可以键入o粘贴您的机密数据(json)

搜索查询可以是:
“role:basic”
-这意味着只有具有role
basic
的服务器才能读取此数据
刀库
需要额外安装吗

在你的食谱里 在
metadata.rb
中:
依赖于“chef vault”、“1.3.0”

更多信息请点击此处:


这里:

最佳做法是将钥匙和密码保存在厨师数据包中。数据包包含数据包项。单个数据包项目采用json格式

对于exmaple:

{
  /* This is a supported comment style */
  // This style is also supported
  "id": "ITEM_NAME",
  "key": "value"
}
加密数据包项目: 数据包项目可以使用共享秘密加密进行加密。这允许每个数据包项存储机密信息(如数据库密码或ssh密钥)或在源代码管理系统中进行管理(版本历史记录中不显示纯文本数据)。这可以通过以下方式完成:

密钥: 例如,创建一个名为encrypted_data_bag_secret的密钥

$ openssl rand -base64 512 | tr -d '\r\n' > encrypted_data_bag_secret
其中,encrypted_data_bag_secret是包含密钥的文件名

加密数据包: 使用类似于以下命令的刀子命令对数据包项目进行加密:

$ knife data bag create passwords mysql --secret-file /tmp/my_data_bag_key
$ knife data bag show passwords mysql
$ knife data bag show --secret-file /tmp/my_data_bag_key passwords mysql
其中“passwords”是数据包的名称,“mysql”是数据包项的名称,“/tmp/my_data_bag_key”是包含密钥的文件所在位置的路径

验证加密: 当数据包项目的内容被加密时,在解密之前,它们将不可读。可以使用类似以下命令的刀命令验证加密:

$ knife data bag create passwords mysql --secret-file /tmp/my_data_bag_key
$ knife data bag show passwords mysql
$ knife data bag show --secret-file /tmp/my_data_bag_key passwords mysql
解密数据包: 加密数据包项目使用类似于以下命令的刀命令解密:

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

为什么这个问题被否决了?这似乎是一个合理的问题。可能是因为有人认为它发生在ServerFault上,因为它与编程无关