2012-12-12 4 views
11

Ich habe eine vollständige Chefkonfiguration von Rollen, Kochbüchern, Databags usw. in einem privaten Git-Repository.Verschlüsselung von Datenbeuteln verschlüsselt auf Chef-Server, aber wie lokale Kopie zu verschlüsseln?

Ich sehe, dass ich die Option --secret-file verwenden kann, um ein Databag zu verschlüsseln, wenn es auf den Chef-Server hochgeladen wird.

Aber ich möchte diese Databags verschlüsselt im Git-Repository speichern.

Das einzige, was einem einfällt, ist das Erstellen einer unverschlüsselten JSON-Datei lokal, das Hochladen auf Chef mit Verschlüsselung, dann das Entnehmen des verschlüsselten JSON von der Chef-Webseite und Einfügen in meine Repository-Kopie.

Hat jemand anderes dieses Problem gelöst?

Antwort

15

Ich habe folgende bash (genannt encrypted-databag.sh) in meinem Koch-Arbeitsverzeichnis:

#!/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 

Das spart ich jedesmal, wenn ich Messer eingeben mir die verschlüsselten Daten Tasche zu zeigen. Und es wird automatisch aktualisiert/speichert es in das Repository, wenn ich es bearbeite.

auf 2013.08.30

Aktualisiert oben

Der Nachteil des Skripts ist, dass Sie Ihre Daten Tasche gerade auf Koch-Server bearbeiten. Aber es gibt ein Problem, wenn du noch an einem Kochbuch arbeitest und es nicht hochgeladen hast, sondern den Datenbeutel schon dort hast und von der älteren Version des Kochbuchs benutzt wird. Wenn der Chef-Client auf einem Knoten ausgeführt wird, kann dies zu einigen Fehlern führen.

Also überlegte ich, den verschlüsselten Datenbeutel lokal, ohne Chef-Server zu bearbeiten und dann die neue Version zusammen mit der neuen Version des Kochbuchs hochzuladen (nachdem die Tests bestanden wurden). Also hier ist die Rake Aufgabe, die ich jetzt verwende, um verschlüsselte Datensäcke zu bearbeiten.

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 

Jetzt verschlüsselten Daten Tasche zu bearbeiten ich benutze:

rake databag:edit[my_databag,item_in_databag] 
+0

Ich mag, dass es Ihnen danken! – Mojo

+0

Clever, danke! – allaire

+0

Danke, Dies half mir mit einem anderen, aber verwandten Problem, ich kann jetzt Databags direkt von Ruby verschlüsseln, ohne den Chef-Server kontaktieren zu müssen, damit es tut, also danke, super hilfreich! Wenn Sie wissen wollten, wie ich es gemacht habe, dann gehen Sie hier: http: //stackoverflow.com/questions/26978737/encrypt-data-bag-with-knife-from-inside-ruby – Thermatix

1

Ich nahm das Beispiel von @ draco-ater ein wenig weiter, als ich mich Daten Taschen wollen finden würde bearbeiten, während im Kochbuch-Verzeichnis indem ich etwas wie ../encrypted_data_bag etc gemacht habe, habe ich den Namen gekürzt und etwas extra bash Magie benutzt, um das eigentliche Verzeichnis zu finden, selbst wenn es symlinked ist (kann von überall im Dateisystem aufgerufen werden). Da ich nicht der Einzige bin, der an den Datensäcken arbeitet, wollte ich jederzeit den Inhalt der Datensäcke zeigen können, falls jemand anderes die Artikel aktualisiert hat und die Daten immer noch in den Repo-Ordner pusht (falls sie es vergessen haben). . Ich wollte auch, dass die Daten aus dem Repository gelöscht werden, wenn sie vom Server gelöscht wurden, um konsistenter zu sein. Also habe ich dieses Skript entwickelt. Bitte beachte, dass sich mein encrypted_data_bag_secret unter/etc/chef/encrypted_data_bag_secret befindet, andere wiederum können es irgendwo anders platzieren, weshalb sich oben im Skript ein SECRETFILE befindet, modifiziere es einfach dort, wo deine verschlüsselte geheime Datei existiert.

#!/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 
+0

Schön gemacht. :) – Mojo

+0

Danke;) Alles über die Automatisierung alles lol –