【问题标题】:Storing passwords in Chef?在 Chef 中存储密码?
【发布时间】:2011-05-24 08:47:18
【问题描述】:

使用 Chef 存储密码和 API 密钥的最佳做法是什么?将数据库密码、AWS api 密钥和其他敏感凭证存储为 Chef 服务器属性以在配方中使用真的很诱人——但是安全考虑呢?这方面的最佳做法是什么?

【问题讨论】:

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

标签: deployment configuration chef-infra


【解决方案1】:

最佳做法是将密钥和密码保存在 Chef data_bags 中。数据包包含数据包项。单个data_bag项为json格式。

例如:

{
  /* 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 是包含密钥的文件的名称

加密 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】:

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

    它使用共享密钥来加密您的数据(类似于厨师加密的数据包)。此共享机密会为将使用它的每个客户端和/或用户加密(如果您允许使用它)。

    好处:

    • 在测试环境中您可以使用未加密的数据
    • 不会将共享机密存储为纯文本
    • 可能只授予少数服务器访问权限以读取和写入某些数据包

    示例

    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 将打开,因此您可以键入 o 粘贴您的秘密数据(在 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-can-it-do-for-you/

    这里:https://github.com/chef/chef-vault

    【讨论】:

      【解决方案3】:

      我认为 Hashicorp 的 Vault 作为一种动态检索加密信息的方式非常有前途,并在该领域留下了 Chef 工作流程的一些奇怪之处。

      这是一篇开始触及主题的有趣帖子。 https://www.hashicorp.com/blog/using-hashicorp-vault-with-chef.html

      【讨论】:

        【解决方案4】:

        我建议将 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 }
        )
        

        【讨论】:

          【解决方案5】:

          Chef Vault 是个不错的选择。它提供了简单的接口,用于在厨师服务器上存储加密数据,访问管理。使用knife vault ... 命令上传、编辑、更新数据。

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

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

          设置用户,可以更新数据使用knifevault_admins属性。

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

          【讨论】:

            【解决方案6】:

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

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

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

            您可能还对encrypted data bags 感兴趣。为了管理postfix SASL authentication,我更详细地写了它们。

            更新:我在 my blogsysadvent 上写了关于 Chef Vault 的博客文章。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • coderanger.net/data-bags 中的 Noah pooh-pooh cryptobags 不是 Code Smell 吗? (TL;DR - 你必须分享一个秘密才能看到秘密)
              【解决方案8】:

              Chef Encrypted data_bags 确实是一个合法的解决方案。 除此之外,您还可以使用 ruby​​ Gem,它允许您使用厨师节点列表的公钥加密厨师数据包项目。这仅允许那些厨师节点解密加密值。 参看。 https://github.com/Nordstrom/chef-vault

              【讨论】:

              • chef-vault 是安全存储密码的好方法!
              【解决方案9】:

              我从未尝试过数据包,但这可能是因为我发现除了 chef-solo 之外的所有东西都太复杂了。这就是为什么我使用名为 Scalarium 的服务的厨师食谱。

              所以密码问题,或者例如私钥和各种其他凭据是一个非常困难的凭据。我也有一堆需要创建或正确设置密码的食谱。

              通常我所做的是,我指定 scalarium 人员所称的 custom json。这个 json 类似于一些人使用 chef-solo -j node.json 给 chef-solo 的 node.json

              例如在 Scalarium Web 界面上的 custom json 中,我有以下内容:

              {"super_secure_password":"foobar"}
              

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

              只要我只使用 Scalarium 部署我的服务器,它就可以正常工作,但我们也在本地 vagrant box 中使用我们的配方来开发环境和更轻松的测试。当我使用 vagrant(甚至是 chef-solo 本身)时,我无法访问 Scalarium 上的 custom json

              这就是我要解决的问题,my_recipe/attributes/default

              set_unless[:super_secure_password] = "test123"
              

              这意味着当我的食谱在 scalarium 之外运行时,node[:super_secure_password] 中的密码仍然可用,并且我的食谱有效,依此类推。当配方在 scalarium 上下文中执行时,它不会覆盖它们提供的内容。

              【讨论】:

              • 此服务已停止。
              猜你喜欢
              • 2017-12-14
              • 2011-01-01
              • 2019-09-17
              • 1970-01-01
              • 1970-01-01
              • 2010-10-26
              • 2011-10-04
              • 2012-01-22
              • 1970-01-01
              相关资源
              最近更新 更多