Hiera-eyaml, die eingebaute Verschlüsselung für sensible Daten in Puppet
Hiera-eyaml erweitert Hiera um die Möglichkeit Werte verschlüsselt in der YAML Datei abzulegen. Dazu wird die Verschlüsselungstechnologie PKCS7 genutzt.
Was ist Hiera?
Puppet nutzt Hiera um Daten als Schlüssel-Wert-Paare zu speichern. Diese können aus dem Code nachgeschlagen und dann in den Puppet Katalog kompiliert werden. Mit hiera ist es möglich sensible Daten wie Passwörter seperat abzulegen, jedoch nicht diese durch Verschlüsselung abzusichern. Hier kommt hiera-e(ncrypted)yaml ins Spiel.
Die Hiera-Erweiterung e(ncrypted)yaml
Hiera-eyaml (https://github.com/voxpupuli/hiera-eyaml) ist ein Hiera-Backend, das mit Puppet ab Version 5 ausgeliefert wird. Es ist die Standardlösung, um Passwörter und andere sensible Daten in Puppet zu verwalten. Mit Hiera-eyaml werden Werte verschlüsselt in Hiera gespeichert und bei Bedarf auf dem Puppet Server entschlüsselt und im Katalog abgelegt.
Konfiguration von Hiera-eyaml
Hiera-eyaml wird in der hiera.yaml Datei im control-repo konfiguriert. Eine Konfiguration könnte wie folgt aussehen:
---
version: 5
defaults:
datadir: data
hierarchy:
- name: "Eyaml hierarchy"
lookup_key: eyaml_lookup_key # eyaml backend aktivieren
paths:
- "nodes/%{trusted.certname}.yaml"
- "common.yaml"
options:
:pkcs7_private_key: /etc/puppetlabs/puppet/keys/private_key.pkcs7.pem
:pkcs7_public_key: /etc/puppetlabs/puppet/keys/public_key.pkcs7.pem
Die Konfiguration erklärt
Zeile 2: Die Version der Hiera Konfiguration
Zeile 3: Der default Hash mit Standardwerten beginnt
Zeile 4: Das Datenverzeichnis, data auf der gleichen Ebene wie die Config.
Zeilen 5-10: Das erstellen der Hierachie und das festlegen des Lookup Keys, diese Option aktiviert eYAML
Zeilen 11-13: Das Hinterlegen der eYAML Schlüssel
Das Schlüsselpaar erzeugen
Hiera-eyaml kommt mit dem eyaml Kommando, das uns den Umgang mit eyaml erleichtert. Zuerst erzeugen wir das benötigte Schlüsselpaar:
Dadurch werden die Keys in dem von uns in der hiera.yaml angegebenen Verzeichnis angelegt. Der private Schlüssel dient dem Entschlüsseln und sollte sicher abgelegt werden und nie abseits der Puppet Server genutzt werden. sind mehrere Puppetserver vorhanden, benötigen alle das Schlüsselpaar. Der öffentliche Schlüssel dient dem verschlüsseln und kann im control-repo versioniert werden.
/opt/puppetlabs/puppet/bin/eyaml createkeys --pkcs7-keysize=6192 --pkcs7-digest=SHA512 --pkcs7-private-key=/etc/puppetlabs/puppet/keys/private_key.pkcs7.pem --pkcs7-public-key=/etc/puppetlabs/puppet/keys/public_key.pkcs7.pem
[hiera-eyaml-core] Created key directory: /etc/puppetlabs/puppet/keys
[hiera-eyaml-core] Keys created OK
sudo chown -R puppet:puppet /etc/puppetlabs/puppet/keys
Werte mit eyaml verschlüsseln
Hiera eyaml unterstützt die beiden Formate String und Block Notation
Enter password: ***
/opt/puppetlabs/puppet/bin/eyaml encrypt -l class::parameter -p
class::parameter:
ENC[PKCS7,MIIDfwYJKoZIhvcNAQcDoIIDcDCCA2wCAQAxggMnMIIDIwIBADAFMA
CAQEwDQYJKoZIhvcNAQEBBQAEggMGkYrbPkbvcUIqVGdXkMAkDwpzKe24+/JCtHf
NZBcN5YZHPzmhHSALFqWX6XSBaYJUQfikEfAbXHKPVq8Ea6ap6KDMU5aHwNlVHlA
ec54C4q/kNQQg53ilyLt+8E+k7XLzhl8k7I1s5oiQqty/hh9cDbmWJ5fnCmzt9Oh
DqK+a+Ddaojlo4aNvj/JXMdPn8ZENihbTehyMk0qq8aIPTXW46jEgXmXfoYBdQE+
830+OWfRebwUrYN2B7e20iLfnF6abVhuPGcdQ3qNzpB6Lko63YM/Q2hLQwDPN1uO
BrnbYw/Ujk+j+ZfUePVIvKA+u0khj3ljKg0M2fQEqbWwVWFmGqT23XA80LtFDfAV
vXchp/S/Qhr3Zah3U4dRFd92+wNBLwQngD2xLibzCSM5OrL4VBFvhrqwAOo8e7yT
pUB+e2GMNavcHfCQGbg8fpAn3Di/YgBamSo95yU0gY5k6QOdGCtffBDqvWpKRu6S
5/FaV005BBY8Cfr57oPHp93sILNmx4JEya0po3xnny/vor+kcuqGWP1vMSeRorRD
l55UzBJ04UayzhGwKbf5XAwrFJ8C+h1H/spV0wsFP8ocsl1oJ/Y1ErsE3fF44dat
Z1+R34vEmExFqlFvQgVV7rrDVVHEw/xs1q145Q1c+u7MtrZmJ8BFOFJHdd0RiONe
l1ILgAmYikYmd4pCr7nii26oZHdQfPnHotOsTBTf3w4WIcFy0ALhICT6DVd8YiYG
CMjoZnxZrAr39Tg86sFIKSuWC+pGZ1BM5uIG/CYyfhBgJ+ig8TdmRSrO6AqRx94U
TNs34EGIGxGfGpN8OLLbDOUpTn1Aa2yyVq2S76NiQwoPdkdCdmdYISSKOzxt508s
WzBLqQ0DnXnfBLLMh5fQDD0gd/pjx+xYiuz3awXkWnK7bRJZJpjjrwiYNFjwtg7+
Lse8yVvyG4l7LOOdDyWdeKZcCtAUQ+zLBwQ23C8XNBwG3YWIehQWmhcc3rFfMqsF
k8TfDh2wmWqM6lN9qZY9bMDwGCSqGSIb3DQEHATAdBglghkgBZQMEASoEEMuRMja
r8NI+EwJ81/rGGCAECJv2efhWyoqjyTJTSpX1Pc=]
oder
class::parameter: >
ENC[PKCS7,MIIDfwYJKoZIhvcNAQcDoIIDcDCCA2wCAQAxggMnMIIDIwIBAD
AFMAACAQEwDQYJKoZIhvcNAQEBBQAEggMGkYrbPkbvcUIqVGdXkMAkDwpzKe
24+/JCtHfSNZBcN5YZHPzmhHSALFqWX6XSBaYJUQfikEfAbXHKPVq8Ea6ap6
KDMU5aHwNlVHlAfec54C4q/kNQQg53ilyLt+8E+k7XLzhl8k7I1s5oiQqty/
hh9cDbmWJ5fnCmzt9OhcDqK+a+Ddaojlo4aNvj/JXMdPn8ZENihbTehyMk0q
q8aIPTXW46jEgXmXfoYBdQE+2830+OWfRebwUrYN2B7e20iLfnF6abVhuPGc
dQ3qNzpB6Lko63YM/Q2hLQwDPN1uOkBrnbYw/Ujk+j+ZfUePVIvKA+u0khj3
ljKg0M2fQEqbWwVWFmGqT23XA80LtFDfAVYvXchp/S/Qhr3Zah3U4dRFd92+.
wNBLwQngD2xLibzCSM5OrL4VBFvhrqwAOo8e7yTGpUB+e2GMNavcHfCQGbg8
fpAn3Di/YgBamSo95yU0gY5k6QOdGCtffBDqvWpKRu6SU5/FaV005BBY8Cfr
57oPHp93sILNmx4JEya0po3xnny/vor+kcuqGWP1vMSeRorRDDl55UzBJ04U
ayzhGwKbf5XAwrFJ8C+h1H/spV0wsFP8ocsl1oJ/Y1ErsE3fF44datWZ1+R3
4vEmExFqlFvQgVV7rrDVVHEw/xs1q145Q1c+u7MtrZmJ8BFOFJHdd0RiONey
l1ILgAmYikYmd4pCr7nii26oZHdQfPnHotOsTBTf3w4WIcFy0ALhICT6DVd8
YiYGbCMjoZnxZrAr39Tg86sFIKSuWC+pGZ1BM5uIG/CYyfhBgJ+ig8TdmRSr
O6AqRx94UWTNs34EGIGxGfGpN8OLLbDOUpTn1Aa2yyVq2S76NiQwoPdkdCdm
dYISSKOzxt508skWzBLqQ0DnXnfBLLMh5fQDD0gd/pjx+xYiuz3awXkWnK7b
RJZJpjjrwiYNFjwtg7+HLse8yVvyG4l7LOOdDyWdeKZcCtAUQ+zLBwQ23C8X
NBwG3YWIehQWmhcc3rFfMqsFIk8TfDh2wmWqM6lN9qZY9bMDwGCSqGSIb3DQ
EHATAdBglghkgBZQMEASoEEMuRMjavr8NI+EwJ81/rGGCAECJv2efhWyoqjy
TJTSpX1Pc=]
Der Wert hat folgendes Format ENC[PKCS7,Wert], wobei PKCS7 für die Verschlüsselungsmethode steht.
Schauen wir uns kurz die Parameter an:
-l steht für das Label, also der Schlüssel der in Hiera nachgeschlagen werden soll
-p sorgt dafür das der Wert von einem Passwort Prompt eingelesen wird und so nicht in der History landet.
Darüber hinaus ist es noch möglich YAML Dateien direkt mit
/opt/puppetlabs/puppet/bin/eyaml edit data/nodes/node.example.com.yaml
zu editieren:
# | 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.
# | 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[]!
---
class::parameter: DEC::PKCS7[foo]!
Der zu verschlüsselnde Wert wird beim Speichern der Datei verschlüsselt, und sieht nachher so aus:
class::parameter:
ENC[PKCS7,MIIDfwYJKoZIhvcNAQcDoIIDcDCCA2wCAQAxggMnMIIDIwIBADAFMA
CAQEwDQYJKoZIhvcNAQEBBQAEggMGxVecrM655/LzNSUbRfrJh0OBSKFyDn7jmeC
RIbK46tWBtw+0r9Qc8hmQX6yzqZPKeullPJ+3s62G9sB2gFooIWAvYmjGp61hGb8
FGKctQgvWsW6mzaFtRuAkc0qPyWTHB+13RnksDvCIgsPugBTkoXABMi1a+lz8HIf
tBgKgqFZ8HBFBlr4bt8uDEg/phBVU7lFNCLg4NTvR/ll47GqyEsrP/jM0a/olZrN
srn0uafatI+YaXm35ooa3RKAvkSBphSH2GAwRW9NNAnbU7EOKK1x4jXLnL7iORIY
WjzbJEBLlK70NOAyuwTShIAL5nV/eJOow7IcAQXNZy9uccauHv6GBId8ZJsGZMOg
TW0heo2OlN9i156zyBXefL0tvPMQLKcLk4ezjyU7KPyx6RhLcCOD2LPJkl8ijq/t
MyyRX1Bqjchhhf0Wo7uDKUr/pEKwS13vNi05m3ibY+BSesLBL25BwA6vkyUCdm3D
KSIej+h4LjSTQQPyug/UEBcxM81a+Eez6QRT08N7gJheDoC6BijUKVJ1fweuwWLI
5SXjAJzzl2gVCraKQdu54AySR8iX2ZvyRLUzRPy9sPpchfrG1KgSjGk3dscc1dwR
1H/UxANFxWY+CHhPTHAvOiaUV5UQM/29hzfebknK1tu+FB/Sma8GNM1cbSwQgnk6
bHAy93b5KrwVvA9dl33s4Hr9ajuDFeQX8udHJz/EpZ/rybfVrrmt+P3gaJVv3sT3
tASnyh47omp4Z/HTAcCxizJdHdlXXDsPw5G/yauysaA2P3rVg6yVBn08Dxa/xd/o
cfpvTUuAu/4a+Djx4tXF0J3TtfMylWnpeR6O/bacWlXbqSyAUbrHs4sXpIHwVG/w
CMGCkqvOFrjhw9+bSVfRJT36hjQt2pTiqVW5VOWp6pyY118121yNrbrrObpq7b4s
ysKEKAyNt+3yRonkA8S9dyGR0wbqnyxJnXROaYtij2L9qrbqKQemxkyVZjuuCAew
jNa/9k8nhiasgMwQsyS2AMDwGCSqGSIb3DQEHATAdBglghkgBZQMEASoEEPgvo9m
5eZ1Ps1cBPGmGPWAEEgevhYeVXyWiPjWQYCwE58=]
Hiermit endet der erste Teil meiner Blogserie zum Passwortmanagement mit Puppet. Viel Erfolg und Spass beim Ausprobieren. Bei weiteren Fragen oder wenn Sie Unterstützung benötigen, nehmen Sie gerne Kontakt auf.