在厨师存储密码?
厨师存储密码和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.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/
在这里: 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