Imbarca gli utenti su Amazon SageMaker Studio con ruoli IAM specifici per gruppi di Active Directory.

Onboard users to Amazon SageMaker Studio with specific IAM roles for Active Directory groups.

Amazon SageMaker Studio è un ambiente di sviluppo integrato (IDE) basato sul web per il machine learning (ML) che consente di costruire, addestrare, debuggare, distribuire e monitorare i modelli di ML. Per fornire Studio nel proprio account AWS e nella propria regione, è necessario creare prima un dominio Amazon SageMaker, una struttura che racchiude l’ambiente di ML. Più concretamente, un dominio SageMaker consiste in un volume di Amazon Elastic File System (Amazon EFS) associato, un elenco di utenti autorizzati e una varietà di configurazioni di sicurezza, applicazione, policy e Amazon Virtual Private Cloud (Amazon VPC).

Nella creazione del proprio dominio SageMaker, è possibile scegliere di utilizzare sia AWS IAM Identity Center (successore di AWS Single Sign-On) che AWS Identity and Access Management (IAM) come metodi di autenticazione utente. Entrambi i metodi di autenticazione hanno il proprio set di casi d’uso; in questo post, ci concentriamo sui domini SageMaker con IAM Identity Center, o modalità single sign-on (SSO), come metodo di autenticazione.

Con la modalità SSO, si configura un utente e un gruppo SSO in IAM Identity Center e quindi si concede l’accesso al gruppo o all’utente SSO dalla console di Studio. Attualmente, tutti gli utenti SSO in un dominio ereditano il ruolo di esecuzione del dominio. Ciò potrebbe non funzionare per tutte le organizzazioni. Ad esempio, gli amministratori potrebbero voler configurare le autorizzazioni IAM per un utente SSO di Studio in base all’appartenenza al gruppo Active Directory (AD). Inoltre, poiché gli amministratori devono concedere manualmente l’accesso agli utenti SSO di Studio, il processo potrebbe non essere scalabile durante l’assunzione di centinaia di utenti.

In questo post, forniamo indicazioni prescrittive per la soluzione di fornire utenti SSO a Studio con autorizzazioni a privilegi minimi in base all’appartenenza al gruppo AD. Queste indicazioni consentono di scalare rapidamente l’assunzione di centinaia di utenti in Studio e di raggiungere la propria posizione di sicurezza e conformità.

Panoramica della soluzione

Il diagramma seguente illustra l’architettura della soluzione.

Il flusso di lavoro per la fornitura di utenti AD in Studio include i seguenti passaggi:

  1. Configurare un dominio Studio in modalità SSO.

  2. Per ogni gruppo AD:

    1. Configurare il proprio ruolo di esecuzione di Studio con le appropriate policy IAM granulari.
    2. Registrare una voce nella tabella di mappatura gruppo-ruolo di Amazon DynamoDB.

    In alternativa, è possibile adottare uno standard di denominazione per gli ARN del ruolo IAM basato sul nome del gruppo AD e derivare l’ARN del ruolo IAM senza la necessità di memorizzare il mapping in un database esterno.

  3. Sincronizzare gli utenti e i gruppi AD e gli appartenenti in AWS Identity Center:

    1. Se si utilizza un provider di identità (IdP) che supporta SCIM, utilizzare l’integrazione dell’API SCIM con IAM Identity Center.
    2. Se si utilizza AD autogestito, è possibile utilizzare AD Connector.
  4. Quando il gruppo AD viene creato nel proprio AD aziendale, completare i seguenti passaggi:

    1. Creare un gruppo SSO corrispondente in IAM Identity Center.
    2. Associare il gruppo SSO al dominio Studio utilizzando la console di SageMaker.
  5. Quando viene creato un utente AD nel proprio AD aziendale, viene creato un utente SSO corrispondente in IAM Identity Center.

  6. Quando l’utente AD viene assegnato a un gruppo AD, viene invocata un’API IAM Identity Center (CreateGroupMembership) e viene creata l’appartenenza al gruppo SSO.

  7. L’evento precedente viene registrato in AWS CloudTrail con il nome AddMemberToGroup.

  8. Una regola Amazon EventBridge ascolta gli eventi CloudTrail e corrisponde al pattern di regola AddMemberToGroup.

  9. La regola EventBridge attiva la funzione AWS Lambda di destinazione.

  10. Questa funzione Lambda richiamerà le API IAM Identity Center, otterrà le informazioni sull’utente e sul gruppo SSO e eseguirà i seguenti passaggi per creare il profilo utente di Studio (CreateUserProfile) per l’utente SSO:

    1. Cercare la tabella DynamoDB per recuperare il ruolo IAM corrispondente al gruppo AD.
    2. Creare un profilo utente con l’utente SSO e il ruolo IAM ottenuto dalla tabella di ricerca.
    3. L’utente SSO ottiene l’accesso a Studio.
  11. L’utente SSO viene reindirizzato all’IDE di Studio tramite l’URL del dominio Studio.

Si noti che, al momento della stesura, la fase 4b (associare il gruppo SSO al dominio Studio) deve essere eseguita manualmente da un amministratore utilizzando la console SageMaker al livello del dominio SageMaker.

