Pular para o conteúdo principal

Habilitar federação de identidade de workload para workloads do AWS IAM

As cargas de trabalho da AWS podem se autenticar no Databricks sem segredos de longo prazo, trocando um token de identidade OIDC assinado pela AWS. O caminho recomendado chama a API AWS STS GetWebIdentityToken , que funciona em qualquer lugar onde a carga de trabalho tenha credenciais da AWS.

Casos de uso

  • Funções Lambda que chamam as APIs do Databricks (acionando jobs, consultando SQL warehouses)
  • Pipelines ETL baseados em EC2/ECS com autenticação no Databricks sem segredos.
  • Cargas de trabalho de aprendizado de máquina baseadas em EKS que acessam endpoints de servindo modelo
  • Padrões de conta cruzada onde as cargas de trabalho em uma account da AWS se federam em uma account do Databricks gerenciada por outra equipe
  • Melhoria da postura de segurança eliminando PATs ou segredos de longa duração do Databricks do AWS Secrets Manager.

Pré-requisitos da AWS

Os seguintes passos devem ser concluídos para habilitar a federação de identidade de workload para workloads do AWS IAM.

o passo 1: Habilitar a federação de identidade de saída do AWS IAM

Habilite a federação de identidades de saída em sua conta da AWS:

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

Também é possível habilitar isto no Console IAM em Configurações da Conta > Habilitar "Federação de identidade da web de saída" .

Etapa 2: Conceda permissão sts:GetWebIdentityToken

Conceda a permissão sts:GetWebIdentityToken à IAM role da carga de trabalho:

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

A condição de público-alvo garante que a função só possa solicitar tokens direcionados ao Databricks. A condição de duração limita a vida útil do token a 300 segundos. Você pode ajustar a duração em até 3600 segundos, de acordo com as necessidades da sua carga de trabalho, mas recomenda-se um tempo de vida mais curto.

O passo 3: Observe a URL de emissor específica da conta

Recupere o URL do emissor específico da account:

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

Criar uma política de federação

importante

As políticas de federação do Databricks são criadas no nível da conta (não no nível do workspace). O host da CLI do Databricks deve ser definido como https://accounts.cloud.databricks.com e o usuário deve ser um administrador da conta.

Crie uma política de federação de identidade de carga de trabalho usando a CLI do Databricks. Defina o emissor como sua URL de emissor específica da conta do passo 3. Para obter instruções detalhadas, consulte Configurar uma política de federação de entidade de serviço.

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

Autenticar-se no Databricks

Após criar a política de federação, use o SDK do Databricks para autenticar suas cargas de trabalho da AWS. O exemplo a seguir usa o padrão IdTokenSource do SDK para recuperar um token AWS STS e trocá-lo por um token OAuth do 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()
nota

Recomenda-se uma duração de token de 300 segundos. É possível ajustar até 3600 segundos com base nas necessidades da workload.

Para um exemplo de troca manual de tokens, consulte Autenticar com um token de provedor de identidade.

Referências à documentação da AWS