Tutorial IAM: utilizza un CloudFormation modello per creare un provider di identità SAML (IdP) e un ruolo IAM federato SAML - AWS Identity and Access Management

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Tutorial IAM: utilizza un CloudFormation modello per creare un provider di identità SAML (IdP) e un ruolo IAM federato SAML

Per acquisire familiarità con la federazione SAML e le sue funzionalità, utilizzerai un CloudFormation modello per configurare un provider di identità SAML (IdP) e il ruolo IAM federato associato. Questo tutorial mostra come creare entrambe le risorse in un unico stack.

Il modello crea un IdP SAML che può essere utilizzato per l'accesso federato alle risorse, insieme AWS a un ruolo IAM che si fida del provider SAML. Gli utenti autenticati dal tuo IdP esterno possono assumere questo ruolo per accedere alle AWS risorse.

Le risorse implementate includono i seguenti elementi:

  • Un IdP SAML configurato con il documento di metadati dell’IdP.

  • Un ruolo IAM federato che ritiene attendibile l’IdP SAML e che può essere assunto dagli utenti autenticati.

  • Policy gestite configurabili che possono essere associate al ruolo per concedere autorizzazioni specifiche.

Prerequisiti

Questo tutorial presuppone che tu abbia a disposizione quanto segue:

  • Python 3.6 o versione successiva installato sul computer locale per eseguire il comando Python utilizzato in questo tutorial per formattare il file XML dei metadati SAML del tuo IdP.

  • Un documento di metadati SAML del tuo IdP esterno salvato come file XML.

Crea un IdP e un ruolo SAML utilizzando CloudFormation

Per creare l'IdP SAML e il ruolo federato, creerai CloudFormation un modello e lo utilizzerai per creare uno stack contenente entrambe le risorse.

Creazione del modello

Innanzitutto, crea il modello. CloudFormation

  1. Nella sezione Modello, fai clic sull’icona di copia nella scheda JSON o YAML per copiare i contenuti del modello.

  2. Copia i contenuti del modello in un nuovo file.

  3. Salva il file localmente.

Creazione dello stack

