Pillar Verschlüsselung
Wenn der Ansatz von Infrastructure as Code (IaC) zur Verwaltung der Systeme genutzt wird, sollten geheime Daten niemals im Klartext im Git-Repository eingecheckt werden. Salt bietet die Möglichkeit Pillars mittels GPG zu verschlüsseln.
Somit wird das Secret verschlüsselt im Git eingecheckt. Der dazugehörige GPG-Schlüssel wird benötigt, um das Secret zu entschlüsseln. Die Entschlüsselung übernimmt der Salt-Master.
Secrets werden innerhalb von Pillars gespeichert. Es werden also die Pillars verschlüsselt, was im Endeffekt ein Secret darstellt.
Erstellung des GPG Schlüsselpaars
Es sollte ein neues Schlüsselpaar ohne Passwortschutz erstellt werden.
mkdir /etc/salt/gpgkeys
chmod 700 /etc/salt/gpgkeys
gpg --gen-key --homedir /etc/salt/gpgkeys
Das Verzeichnis /etc/salt/gpgkeys
darf nur vom User gelesen werden, der den Salt-Master ausführt.
ps aux | grep salt-master
In der ersten Spalte wird der Username angezeigt.
chown -R <user>:<group> /etc/salt/gpgkeys
Konfiguration des Salt-Masters
Nun muss die Konfiguration gpg_keydir
dem Salt-Master übergeben werden.
echo 'gpg_keydir: /etc/salt/gpgkeys' > /etc/salt/master.d/gpg-pillar.conf
systemctl reload-or-restart salt-master
Erstellung eines verschlüsselten Secrets
Vorerst muss die Key-ID herausgefunden werden:
gpg --homedir /etc/salt/gpgkeys --list-secret-keys
sec rsa3072 2023-09-05 [SC] [expires: 2025-09-04]
940CBABC0E803D252E7853F3AE0F5E016A10900C
uid [ultimate] Test User <test@example.com>
ssb rsa3072 2023-09-05 [E] [expires: 2025-09-04]
Die Key-ID des GPG-Schlüssels lautet: 940CBABC0E803D252E7853F3AE0F5E016A10900C
Das verschlüsselte Secret kann folgendermaßen erstellt werden:
echo -n 'supersecret' | gpg --trust-model always -ear 940CBABC0E803D252E7853F3AE0F5E016A10900C --homedir /etc/salt/gpgkeys
-----BEGIN PGP MESSAGE-----
hQGMA7vGc9C+pa4RAQwAnSpElvq4Ag0GEFlrHn/gduGRj0/aDxlZgXuXEniGNwjG
3N2+oN13Hd1sHEv5gEBXTyes/LAIyXA8nYuG1wmF1A6F110tKJM0jueq5sSdrEsV
WmXXNAVUHIHDyj01rZVgN6GdEYdFHgZ2bgi2zlVWRDQO8CHJeUrQEMMuC6o6jdj7
4l4b1Fi0QSQt49kNUqmT/iqmQvjzz7XYoLZYlCoyYje8qe0dqJIRjMdPhNd6PnfN
vJKRKD4AOk29dPEhhPOYbJ5SeMALfNnpR7h1opK/IazOlFr6fS4ipjWUYog+QdHk
BrOmty1jH5wsStYoIm+g2SicovDLUujl1yD126nsKck/6s5mCiX8PhwIdfoVYIDp
SMyl+Fe5gEE9o6AiYOYJN51IUbjVJCxz6vyj5abbGXVfiooV02+JIlVlCliAqzd2
nuUpxWzPRO8J95XLL0MlZlGb9vZioTWEaocMCYnG7mhAK1DGZGb8pfTtJZyco5gU
IqxAwplFPNxeZfM6r8a60kYBoYP7YWdZXzfQafZiTNbU0A1Ud4YJcqXbuOzIgQHi
jlco7OyzdMCb5TBAfqyJPZd0Dkzef6/ER0rLSl+1cKaGzrAcZ8oy
=g+n0
-----END PGP MESSAGE-----
Der Befehl gpg --trust-model always -ear 940CBABC0E803D252E7853F3AE0F5E016A10900C --homedir /etc/salt/gpgkeys
kann auch als Alias definiert werden.
echo "alias gpg_encrypt='gpg --trust-model always -ear 940CBABC0E803D252E7853F3AE0F5E016A10900C --homedir /etc/salt/gpgkeys'" >> ~/.bashrc
source ~/.bashrc
echo -n 'supersecret' | gpg_encrypt
Nutzung des verschlüsselten Secrets
Die erstellte PGP-Message kann nun als Pillar definiert werden.
#!yaml|gpg
---
data1: this is not encrypted
data2: |
-----BEGIN PGP MESSAGE-----
hQGMA7vGc9C+pa4RAQwAnSpElvq4Ag0GEFlrHn/gduGRj0/aDxlZgXuXEniGNwjG
3N2+oN13Hd1sHEv5gEBXTyes/LAIyXA8nYuG1wmF1A6F110tKJM0jueq5sSdrEsV
WmXXNAVUHIHDyj01rZVgN6GdEYdFHgZ2bgi2zlVWRDQO8CHJeUrQEMMuC6o6jdj7
4l4b1Fi0QSQt49kNUqmT/iqmQvjzz7XYoLZYlCoyYje8qe0dqJIRjMdPhNd6PnfN
vJKRKD4AOk29dPEhhPOYbJ5SeMALfNnpR7h1opK/IazOlFr6fS4ipjWUYog+QdHk
BrOmty1jH5wsStYoIm+g2SicovDLUujl1yD126nsKck/6s5mCiX8PhwIdfoVYIDp
SMyl+Fe5gEE9o6AiYOYJN51IUbjVJCxz6vyj5abbGXVfiooV02+JIlVlCliAqzd2
nuUpxWzPRO8J95XLL0MlZlGb9vZioTWEaocMCYnG7mhAK1DGZGb8pfTtJZyco5gU
IqxAwplFPNxeZfM6r8a60kYBoYP7YWdZXzfQafZiTNbU0A1Ud4YJcqXbuOzIgQHi
jlco7OyzdMCb5TBAfqyJPZd0Dkzef6/ER0rLSl+1cKaGzrAcZ8oy
=g+n0
-----END PGP MESSAGE-----
Prüfung
Nachdem die Pillar-Datei erstellt wurde, muss diese in der top.sls
Datei dem Zielsystem zugewiesen werden.
Anschließend kann das Pillar neu geladen und ausgegeben werden.
salt '*' saltutil.refresh_pillar
salt '*' pillar.get data2
host:
supersecret