Ativar a federação de identidades de cargas de trabalho para cargas de trabalho do AWS IAM

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

Casos de uso

  • funções Lambda a chamar APIs do Azure Databricks (a acionar tarefas, a consultar armazéns SQL)
  • Pipelines ETL com base em EC2/ECS que se autenticam no Azure Databricks sem credenciais secretas
  • Cargas de trabalho de aprendizagem automática baseadas em EKS que acedem a pontos de extremidade de disponibilização de modelos
  • Padrões entre contas onde cargas de trabalho numa conta AWS federam-se numa conta Azure Databricks gerida por outra equipa
  • Melhoria da postura de segurança pela eliminação de PATs ou segredos de longa duração do Azure Databricks armazenados no AWS Secrets Manager

Pré-requisitos AWS

As etapas seguintes têm de ser concluídas para ativar a federação de identidade de carga de trabalho para cargas de trabalho do AWS IAM.

Passo 1: Ativar a federação de identidades de saída AWS IAM

Ative a federação de identidade de saída na sua conta AWS:

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

Também pode ativar esta opção na Consola do IAM, em Definições da conta>Ativar "federação de identidade web de saída".

Passo 2: Conceder sts:GetWebIdentityToken permissão

Atribua permissão à função do IAM sts:GetWebIdentityToken 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
        }
      }
    }
  ]
}

Note

A condição de destinatário garante que a função só pode solicitar tokens destinados ao Azure Databricks. A condição de duração limita a vida útil do token a 300 segundos. Pode ajustar a duração até 3600 segundos consoante as suas necessidades de carga de trabalho, mas recomenda-se uma vida útil mais curta.

Passo 3: Note a URL específica do emissor da conta

Recupere a URL específica do emissor da conta:

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

Important

As políticas de federação do Azure Databricks são criadas ao nível da conta (não ao nível do espaço de trabalho). O host CLI do Azure Databricks deve ser definido como https://accounts.azuredatabricks.net e o utilizador deve ser administrador de conta.

Crie uma política de federação de identidades de cargas de trabalho usando a Databricks CLI. Defina o emissor para o URL específico da sua conta a partir do Passo 3. Para instruções detalhadas, consulte Configurar uma política de federação de principal 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

Depois de criares a política de federação, usa o SDK Databricks para autenticar as tuas cargas de trabalho AWS. O exemplo seguinte utiliza o padrão do IdTokenSource SDK para recuperar um token AWS STS e trocá-lo por um token Azure Databricks OAuth.

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

Recomenda-se uma duração do token de 300 segundos. Pode ajustar até 3600 segundos consoante a necessidade de carga de trabalho.

Para um exemplo de troca manual de tokens, veja Autenticar com um token de fornecedor de identidade.

Referências à documentação AWS