Wie man Secret Manager mit API Gateway verwendet
Shirui Zhao
January 13, 2023
Was ist ein Secret?
In einer IT-Umgebung ist ein Secret ein privilegiertes Anmeldeinformation, das normalerweise von Systemen und Anwendungen für die Authentifizierung oder als Eingabe für Verschlüsselungsalgorithmen verwendet wird. Zum Beispiel gehören Passwörter, die benötigt werden, um ein Programm mit einer Datenbank zu verbinden, sowie Schlüssel/Zertifikate für verschlüsselte Kommunikation zu den Secrets.
Häufige Arten von Secrets sind:
- Verschlüsselungsschlüssel
- Zugangsdaten für Cloud-Dienste
- API-Schlüssel (Application Programming Interface)
- Zugriffstoken
- SSH-Schlüssel (Secure Shell)
Secret Manager
Der Secret Manager speichert, ruft ab, rotiert und überprüft Secrets während ihres gesamten Lebenszyklus. HashiCorp Vault ist einer der am häufigsten verwendeten Secret-Manager-Dienste, und sein Funktionsprinzip ist wie folgt (Bild von der offiziellen HashiCorp-Website):
Neben HashiCorp Vault bieten auch Cloud-Anbieter wie AWS, Google und Azure Secret-Manager-Dienste an.
Die Verwendung eines Secret Managers zur Entwicklung von Anwendungen erhöht nicht nur die Sicherheit, sondern bietet auch die folgenden Funktionen:
- Ermöglicht die einfache Aktualisierung von Secrets auf mehreren Maschinen, ohne die Anwendung zu beeinträchtigen.
- Entwickler müssen sich nicht zu sehr um die Speicherung von Secrets kümmern und können sich stärker auf die Geschäftslogik konzentrieren.
- Die Rotation und Widerrufung von Secrets kann ohne erneute Bereitstellung oder Unterbrechung aktiver Anwendungen durchgeführt werden.
- Der Secret Manager bietet flexible und detaillierte Audit-Protokolle, die die Historie aller Benutzerzugriffe verfolgen und die Anforderungen an Audits und Compliance leichter erfüllen können.
Verwendung des Secret Managers im API-Gateway
Als Eingangspunkt für den Geschäftsverkehr enthält das API-Gateway oft eine große Menge an geheimen Informationen, wie z.B. API-Schlüssel und Token für die Authentifizierung. Daher ist es von entscheidender Bedeutung, einen Secret Manager in das API-Gateway zu integrieren.
Szenarien für die Verwendung von Secrets im API-Gateway
Key Auth
ist eine einfache Authentifizierungsmethode im API-Gateway. Benutzer müssen einen Schlüssel vordefinieren, und wenn der Client API-Anfragen stellt, wird der vordefinierte Schlüssel in den entsprechenden Anfrageheader geschrieben oder als Anfrageparameter verwendet, um die Authentifizierung zu bestehen. Schlüsselverluste sind jedoch häufig, und Schlüssel werden oft in Konfigurationsdateien gespeichert oder als Variablen im Code gespeichert. Wenn Schlüssel nicht ordnungsgemäß gespeichert werden, könnten sie sogar in öffentlichen Code-Repositories wie GitHub auftauchen, was eine erhebliche Bedrohung für die Sicherheit darstellt. Administratoren aktualisieren diese Schlüssel oft regelmäßig, um schwerwiegende Schäden durch Schlüsselverluste zu verhindern. Für einige statische Schlüssel kann jedoch die individuelle Aktualisierung der Konfigurationsdatei auf jeder Maschine auch eine erhebliche Bedrohung für die Stabilität des Dienstes darstellen.
Integration des Secret Managers in das API-Gateway
Durch die Integration des Secret Managers in das API-Gateway kann der vordefinierte Schlüssel für die Key Auth
-Authentifizierung im Secret-Manager-Dienst gespeichert werden, wodurch eine Reihe von Problemen, die durch Schlüsselverluste verursacht werden, effektiv gelöst werden können. Das API-Gateway ist nur ein Schlüsselbenutzer, und der tatsächliche Wert des Schlüssels wird im externen Secret-Manager-Dienst gespeichert. Darüber hinaus behält das API-Gateway nur einen Verweis auf den Schlüssel, sodass selbst wenn das API-Gateway gehackt wird, der tatsächliche Schlüssel nicht aus dem Code oder der Konfigurationsdatei abgerufen werden kann. Wenn Sie den Wert des Schlüssels aktualisieren müssen, müssen Sie ihn nur im Secret Manager aktualisieren, ohne den Code oder die Konfiguration des API-Gateways zu ändern, was auch einen Neustart des API-Gateways effektiv vermeidet.
Im Folgenden verwenden wir Apache APISIX als Beispiel, um zu zeigen, wie der Secret Manager verwendet werden kann, um den vordefinierten Schlüssel für Key Auth
im API-Gateway zu speichern.
Beispiel für die Verwendung von Apache APISIX im Secret Manager in der Praxis
Apache APISIX ist ein dynamisches, Echtzeit-, Hochleistungs-API-Gateway, das Hunderte von Funktionen bietet, wie z.B. Lastenausgleich, dynamisches Upstream, Canary Release, fein abgestimmtes Routing, Rate Limiting, Service-Degradation, Circuit Breaker, Authentifizierung und Beobachtbarkeit.
In Version 3.1.0 hat Apache APISIX APISIX Secret
eingeführt, um verschiedene Secret-Manager-Dienste zu integrieren. Die Arbeitssequenz ist wie folgt:
Im Folgenden verwenden wir Vault als Secret-Manager-Dienst. Wir werden die Key Auth
-Authentifizierung verwenden, um zu veranschaulichen, wie ein Secret Manager verwendet werden kann, um Schlüssel in Apache APISIX zu speichern.
Erstellen von Schlüsseln in Vault
Bevor Sie den Schlüssel erstellen, müssen Sie den Vault-Dienst starten. Da dieser Abschnitt die Best Practices für die Verwendung von Vault im Apache-APISIX-Ökosystem teilt, wird die Konfiguration von Vault selbst nicht detailliert beschrieben und kann hier gefunden werden.
Um den entsprechenden Schlüssel in Vault zu erstellen, können Sie den folgenden Befehl verwenden:
vault secrets enable -version=1 -path=apisix kv
vault kv put apisix/jack auth-key=secret-key
Nach der Ausführung des obigen Befehls finden Sie einen Schlüssel namens auth-key
unter dem Pfad apisix/jack
, mit dem Wert secret-key
.
Konfiguration in APISIX
Zuerst fügen Sie die Secret-Ressource über die Admin API
hinzu und konfigurieren die Adresse sowie andere Verbindungsinformationen für Vault:
- Die APISIX Secret-Ressourcen-ID ist "gateway", siehe https://apisix.apache.org/docs/apisix/terminology/secret/#usage-1
- Das Feld
prefix
ist der Pfad des Schlüssels in Vault, und das Feldtoken
ist das Vault-Token.
curl http://127.0.0.1:9180/apisix/admin/secrets/vault/gateway \
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
"uri": "https://127.0.0.1:8200",
"prefix": "apisix",
"token": "hvs.chjDFWvZRcihoq2vpSsVenmR"
}'
Dann verwenden Sie das key-auth
-Plugin, um einen Consumer zu erstellen und die Key Auth-Authentifizierung für die entsprechende Route oder den entsprechenden Dienst durchzuführen. Das Schlüsselfeld verweist auf die APISIX Secret-Ressource:
curl http://127.0.0.1:9180/apisix/admin/consumers \
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
"username": "jack",
"plugins": {
"key-auth": {
"key": "$secret://vault/gateway/jack/auth-key"
}
}
}'
Durch die obigen beiden Schritte ruft die Secret
-Komponente, wenn die Anfrage des Benutzers auf ein key-auth
-Plugin trifft, den vom Benutzer konfigurierten Secret Manager über die bereitgestellte Schnittstelle auf, um den tatsächlichen Wert des Schlüssels in Vault zu erhalten. Wenn der Wert des Schlüssels nicht gefunden wird, zeichnet das Plugin den Fehler auf und die Key Auth
-Validierung schlägt fehl.
Dann erstellen Sie eine Route, um die Key Auth
-Authentifizierung durchzuführen:
curl -i "http://127.0.0.1:9180/apisix/admin/routes" -H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
"id": "getting-started-ip",
"uri": "/ip",
"plugins": {
"key-auth": {}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
Schließlich senden Sie eine Anfrage ohne Schlüssel an das API-Gateway, um das Ergebnis zu überprüfen:
curl -i "http://127.0.0.1:9080/ip"
Das Ergebnis ist wie folgt:
HTTP/1.1 401 Unauthorized
...
{"message":"Missing API key found in request"}
Und dann senden Sie eine Anfrage mit dem Schlüssel an das API-Gateway, um das Ergebnis zu überprüfen:
curl -i "http://127.0.0.1:9080/ip" -H 'apikey: secret-key'
Das Ergebnis ähnelt dem Folgenden:
HTTP/1.1 200 OK
...
{
"origin": "127.0.0.1, 59.172.90.243"
}
Darüber hinaus hat Apache APISIX Umgebungsvariablen zu einem einfachen Secret-Manager-Dienst erweitert, und das APISIX-Token für die Verbindung zu Vault kann auch in Umgebungsvariablen gespeichert werden. Bevor Sie APISIX starten, können Sie die Umgebungsvariablen mit dem folgenden Befehl setzen:
export VAULT_TOKEN="root"
Verweisen Sie auf Umgebungsvariablen beim Hinzufügen der Secret
-Ressource:
curl http://127.0.0.1:9180/apisix/admin/secrets/vault/1
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
"uri": "https://127.0.0.1:8200",
"prefix": "apisix",
"token": "$ENV://VAULT_TOKEN"
}'
Durch die obigen Schritte können Sie den für die Key Auth
-Authentifizierung benötigten Schlüssel in Vault speichern, anstatt ihn im Klartext bei der Konfiguration des Plugins anzuzeigen.
Fazit
Im API-Gateway gibt es eine große Menge an geheimen Informationen. Die Verwendung eines Secret Managers zur Verwaltung von Secrets stellt sicher, dass keine Klartext-Geheiminformationen im API-Gateway vorhanden sind, und verbessert effektiv die Sicherheit und Stabilität des API-Gateways. Als das weltweit aktivste Open-Source-API-Gateway unterstützt Apache APISIX auch Secret Manager in großem Umfang. Dieser Artikel verwendet auch die Key Auth
-Authentifizierung, um zu veranschaulichen, wie ein Secret Manager verwendet werden kann, um Schlüsselinformationen in APISIX zu verwalten.
Weitere Informationen über API-Gateways finden Sie in unseren Blogs oder kontaktieren Sie uns.