Quindi, usa il modello che hai salvato per effettuare il provisioning di uno CloudFormation stack.

  1. Apri la CloudFormation console in https://console.aws.amazon.com/cloudformation.

  2. Nella pagina Stack, scegli Con nuove risorse (standard) nel menu Crea stack.

  3. Specifica il modello:

    1. In Prerequisito, seleziona Scegli un modello esistente.

    2. In Specifica modello, seleziona Carica un file di modello.

    3. Seleziona Scegli file, quindi passa al file del modello e selezionalo.

    4. Scegli Next (Successivo).

  4. Specifica i seguenti dettagli dello stack:

    1. Inserisci un nome dello stack.

    2. Infatti IdentityProviderName, puoi lasciare vuoto questo campo per generare automaticamente un nome basato sul nome dello stack o inserire un nome personalizzato per il tuo IdP SAML.

      Esempio: CompanyIdP o EnterpriseSSO

    3. Per IdentityProviderSAMLMetadataDocument, devi formattare il file XML dei metadati SAML come una singola riga prima di incollarlo in questo campo. Ciò è necessario perché la CloudFormation console richiede che il contenuto XML venga formattato come una singola riga quando viene passato attraverso i parametri della console.

      Usa il seguente comando Python per riformattare il tuo file XML:

      python3 -c "import sys, re; content=open(sys.argv[1]).read(); print(re.sub(r'>\s+<', '><', content.replace('\n', '').replace('\r', '').strip()))" saml-metadata.xml
      Nota

      Il documento di metadati SAML dell’IdP deve essere formattato come una singola riga per poter essere utilizzato come parametro nella console. Il comando Python rimuove le interruzioni di riga e gli spazi bianchi aggiuntivi per creare il formato richiesto, mantenendo però intatti tutti i contenuti e la struttura originali.

      Copia l'output dal comando Python e incollalo nel campo IdentityProviderSAMLMetadataDocumento.

      Esempio di documento di metadati SAML formattato (abbreviato):

      <?xml version="1.0" encoding="UTF-8"?><md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://portal.sso.example.com/saml/assertion/CompanyIdP"><md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"><md:KeyDescriptor use="signing"><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:X509Data><ds:X509Certificate>MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiIMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV...</ds:X509Certificate></ds:X509Data></ds:KeyInfo></md:KeyDescriptor><md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/logout/CompanyIdP"/><md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat><md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/assertion/CompanyIdP"/></md:IDPSSODescriptor></md:EntityDescriptor>
    4. Infatti RoleName, puoi lasciare vuoto questo campo per generare automaticamente un nome basato sul nome dello stack o inserire un nome personalizzato per il ruolo IAM federato.

      Esempio: SAML-Developer-Access o SAML-ReadOnly-Role

    5. Per gli altri parametri, accetta i valori predefiniti o inseriscine altri in base ai tuoi requisiti:

      • IdentityProviderAddPrivateKey- Chiave privata opzionale per decrittografare le asserzioni SAML

      • IdentityProviderAssertionEncryptionMode- Modalità di crittografia per le asserzioni SAML

        Valori di esempio: Allowed, Required o lasciare vuoto per non utilizzare alcuna crittografia

      • RoleSessionDuration- Durata massima della sessione in secondi (3600-43200, impostazione predefinita 7200)

        Esempio: 14400 (4 ore)

      • RolePermissionsBoundary- ARN opzionale di una politica sui limiti delle autorizzazioni

        Ad esempio: arn:aws:iam::123456789012:policy/DeveloperBoundary

      • RolePath- Percorso per il ruolo IAM (l'impostazione predefinita è/)

        Ad esempio: /saml-roles/

      • RoleManagedPolicy1-5 - Possibilità ARNs di allegare un massimo di 5 policy gestite

        Esempio per RoleManagedPolicy 1: arn:aws:iam::aws:policy/ReadOnlyAccess

        Esempio per RoleManagedPolicy 2: arn:aws:iam::123456789012:policy/CustomPolicy

    6. Scegli Next (Successivo).

  5. Configura le opzioni dello stack:

    1. In Opzioni di errore dello stack, scegli Elimina tutte le nuove risorse create.

      Nota

      Scegliendo questa opzione si evita di ricevere addebiti per risorse la cui policy di eliminazione specifica che devono essere mantenute anche se la creazione dello stack non riesce.

    2. Accetta tutti gli altri valori predefiniti.

    3. In Capacità, seleziona la casella per confermare che CloudFormation potresti creare risorse IAM nel tuo account.

    4. Scegli Next (Successivo).

  6. Rivedi i dettagli dello stack e scegli Invia.

CloudFormation crea lo stack. Una volta completata la creazione dello stack, le relative risorse sono pronte per l’uso. Puoi utilizzare la scheda Risorse nella pagina dei dettagli dello stack per visualizzare le risorse che sono state fornite nel tuo account.

Lo stack produrrà i seguenti valori, che puoi visualizzare nella scheda Output:

  • RoleARN: l’ARN del ruolo IAM creato (ad esempio, arn:aws:iam::123456789012:role/SAML-Developer-Access o arn:aws:iam::123456789012:role/stack-name-a1b2c3d4 se si utilizza un nome generato automaticamente).

  • IdentityProviderARN: l'ARN dell'IdP SAML creato (ad esempio,). arn:aws:iam::123456789012:saml-provider/CompanyIdP

Avrai bisogno di entrambi questi elementi per configurare ARNs il tuo IdP per inviare gli attributi SAML appropriati per l'assunzione del ruolo.

Test della federazione SAML

Una volta che sono stati creati il ruolo federato e l’IdP SAML, puoi testare l’impostazione della federazione.

  1. Aprire la console IAM all'indirizzo https://console.aws.amazon.com/iam/.

  2. Nel pannello di navigazione, scegli Identity providers (Provider di identità).

    L’elenco dovrebbe mostrare l’IdP SAML appena creato.

  3. Scegli il nome dell’IdP per visualizzarne i dettagli.

    Nella pagina dei dettagli dell’IdP, puoi vedere il documento di metadati SAML e altri dettagli di configurazione.

  4. Nel riquadro di navigazione, seleziona Ruoli.

  5. Trova e scegli il ruolo federato appena creato.

    Nella pagina dei dettagli del ruolo, puoi vedere la policy di attendibilità che consente all’IdP SAML di assumere questo ruolo.

  6. Scegli la scheda Relazioni di attendibilità per rivedere la policy di attendibilità.

    La policy di attendibilità dovrebbe mostrare che l’IdP SAML è affidabile per assumere questo ruolo a condizione che il pubblico SAML (SAML:aud) corrisponda a https://signin.aws.amazon.com/saml.

Pulizia: eliminazione delle risorse

Come passaggio finale, eliminerai lo stack e le risorse in esso contenute.

  1. Apri la console. CloudFormation

  2. Nella pagina Stack, scegli lo stack creato dal modello, poi scegli Elimina, quindi conferma con Elimina.

    CloudFormation avvia l'eliminazione dello stack e di tutte le risorse che include.

CloudFormation dettagli del modello

Resources

Il CloudFormation modello di questo tutorial creerà le seguenti risorse nel tuo account:

  • AWS::IAM::SAMLProvider: un IdP SAML che stabilisce un rapporto di fiducia AWS tra e il tuo IdP esterno.

  • AWS::IAM::Role: un ruolo IAM federato che può essere assunto dagli utenti autenticati tramite l’IdP SAML.

Configurazione

Il modello include i seguenti parametri configurabili:

  • IdentityProviderName- Nome dell'IdP SAML (lascia vuoto il nome generato automaticamente)

  • IdentityProviderSAMLMetadataDocumento: documento di metadati SAML del tuo IdP (richiesto)

  • IdentityProviderAddPrivateKey- Chiave privata opzionale per decrittografare le asserzioni SAML

  • IdentityProviderAssertionEncryptionMode- Modalità di crittografia per le asserzioni SAML

  • RoleName- Nome del ruolo IAM (lasciare vuoto il nome generato automaticamente)

  • RolePath- Percorso per il ruolo IAM (predefinito/)

  • RolePermissionsBoundary- ARN opzionale della politica dei limiti delle autorizzazioni

  • RoleSessionDuration- Durata massima della sessione in secondi (3600-43200, impostazione predefinita 7200)

  • RoleManagedPolicy1-5 - Possibilità di allegare fino a 5 ARNs policy gestite

CloudFormation modello

Salva il seguente codice JSON o YAML come file separato da utilizzare come CloudFormation modello per questo tutorial.

JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "[AWSDocs] IAM: tutorial_saml-idp-and-federated-role", "Parameters": { "IdentityProviderName": { "Type": "String", "Description": "Name of the SAML Identity Provider (leave empty for auto-generated name like '{StackName}-{UniqueId}')", "Default": "", "AllowedPattern": "^$|^[a-zA-Z0-9._-]+$", "ConstraintDescription": "Must be empty or contain only alphanumeric characters, periods, underscores, and hyphens" }, "IdentityProviderSAMLMetadataDocument": { "Type": "String", "Description": "SAML metadata document from identity provider" }, "IdentityProviderAddPrivateKey": { "Type": "String", "Description": "Optional private key for decrypting SAML assertions. The private key must be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML assertions.", "Default": "" }, "IdentityProviderAssertionEncryptionMode": { "Type": "String", "Description": "Optional, sets encryption mode for SAML assertions", "Default": "", "AllowedValues": ["", "Allowed", "Required"] }, "RoleName": { "Type": "String", "Description": "Name of the IAM Role (leave empty for auto-generated name like '{StackName}-{UniqueId}')", "Default": "", "AllowedPattern": "^$|^[\\w+=,.@-]{1,64}$", "ConstraintDescription": "Must be empty or 1-64 characters and can contain alphanumeric characters and +=,.@-" }, "RolePath": { "Type": "String", "Description": "Path for the IAM Role", "AllowedPattern": "(^\\/$)|(^\\/.*\\/$)", "Default": "/" }, "RolePermissionsBoundary": { "Type": "String", "Description": "Optional ARN of the permissions boundary policy (leave empty for none)", "Default": "" }, "RoleSessionDuration": { "Description": "The maximum session duration (in seconds) that you want to set for the specified role (3600-43200)", "Type": "Number", "MinValue": 3600, "MaxValue": 43200, "Default": 7200 }, "RoleManagedPolicy1": { "Type": "String", "Description": "Optional managed policy ARN 1", "Default": "" }, "RoleManagedPolicy2": { "Type": "String", "Description": "Optional managed policy ARN 2", "Default": "" }, "RoleManagedPolicy3": { "Type": "String", "Description": "Optional managed policy ARN 3", "Default": "" }, "RoleManagedPolicy4": { "Type": "String", "Description": "Optional managed policy ARN 4", "Default": "" }, "RoleManagedPolicy5": { "Type": "String", "Description": "Optional managed policy ARN 5", "Default": "" } }, "Conditions": { "HasCustomProviderName": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderName"}, ""]}]}, "HasCustomRoleName": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleName"}, ""]}]}, "HasPermissionsBoundary": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RolePermissionsBoundary"}, ""]}]}, "HasPolicy1": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy1"}, ""]}]}, "HasPolicy2": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy2"}, ""]}]}, "HasPolicy3": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy3"}, ""]}]}, "HasPolicy4": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy4"}, ""]}]}, "HasPolicy5": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy5"}, ""]}]}, "HasPrivateKey": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAddPrivateKey"}, ""]}]}, "HasAssertionEncryptionMode": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAssertionEncryptionMode"}, ""]}]} }, "Resources": { "SAMLProvider": { "Type": "AWS::IAM::SAMLProvider", "Properties": { "Name": {"Fn::If": ["HasCustomProviderName", {"Ref": "IdentityProviderName"}, {"Ref": "AWS::NoValue"}]}, "SamlMetadataDocument": {"Ref": "IdentityProviderSAMLMetadataDocument"}, "AddPrivateKey": {"Fn::If": ["HasPrivateKey", {"Ref": "IdentityProviderAddPrivateKey"}, {"Ref": "AWS::NoValue"}]}, "AssertionEncryptionMode": {"Fn::If": ["HasAssertionEncryptionMode", {"Ref": "IdentityProviderAssertionEncryptionMode"}, {"Ref": "AWS::NoValue"}]} } }, "SAMLFederatedRole": { "Type": "AWS::IAM::Role", "Properties": { "RoleName": {"Fn::If": ["HasCustomRoleName", {"Ref": "RoleName"}, {"Ref": "AWS::NoValue"}]}, "Path": {"Ref": "RolePath"}, "Description": "SAML federated IAM role for SSO access with specified permissions", "MaxSessionDuration": {"Ref": "RoleSessionDuration"}, "PermissionsBoundary": {"Fn::If": ["HasPermissionsBoundary", {"Ref": "RolePermissionsBoundary"}, {"Ref": "AWS::NoValue"}]}, "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": {"Ref": "SAMLProvider"} }, "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity", "sts:TagSession" ], "Condition": { "StringEquals": { "SAML:aud": "https://signin.aws.amazon.com/saml" } } } ] }, "ManagedPolicyArns": { "Fn::Split": [ ",", { "Fn::Join": [ ",", [ {"Fn::If": ["HasPolicy1", {"Ref": "RoleManagedPolicy1"}, {"Ref": "AWS::NoValue"}]}, {"Fn::If": ["HasPolicy2", {"Ref": "RoleManagedPolicy2"}, {"Ref": "AWS::NoValue"}]}, {"Fn::If": ["HasPolicy3", {"Ref": "RoleManagedPolicy3"}, {"Ref": "AWS::NoValue"}]}, {"Fn::If": ["HasPolicy4", {"Ref": "RoleManagedPolicy4"}, {"Ref": "AWS::NoValue"}]}, {"Fn::If": ["HasPolicy5", {"Ref": "RoleManagedPolicy5"}, {"Ref": "AWS::NoValue"}]} ] ] } ] } } } }, "Outputs": { "RoleARN": { "Description": "ARN of the created IAM Role", "Value": {"Fn::GetAtt": ["SAMLFederatedRole", "Arn"]}, "Export": { "Name": {"Fn::Sub": "${AWS::StackName}-RoleARN"} } }, "IdentityProviderARN": { "Description": "ARN of the created SAML Identity Provider", "Value": {"Ref": "SAMLProvider"}, "Export": { "Name": {"Fn::Sub": "${AWS::StackName}-IdentityProviderARN"} } } } }
YAML
AWSTemplateFormatVersion: '2010-09-09' Description: '[AWSDocs] IAM: tutorial_saml-idp-and-federated-role' Parameters: IdentityProviderName: Type: String Description: Name of the SAML Identity Provider (leave empty for auto-generated name like '{StackName}-{UniqueId}') Default: "" AllowedPattern: '^$|^[a-zA-Z0-9._-]+$' ConstraintDescription: Must be empty or contain only alphanumeric characters, periods, underscores, and hyphens IdentityProviderSAMLMetadataDocument: Type: String Description: SAML metadata document from identity provider IdentityProviderAddPrivateKey: Type: String Description: Optional private key for decrypting SAML assertions. The private key must be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML assertions. Default: "" IdentityProviderAssertionEncryptionMode: Type: String Description: Optional, sets encryption mode for SAML assertions Default: "" AllowedValues: - "" - "Allowed" - "Required" RoleName: Type: String Description: Name of the IAM Role (leave empty for auto-generated name like '{StackName}-{UniqueId}') Default: "" AllowedPattern: '^$|^[\w+=,.@-]{1,64}$' ConstraintDescription: "Must be empty or 1-64 characters and can contain alphanumeric characters and +=,.@-" RolePath: Type: String Description: Path for the IAM Role AllowedPattern: (^\/$)|(^\/.*\/$) Default: "/" RolePermissionsBoundary: Type: String Description: Optional ARN of the permissions boundary policy (leave empty for none) Default: "" RoleSessionDuration: Description: The maximum session duration (in seconds) that you want to set for the specified role (3600-43200) Type: Number MinValue: 3600 MaxValue: 43200 Default: 7200 RoleManagedPolicy1: Type: String Description: Optional managed policy ARN 1 Default: "" RoleManagedPolicy2: Type: String Description: Optional managed policy ARN 2 Default: "" RoleManagedPolicy3: Type: String Description: Optional managed policy ARN 3 Default: "" RoleManagedPolicy4: Type: String Description: Optional managed policy ARN 4 Default: "" RoleManagedPolicy5: Type: String Description: Optional managed policy ARN 5 Default: "" Conditions: HasCustomProviderName: !Not [!Equals [!Ref IdentityProviderName, ""]] HasCustomRoleName: !Not [!Equals [!Ref RoleName, ""]] HasPermissionsBoundary: !Not [!Equals [!Ref RolePermissionsBoundary, ""]] HasPolicy1: !Not [!Equals [!Ref RoleManagedPolicy1, ""]] HasPolicy2: !Not [!Equals [!Ref RoleManagedPolicy2, ""]] HasPolicy3: !Not [!Equals [!Ref RoleManagedPolicy3, ""]] HasPolicy4: !Not [!Equals [!Ref RoleManagedPolicy4, ""]] HasPolicy5: !Not [!Equals [!Ref RoleManagedPolicy5, ""]] HasPrivateKey: !Not [!Equals [!Ref IdentityProviderAddPrivateKey, ""]] HasAssertionEncryptionMode: !Not [!Equals [!Ref IdentityProviderAssertionEncryptionMode, ""]] Resources: SAMLProvider: Type: AWS::IAM::SAMLProvider Properties: Name: !If - HasCustomProviderName - !Ref IdentityProviderName - !Ref AWS::NoValue SamlMetadataDocument: !Ref IdentityProviderSAMLMetadataDocument AddPrivateKey: !If - HasPrivateKey - !Ref IdentityProviderAddPrivateKey - !Ref AWS::NoValue AssertionEncryptionMode: !If - HasAssertionEncryptionMode - !Ref IdentityProviderAssertionEncryptionMode - !Ref AWS::NoValue SAMLFederatedRole: Type: AWS::IAM::Role Properties: RoleName: !If - HasCustomRoleName - !Ref RoleName - !Ref AWS::NoValue Path: !Ref RolePath Description: "SAML federated IAM role for SSO access with specified permissions" MaxSessionDuration: !Ref RoleSessionDuration PermissionsBoundary: !If - HasPermissionsBoundary - !Ref RolePermissionsBoundary - !Ref AWS::NoValue AssumeRolePolicyDocument: Version: '2012-10-17 ' Statement: - Effect: Allow Principal: Federated: !Ref SAMLProvider Action: - 'sts:AssumeRole' - 'sts:SetSourceIdentity' - 'sts:TagSession' Condition: StringEquals: 'SAML:aud': 'https://signin.aws.amazon.com/saml' ManagedPolicyArns: !Split - ',' - !Join - ',' - - !If [HasPolicy1, !Ref RoleManagedPolicy1, !Ref "AWS::NoValue"] - !If [HasPolicy2, !Ref RoleManagedPolicy2, !Ref "AWS::NoValue"] - !If [HasPolicy3, !Ref RoleManagedPolicy3, !Ref "AWS::NoValue"] - !If [HasPolicy4, !Ref RoleManagedPolicy4, !Ref "AWS::NoValue"] - !If [HasPolicy5, !Ref RoleManagedPolicy5, !Ref "AWS::NoValue"] Outputs: RoleARN: Description: ARN of the created IAM Role Value: !GetAtt SAMLFederatedRole.Arn Export: Name: !Sub '${AWS::StackName}-RoleARN' IdentityProviderARN: Description: ARN of the created SAML Identity Provider Value: !Ref SAMLProvider Export: Name: !Sub '${AWS::StackName}-IdentityProviderARN'