API-Gateway-Authentifizierung

Yong Qian

November 25, 2022

Technology

Bedeutung von Authentifizierung und Autorisierung für API-Gateways

Die Kernfunktion eines API-Gateways lässt sich als Verknüpfung von API-Konsumenten und API-Anbietern zusammenfassen.

In der Praxis erlauben nur wenige APIs den anonymen Zugriff. Anbieter schränken Konsumenten oft ein: Nur berechtigte Konsumenten können auf die API zugreifen. Darüber hinaus können Anbieter unterschiedliche Zugriffsrichtlinien für verschiedene Konsumenten haben. Beispielsweise können sowohl Konsument A als auch Konsument B auf die /send_mail-API zugreifen, aber die Häufigkeit der Aufrufe pro Minute muss unterschiedlich berechnet werden.

Aus diesen beiden Punkten wird deutlich, dass die Identifizierung und Überprüfung der Identität von API-Konsumenten auf der Ebene des API-Gateways von entscheidender Bedeutung ist. Im Folgenden wird erläutert, wie das Open-Source-API-Gateway Apache APISIX die Authentifizierung von Konsumenten implementiert und welche Authentifizierungsmethoden von Unternehmen weit verbreitet sind. Anschließend wird gezeigt, wie das Benutzerauthentifizierungssystem von APISIX mit anderen Sicherheitsfunktionen kombiniert werden kann, um den Sicherheitsschutz von API-Gateways weiter zu verbessern.

api gateway authentication

Authentifizierung und Autorisierung von Apache APISIX

Traditionelle HTTP-Proxys können den Anfragenden nur anhand grober Mittel wie der Anfragedomain und der Client-IP identifizieren, was für ein API-Gateway nicht ausreicht. Wir benötigen feinere Authentifizierungsmethoden, um immer komplexere Geschäftsanforderungen zu erfüllen. Einer der großen Vorteile von APISIX gegenüber traditionellen Proxys ist seine flexible Plugin-Erweiterungsfähigkeit, einschließlich einer Sammlung von Plugins für die Benutzerauthentifizierung, die je nach Implementierungsmethode in zwei Kategorien unterteilt werden können:

  1. Schnittstelle zu externen Authentifizierungsdiensten

external auth service

  1. Interne Gateway-Authentifizierung durch das von APISIX entworfene Consumer-Objekt

internal auth

Diese beiden Authentifizierungsmethoden werden im Folgenden vorgestellt.

Schnittstelle zu externen Authentifizierungsdiensten

Bevor ein Unternehmen ein API-Gateway einführt, gibt es oft einen separaten Authentifizierungsdienst im System. Wie können wir APISIX mit dem bestehenden Authentifizierungsdienst verbinden? APISIX bietet eine Reihe von Plugins, die mit verschiedenen externen Authentifizierungsdiensten interagieren und ihnen die Authentifizierung überlassen.

Beispielsweise können wir das openid-connect-Plugin verwenden, um mit jedem Authentifizierungsdienst zu interagieren, der das OIDC-Protokoll unterstützt. Hier ist eine Beispielkonfiguration für die Interaktion mit dem Keycloak-Dienst:

curl http://127.0.0.1:9180/apisix/admin/routes -H "X-Api-Key: your-API-key" -XPOST -d '
{
    "uri":"/*",
    "plugins":{
        "openid-connect":{
            "client_id":"apisix", // Wird erstellt, wenn Keycloak einen Client erstellt
            "client_secret":"d5c42c50-3e71-4bbe-aa9e-31083ab29da4",
            "discovery":"http://keycloak:8080/auth/realms/apisix_test_realm/.well-known/openid-configuration", // Keycloak OpenID Endpoint
            "scope":"openid profile",
            "bearer_only":false,
            "realm":"apisix_test_realm",
            "introspection_endpoint_auth_method":"client_secret_post",
            "redirect_uri":"http://127.0.0.1:9080/"
        }
    },
    "upstream":{
        ...
    }
}'

Interne Gateway-Authentifizierung

Consumer

consumer

Wenn Anfragen aus verschiedenen Quellen beim API-Gateway eintreffen, muss das Gateway diese Aufrufer identifizieren. Apache APISIX führt das Konzept des "Consumer" ein, um die Aufrufer eines bestimmten Diensttyps darzustellen.

Das Consumer-Objekt erfordert die Konfiguration eines Authentifizierungsplugins für die Verwendung. Nehmen wir das einfachste key-auth-Plugin als Beispiel:

$ curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "username": "jack",
    "plugins": {
        "key-auth": {
            "key": "auth-jack"
        }
}'

Die obige Konfiguration bedeutet, dass die aktuelle Anfrage mit dem Consumer - jack verknüpft wird, wenn die Anfrage den angegebenen Schlüssel (auth-jack) enthält. Wie Sie sehen können, ist das auf dem Consumer konfigurierte Authentifizierungsplugin tatsächlich ein Identitätsnachweis unter einem bestimmten Authentifizierungsmechanismus. Im key-auth-Plugin ist der Schlüssel der Nachweis, der einen Consumer identifiziert, ähnlich wie Benutzername und Passwort im basic-auth-Plugin.

