Schakel federatie van workloadidentiteiten in voor AWS IAM-workloads

AWS-workloads kunnen worden geverifieerd bij Azure Databricks zonder langetermijngeheimen door een door AWS ondertekend OIDC-identiteitstoken uit te wisselen. De aanbevolen methode roept de AWS STS-API GetWebIdentityToken aan, wat werkt overal waar de workload AWS-inloggegevens heeft.

Gebruikssituaties

  • Lambda-functies die Azure Databricks API's aanroepen (het activeren van taken, het uitvoeren van query's op SQL-warehouses)
  • ETL-pijplijnen op EC2/ECS-basis die zich zonder geheime gegevens verifiëren bij Azure Databricks
  • Op EKS gebaseerde ML-workloads die toegang hebben tot het model dat eindpunten bedient
  • Patronen voor meerdere accounts waarbij workloads in één AWS-account federeren in een Azure Databricks-account dat wordt beheerd door een ander team
  • Verbetering van de beveiligingspostuur door langdurige Azure Databricks PAT's of geheimen van AWS Secrets Manager te elimineren

AWS-vereisten

De volgende stappen moeten worden voltooid om federatie van workloadidentiteiten voor AWS IAM-workloads in te schakelen.

Stap 1: AWS IAM-uitgaande identiteitsfederatie inschakelen

Uitgaande identiteitsfederatie inschakelen voor uw AWS-account:

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

U kunt dit ook inschakelen in de IAM-console onder Accountinstellingen>'Uitgaande webidentiteitsfederatie inschakelen.

Stap 2: Machtiging verlenen sts:GetWebIdentityToken

De IAM-rolmachtiging sts:GetWebIdentityToken van de workload verlenen:

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

Note

De doelgroepvoorwaarde zorgt ervoor dat de rol alleen tokens kan aanvragen die zijn gericht op Azure Databricks. De duurvoorwaarde beperkt de levensduur van tokens tot 300 seconden. U kunt de duur tot 3600 seconden aanpassen op basis van uw workloadbehoeften, maar kortere levensduur wordt aanbevolen.

Stap 3: Noteer de url van de accountspecifieke verlener

Haal de URL van de accountspecifieke verlener op:

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

Een federatiebeleid maken

Important

Azure Databricks federatiebeleid wordt gemaakt op accountniveau (niet op werkruimteniveau). De Azure Databricks CLI-host moet zijn ingesteld op https://accounts.azuredatabricks.net en de gebruiker moet een accountbeheerder zijn.

Maak een federatiebeleid voor workloadidentiteiten met behulp van de Databricks CLI. Stel de verlener in op de URL van uw accountspecifieke verlener uit stap 3. Zie Een federatiebeleid voor een service-principal configureren voor gedetailleerde instructies.

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

Verifiëren bij Databricks

Nadat u het federatiebeleid hebt gemaakt, gebruikt u de Databricks SDK om uw AWS-workloads te verifiëren. In het volgende voorbeeld wordt het patroon van IdTokenSource de SDK gebruikt om een AWS STS-token op te halen en om te wisselen voor een Azure Databricks OAuth-token.

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

Een duur van de token van 300 seconden wordt aanbevolen. U kunt maximaal 3600 seconden aanpassen op basis van de behoeften van de workload.

Zie Verifiëren met een token van een identiteitsprovider voor een voorbeeld van een handmatige tokenuitwisseling.

Referenties voor AWS-documentatie