问题 数据包加密在Chef服务器上加密,但如何加密本地副本?


我在私有git存储库中有一组完整的Chef配置角色,cookbook,databag等。

我看到我可以使用--secret-file选项在数据库上传到Chef服务器时对其进行加密。

但我想存储在git存储库中加密的数据库。

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

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


10670
2017-12-12 22:22


起源



答案:


我的厨师工作目录中有以下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在某个节点上运行时,可能会导致一些错误。

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

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]

15
2017-12-13 15:50



我喜欢,谢谢! - Mojo
聪明,谢谢! - allaire
谢谢,这帮助了我一个不同但相关的问题,我现在可以直接从ruby加密数据库,而无需联系厨师服务器来做,所以谢谢,超级有帮助!如果你想知道我是怎么做的,那就去这里:stackoverflow.com/questions/26978737/... - Thermatix


答案:


我的厨师工作目录中有以下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在某个节点上运行时,可能会导致一些错误。

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

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]

15
2017-12-13 15:50



我喜欢,谢谢! - Mojo
聪明,谢谢! - allaire
谢谢,这帮助了我一个不同但相关的问题,我现在可以直接从ruby加密数据库,而无需联系厨师服务器来做,所以谢谢,超级有帮助!如果你想知道我是怎么做的,那就去这里:stackoverflow.com/questions/26978737/... - Thermatix


我从@draco-ater中得到了一个例子,因为我发现自己想要在cookbook目录中编辑数据包,做类似../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

1
2017-11-22 06:08



做得很好。 :) - Mojo
谢谢;)所有关于自动化一切大声笑 - Will H


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

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

knife backup export data_bags

刀要领 https://github.com/jkeiser/knife-essentials

knife download data_bags

0
2018-01-24 17:08