Am 17. Juni 2014 wurde die Firma Code Spaces [1] Opfer einer Hacker-Attacke. Dem Unternehmen, das selbst mit Sicherheit und Stabilität warb, fehlte nach 12 Stunden jegliche Existenzgrundlage: Hacker hatten Zugriff auf die zentrale AWS-Console und löschten alle Daten und Backups der Kunden. Eine Wiederherstellung war mit vertretbarem Aufwand nicht möglich. Code Spaces musste den Betrieb einstellen. Die Ursache: Fehlendes Secrets Management.

Einleitung

Haben Sie aktuell geheime Anmeldedaten für eine Produktionsumgebung auf Ihrem Computer gespeichert? Dies können Konfigurationsdateien mit Datenbankpasswörtern, eine AWS-Credentials-Datei oder ein unverschlüsselter SSH-Schlüssel sein. Entwickler oder Administratoren, die häufig mit Produktivsystemen interagieren, werden diese Frage sehr wahrscheinlich mit einem „Ja” beantworten oder in einer Umgebung mit sehr strengen Regularien und Prozessen arbeiten.

Secrets-Management

Secrets-Management beschreibt Strategien, wie mit Secrets, also Geheimnissen, umgegangen werden soll. Mit Geheimnissen sind nicht Kreditkartennummern gemeint, die verschlüsselt abgespeichert werden müssen, sondern Passwörter, Schlüssel oder Zertifikate, die beispielsweise zum Verschlüsseln von Daten genutzt werden.

Secrets-Management ist Teil der IT-Sicherheitsstrategie und beschäftigt sich, im Gegensatz zu Konzepten wie Firewalls, VPNs usw., mit Bedrohungen, die von innerhalb des Unternehmens kommen. Dies können zum Beispiel frustrierte Mitarbeiter sein, die der Firma böswillig Schaden zufügen, oder Flüchtigkeitsfehler im Umgang mit Secrets. Laut Rashmi Jha, Program Manager bei Microsoft, sind 80 Prozent der Datenlecks auf vermeidbare Fehler von Personen zurückzuführen, die verantwortlich für das Managen von Geheimnissen sind [2].

Traditionell werden Secrets von einer möglichst kleinen Personengruppe, in der Regel Administratoren, verwaltet und für Applikationen auf Servern bereitgestellt. Diese Strategie funktioniert mit klassisch ausgelieferten Monolithen gut. Werden diese allerdings durch viele, kontinuierlich ausgerollte Microservices ersetzt, skaliert diese Art des Secrets-Managements nicht mehr. Dies hat unter anderem folgende Gründe:

Die optimale Implementierung einer modernen Microservice-Architektur soll Entwicklern einen möglichst hohen Freiheitsgrad bieten und gleichzeitig mindestens so sicher sein wie bisher.

Unternehmen, die nicht in Secrets-Management investieren, müssen zumeist einen der folgenden Kompromisse eingehen:

Da modernes, automatisiertes Secrets-Management noch ein relativ neues Themengebiet ist, entscheiden sich zur Zeit viele Unternehmen für einen dieser beiden Kompromisse. Große Unternehmen, die eine Prozesskultur und Ticket-Systeme haben, beschneiden häufiger die Flexibilität, kleinere Firmen erweitern eher die Rechte der Entwickler.

Gutes Secrets-Management

Die Strategien eines guten Secrets-Managements sind weder neu noch unbekannt, dennoch werden diese bisher kaum oder nur manuell umgesetzt. Gutes Secrets-Management deckt unter anderem folgende Best Practices ab:

Aktuelle Lösungen für Secrets-Management

Wer nach Lösungen für Secrets-Management sucht, wird sehr wahrscheinlich auf HashiCorps Vault stoßen, die zur Zeit umfassendste und ausgereifteste Lösung. Alternativen sind entweder an ein Framework oder eine Umgebung gebunden (AWS Secrets Manager, CloudFoundry CredHub) und/oder verfügen über einen deutlich geringeren Funktionsumfang (Keywhiz). Alle erwähnten Lösungen haben interessante Konzepte implementiert, von denen hier einige näher betrachtet werden. Tabelle 1 fasst die Informationen zusammen.

Generelle Funktionsweise

Vault, AWS Secrets Manager, CredHub und Keywhiz speichern Secrets zentral ab und stellen eine REST-Schnittstelle zur Interaktion zur Verfügung. Aus Entwickler- und Applikationssicht erfüllen Secrets-Management-Systeme die Aufgabe, Secrets bereitzustellen, sofern eine Berechtigung zum Lesen vorhanden ist (s. Abb. 1).

Abb. 1: Grundprinzip eines Secrets-Managers
Abb. 1: Grundprinzip eines Secrets-Managers

Authentifizierung von Nutzern

