【问题标题】:Data bag encryption encrypts on Chef server, but how to encrypt local copy?数据包加密在 Chef 服务器上加密,但如何加密本地副本?
【发布时间】:2012-11-30 17:54:47
【问题描述】:

我在私有 git 存储库中有完整的 Chef 配置集,包括角色、食谱、数据包等。

我发现当数据包上传到 Chef 服务器时,我可以使用 --secret-file 选项对其进行加密。

但我也想将那些加密的数据包存储在 git 存储库中。

唯一想到的是在本地制作一个纯文本 json 文件,将其上传到 Chef 并加密,然后从 Chef 网页获取加密的 JSON 并将其粘贴到我的存储库副本中。

其他人解决了这个问题吗?

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    我的主厨工作目录中有以下 bash(称为 encrypted-databag.sh):

    #!/bin/bash -e
    
    knife data bag $1 $2 $3 --secret-file ~/.chef/encrypted_data_bag_secret
    if [ "$1" == "edit" ] ; then
        knife data bag show $2 $3 -Fj > "./data_bags/$2/$3.json"
    fi
    

    每次我向我展示加密的数据包时,它都可以节省我的打字时间。当我编辑它时,它会自动更新/保存到存储库中。

    2013 年 8 月 30 日更新

    上述脚本的缺点是您直接在 chef-server 上编辑数据包。但是,当您仍在编写一些食谱并且尚未上传它时,就会出现问题,但数据包已经存在并且被旧版本的食谱使用。这样在某个节点上运行 chef-client 时,可能会导致一些错误。

    所以我正在考虑在本地编辑加密数据包,没有厨师服务器,然后将新版本的它与新版本的食谱一起上传(测试通过后)。所以这是我现在用来编辑加密数据包的 rake 任务。

    namespace 'databag' do
      desc 'Edit encrypted databag item.'
      task :edit, [:databag, :item, :secret_file] do |t, args|
        args.with_defaults :secret_file => "#{ENV['HOME']}/.chef/encrypted_data_bag_secret"
        secret = Chef::EncryptedDataBagItem.load_secret args.secret_file
        item_file = "data_bags/#{args.databag}/#{args.item}.json"
        tmp_item_file = "/tmp/#{args.databag}_#{args.item}.json"
        begin
          #decrypt data bag into tmp file
          raw_hash = Chef::JSONCompat.from_json IO.read item_file
          databag_item = Chef::EncryptedDataBagItem.new raw_hash, secret
          IO.write tmp_item_file, Chef::JSONCompat.to_json_pretty( databag_item.to_hash )
          #edit tmp file
          sh "#{ENV['EDITOR']} #{tmp_item_file}"
          #encrypt tmp file data bag into original file
          raw_hash = Chef::JSONCompat.from_json IO.read tmp_item_file
          databag_item = Chef::EncryptedDataBagItem.encrypt_data_bag_item raw_hash, secret
          IO.write item_file, Chef::JSONCompat.to_json_pretty( databag_item )
        ensure
          ::File.delete tmp_item_file #ensure tmp file deleted.
        end
      end
    end
    

    现在编辑我使用的加密数据包:

    rake databag:edit[my_databag,item_in_databag]
    

    【讨论】:

    • 谢谢,这帮助我解决了一个不同但相关的问题,我现在可以直接从 ruby​​ 加密数据包,而无需联系厨师服务器来做这件事,非常感谢,非常有帮助!如果你想知道我是怎么做到的,那就去这里:stackoverflow.com/questions/26978737/…
    【解决方案2】:

    我从@draco-ater 中进一步举了一个例子,因为我发现自己想在食谱目录中通过执行类似 ../encrypted_data_bag 之类的操作来编辑数据包,所以我缩短了名称并使用了一些额外的 bash 魔法找到实际的目录,即使它是符号链接的(可以从文件系统中的任何地方调用)。因为我不是唯一一个处理数据包的人,所以我希望能够随时显示数据包的内容,以防其他人更新了项目并且仍然将数据推送到存储库中(以防他们忘记添加它) .如果从服务器中删除数据,我还希望从存储库中删除数据以更加一致。所以我想出了这个脚本。请记住,我的 encrypted_data_bag_secret 位于 /etc/chef/encrypted_data_bag_secret 下,但是其他人可能会选择将其放在其他位置,这就是脚本顶部有一个 SECRETFILE 的原因,只需使用加密的机密文件所在的位置进行修改即可。

    #!/bin/bash -e
    SECRETFILE="/etc/chef/encrypted_data_bag_secret"
    SOURCE="${BASH_SOURCE[0]}"
    while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
    appDir="$( cd -P "$( dirname "$SOURCE" )/" && pwd )"
    cd $appDir
    if [ "$1" != "edit" ] && [ "$1" != "create" ] && [ "$1" != "delete" ] && [ "$1" != "show" ]
    then
            echo "Bad arguments!"
            echo "First argument is what you want to do on the databag (show|edit|create|delete)"
            echo "Second argument is the databag"
            echo "Third argument is the item inside the databag"
            echo ""
            echo "Example: ./dbag edit aws main"
            echo ""
            echo "You used ($1) as the action to perform on ($2)/($3)"
            exit 1
    else
            if [ "$1" == "delete" ]; then
                    knife data bag $1 $2 $3
                    if [ -z "$3" ]; then
                            rm -rf data_bags/$2
                    else
                            rm -f data_bags/$2/$3.json
                    fi
            else
                    mkdir -p $appDir/data_bags/$2
                    knife data bag $1 $2 $3 --secret-file $SECRETFILE
                    knife data bag show $2 $3 -Fj > "./data_bags/$2/$3.json"
            fi
    fi
    

    【讨论】:

      【解决方案3】:

      实现此目的的另一种方法是使用刀插件:

      刀备份https://github.com/mdxp/knife-backup

      knife backup export data_bags
      

      刀具必备https://github.com/jkeiser/knife-essentials

      knife download data_bags
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多