Aktivera federering av arbetsbelastningsidentiteter för AWS IAM-arbetsbelastningar

AWS-arbetsbelastningar kan autentisera till Azure Databricks utan långsiktiga hemligheter genom att utbyta en AWS-signerad OIDC-identitetstoken. Den rekommenderade sökvägen anropar AWS STS GetWebIdentityToken API, som fungerar överallt där arbetsbelastningen har AWS-autentiseringsuppgifter.

Användningsfall

  • Lambda-funktioner som anropar Azure Databricks API:er (utlöser jobb, frågar SQL-lager)
  • EC2/ECS-baserade ETL-pipelines som autentiserar till Azure Databricks utan hemligheter
  • EKS-baserade ML-arbetslaster med åtkomst till slutpunkter för modellservering
  • Korskontomönster där arbetsbelastningar i ett AWS-konto federeras till ett Azure Databricks konto som hanteras av ett annat team
  • Förbättring av säkerhetsläget genom att ta bort långlivade Azure Databricks-PAT:ar eller hemligheter ur AWS Secrets Manager

AWS-krav

Följande steg måste slutföras för att aktivera arbetsbelastningsidentitetsfederation för AWS IAM-arbetsbelastningar.

Steg 1: Aktivera utgående identitetsfederation för AWS IAM

Aktivera utgående identitetsfederation på ditt AWS-konto:

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

Du kan också aktivera detta i IAM-konsolen under Kontoinställningar>Aktivera "Utgående webbidentitetsfederation".

Steg 2: Bevilja sts:GetWebIdentityToken behörighet

Bevilja arbetsbelastningens IAM-rollbehörighet sts:GetWebIdentityToken :

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

Note

Målgruppsvillkoret säkerställer att rollen endast kan begära token som är riktade till Azure Databricks. Varaktighetsvillkoret begränsar tokens livslängd till 300 sekunder. Du kan justera varaktigheten upp till 3 600 sekunder baserat på dina arbetsbelastningsbehov, men kortare livslängd rekommenderas.

Steg 3: Observera url:en för den kontospecifika utfärdaren

Hämta url:en för den kontospecifika utfärdaren:

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

Skapa en federationsprincip

Important

Azure Databricks federationsprinciper skapas på kontonivå (inte på arbetsytenivå). Azure Databricks CLI-värden måste ställas in på https://accounts.azuredatabricks.net och användaren måste vara kontoadministratör.

Skapa en identitetsfederationsprincip för arbetsbelastning med hjälp av Databricks CLI. Ange utfärdaren till din kontospecifika utfärdar-URL från steg 3. Detaljerade instruktioner finns i Konfigurera en federationsprincip för ett tjänsthuvudnamn.

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>"
  }
}'

Autentisera till Databricks

När du har skapat federationsprincipen använder du Databricks SDK för att autentisera dina AWS-arbetsbelastningar. I följande exempel används SDK:ns IdTokenSource mönster för att hämta en AWS STS-token och byta ut den mot en Azure Databricks OAuth-token.

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()

Note

Tokenvaraktighet på 300 sekunder rekommenderas. Du kan justera upp till 3 600 sekunder baserat på arbetsbelastningsbehov.

Ett exempel på manuell tokenutbyte finns i Autentisera med en identitetsprovidertoken.

AWS-dokumentationsreferenser