Bei der Authentifizierung bestehen für Nutzer und Applikationen verschiedene Anforderungen. Für Nutzer ist es vorteilhaft, wenn eine schon existierende Nutzerverwaltung wie LDAP, Active Directory oder IAM genutzt werden kann. Dies macht das Aufbauen einer neuen Nutzerverwaltung für den Secrets-Manager überflüssig. Vault und der AWS Secrets Manager bieten hier eine Vielzahl von Möglichkeiten an. CredHub nutzt die integrierte CloudFoundry-Nutzerverwaltung und Keywhiz kann zusammen mit LDAP genutzt werden. Berechtigungen, welche Secrets gesetzt, gelesen oder gelöscht werden können, sind jeweils davon abhängig, welcher User sich authentifiziert oder zu welcher Gruppe der User gehört.

Alle Systeme, mit Ausnahme des AWS Secrets Managers, bieten außerdem die Möglichkeit, eine eigene Nutzerdatenbank anzulegen. Bei Vault und Keywhiz erhält der Nutzer nach der Autorisierung einen Token, der bei nachfolgenden Anfragen mitgeschickt werden muss (s. Abb. 2). Bei den anderen Lösungen werden die Requests entweder signiert (AWS), oder Tokens beziehungsweise Zertifikate werden bei jedem Request zur Authentifizierung und Autorisierung mitgeschickt.

Abb. 2: Authentifizierung mit externem System bei Vault
Abb. 2: Authentifizierung mit externem System bei Vault

Authentifizierung von Applikationen

Für Applikationen ist das Ziel, möglichst keine Geheimnisse in einem Versionsverwaltungssystem speichern zu müssen. Idealerweise wird eine App ausgerollt und bekommt auf „magische Art“ alle nötigen Secrets wie Datenbank-Passwörter, API-Keys oder Zertifikate. Müssten Applikationen Anmeldedaten für das Secrets-Management-System mitbringen, wäre ein Satz von Secrets durch einen anderen getauscht worden. Dies würde in etwa dem Prinzip eines Passwortmanagers entsprechen. Das Grundproblem der Übergabe von Passwörtern an Applikationen wäre hierdurch aber nicht gelöst.

Eine mögliche Lösung ist, nötige Anmeldedaten für den Secrets-Manager in der Laufzeitumgebung bereitzustellen. Bei AWS ist dies zum Beispiel über Instance-Profile [3] möglich: Die Rechte, mit dem Secrets-Manager zu sprechen, sind davon abhängig, welche Rolle die EC2-Instanz besitzt, auf der die Applikation läuft.

Tabelle 1: Secrets-Management-Systeme im Vergleich
Vault CredHub AWS Secrets Manager Keywhiz
Homepage vaultproject.io docs.cloudfoundry.org/credhub/ docs.aws.amazon.com/secretsmanager# square.github.io/keywhiz
Zentraler Service Ja Ja Ja Ja
Rest-API Ja Ja Ja Ja
CLI Ja Ja Ja (AWS CLI) Ja
Open Source Ja Nein Ja Ja
Nutzer-Authentifizierung Identity Provider: LDAP, Active Directory, Google Cloud, Azure, RADIUS, Okta, OpenID Connect Provider, Interne Nutzerverwaltung: Username / Password, generierte Token, TLS-Zertifikate TLS-Zertifikate, CloudFoundrys UAA alles, was von IAM unterstützt wird (also auch LDAP, Active Directory, federated Users) TLS-Zertifikate, LDAP, Username / Password
App-Authentifizierung Kubernetes Service Account auth, AWS IAM auth, AWS EC2 auth, Google Cloud IAM service accounts, Google Compute Engine (GCE) instances, AppRole (gut einsetzbar wenn Chef, Puppet, Ansible usw. genutzt wird) passiert via BOSH zur Deploy-Zeit alles, was von IAM unterstützt wird (Environment-Variablen, Instance-Profiles usw.) TLS-Client- Zertifikate
erweiterbar Nein Nein Ja Nein
dynamische Secrets Active Directory, AliCloud, AWS (IAM User oder STS-Token), Azure, Consul, Cassandra, Influxdb, HanaDB, MongoDB, MSSQL, Mysql / MariaDB, PostgreSQL, Oracle, Google Cloud (Access Tokens, Service Account Keys), Google Cloud KMS, Nomad, PKI (Private Key Infrastructure), RabbitMQ, SSH, TOTP (time-based one-time password) keine Unterstützung keine Unterstützung keine Unterstützung
rotieren von Secrets keine Unterstützung – wäre aber bei dynamischen Secrets auch nicht sinnvoll built in bei RDS-Datenbanken, kann für andere Systeme via Lambda-Funktion selbst geschrieben werden

Vault bietet mehrere Möglichkeiten zur Authentifizierung von Applikationen. Bei Kubernetes können sich Applikationen beispielsweise mit dem Token des Kubernetes-Service-Accounts gegen Vault authentifizieren. Dieser Token ist in jedem Kubernetes-Container unter einem definierten Pfad verfüg- und auslesbar und ermöglicht eine Authentifizierung gegen die Kubernetes-Programmierschnittstelle (s. Abb. 3). Ähnliche Lösungen sind bei Vault auch für andere Umgebungen verfügbar (AWS, Google Cloud und mehr).

Abb. 3: Authentifizierung gegen Vault im Kubernetes-Umfeld
Abb. 3: Authentifizierung gegen Vault im Kubernetes-Umfeld