Impostare una funzione Lambda per creare i profili utente

La soluzione utilizza una funzione Lambda per creare i profili utente di Studio. Forniamo la seguente funzione Lambda di esempio che è possibile copiare e modificare per soddisfare le proprie esigenze per automatizzare la creazione del profilo utente di Studio. Questa funzione esegue le seguenti azioni:

  1. Riceve l’evento CloudTrail AddMemberToGroup da EventBridge.
  2. Recupera l’ID_DOMINIO di Studio dalla variabile di ambiente (è anche possibile codificare l’ID del dominio o utilizzare una tabella DynamoDB se si hanno più domini).
  3. Legge da una tabella fittizia per abbinare gli utenti AD ai ruoli di esecuzione. È possibile modificare questo per ottenere i dati dalla tabella DynamoDB se si utilizza un approccio basato su tabella. Se si utilizza DynamoDB, il ruolo di esecuzione della funzione Lambda deve avere le autorizzazioni per leggere dalla tabella.
  4. Recupera le informazioni sull’utente SSO e l’appartenenza al gruppo AD da IAM Identity Center, in base ai dati dell’evento CloudTrail.
  5. Crea un profilo utente di Studio per l’utente SSO, con i dettagli SSO e il ruolo di esecuzione corrispondente.
import os
import json
import boto3
DOMAIN_ID = os.environ.get('DOMAIN_ID', 'd-xxxx')


def lambda_handler(event, context):
    
    print({"Event": event})

    client = boto3.client('identitystore')
    sm_client = boto3.client('sagemaker')
    
    event_detail = event['detail']
    group_response = client.describe_group(
        IdentityStoreId=event_detail['requestParameters']['identityStoreId'],
        GroupId=event_detail['requestParameters']['groupId'],
    )
    group_name = group_response['DisplayName']
    
    user_response = client.describe_user(
        IdentityStoreId=event_detail['requestParameters']['identityStoreId'],
        UserId=event_detail['requestParameters']['member']['memberId']
    )
    user_name = user_response['UserName']
    print(f"Dettagli evento: {user_name} è stato aggiunto a {group_name}")
    
    mapping_dict = {
        "ad-group-1": "<execution-role-arn>",
        "ad-group-2": "<execution-role-arn>”
    }
    
    user_role = mapping_dict.get(group_name)
    
    if user_role:
        response = sm_client.create_user_profile(
            DomainId=DOMAIN_ID,
            SingleSignOnUserIdentifier="UserName",
            SingleSignOnUserValue=user_name,
            # if the SSO user_name value is an email, 
      #  add logic to handle it since Studio user profiles don’t accept @ character
            UserProfileName=user_name, 
            UserSettings={
                "ExecutionRole": user_role
            }
        )
        print(response)
    else:
        response = "Il gruppo non è autorizzato ad utilizzare SageMaker. Non fare nulla."
        print(response)
    return {
        'statusCode': 200,
        'body': json.dumps(response)
    }

Si noti che per impostazione predefinita, il ruolo di esecuzione Lambda non ha accesso alla creazione di profili utente o all’elenco degli utenti SSO. Dopo aver creato la funzione Lambda, accedere al ruolo di esecuzione della funzione su IAM e allegare la seguente policy come policy incorporata dopo aver limitato la portata in base alle esigenze dell’organizzazione.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "identitystore:DescribeGroup",
                "identitystore:DescribeUser"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": "sagemaker:CreateUserProfile",
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": "iam:PassRole",
            "Effect": "Allow",
            "Resource": [
                "<list-of-studio-execution-roles>"
            ]
        }
    ]
}

Impostare la regola EventBridge per l’evento CloudTrail

EventBridge è un servizio di bus degli eventi serverless che è possibile utilizzare per collegare le applicazioni con i dati provenienti da una varietà di fonti. In questa soluzione, creiamo un trigger basato su regole: EventBridge ascolta gli eventi e corrisponde al modello fornito e attiva una funzione Lambda se la corrispondenza del modello ha successo. Come spiegato nella panoramica della soluzione, ascoltiamo l’evento AddMemberToGroup. Per impostarlo, completare i seguenti passaggi:

  1. Nella console di EventBridge, scegli Regole nel riquadro di navigazione.

  2. Scegli Crea regola.

  3. Fornisci un nome per la regola, ad esempio, AddUserToADGroup.

  4. Opzionalmente, inserisci una descrizione.

  5. Seleziona default per il bus degli eventi.

  6. Sotto Tipo di regola, scegli Regola con un modello di evento, quindi scegli Avanti.

  7. Nella pagina Crea modello di evento, scegli Origine evento come Eventi AWS o eventi partner di EventBridge.

  8. Sotto Modello di evento, scegli la scheda Modelli personalizzati (editor JSON) e inserisci il seguente modello:

    {
      "source": ["aws.sso-directory"],
      "detail-type": ["AWS API Call via CloudTrail"],
      "detail": {
        "eventSource": ["sso-directory.amazonaws.com"],
        "eventName": ["AddMemberToGroup"]
      }
    }
  9. Scegli Avanti.

  10. Nella pagina Seleziona destinazione, scegli il servizio AWS per il tipo di destinazione, la funzione Lambda come destinazione e la funzione che hai creato in precedenza, quindi scegli Avanti.

  11. Scegli Avanti sulla pagina Configura tag, quindi scegli Crea regola sulla pagina Rivedi e crea.

