Hiera-eyaml-gpg – Hiera-eyaml mit GPG nutzen
Hiera-eyaml-gpg erweitert Hiera-eyaml um die Möglichkeit GPG Schlüssel zur Verschlüsselung der Werte im Hiera zu nutzen.
So funktioniert hiera-eyaml-gpg
Hiera-eyaml-gpg verwendet ebenfalls ein Public/Private-Key-Paar wie Hiera-eyaml, das mit Puppet ausgeliefert wird, aber im Unterschied zu Hiera-eyaml verwendet jeder Server (auf Wunsch) und jeder Benutzer sein eigenes GPG Key-Paar. Benutzer können auf einfache Weise in die Liste der Empfänger aufgenommen oder daraus entfernt werden. Wenn GPG bereits im Einsatz ist, haben die Benutzer bereits ein Schlüsselpaar.
Die Installation
Voraussetzungen
Eine laufende Installation von Puppet Server 6 oder neuer wird vorausgesetzt, ebenso eine Workstation mit einer Ruby-Installation. Dies ist nicht das Ruby, das mit dem Puppet Agent ausgeliefert wird. Später mehr dazu, warum das wichtig ist.
Installation der benötigten Gems
Es gibt zwei GPG-Implementierungen für Ruby. ruby_gpg ist die native Implementierung, kann aber nur Inhalte entschlüsseln. Gpgme ist die Implementierung mit dem vollen Funktionsumfang, die sowohl in der Lage ist zu verschlüsseln als auch zu entschlüsseln.
Gpgme muss kompiliert werden, läuft also weder mit dem JRuby des Puppet Servers noch mit dem Ruby Agent, da diese keine Quellen für die Kompilierung enthalten. Wir installieren das Ruby der Linux-Distribution.
Auf dem Puppet Server:
sudo /opt/puppetlabs/bin/puppetserver gem install ruby_gpg
sudo /opt/puppetlabs/bin/puppetserver gem install hiera-eyaml hiera-eyaml-gpg
sudo /opt/puppetlabs/puppet/bin/gem install ruby_gpg
sudo opt/puppetlabs/bin/puppetserver gem install ruby_gpg
Auf der Workstation
sudo apt-get install ruby ruby-dev
sudo gem install hiera-eyaml-gpg gpgme puppet
Die benötigten Pakete sind nun installiert..
GPG Schlüsselpaare erstellen
Puppet Server Schlüsselpaar
gpg --full-generate-key
Folge dem Dialog und schütze den Key NICHT mit einem Passwort
Schlüsselpaar für den Benutzer generieren
gpg --full-generate-key
Folge dem Dialog und schütze den Key mit einem Passwort
Die Schlüsselpaare exportieren
Die Schlüsselpaare prüfen
gpg -K
sec rsa4096 2012-07-02 [SC]
CED7883AFF58E66AD69518A2F6A73813AAF1C5C0
uid [ unbekannt ] Simon Hönscheid <simon@hoenscheid-itconsulting.com>
ssb rsa4096 2012-07-02 [E]
sec rsa4096 2016-02-10 [SC]
B1075B7194BA4F90DED738E725D4D0655675479C
uid [ unbekannt ] Puppetserver (Puppetserver GPG Key) <puppetserver@hoenscheid-itconsulting.com>
ssb rsa4096 2016-02-10 [E]
Export der privaten Schlüssel
gpg --export-secret-key -a "simon@hoenscheid-itconsulting.com" > puppetuser.gpg.sec
gpg --export-secret-key -a "puppetserver@hoenscheid-itconsulting.com" > puppetserver.gpg.sec
Export der öffentlichen Schlüssel
gpg --export -a "simon@hoenscheid-itconsulting.com" > puppetuser.gpg.pub
gpg --export -a "puppetserver@hoenscheid-itconsulting.com" > puppetserver.gpg.pub
Vorbereiten der Hiera Struktur
vim hiera.yaml
---
version: 5
defaults:
hierarchy:
- name: "my hierachy structure"
lookup_key: eyaml_lookup_key
options:
gpg_gnupghome: /opt/puppetlabs/server/data/puppetserver/.gnupg
paths:
- "common.yaml"
Verschlüsselung des ersten Werts
Import der Schlüssel(paare)
In einem ersten Schritt importieren wir die Schlüssel auf den Puppet Server.
sudo cp puppetserver.gpg.sec /opt/puppetlabs/server/data/puppetserver/key
sudo chown puppet:puppet /opt/puppetlabs/server/data/puppetserver/key
sudo su puppet -s /bin/bash -c '/usr/bin/gpg --import /opt/puppetlabs/server/data/puppetserver/key'
Abschließend starten wir den Puppet server neu
systemctl restart puppetserver.service
Füge die Scripte und öffentlichen Schlüssel zum data directory des control-repositories hinzu
Es gibt zwei scripte die es sehr einfach machen mit Hiera-eyaml-gpg zu arbeiten
edit.sh
Dieses Skript ermöglicht das Editieren einer Datei mit verschlüsselten Werten oder das Hinzufügen neuer Werte. puppetserver_key nach Bedarf anpassen.
#!/bin/bash
puppetserver_key='puppetserver@hoenscheid-itconsulting.com'
recipient_file='gpg_recipients'
if [ $# -ne 1 ]; then
echo "[-] Please specify a file to edit.."
exit 1
fi
grep $puppetserver_key $recipient_file > /dev/null || { echo "ERROR: ${puppetserver_key} not in recipient file ${recipient_file}. This may NEVER happen!"; exit 1; }
if [ ! -e $1 ]; then
echo "[*] Specified file argument $1 does not exist, creating it for you..."
touch $1
fi
echo -e "[*] Importing new public keys..."
gpg --import gpg_pubkeys/*
echo -e "[*] Editing the following file: $1"
echo -e "[*] Recipients are:"
cat $recipient_file
echo ""
eyaml edit --gpg-always-trust --gpg-recipients-file $recipient_file $1
recrypt_all.sh
Mit Hilfe dieses Skripts ist es möglich, alle Dateien mit verschlüsseltem Inhalt beim Ausscheiden von Mitarbeitern aus dem Unternehmen oder beim Eintritt von Mitarbeitern in das Unternehmen neu zu verschlüsseln.
Passe den Wert von puppetserver_key an deine Bedürfnisse an.
#!/bin/bash
if [ $# -eq 0 ]; then
encrypted_files=`grep -Rl "ENC\[GPG" *`
else
encrypted_files=$*
fi
puppetserver_key='puppetserver@hoenscheid-itconsulting.com'
recipient_file='gpg_recipients'
grep $puppetserver_key $recipient_file > /dev/null || { echo "ERROR: ${puppetserver_key} not in recipient file ${recipient_file}. This must NEVER happen!"; exit 1; }
echo -e "[*] Reencrypting the following files:\n $encrypted_files\n"
echo -e "[*] Recipients are:"
cat $recipient_file
echo ""
for item in $encrypted_files ; do
echo "[*] Reencrypting $item"
eyaml recrypt --gpg-always-trust --gpg-recipients-file $recipient_file $item
if [ $? -eq 0 ] ; then
echo -e "[+] Successfully reencrypted $item\n"
else
echo "[-] Reencryption of $item failed, this is bad!"
echo "[-] Please investigate what went wrong and DO NOT PUSH THIS!!"
exit 1
fi
done
echo "[+] Reencryption of all files was successful"
Füllen der gpg_recipients Datei
In dieser Datei sind alle E-Mail-Adressen oder KeyIDs der Puppet-Server und aller Teammitglieder enthalten.
Wenn ein Teammitglied das Team verlässt oder hinzukommt, wird der Schlüssel hinzugefügt und entfernt.
puppetserver@hoenscheid-itconsulting.com
simon@hoenscheid-itconsulting.com
GPG public Keys ins gpg_pubkeys Verzeichnis legen
cp puppetserver.gpg.pub gpg_pubkeys/
cp puppetuser.gpg.pub gpg_pubkeys/
Füge den Schlüssel hinzu und entferne ihn, wenn ein Teammitglied geht oder hinzukommt.
Das erste Secret verschlüsseln
Das Script öffnet den bevorzugten Editor, im Zweifelsfall wird nachgefragt:
./edit.sh nodes/node.example.com.yaml
[*] Importing new public keys...
gpg: key B1075B7194BA4F90: "Puppetserver (Puppetserver GPG Key) <puppetserver@hoenscheid-itconsulting.com>" not changed
gpg: key CED7883AFF58E66A: "Simon Hönscheid <simon@hoenscheid-itconsulting.com>" not changed
gpg: Total number processed: 2
gpg: unchanged: 2
[*] Editing the following file: nodes/node.example.com.yaml
[*] Recipients are:
puppetserver@hoenscheid-itconsulting.com
simon@hoenscheid-itconsulting.com
# | This is eyaml edit mode. This text (lines starting with # | at the top of
# | the file) will be removed when you save and exit.
# | - To edit encrypted values, change the content of the DEC(<num>)::PKCS7[]!
# | block (or DEC(<num>)::GPG[]!).
# | WARNING: DO NOT change the number in the parentheses.
# | - To add a new encrypted value copy and paste a new block from the
# | appropriate example below. Note that:
# | * the text to encrypt goes in the square brackets
# | * ensure you include the exclamation mark when you copy and paste
# | * you must not include a number when adding a new block
# | e.g. DEC::PKCS7[]! -or- DEC::GPG[]!
---
secret_lookup_key: 'DEC::GPG[my secret string]!'
Speichern. Die Ausgabe mit cat sieht so aus:
cat nodes/node.example.com.yaml
---
secret_lookup_key: 'ENC[GPG,hQIMA/E8AY2ukwPnAQ/9GPh0mKICiGEFnl5mRGfGvLfkngYlMjK4dId7jZzz8QsJnxzGVdpjEs+fLPi0Cbt3+MoXAoKFcNQQWLDvWCgKZFe+u5N99mkJsrYXf0GTqCGDyylhu0G1uIL5qAVcZFQMbVxOeijlNBJreP//DLpLjrIZ4Csu4Zl5W6dUm9MmmCejfpTFDuo2Jn3eoCzGhSAXmBNo8mzPHxgirb2YhjZunBQBc0VZquP6PIrM0H0rbH6Hy7ISXp3i6L5WGzjmW3WPdb4y89ccY3OKDY6Vj+BjCgRVc9NQB8Fqt6tkirJ1MhSfbFhMuHmgAns7ye/+yZKwIVu/HZ+gdSJPD1VeprYBw9evM+4vxXeSO3BAYv6tdrQUEfSCCixfxVENS5srk3sLfFmiCm+xxTKEGf9ti0gNXMzO9S3ImcXjOUNag43peXmtH5StgkWz4+ldi4NhzPBC5dHeriOQLH3ZMtQC4mIt4UZ1+TcFRCaYoDm6HaNOmdy5Xbb7/XLZKL0Q935X0L7XTQJ7sbacoOdix6/axT+pZ5/HNQCjpA2PXESh1RwPx6keVuYFKcvwWMh0U5iptXBU8boCYgB4zdyGRarE+E5MBuxKf+DwYX5+joCuYVs8uBK2JHESc0wiTVbh17e/9LbPFOajxtKjcFyMtnGU4HJGplCRbsIe+EX41uNtsS6YWeqFAgwDPvX9mQAHng4BD/4go3GImAVwN/UKykIHCTDzNPABlkNog9nfOGeWUSeWRvkr5IN/4CzKu2G106AK8L1BU4qMK2AD8pjgpujwWJEiaqhheyuAxlKNc0CDkxCdkvUTjTrUALPn6P/ZhfpvrV+qk9uGzlowTB8MseeAvUn9iCO8raU8xi0KUr+Yc2Fj/mBofLHreI9uoU3uqIZii1D3h1SecWIg/6zaJjHz8+6c7m6aL+tQwv8teaXOWNAHkbm06piA4pYwA3URe3q89yl5Pkat7pqe8HwJms/wcJr0SyR6w9naFlLV3NVaOlG8J/wOiPZWvGPNiZAoJUfNmn0OufBEmXYLrqPtNop1mavk1f4kYoQx7aDUHWOaeBzDFlxr5E1KLzf02mBD6vNWbvFEPYRB/VbxxR2ZS5EV9W574WRGHQR1RIjtBwAHcSTRMXXD7kjKznqPFmCfbYjT1b6h1wx2dTYxL2AGTn8pzBqy/yLd85Iab5r6H1//FTcRjG2zoVo7gPMddo8ao27fa8aCNXTpI559qwdX1C+bY1IzKCO27I9jF6WRfYUt62lP69uvCBH4EVSnHcd6rauV+AdRhL8I4MJm2r0SykL7az9uBHujcqYuXkM+ckD2k7BfnUAiwvIcictNtPR9AS8YYNXeCu1LPfhSMQCm1AaiE3dQFD2w4kikfy/fxdAvBNgXdNJOAQf6m4NiPZfHrlHQAMXFDaye32fLmdDcFme4KkkzrpbcPVNJlQ932jC8REaKKPPUJqHi7GG3rVRfwYYfwglyuNDNKQwXG2UOd5ukHw0W]'
Prüfen des lookup
Wenn alles passt, sollten wir den Wert auf dem Pupper Server mit puppet lookup abfragen können und den Klartext als Antwort erhalten:
HIERA_EYAML_GPG_GNUPGHOME=~/.gnupg
puppet lookup 'secret_lookup_key'
--- my secret string
Das Einrichtung von Hiera-eyaml-gpg ist damit abgeschlossen
Hinzufügen/entfernen von Team Mitgliedern
- editieren der gpg_recipients datei
- hinzufügen/entfernen des öffentlichen Schlüssels zum/aus dem gpg_pubkeys Verzeichnis
- recrypt.sh laufen lassen
- commit
- push
- review
- merge
- fertig
Bekannte Stolpersteine
Daten Strukturen
YAML Blöcke funktionieren nicht:
key: |
content
more content
Es ist möglich das weitere komplexe YAML Strukturen ebenfalls nicht funktionieren
Anführungszeichen
Wenn ein String durch Anführungszeichen begrenzt ist, schließen diese den Verschlüsselungs-Block mit ein.
---
secret_lookup_key: 'DEC(1)::GPG[my secret string]!'
Der Index und das kopieren von Werten
Das Kopieren und Einfügen von Werten im Bearbeitungsmodus ist problemlos möglich, wenn folgende Punkte beachtet werden:
Die Indexnummern werden pro Datei hochgezählt. Sie sind immer ungerade. Beim Kopieren ist darauf zu achten, den Index zu entfernen. Er wird automatisch wieder hinzugefügt.
---
secret_lookup_key: 'DEC(1)::GPG[my secret string]!'
secret_lookup_key_two: 'DEC::GPG[my secret string]!'
Beim erneuten editieren:
---
secret_lookup_key: 'DEC(1)::GPG[my secret string]!'
secret_lookup_key_two: 'DEC(3)::GPG[my secret string too]!'
Viel Erfolg beim benutzen von Hiera-eyaml-gpg, bei Fragen nehmen Sie gerne Kontakt zu mir auf oder schreiben Sie einen Kommentar!