Aktivieren Sie den Workload-Identitätsverbund für AWS IAM-Workloads

AWS-Workloads können sich bei Azure Databricks ohne langfristige Geheimnisse authentifizieren, indem sie ein AWS-signiertes OIDC-Identitätstoken austauschen. Der empfohlene Pfad ruft die AWS STS-API GetWebIdentityToken auf, die überall funktioniert, wo die Workload AWS-Anmeldeinformationen enthält.

Anwendungsfälle

  • Lambda-Funktionen, die Azure Databricks APIs aufrufen (Auslösen von Aufträgen, Abfragen von SQL Warehouses)
  • EC2/ECS-basierte ETL-Pipelines zur Authentifizierung bei Azure Databricks ohne Geheimnisse
  • EKS-basierte ML-Workloads, die auf Endpunkte für die Modellbereitstellung zugreifen
  • Kontoübergreifende Muster, bei denen Workloads in einem AWS-Konto mit einem von einem anderen Team verwalteten Azure Databricks Konto verbunden sind
  • Verbesserung des Sicherheitsstatus durch Beseitigung langlebiger Azure Databricks PATs oder Geheimnisse vom AWS Secrets Manager

AWS-Voraussetzungen

Die folgenden Schritte müssen ausgeführt werden, um den Workload-Identitätsverbund für AWS IAM-Workloads zu aktivieren.

Schritt 1: Aktivieren Sie die ausgehende AWS IAM-Verbundidentität

Aktivieren Des ausgehenden Identitätsverbunds für Ihr AWS-Konto:

import boto3
boto3.client('iam').enable_outbound_web_identity_federation()

Sie können dies auch in der IAM-Konsole unter Kontoeinstellungen>"Ausgehender Webidentitätsverbund aktivieren" aktivieren.

Schritt 2: Erteilen der sts:GetWebIdentityToken Berechtigung

Erteilen Sie der IAM-Rolle der Workload die sts:GetWebIdentityToken-Berechtigung:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["sts:GetWebIdentityToken"],
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
          "sts:IdentityTokenAudience": "databricks"
        },
        "NumericLessThanEquals": {
          "sts:DurationSeconds": 300
        }
      }
    }
  ]
}

Hinweis

Die Zielgruppenbedingung stellt sicher, dass die Rolle nur Token anfordern kann, die auf Azure Databricks ausgerichtet sind. Die Dauerbedingung begrenzt die Tokenlebensdauer auf 300 Sekunden. Sie können die Dauer bis zu 3600 Sekunden basierend auf Ihren Workloadanforderungen anpassen, aber kürzere Lebensdauern werden empfohlen.

Schritt 3: Beachten Sie die kontospezifische Aussteller-URL

Abrufen der kontospezifischen Aussteller-URL:

import boto3
info = boto3.client('iam').get_outbound_web_identity_federation_info()
print(info['IssuerUrl'])  # https://<uuid>.tokens.sts.global.api.aws

Erstellen einer Verbundrichtlinie

Important

Azure Databricks Verbundrichtlinien werden auf Kontoebene (nicht auf Arbeitsbereichsebene) erstellt. Der Azure Databricks CLI-Host muss auf https://accounts.azuredatabricks.net festgelegt sein, und der Benutzer muss Kontoadministrator sein.

Erstellen Sie eine Workload-Identitätsverbundrichtlinie mithilfe der Databricks CLI. Legen Sie den Aussteller auf Ihre kontospezifische Aussteller-URL aus Schritt 3 fest. Ausführliche Anweisungen finden Sie unter Konfigurieren einer Dienstprinzipalverbundrichtlinie.

databricks account service-principal-federation-policy create ${SP_ID} --json '{
  "oidc_policy": {
    "issuer": "https://<uuid>.tokens.sts.global.api.aws",
    "audiences": ["databricks"],
    "subject": "arn:aws:iam::<account-id>:role/<workload-role-name>"
  }
}'

Authentifizieren bei Databricks

Nachdem Sie die Verbundrichtlinie erstellt haben, verwenden Sie das Databricks SDK, um Ihre AWS-Workloads zu authentifizieren. Im folgenden Beispiel wird das SDK-Muster IdTokenSource verwendet, um ein AWS STS-Token abzurufen und es für ein Azure Databricks OAuth-Token auszutauschen.

import boto3
from databricks.sdk import WorkspaceClient
from databricks.sdk import oidc
from databricks.sdk.core import Config, credentials_strategy, oidc_credentials_provider


class AwsStsTokenSource(oidc.IdTokenSource):
    def __init__(self, audience="databricks", region="us-east-1"):
        self._audience = audience
        self._region = region

    def id_token(self) -> oidc.IdToken:
        sts = boto3.client("sts", region_name=self._region)
        resp = sts.get_web_identity_token(
            Audience=[self._audience],
            SigningAlgorithm="RS256",
            DurationSeconds=300,
        )
        return oidc.IdToken(jwt=resp["WebIdentityToken"])


@credentials_strategy("aws-sts-wif", [])
def aws_sts_wif_strategy(cfg: Config):
    return oidc_credentials_provider(cfg, AwsStsTokenSource())


w = WorkspaceClient(
    host="https://my-workspace.cloud.databricks.com",
    client_id="<service-principal-uuid>",
    credentials_strategy=aws_sts_wif_strategy
)
# No secrets needed
clusters = w.clusters.list()

Hinweis

Die Tokendauer von 300 Sekunden wird empfohlen. Sie können bis zu 3600 Sekunden je nach Workloadanforderungen anpassen.

Ein Beispiel für einen manuellen Tokenaustausch finden Sie unter Authentifizieren mit einem Identitätsanbietertoken.

AWS-Dokumentationsreferenzen