Wer den Secrets-Manager CredHub von CloudFoundry nutzen will, muss die Kommunikation mit CredHub nicht selbst implementieren. Stattdessen liest das Deployment-Tool BOSH alle referenzierten Secrets von CredHub und injiziert diese über Environment-Variablen in die Laufzeitumgebung.

Bei Keywhiz muss die Authentifizierung auch über das Deployment-Tool stattfinden. Statt Environment-Variablen wird via FuseFS ein Verzeichnis mit Dateien gemounted, welche die jeweiligen Secrets gespeichert haben.

Automatisches Rotieren von Secrets

Der AWS Secrets Manager, und zukünftig auch CredHub [4], unterstützen das automatische Rotieren von Geheimnissen. Hierzu müssen Backends wie zum Beispiel MySQL-Datenbanken explizit unterstützt werden. AWS bietet dies bereits für seine RDS-Datenbanken an. Für andere Systeme können Lambda-Funktionen erstellt werden, welche das Rotieren implementieren. Beim automatischen Rotieren ersetzt das Secrets-Management-System aktuelle Geheimnisse externer Systeme automatisch durch neue, sichere Passwörter. Das Austauschen von Passwörtern ist somit nur noch eine Funktion, die ausgelöst werden muss. Niemand kommt in Kontakt mit den neuen Passwörtern, da diese nicht mehr manuell gesetzt werden müssen. Da Geheimnisse nicht im Quellcode gespeichert werden, ist eine Anpassung der Applikationen nach einer Rotation nicht nötig.

Dynamische Secrets

Vault verzichtet auf das automatische Rotieren von Passwörtern und geht mit sogenannten dynamischen Secrets noch einen Schritt weiter. Im Gegensatz zu normalen, statischen Geheimnissen werden dynamische Secrets zur Anfragezeit erstellt und haben eine begrenzte Lebensdauer. Wenn eine Applikation einen Nutzernamen und das zugehörige Passwort für eine Datenbank anfragt, so wird ein neuer Datenbanknutzer mit entsprechenden Rechten und einem zufälligen Passwort erstellt und zurückgeliefert. Werden von dieser Applikation mehrere Instanzen ausgerollt, so bekommt jede Instanz ein individuelles Username-Passwort-Paar. Der erstellte

Abb. 4: Dynamische Secrets für eine SQL-Datenbank
Abb. 4: Dynamische Secrets für eine SQL-Datenbank

Nutzer wird automatisch nach einer konfigurierten Zeit (time to live) wieder gelöscht.

Sollen dynamische Secrets für ein System genutzt werden, muss Vault mit entsprechenden Rechten ausgestattet werden. Bei MySQL wären dies beispielsweise Credentials eines Nutzers, welcher andere Nutzer anlegen und löschen darf.

Vault unterstützt dynamische Secrets unter anderem für Datenbanken, AWS, SSH und PKI (private key infrastructure). Bei der PKI können via API einfach TLS-Client-Zertifikate angefragt werden. Dies kann genutzt werden, um kurzlebige Client-Zertifikate zur Authentifizierung zu erstellen. Da der Aufwand gering ist, können auch diese Zertifikate eine kurze Lebensdauer haben – das Ausstellen eines neuen Zertifikats ist nur eine HTTP-Anfrage.

Dynamische Secrets lösen eins der größten Sicherheitsprobleme zuverlässig: langlebige Passwörter oder Tokens.

Literatur und Links

  1. Code Spaces: Is Down, 2014, https://web.archive.org/web/20140618165208/http://www.codespaces.com/  ↩

  2. E. Tara, Secrets Management: the Must–Dos, Infosecurity Magazin, 5.2.2017, https://www.infosecurity-magazine.com/news/secrets-management-the-mustdos/  ↩

  3. https://docs.aws.amazon.com/de_de/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html  ↩

  4. B. McClain, CredHub and The Road to Credential Rotation, Pivotal, 17.7.2018, https://content.pivotal.io/blog/credhub-and-the-road-to-credential-rotation  ↩

Conclusion

Secrets-Management ist nicht trivial und erfordert vor allem bei der Einführung eine hohe zeitliche Investition. Vor allem Vault wirkt am Anfang aufgrund der großen Funktionalität sehr komplex.

Auch wenn die Interaktion mit dem Secrets-Management-System durch Helfer-Skripte implementiert wird, ist häufig eine Anpassung der Applikationen nötig. Diese müssen mit zeitlich begrenzt gültigen Geheimnissen umgehen können. Die meisten Frameworks sind beispielsweise nicht darauf vorbereitet, dass Passwörter für Datenbanken zur Laufzeit ungültig werden können.

Vault ist zur Zeit die mit Abstand umfassendste Lösung. Wer allerdings AWS oder CloudFoundry nutzt und die Investition scheut, Vault zu lernen und zu betreiben, findet mit dem AWS Secrets Manager oder CredHub zwei Alternativen, die gut in die jeweiligen Umgebungen integriert sind.

Da die hier vorgestellten Lösungen entweder ein REST-API zur Verfügung stellen oder die Secrets direkt in die Umgebung injizieren, können sie mit quasi allen Sprachen genutzt werden.

TAGS