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:
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:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["sts:GetWebIdentityToken"],
"Resource": "*",
"Condition": {
"ForAllValues:StringEquals": {
"sts:IdentityTokenAudience": "databricks"
},
"NumericLessThanEquals": {
"sts:DurationSeconds": 300
}
}
}
]
}
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:
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
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.
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.
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()
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.