Zum Hauptinhalt

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.

Kategorien: Automatisierung
Schwierigkeit: einfach Serie: Secretmanagement mit Puppet Teil 2 von 2

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

  1. editieren der gpg_recipients datei
  2. hinzufügen/entfernen des öffentlichen Schlüssels zum/aus dem gpg_pubkeys Verzeichnis
  3. recrypt.sh laufen lassen
  4. commit
  5. push
  6. review
  7. merge
  8. 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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert