Ähnlich wie beim SSH-Login können Sie Vault verwenden, um Zugänge zu einem Datenbank-Server zu verwalten. Folgend betrachten wir die Verwaltung eines MySQL-Servers. Für Cloud-Instanzen ist das ein wertvolles Feature, da Sie kein festes Passwort mehr in der Vorlage pflegen müssen. Jede Instanz erhält eine eigene "Benutzername:Passwort"-Kombination, die darüber hinaus zeitlich beschränkt ist.
Ein Hinweis vorab: Bei vielen Cloud-Angeboten wie Amazon EC2 und Amazon RDS liegen die Maschinen und Datenbanken gemeinsam in virtuellen privaten Netzwerken. Ist das in Ihrem Setup nicht der Fall, achten Sie darauf, dass Sie die MySQL-Verbindungen mit TLS verschlüsseln. Dies ist bei MySQL nämlich standardmäßig nicht der Fall.
Fügen Sie zunächst das MySQL-Backend hinzu und schreiben die Verbindung zu Ihrem MySQL-Server mit "write" in den Konfigurationspfad des Backends:
$ vault mount mysql
$ vault write /mysql/config/connection connection_url="user:password@tcp(w.x.y.z:3306)/"
Die Verbindungseinstellungen lassen sich nachträglich nicht mehr auslesen. Achten Sie darauf, dass MySQL die Benutzer auch anhand des Hostnamens unterscheidet. Sie müssen also für den Benutzer den korrekten Hosteintrag des Vault-Servers angeben. Zusätzlich muss der Benutzer GRANT-Rechte besitzen, um weitere Benutzer mit unterschiedlichen Rechten anlegen zu können.
Die Gültigkeitsdauer und Nutzungsdauer der MySQL-Zugänge stellen Sie ebenfalls im config-Pfad des Backends ein. Die Gültigkeit legen Sie zunächst auf eine Stunde fest. Nach Ablauf dieser Stunde lässt sich der Lease verlängern, bis zu der von Ihnen gesetzten Höchstdauer von 24 Stunden:
$ vault write /mysql/config/lease lease=1h lease_max=24h
Das MySQL-Backend unterstützt beliebige Namen für Rollen, die ein Benutzer-Zugang haben kann. Eine Rollendefinition enthält dabei das MySQL-Statement zum Anlegen der Benutzer. Wir definieren beispielhaft eine Rolle "readonly", die auf allen Tabellen ausschließlich SELECTs ausführen darf:
$ vault write /mysql/roles/readonly sql="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; \
GRANT SELECT ON *.* TO '{{name}}'@'%'; "
Die Platzhalter "{{name}}" und "{{password}}" ersetzt Vault durch die generierten Werte. Die gespeicherten Rollen und die zugehörigen SQL-Statements zeigen die folgenden Befehle:
$ vault list /mysql/roles
$ vault read /mysql/roles/readonly
Für den Zugriff auf die MySQL-Datenbank erfragt nun die Anwendung selbst oder ein regelmäßig laufender Job den Zugang zur Datenbank und erhält die Benutzername/Passwort-Kombination:
$ vault read /mysql/creds/readonly
Der Widerruf ausgestellter Zugänge erfolgt automatisch nach dem Ablauf der Gültigkeit. Sollten Sie mehrere MySQL-Server verwalten, können Sie dies durch die weitere Einbindung des MySQL-Backends auf einem zweiten Pfad realisieren. Diesen Pfad übergeben Sie dem mount-Befehl mittels "path"-Argument:
$ vault mount -path mysql2 mysql
Link-Codes
[1] Hashicorp: https://www.hashicorp.com/
[2] Vault-Projekt: https://www.vaultproject.io/
[3] Vault-SSH-Helper auf GitHub: https://github.com/hashicorp/vault-ssh-helper/
[4] Keywhiz: https://square.github.io/keywhiz/
Um bei reger Verwendung die Zugriffe auf den Vault-Server zu auditieren, bietet Vault zwei Backends zum Erstellen von Logs an. Sie können wählen zwischen "file" und "syslog", es lassen sich sogar beide Backends gleichzeitig verwenden. In diesem Beispiel nutzen Sie nur das Syslog-Backend, das Sie vermutlich bereits in Ihr bestehendes Monitoring eingebunden haben. Die Aktivierung erfolgt über den nachfolgenden Befehl mit dem Tag "vault" und der Syslog-Facility "AUTH". So lassen sich die Logs wie von Syslog gewohnt direkt sortieren:
$ vault audit-enable syslog tag="vault" facility="AUTH"
Die Logdaten von Vault sind sehr ausführlich und enthalten auch Informationen zu den verwendeten Login-Informationen. Diese hasht Vault jedoch im Standardfall mit SHA256 und einem Saltwert, so landen diese nicht im Klartext in den Logs.