Okta für External OAuth konfigurieren

Unter diesem Thema wird beschrieben, wie Sie Snowflake als OAuth-Ressource und Okta als External OAuth-Autorisierungsserver konfigurieren, um einen sicheren, programmgesteuerten Zugriff auf Snowflake-Daten zu ermöglichen.

Unter diesem Thema:

Konfigurationsverfahren

In den folgenden fünf Schritten wird davon ausgegangen, dass in Ihrer Umgebung nichts konfiguriert ist, was sich auf Okta OAuth-Autorisierungsserver, OAuth-Clients, Bereiche und erforderliche Metadaten bezieht.

Die Informationen aus den Schritten 1-3 werden verwendet, um eine Sicherheitsintegration in Snowflake zu erstellen.

Wenn Sie bereits einen Okta-Autorisierungsserver und -Client konfiguriert haben, müssen Sie nicht alle folgenden Schritte ausführen. Überspringen Sie stattdessen die folgenden vier Schritte, und stellen Sie sicher, dass Sie die gewünschten Informationen erhalten, Bereiche erstellen, Bereiche zu einer oder mehreren Richtlinien zuweisen und auf die Metadaten zugreifen können.

Wenn Sie keinen Okta-OAuth-Autorisierungsserver und -Client konfiguriert haben, führen Sie alle folgenden fünf Schritte aus.

Wichtig

Die Schritte unter diesem Thema sind ein repräsentatives Beispiel zum Konfigurieren von Okta für External OAuth.

Sie können Okta in einem beliebigen Status konfigurieren und einen beliebigen OAuth-Ablauf verwenden, sofern Sie die erforderlichen Informationen für die Sicherheitsintegration (unter diesem Thema) erhalten.

Beachten Sie, dass die folgenden Schritte als Leitfaden dienen, um die erforderlichen Informationen zum Erstellen der Sicherheitsintegration in Snowflake abzurufen.

Beachten Sie bei der Konfiguration eines Autorisierungsservers unbedingt Ihre internen Sicherheitsrichtlinien, damit Ihre Organisation alle erforderlichen Vorschriften und Compliance-Anforderungen erfüllt.

Die Schritte 1–3 wurden aus der Okta-Dokumentation zu Autorisierungsservern abgeleitet. Weitere Informationen dazu, wie Okta seine Begriffe, seine Benutzeroberfläche und Optionen für Autorisierungsserver definiert, finden Sie in den folgenden Okta-Handbüchern:

