Seit Inkrafttreten der DSVGO ist Datenschutz in aller Munde. Da wird es einmal Zeit auch den Datenschutz des Monitoring-Servers zu überdenken. Dabei denke ich in diesem Fall nicht an die diversen Härtungsmaßnamen wie SSL für Webserver und Datenbank. Auch Icinga2 erzwingt bei seinen API Verbindungen immer verschlüsselte Verbindungen.
Wo bleiben aber die Backup Dateien? Einmal erzeugt, verlassen sie den Server und liegen dann ‚woanders‘. Zum Glück ist es nicht unbedingt nötig, dass man dem File Server voll vertraut. Eventuell ist es günstig die Backup in irgendeine Cloud zu schieben, oder auf den semi public File Server der Unternehmens. Mit Hilfe von GPG kann man seine Daten einfach verschlüsseln und sicherstellen, dass alle Berechtigten sie auch wieder entschlüsseln können. Im folgenden wird erklärt wie man GPG benutzt um ein icinga2 Backup für eine Gruppe von Berechtigten zu verschlüsseln ohne das der private key einer Person den Monitoring Server oder den Backup Server berührt.
1.) gpg Schlüsselpaar erstellen
Am einfachsten benutzt man das CLI tool gpg um den key zu erzeugen. Das sollte man aber auf einem sicheren System machen, z.B. dem eigenen Laptop oder Arbeitsplatz PC. Anschließend wird der öffentliche Teil an einen Keyserver gesendet um den Schlüsselaustausch zu vereinfachen.
$ gpg --full-gen-key [...] Ihr Name ("Vorname Nachname"): Max Mustermann Email-Adresse: max.mustermann@example.org pub rsa2048 2018-05-31 [SC] [verfällt: 2023-05-30] XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0BA2D8D6 Max Mustermann <max.mustermann@example.org> $ gpg --keyserver pool.sks-keyservers.net --send-key 0BA2D8D6
2.) Monitoring Server mit Schlüsseln versorgen
Auf dem Server kann man mit Hilfe der gpg group Funktion die Daten mit den public keys einer ganzen Gruppe verschlüsseln. Hierfür muss man diese Gruppe in der ~/.gnupg/gpg.conf anlegen.
$ vim .gnupg/gpg.conf +80 group icingabackup = max.mustermann@example.org john.doe@example.org
Anschließend kann man die public keys vom keyserver laden und ihnen das Vertrauen aussprechen. Nur wenn man allen Schlüsseln „absolutes Vertrauen“ ausspricht läuft der encryption Prozess ohne weitere Rückmeldungen ab.
$ gpg --keyserver pool.sks-keyservers.net --search-keys max.mustermann@example.org gpg: suche nach "max.mustermann@example.org" auf hkp-Server pool.sks-keyservers.net (1) Max Mustermann (Test) <mustermann@example.org> 4096 bit RSA key 0BA2D8D6, erzeugt: 2013-11-18 $ gpg --keyserver pool.sks-keyservers.net --recv-keys 0BA2D8D6 $ gpg --edit 0BA2D8D6 trust 5 = Ich vertraue ihm absolut $ gpg --keyserver pool.sks-keyservers.net --search-keys johndoe@example.org gpg: suche nach "johndoe@example.org" auf hkp-Server pool.sks-keyservers.net (1) John Doe (Work email) johndoe@example.org 4096 bit RSA key 732D8994, erzeugt: 2018-04-20, verfällt: 2020-04-19 $ gpg --keyserver pool.sks-keyservers.net --recv-keys 732D8994 $ gpg --edit 732D8994 trust 5 = Ich vertraue ihm absolut
3.) Backup erzeugen und verschlüssen
Das kurze bash Script sammelt Dateien von icinga2 und icingaweb, erzeugt einen mysqldump, packt alles zusammen und verschlüsselt es zum Schluss. Alle Schritte sind im Script kommentiert. Bitte lesen sie unbedingt auch die Hinweise in der icinga2 Dokumentation zu diesem Thema.
#!/bin/bash DATE=`date +%Y%m%d%H%M` # Backup script for icinga2 and icingaweb2 # Choose which parts will be backed up. BACKUP_ICINGA2=true BACKUP_ICINGAWEB2=true BACKUP_MYSQL=true ENABLE_ENCRYPTION=true DELETE_OLD_FILES=true # Backup target dir BACKUPDIR=/data/icinga2_backup # Backup retention time. Files will be deleted after 14 days RETENTION_TIME=14 # Icinga2 settings ICINGA2FILES="/etc/icinga2 /var/lib/icinga2 /etc/default/icinga2" # Icingaweb2 settings ICINGAWEB2FILES="/etc/icingaweb2 /usr/share/icingaweb2" HTTPD_ETCDIR="/etc/apache2" # mysql settings MYSQL_DATABASES="mysql icinga icingaweb director" MYSQL_ETCDIR="/etc/mysql" MYSQL_DUMP="$BACKUPDIR/tmp/icingaMysqlDump.sql.gz" # encryption settings GPG_RECIPIENT=icingabackup # Ensure Backupdir exists [ ! -d $BACKUPDIR ] && mkdir -p $BACKUPDIR/tmp # Add icinga2 folders if [ $BACKUP_ICINGA2 = true ]; then BACKUPFILES+=" $ICINGA2FILES" fi # Add icingaweb2 folders if [ $BACKUP_ICINGAWEB2 = true ]; then BACKUPFILES+=" $ICINGAWEB2FILES" BACKUPFILES+=" $HTTPD_ETCDIR" fi # Add my folders and mysqldump if [ $BACKUP_MYSQL = true ]; then BACKUPFILES+=" $MYSQL_ETCDIR" if [ ! -z "$MYSQL_DATABASES" ]; then mysqldump --create-options --databases ${MYSQL_DATABASES} | gzip > $MYSQL_DUMP BACKUPFILES+=" $MYSQL_DUMP" fi fi # make archive TAR=$BACKUPDIR/icingaBackup_${DATE}.tar.gz if [ ! -z "$BACKUPFILES" ]; then # Archive all files and delete mysqldump tar -czf $TAR $BACKUPFILES 2> /dev/null && [ -e $MYSQL_DUMP ] && rm $MYSQL_DUMP fi # encrypt archive if [ $ENABLE_ENCRYPTION = true ]; then gpg --encrypt --recipient icingabackup $TAR && rm $TAR fi # delete everything older than 14 days if [ $DELETE_OLD_FILES = true ]; then find $BACKUPDIR -mtime +$RETENTION_TIME -exec rm \{\} \; fi
4.) Cron
Um das Backupscript jeden Tag auszuführen kopiert man es auf den Server und trägt es im crontab ein:
root@icingaMaster# crontab -e @daily /root/backup_icinga2.sh
5.) Decrypt
Da beim verschlüsseln alle User der Gruppe icingabackup berechtigt wurden kann jeder aus dieser Gruppe die Dateien wieder entschlüsseln.
gpg –output icinga2Backup.tar.gz –decrypt icinga2Backup.tar.gz.gpg
0 Kommentare