Dopo aver impostato la funzione Lambda e la regola EventBridge, puoi testare questa soluzione. Per farlo, apri il tuo provider di identità e aggiungi un utente a uno dei gruppi AD con il ruolo di esecuzione di Studio mappato. Una volta aggiunto l’utente, puoi verificare i log della funzione Lambda per ispezionare l’evento e vedere anche l’utente di Studio provisionato automaticamente. Inoltre, puoi utilizzare la chiamata API DescribeUserProfile per verificare che l’utente sia creato con le autorizzazioni appropriate.

Supportare più account di Studio

Per supportare più account di Studio con l’architettura precedente, ti consigliamo i seguenti cambiamenti:

  1. Imposta un gruppo AD mappato per ogni livello di account di Studio.
  2. Imposta un ruolo IAM a livello di gruppo in ogni account di Studio.
  3. Imposta o deriva la mappatura del gruppo al ruolo IAM.
  4. Imposta una funzione Lambda per eseguire l’assunzione del ruolo tra account, in base all’ARN della mappatura del ruolo IAM e del profilo utente creato.

Deprovisioning degli utenti

Quando un utente viene rimosso dal proprio gruppo AD, dovresti rimuovere anche il loro accesso al dominio Studio. Con SSO, quando un utente viene rimosso, l’utente viene disabilitato automaticamente nel Centro identità IAM se la sincronizzazione AD con il Centro identità IAM è in atto, e il loro accesso all’applicazione di Studio viene revocato immediatamente.

Tuttavia, il profilo utente su Studio persiste ancora. Puoi aggiungere un flusso di lavoro simile con CloudTrail e una funzione Lambda per rimuovere il profilo utente da Studio. L’evento EventBridge dovrebbe ora ascoltare l’evento DeleteGroupMembership. Nella funzione Lambda, completa i seguenti passaggi:

  1. Ottieni il nome del profilo utente dall’ID dell’utente e del gruppo.
  2. Elenca tutte le app in esecuzione per il profilo utente utilizzando la chiamata API ListApps, filtrando per il parametro UserProfileNameEquals. Assicurati di controllare la risposta paginata, per elencare tutte le app per l’utente.
  3. Elimina tutte le app in esecuzione per l’utente e attendi fino a quando tutte le app sono state eliminate. Puoi utilizzare la chiamata API DescribeApp per visualizzare lo stato dell’app.
  4. Quando tutte le app sono in uno stato Eliminato (o Fallito), elimina il profilo utente.

Con questa soluzione in atto, gli amministratori della piattaforma ML possono mantenere l’appartenenza ai gruppi in un’unica posizione centrale e automatizzare la gestione del profilo utente di Studio tramite EventBridge e funzioni Lambda.

Il seguente codice mostra un evento CloudTrail di esempio:

"AddMemberToGroup": 
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "Unknown",
        "accountId": "<account-id>",
        "accessKeyId": "30997fec-b566-4b8b-810b-60934abddaa2"
    },
    "eventTime": "2022-09-26T22:24:18Z",
    "eventSource": "sso-directory.amazonaws.com",
    "eventName": "AddMemberToGroup",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "54.189.184.116",
    "userAgent": "Okta SCIM Client 1.0.0",
    "requestParameters": {
        "identityStoreId": "d-906716eb24",
        "groupId": "14f83478-a061-708f-8de4-a3a2b99e9d89",
        "member": {
            "memberId": "04c8e458-a021-702e-f9d1-7f430ff2c752"
        }
    },
    "responseElements": null,
    "requestID": "b24a123b-afb3-4fb6-8650-b0dc1f35ea3a",
    "eventID": "c2c0873b-5c49-404c-add7-f10d4a6bd40c",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<account-id>",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "up.sso.us-east-1.amazonaws.com"
    }
}

Il codice seguente mostra una richiesta API di esempio del profilo utente Studio:

create-user-profile \\
--domain-id d-xxxxxx \\
--user-profile-name ssouserid
--single-sign-on-user-identifier 'userName' \\
--single-sign-on-user-value 'ssouserid‘ \\
--user-settings ExecutionRole=arn:aws:iam::<account id>:role/name

Conclusione

In questo post, abbiamo discusso di come gli amministratori possono scalare l’onboarding di Studio per centinaia di utenti in base all’appartenenza al gruppo AD. Abbiamo dimostrato un’architettura di soluzione end-to-end che le organizzazioni possono adottare per automatizzare e scalare il loro processo di onboarding per soddisfare le loro esigenze di agilità, sicurezza e conformità. Se stai cercando una soluzione scalabile per automatizzare l’onboarding degli utenti, prova questa soluzione e lascia un tuo feedback qui sotto! Per ulteriori informazioni sull’onboarding in Studio, consulta Onboard to Amazon SageMaker Domain.