Schritt 1: OAuth-kompatiblen Client zur Verwendung mit Snowflake erstellen

  1. Navigieren Sie zur Okta Admin Console.

  2. Klicken Sie auf Applications.

  3. Klicken Sie auf Add Application.

  4. Klicken Sie auf Create New App.

    • Wählen Sie für Platform die Option Native App aus.

  5. Klicken Sie auf Create.

  6. Geben Sie einen Namen für die Anwendung ein.

  7. Fügen Sie im Feld Login redirect URIs die vollständige Snowflake-Konto-URL hinzu (z. B. https://<Konto>.<Region>.snowflakecomputing.com).

  8. Klicken Sie auf Save.

  9. Klicken Sie auf der General-Benutzeroberfläche unter New Applications auf Edit.

  10. Überprüfen Sie Refresh Token und Resource Owner Password.

  11. Klicken Sie auf Save.

  12. Klicken Sie neben Client Credentials auf die Schaltfläche Edit.

  13. Wählen Sie die Option Use Client Authentication aus.

  14. Klicken Sie auf Save.

  15. Speichern Sie im Client Credentials-Container die ClientID und das Geheimnis Secret. Diese beiden Werte werden in den folgenden Schritten als <OAUTH_CLIENT_ID> bzw. <OAUTH_CLIENT_SECRET> bezeichnet.

Schritt 2: OAuth-Autorisierungsserver erstellen

  1. Navigieren Sie zur Okta Admin Console.

  2. Klicken Sie im Menü Security auf API.

  3. Klicken Sie auf Authorization Servers.

  4. Klicken Sie auf Add Authorization Server.

  5. Geben Sie einen Namen ein.

  6. Geben Sie die Snowflake Account URL als Wert für Audience ein.

    • Die Zielgruppe muss im Verzeichnis Ihrer Organisation eindeutig sein. Beispiel: https://<Konto>.<Region>.snowflakecomputing.com. Dieser Wert wird in den folgenden Schritten als <SNOWFLAKE_AUDIENCE> bezeichnet.

  7. Klicken Sie auf Save.

Führen Sie die folgenden Schritte für den neu hinzugefügten Autorisierungsserver aus.

  1. Kopieren Sie den Issuer-Wert. Sein Format sollte https://dev-390798.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7 ähneln. Dieser Wert wird in den folgenden Schritten als <OKTA_ISSUER> bezeichnet.

  2. Klicken Sie auf Scopes.

  3. Klicken Sie auf Add Scope.

  4. Um eine Snowflake-Rolle als Bereich hinzuzufügen, geben Sie den Bereich ein, indem Sie den Namen der Snowflake-Rolle mit dem Präfix session:role: angeben (z. B. geben Sie für die Rolle des Snowflake-Analysten session:role:analyst ein).

  5. Klicken Sie auf Create.

  6. Klicken Sie auf Access Policies.

  7. Klicken Sie auf Add Policy.

  8. Geben Sie einen Namen und eine Beschreibung für die Richtlinie ein. Weisen Sie sie dem zuvor erstellten Client zu, und klicken Sie auf Create.

  9. Klicken Sie in der neu hinzugefügten Zugriffsrichtlinie auf Add Rule.

  10. Geben Sie einen Regelnamen ein.

  11. Wählen Sie die autorisierten Genehmigungstypen Grant Types aus. Sie sollten Resource Owner Password und Client Credentials zusammen mit anderen auswählen, die den Richtlinien Ihrer Organisation entsprechen.

  12. Für Bereiche können Sie jeden beliebigen Bereich oder die zuvor erstellten Bereiche auswählen. Diese können dann von den Clients, die dieser Richtlinie zugewiesen sind, angefordert werden (einschließlich „offline_access“ für Aktualisierungstoken, falls erforderlich). Konfigurieren Sie nach Bedarf zusätzliche Einstellungen.

  13. Klicken Sie auf Create Rule.

Schritt 3: Okta-Informationen erfassen

  1. Wechseln Sie zur Okta Admin Console.

  2. Klicken Sie im Menü Security auf API.

  3. Klicken Sie auf Authorization Servers.

  4. Klicken Sie auf den Autorisierungsserver für die Snowflake-Ressource.

  5. Kopieren Sie auf der Registerkarte Settings den Wert Issuer. Dieser Wert wird in den folgenden Schritten als <OKTA_ISSUER> bezeichnet. Sein Format sollte https://dev-111111.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7 ähneln.

Im Metadata-Dokument:

  1. Kopieren Sie den Wert Metadata URI, öffnen Sie eine Browser-Registerkarte, und fügen Sie die URL in die Adressleiste ein.

  2. Sie sollten JSON-Text im Browser sehen. Sie können diesen Text in einem Texteditor oder im Browser selbst bearbeiten.

  3. Suchen Sie den Parameter "jwks_uri", und kopieren Sie seinen Wert. Sein Format sollte https://dev-111111.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7/v1/keys ähneln. Dieser Endpunkt wird in den folgenden Schritten als <OKTA_JWS_KEY_ENDPOINT> bezeichnet.

  4. Suchen Sie den Parameter "token_endpoint", und kopieren Sie seinen Wert. Sein Format sollte https://dev-111111.oktapreview.com/oauth2/auslh9j9vf9ej7NfT0h7/v1/token ähneln. Dieser Endpunkt wird in den folgenden Schritten als <OKTA_OAUTH_TOKEN_ENDPOINT> bezeichnet.

Schritt 4: OAuth-Autorisierungsserver in Snowflake erstellen

In diesem Schritt wird eine Sicherheitsintegration in Snowflake erstellt. Die Sicherheitsintegration sorgt dafür, dass Snowflake sicher mit Okta kommunizieren, die Token von Okta validieren und Benutzern den entsprechenden Snowflake-Datenzugriff basierend auf der dem OAuth-Token zugeordneten Benutzerrolle bereitstellen kann.

Weitere Informationen dazu finden Sie unter CREATE SECURITY INTEGRATION.

Wichtig

Dieser SQL-Befehl kann nur von Kontoadministratoren (d. h. Benutzern mit der Rolle ACCOUNTADMIN) oder von Rollen mit der globalen Berechtigung CREATE INTEGRATION ausgeführt werden.

Bei den Werten der Sicherheitsintegrationsparameter wird zwischen Groß- und Kleinschreibung unterschieden, und die Werte, die Sie in die Sicherheitsintegration eingeben, müssen mit diesen Werten in Ihrer Umgebung übereinstimmen. Wenn die Schreibung nicht übereinstimmt, wird das Zugriffstoken möglicherweise nicht validiert, was zu einem fehlgeschlagenen Authentifizierungsversuch führt.

OAuth-Autorisierungsserver mit Zielgruppen erstellen

Wenn der beim Erstellen der Snowflake OAuth-Ressourcenanwendung in Okta eingegebene Audience-Wert nicht die Snowflake-Konto-URL (z. B. <Konto>.<Region>.snowflakecomputing.com) ist, fügen Sie den Parameter external_oauth_audience_list zur Sicherheitsintegration hinzu und ersetzen Sie <SNOWFLAKE_AUDIENCE> durch Ihre Snowflake-Konto-URL.

create security integration external_oauth_okta_2
    type = external_oauth
    enabled = true
    external_oauth_type = okta
    external_oauth_issuer = '<OKTA_ISSUER>'
    external_oauth_jws_keys_url = '<OKTA_JWS_KEY_ENDPOINT>'
    external_oauth_audience_list = ('<SNOWFLAKE_AUDIENCE>')
    external_oauth_token_user_mapping_claim = 'sub'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';

Ändern der External OAuth-Sicherheitsintegration

Sie können Ihre External OAuth-Sicherheitsintegration aktualisieren, indem Sie auf der Sicherheitsintegration eine ALTER-Anweisung ausführen.

Weitere Informationen dazu finden Sie unter ALTER SECURITY INTEGRATION.

Verwenden der Rolle ANY mit External OAuth

Im Konfigurationsschritt zum Erstellen einer Sicherheitsintegration in Snowflake enthält das OAuth-Zugriffstoken die Bereichsdefinition. Daher können zur Laufzeit mit der External OAuth-Sicherheitsintegration weder OAuth-Client noch -Benutzer eine undefinierte Rolle im OAuth-Zugriffstoken verwenden.

Nach dem Überprüfen des Zugriffstokens und dem Erstellen einer Sitzung kann die Rolle ANY dem OAuth-Client und -Benutzer ermöglichen, ihre Rolle zu bestimmen. Bei Bedarf kann der Client oder der Benutzer zu einer Rolle wechseln, die sich von der im OAuth-Zugriffstoken definierten Rolle unterscheidet.

Beim Konfigurieren der ANY-Rolle definieren Sie den Bereich als SESSION:ROLE-ANY und konfigurieren dann die Sicherheitsintegration mit dem Parameter external_oauth_any_role_mode. Dieser Parameter kann drei mögliche Zeichenfolgenwerte haben:

  • DISABLE erlaubt dem OAuth-Client oder -Benutzer nicht, die Rollen zu wechseln (d. h. use role <Rolle>;). Standard.

  • ENABLE ermöglicht dem OAuth-Client oder -Benutzer, die Rollen zu wechseln.

  • ENABLE_FOR_PRIVILEGE ermöglicht dem OAuth-Client oder -Benutzer, die Rollen nur für einen Client oder Benutzer mit der Berechtigung USE_ANY_ROLE zu wechseln. Diese Berechtigung kann einer oder mehreren dem Benutzer zur Verfügung stehenden Rollen erteilt und entzogen werden. Beispiel:

    grant USE_ANY_ROLE on integration external_oauth_1 to role1;
    
    revoke USE_ANY_ROLE on integration external_oauth_1 from role1;
    

Definieren Sie die Sicherheitsintegration wie folgt:

create security integration external_oauth_1
    type = external_oauth
    enabled = true
    external_oauth_any_role_mode = 'ENABLE'
    ...

Verwenden von Netzwerkrichtlinien mit External OAuth

Derzeit können keine Netzwerkrichtlinien zu Ihrer External OAuth-Sicherheitsintegration hinzugefügt werden.

Wenn für Ihren Anwendungsfall OAuth und eine Snowflake-Netzwerkrichtlinie erforderlich sind, verwenden Sie Snowflake OAuth.

Weitere Informationen dazu finden Sie unter OAuth und Netzwerkrichtlinien.

Testverfahren

Im Zusammenhang mit dem Testen von OAuth unter Verwendung von Okta als Autorisierungsserver müssen Sie Folgendes tun:

  1. Stellen Sie sicher, dass der Testbenutzer in Okta vorhanden ist und ein Kennwort hat.

  2. Stellen Sie sicher, dass der Testbenutzer in Snowflake vorhanden ist und der Attributwert login_name auf <OKTA_USER_USERNAME> gesetzt ist.

  3. Registrieren Sie einen OAuth-Client.

  4. Ermöglichen Sie dem OAuth-Client, eine POST-Anforderung an den Okta-Token-Endpunkt wie folgt zu senden:

    • Gewährungstyp auf „Ressource Owner“ setzen

    • HTTP-Basic Authorization-Header, der clientID und Geheimnis enthält

    • FORM-Daten, die den Benutzernamen und das Kennwort des Benutzers enthalten

    • Bereiche einschließen

Der Beispielbefehl fordert den Analysten an und setzt voraus, dass session:role:analyst in Okta > OAuth App Resource definiert wurde.

Hier ist ein Beispiel für das Abrufen eines Zugriffstokens mit cURL.

curl -X POST -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" \
  --user <OAUTH_CLIENT_ID>:<OAUTH_CLIENT_SECRET> \
  --data-urlencode "username=<OKTA_USER_USERNAME>" \
  --data-urlencode "password=<OKTA_USER_PASSWORD>" \
  --data-urlencode "grant_type=password" \
  --data-urlencode "scope=session:role:analyst" \
  <OKTA_OAUTH_TOKEN_ENDPOINT>

Herstellen einer Verbindung zu Snowflake mit External OAuth

Nachdem Sie Ihre Sicherheitsintegration konfiguriert und Ihr Zugriffstoken erhalten haben, können Sie eine der folgenden Verbindungen zu Snowflake herstellen:

Beachten Sie Folgendes:

  • Es ist notwendig, den Parameter authenticator auf oauth und den Parameter token auf external_oauth_access_token zu setzen.

  • Wenn Sie den token-Wert als URL-Abfrageparameter übergeben, muss der token-Wert als URL codiert werden.

  • Wenn Sie den token-Wert an ein Properties-Objekt übergeben (z. B. JDBC-Treiber), sind keine Anpassungen erforderlich.

Wenn Sie beispielsweise den Python-Konnektor verwenden, legen Sie die Verbindungszeichenfolge wie unten gezeigt fest.

ctx = snowflake.connector.connect(
   user="<username>",
   host="<hostname>",
   account="<account_name>",
   authenticator="oauth",
   token="<external_oauth_access_token>",
   warehouse="test_warehouse",
   database="test_db",
   schema="test_schema"
)

Sie können jetzt External OAuth verwenden, um eine sichere Verbindung zu Snowflake herzustellen.