Aller au contenu principal

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

Les charges de travail AWS peuvent s'authentifier auprès de Databricks sans secrets à long terme en échangeant un jeton d'identité OIDC signé par AWS. Le chemin recommandé appelle l'API AWS STS GetWebIdentityToken, qui fonctionne partout où la charge de travail dispose d'identifiants AWS.

Cas d'utilisation

  • Fonctions Lambda appelant les APIs Databricks (déclenchant des jobs, interrogeant des SQL warehouses)
  • Pipelines ETL basés sur EC2/ECS s'authentifiant auprès de Databricks sans secrets
  • Charges de travail ML basées sur EKS accédant aux Endpoint de service de modèle
  • Modèles inter-comptes où les charges de travail d'un compte AWS se fédèrent dans un compte Databricks géré par une autre équipe
  • Amélioration de la posture de sécurité en éliminant les PAT Databricks ou les secrets de longue durée d'AWS Secrets Manager

Prérequis AWS

Les étapes suivantes doivent être terminées pour activer la fédération d’identité 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 :

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

Vous pouvez également l'activer dans la console IAM sous Paramètres du compte > Activer « fédération d'identité web sortante » .

Étape 2 : accorder l'autorisation à sts:GetWebIdentityToken

Accorder l'autorisation sts:GetWebIdentityToken au rôle IAM de la charge de travail :

JSON
{
"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 ciblant Databricks. La condition de durée limite la durée de vie du jeton à 300 secondes. Vous pouvez ajuster la durée jusqu'à 3 600 secondes en fonction de vos besoins en matière de charge de travail, mais des durées de vie plus courtes sont recommandées.

Étape 3 : Notez l'URL d'émetteur spécifique au compte

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

Python
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 politique de fédération

important

Les politiques de fédération Databricks sont créées au niveau du compte (et non au niveau du Workspace). L'hôte Databricks CLI doit être défini sur https://accounts.cloud.databricks.com et l'utilisateur doit être un administrateur de compte.

Créez une politique de fédération d'identités de charge de travail à l'aide de la Databricks CLI. Définissez l'émetteur sur l'URL de votre émetteur spécifique au compte à partir de l'étape 3. Pour des instructions détaillées, consultez Configurer une stratégie de fédération de service principal.

Bash
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 politique de fédération, utilisez le Databricks SDK pour authentifier vos workloads AWS. L'exemple suivant utilise le modèle IdTokenSource du SDK pour récupérer un jeton STS AWS et l'échanger contre un jeton OAuth Databricks.

Python
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 des jetons de 300 secondes est recommandée. Vous pouvez ajuster jusqu'à 3 600 secondes en fonction des besoins de la charge de travail.

Pour un exemple d’échange manuel de jeton, consultez S’authentifier avec un jeton du fournisseur d’identité.

Références de la documentation AWS.