Konfiguration des Authentifizierungsplugins für die Route

Sobald wir die Anmeldeinformationen mit einem bestimmten Consumer über das Consumer-Objekt verknüpft haben, müssen wir das Authentifizierungsplugin auch auf der entsprechenden Route aktivieren:

$ curl http://127.0.0.1:9180/apisix/admin/routes/orders -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "uri": "/orders",
    "plugins": {
        "key-auth": {
            "header": "Authorization"
        }
    }
}'

Die obige Konfiguration bedeutet, dass das key-auth-Plugin auf der Route /orders aktiviert ist, und die Authentifizierungswirkung ist wie folgt:

$ curl http://127.0.0.1:9080/orders -H 'Authorization: auth-jack' -i
HTTP/1.1 200 OK
...
$ curl http://127.0.0.1:9080/orders -H 'Authorization: wrong-key' -i
HTTP/1.1 401 Unauthorized
...
{"message":"Invalid API key in request"}

Wenn eine Anfrage eines Benutzers diese Route erreicht, versucht APISIX, den vom Benutzer bereitgestellten Schlüssel über den Authorization-Header zu erhalten. Wenn er nicht erhalten wird oder der erhaltene Schlüssel nicht legitim ist, wird die Anfrage direkt vom Gateway abgelehnt, wodurch der Upstream-Dienst geschützt wird.

Es ist ersichtlich, dass in den beiden oben genannten Authentifizierungsmethoden das Authentifizierungsplugin im Kern des gesamten Systems steht, dessen Vielfalt die Wahl der Benutzer für API-Gateways zur Authentifizierung direkt beeinflusst. Im Folgenden sind einige der gängigen Authentifizierungsmethoden und ihre jeweiligen Vor- und Nachteile aufgeführt, die als Referenz dienen können.

Gängige Authentifizierungsmethoden

Authentifizierung und Autorisierung, ein grundlegender Mechanismus, der seit dem Eintritt in die Computerwelt existiert, hat sich im Laufe der Jahre zu einem sehr vielfältigen Bereich entwickelt. Der Plugin-Mechanismus von APISIX hat die Entwicklungskosten für die Implementierung verschiedener Authentifizierungsmethoden erheblich reduziert. Im Folgenden sind einige der gängigen Authentifizierungsmethoden aufgeführt, die bereits von APISIX unterstützt werden:

Key Auth

Key Auth ist das einfachste aller Authentifizierungsplugins, hat aber in realen Szenarien eine breite Anwendung, wie z.B. Lizenzen für kostenpflichtige Software, Tokens zur Identifizierung von Entwicklern in offenen API-Plattformen usw., die alle leicht mit Key Auth implementiert werden können. Darüber hinaus können basierend auf der vollständig dynamischen Konfigurations- und Zuweisungsfähigkeit von APISIX Schlüssel schnell erstellt und widerrufen werden, die in Echtzeit wirksam werden.

Basic Auth

Basic Auth ist eine Authentifizierungsmethode basierend auf Benutzername und Passwort, die häufig in Web-Login-Szenarien verwendet wird. Beispielsweise kann das Admin-Backend einer Website nach dem Login des Admins verwendet werden, wo wir Basic Auth zur Authentifizierung verwenden können.

LDAP

LDAP (Lightweight Directory Access Protocol) ist ein leichtgewichtiges Dateizugriffsprotokoll basierend auf dem X.500-Standard, das Zugriffskontrolle und Wartung von verteilten Informationsverzeichnissen über das IP-Protokoll bereitstellt. Mit LDAP können Anwendungs- und Betriebsentwickler den Benutzerzugriff auf Ressourcen auf granularer Ebene steuern. Mit dem ldap-auth-Plugin von APISIX können Sie leicht mit Plattformen interagieren, die das LDAP-Protokoll implementieren, wie z.B. Microsofts Active Directory oder OpenLDAP Server für Linux-Plattformen, um den Zugriff von Consumern auf bestimmte Routen fein zu steuern.

OIDC

OpenID ist ein dezentrales Online-Authentifizierungssystem. Für Websites, die OpenID unterstützen, müssen Benutzer keine traditionellen Authentifizierungstoken wie Benutzername und Passwort merken. Stattdessen müssen sie sich im Voraus bei einer Website registrieren, die als OpenID-Identitätsanbieter (IdP) fungiert, und können dann dieses Konto verwenden, um sich bei allen Anwendungen anzumelden, die mit diesem Anbieter verbunden sind, z.B. um Benutzer unseres eigenen Systems über die Konten bekannter Dienste wie Google oder Facebook zu authentifizieren.

Für OIDC bietet APISIX das openid-connect-Plugin, das verwendet werden kann, um mit Authentifizierungsdiensten zu interagieren, die das OIDC-Protokoll unterstützen.

Forward Auth

