Activer la fédération des identités de charge de travail pour les charges de travail AWS IAM

Les charges de travail AWS peuvent s’authentifier auprès de Azure Databricks sans secrets à long terme en échangeant un jeton d’identité OIDC signé AWS. Le chemin recommandé appelle l’API AWS STS GetWebIdentityToken , qui fonctionne n’importe où où la charge de travail possède des informations d’identification AWS.

Cas d’utilisation

  • Fonctions lambda appelant Azure Databricks API (déclenchement de travaux, interrogation d’entrepôts SQL)
  • Pipelines ETL basés sur EC2/ECS s’authentifiant auprès d’Azure Databricks sans secrets
  • Charges de travail d’apprentissage automatique basées sur EKS accédant aux points de terminaison de service des modèles
  • Modèles inter-comptes où les charges de travail d’un compte AWS fédèrent dans un compte Azure Databricks géré par une autre équipe
  • Amélioration de la posture de sécurité par l’élimination des PAT Azure Databricks à longue durée de vie ou des secrets d’AWS Secrets Manager

Prérequis AWS

Les étapes suivantes doivent être effectuées pour activer la fédération des identités de charge de travail pour les charges de travail AWS IAM.

Étape 1 : Activer la fédération d’identité sortante AWS IAM

Activez la fédération d’identité sortante sur votre compte AWS :

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

Vous pouvez également l’activer dans la console IAM sous Paramètres >pour activer la « fédération des identités web sortantes ».

Étape 2 : Accorder l’autorisation sts:GetWebIdentityToken

Accordez une autorisation au rôle IAM de la charge de travail sts:GetWebIdentityToken :

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

Remarque

La condition d’audience garantit que le rôle ne peut demander que des jetons destinés à Azure Databricks. La condition de durée limite la durée de vie du jeton à 300 secondes. Vous pouvez ajuster la durée jusqu’à 3600 secondes en fonction des besoins de votre charge de travail, mais des durées de vie plus courtes sont recommandées.

Étape 3 : Notez l’URL de l’émetteur spécifique au compte

Récupérez l’URL de l’émetteur spécifique au compte :

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

Créer une stratégie de fédération

Important

Azure Databricks stratégies de fédération sont créées au niveau du compte (et non au niveau de l’espace de travail). L’hôte de l’interface CLI Azure Databricks doit être défini sur https://accounts.azuredatabricks.net et l’utilisateur doit être un administrateur de compte.

Créez une stratégie de fédération d’identités de workloads à l’aide de la CLI Databricks. Définissez l’émetteur sur l’URL d’émetteur spécifique à votre compte indiquée à l’étape 3. Pour obtenir des instructions détaillées, consultez Configurer une stratégie de fédération de principal de service.

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

S’authentifier auprès de Databricks

Après avoir créé la stratégie de fédération, utilisez le Kit de développement logiciel (SDK) Databricks pour authentifier vos charges de travail AWS. L'exemple suivant utilise le modèle du Kit de IdTokenSource développement logiciel (SDK) pour récupérer un jeton AWS STS et l'échanger pour un jeton OAuth Azure Databricks.

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

Remarque

La durée du jeton de 300 secondes est recommandée. Vous pouvez ajuster jusqu’à 3600 secondes en fonction des besoins de charge de travail.

Pour obtenir un exemple d’échange de jetons manuel, consultez Authentifier avec un jeton de fournisseur d’identité.

Références de documentation AWS