Wenn das Standard-Authentifizierungsplugin von APISIX Ihre aktuellen Anforderungen nicht erfüllt oder wenn in Ihrem System ein dedizierter und nicht standardmäßiger Protokoll-Authentifizierungsdienst bereitgestellt wurde, können Sie das forward-auth-Plugin verwenden. Mit diesem Plugin können Sie Benutzeranfragen über HTTP an den Authentifizierungsdienst weiterleiten und benutzerdefinierte Fehler zurückgeben oder Benutzer auf die Authentifizierungsseite umleiten, wenn der Authentifizierungsdienst mit einem nicht normalen Status (Fehlercode außer 20x) antwortet.

Mit der Kraft des forward-auth-Plugins kann die Authentifizierungs- und Autorisierungslogik sehr geschickt auf einen dedizierten, nicht standardmäßigen Protokoll-externen Dienst übertragen werden.

Verknüpfung mit anderen Plugins nach der Authentifizierung

Die Benutzerauthentifizierung ist nur der erste Schritt zur Sicherung der API mit APISIX. Die Kombination von Authentifizierungsfähigkeiten mit anderen Sicherheitsplugins wird die Sicherheitsfähigkeiten des Gateways weiter verstärken.

ACL(consumer-restriction)

In einem komplexen Backend-System kann es einige APIs geben, die höhere Sicherheitsbeschränkungen haben als andere, die nicht nur anonyme Benutzer blockieren, sondern auch authentifizierte Benutzer einschränken müssen, z.B. nur Benutzer auf der Whitelist dürfen auf die Benutzerverwaltungs-API zugreifen.

white list

In diesem Fall können wir das von APISIX bereitgestellte consumer-restriction-Plugin verwenden, um den Zugriffskontrollmechanismus zu implementieren.

$ curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: your-API-key' -X POST -i -d '
{
    "uri": "/api/v1/users/admin",
    "plugins": {
        "key-auth": {},
        "consumer-restriction": {
            "whitelist": [
                "Rose",
                "Peter
            ]
        }
    },
    "upstream": {
        ...
    },
}'

Die obige Route schränkt die /api/v1/users/admin-Route ein, um eine Key-Auth-Authentifizierung über die key-auth- und consumer-restriction-Plugins zu erfordern, und nur Rose und Peter können darauf zugreifen.

Rate Limiting (limit-count

Wir haben bereits beschrieben, dass Sie Benutzeranmeldeinformationen mit Consumern verknüpfen können, indem Sie Authentifizierungsplugins im Consumer konfigurieren, aber tatsächlich können APISIX Consumer-Objekte nicht nur Authentifizierungsplugins, sondern auch beliebige Plugins wie Route und Service mounten.

Beispielsweise wird in der praktischen Anwendung oft gefordert, dass die Rate-Limiting-Richtlinie nicht statisch, sondern personalisiert ist. Es wird häufig gefordert, dass verschiedene Dienstebenen-Aufrufer unterschiedliche API-Rate-Limiting-Richtlinien haben. Eine solche Anforderung kann jedoch nicht durch das Mounten des Rate-Limiting-Plugins auf der Route gelöst werden. Daher müssen wir das Rate-Limiting-Plugin auf dem Consumer mounten und für jeden Consumer eine gezielte Rate-Limiting-Richtlinie festlegen.

$ curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "username": "jack",
    "plugins": {
        "key-auth": {
            "key": "jack"
        },
        "limit-count": {
            "count": 200,
            "time_window": 60,
            "rejected_code": 503,
            "key": "$consumer_name",
        }
}'
$ curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
    "username": "rose",
    "plugins": {
        "key-auth": {
            "key": "rose"
        },
        "limit-count": {
            "count": 1000,
            "time_window": 60,
            "rejected_code": 503,
            "key": "$consumer_name",
        }
}'

Mit der obigen Konfiguration legen wir unterschiedliche Rate-Limiting-Richtlinien für jack und rose fest, wobei rose eine höhere Anfragezahlquote von 1000 in 60 Sekunden hat, während jack nur 200 hat.

Zusammenfassung

Als unverzichtbare Fähigkeit von API-Gateways ist Authentifizierung und Autorisierung einer der wichtigen Faktoren, die Benutzer bei der Auswahl von API-Gateways berücksichtigen.

Apache APISIX, das in diesem Artikel vorgestellte Open-Source-Gateway, deckt alle wichtigen Authentifizierungsmethoden ab und kann die Anforderungen von Unternehmensbenutzern an Authentifizierung und Autorisierung erfüllen. APISIX hat außerdem die folgenden Vorteile:

  • Reichhaltige Authentifizierungsplugins, die sofort einsatzbereit sind
  • Unterstützung von internen und externen Authentifizierungsmethoden, die Benutzer frei wählen können
  • Unterstützung der sekundären Entwicklung, einfache Interaktion mit benutzerdefinierten Authentifizierungszentren

Diese Vorteile können Unternehmen dabei helfen, die Gateway-Authentifizierung und -Autorisierung leichter umzusetzen und die API-Sicherheit zu stärken.

Willkommen, mehr über Apache APISIX zu erfahren. Sie können uns unter https://api7.ai/contact kontaktieren.

Tags: