

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)
<a name="tutorial_saml-idp"></a>

Per configurare la federazione SAML per il tuo AWS account, devi creare un provider di identità SAML (IdP). Questo tutorial mostra come utilizzare un CloudFormation modello per creare un IdP SAML che stabilisca la fiducia AWS tra e il tuo IdP esterno.

Il modello crea un IdP SAML configurato con il documento di metadati dell’IdP. I ruoli IAM federati possono quindi fare riferimento a questo IdP per consentire agli utenti autenticati del tuo IdP esterno di accedere alle risorse. AWS 

La risorsa implementata è costituita da un IdP SAML configurato con il documento di metadati del tuo IdP e impostazioni di crittografia facoltative.

## Prerequisiti
<a name="tutorial_saml-idp-prereqs"></a>

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 SAML utilizzando CloudFormation
<a name="tutorial_saml-idp-create"></a>

Per creare l'IdP SAML, creerai CloudFormation un modello e lo utilizzerai per creare uno stack contenente la risorsa IdP.

### Creazione del modello
<a name="tutorial_saml-idp-file"></a>

Innanzitutto, crea il modello. CloudFormation 

1. Nella sezione [Modello](#tutorial_saml-idp-template), fai clic sull’icona di copia nella scheda **JSON** o **YAML** per copiare i contenuti del modello.

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

1. Salva il file localmente.

### Creazione dello stack
<a name="tutorial_saml-idp-stack"></a>

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.](https://console.aws.amazon.com/cloudformation/)

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

1. Specifica il modello:

   1. In **Prerequisito**, seleziona **Scegli un modello esistente**.

   1. In **Specifica modello**, seleziona **Carica un file di modello**.

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

   1. Scegli **Next (Successivo)**.

1. Specifica i seguenti dettagli dello stack:

   1. Inserisci un nome dello stack.

   1. 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. I nomi personalizzati devono contenere solo caratteri alfanumerici, punti, trattini bassi e trattini.

   1. 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>
      ```

   1. Per gli altri parametri, accetta i valori predefiniti o inseriscine altri in base ai tuoi requisiti:
      + **IdentityProviderAddPrivateKey**- Chiave privata opzionale per decifrare le asserzioni SAML
      + **IdentityProviderAssertionEncryptionMode**- Facoltativo, imposta la modalità di crittografia per le asserzioni SAML (consentita, obbligatoria o vuota)

   1. Scegli **Next (Successivo)**.

1. 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.

   1. Accetta tutti gli altri valori predefiniti.

   1. In **Funzionalità**, seleziona la casella per confermare che CloudFormation potresti creare risorse IAM nel tuo account.

   1. Scegli **Next (Successivo)**.

1. 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**:
+ **ProviderARN**: l’ARN dell’IdP SAML creato (ad esempio, `arn:aws:iam::123456789012:saml-provider/CompanyIdP`). Avrai bisogno di questo ARN per creare ruoli che considerano attendibile questo provider.
+ **ProviderName**: il nome dell'IdP SAML creato (ad esempio`CompanyIdP`, se hai specificato un nome personalizzato `my-saml-stack-saml-provider` o se hai utilizzato la denominazione predefinita).

Questi output vengono anche esportati, consentendone l’importazione da altri stack CloudFormation utilizzando la funzione `Fn::ImportValue`.

## Verifica dell’IdP SAML
<a name="tutorial_saml-idp-using"></a>

Una volta che l’IdP SAML è stato creato, puoi verificarne la configurazione e prendere nota del relativo ARN da utilizzare con i ruoli federati.

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

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

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

1. 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.

1. Prendi nota del **Provider ARN** visualizzato nella pagina dei dettagli.

   Avrai bisogno di questo ARN per creare ruoli IAM federati che ritengono attendibile questo IdP.

1. Esamina il documento di metadati per assicurarti che corrisponda a quello che hai fornito dal tuo IdP esterno.

Il tuo IdP SAML è ora pronto per essere utilizzato dai ruoli IAM federati. Puoi creare ruoli che si fidano di questo IdP per consentire agli utenti autenticati del tuo IdP esterno di assumere tali ruoli e accedere alle risorse. AWS 

## Pulizia: eliminazione delle risorse
<a name="tutorial_saml-idp-delete"></a>

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

1. Apri la console. CloudFormation 

1. 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
<a name="tutorial_saml-idp-template-details"></a>

### Resources
<a name="tutorial_saml-idp-template-resources"></a>

Il CloudFormation modello di questo tutorial creerà la seguente risorsa nel tuo account:

[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html): un IdP SAML che stabilisce un rapporto di fiducia AWS tra e il tuo IdP esterno.

### Configurazione
<a name="tutorial_saml-idp-template-config"></a>

Il modello include i seguenti parametri configurabili:
+ **IdentityProviderName**- Il nome del tuo IdP SAML (lascia vuoto il nome generato automaticamente)

  Esempio: `CompanyIdP` o `EnterpriseSSO`
+ **IdentityProviderSAMLMetadataDocumento: il documento** di metadati SAML del tuo IdP esterno (formattato come una singola riga)
+ **IdentityProviderAddPrivateKey**- Chiave privata opzionale per decrittografare le asserzioni SAML
+ **IdentityProviderAssertionEncryptionMode**- Facoltativo, imposta la modalità di crittografia per le asserzioni SAML

## CloudFormation modello
<a name="tutorial_saml-idp-template"></a>

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",
  "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"]
    }
  },
  "Conditions": {
    "HasPrivateKey": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAddPrivateKey"}, ""]}]},
    "HasEncryptionMode": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAssertionEncryptionMode"}, ""]}]},
    "HasCustomName": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderName"}, ""]}]}
  },
  "Resources": {
    "SAMLProvider": {
      "Type": "AWS::IAM::SAMLProvider",
      "Properties": {
        "Name": {"Fn::If": ["HasCustomName", {"Ref": "IdentityProviderName"}, {"Ref": "AWS::NoValue"}]},
        "SamlMetadataDocument": {"Ref": "IdentityProviderSAMLMetadataDocument"},
        "Tags": [
          {
            "Key": "Name",
            "Value": {"Fn::If": ["HasCustomName", {"Ref": "IdentityProviderName"}, {"Fn::Sub": "${AWS::StackName}-saml-provider"}]}
          }
        ],
        "AddPrivateKey": {"Fn::If": ["HasPrivateKey", {"Ref": "IdentityProviderAddPrivateKey"}, {"Ref": "AWS::NoValue"}]},
        "AssertionEncryptionMode": {"Fn::If": ["HasEncryptionMode", {"Ref": "IdentityProviderAssertionEncryptionMode"}, {"Ref": "AWS::NoValue"}]}
      }
    }
  },
  "Outputs": {
    "ProviderARN": {
      "Description": "ARN of the created SAML Identity Provider",
      "Value": {"Ref": "SAMLProvider"},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-ProviderARN"}
      }
    },
    "ProviderName": {
      "Description": "Name of the SAML Identity Provider",
      "Value": {"Fn::If": ["HasCustomName", {"Ref": "IdentityProviderName"}, {"Fn::Sub": "${AWS::StackName}-saml-provider"}]},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-ProviderName"}
      }
    }
  }
}
```

------
#### [ YAML ]

```
AWSTemplateFormatVersion: '2010-09-09'
Description: '[AWSDocs] IAM: tutorial_saml-idp'

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"

Conditions:
  HasPrivateKey: !Not [!Equals [!Ref IdentityProviderAddPrivateKey, ""]]
  HasEncryptionMode: !Not [!Equals [!Ref IdentityProviderAssertionEncryptionMode, ""]]
  HasCustomName: !Not [!Equals [!Ref IdentityProviderName, ""]]

Resources:
  SAMLProvider:
    Type: 'AWS::IAM::SAMLProvider'
    Properties:
      Name: !If
        - HasCustomName
        - !Ref IdentityProviderName
        - !Ref AWS::NoValue
      SamlMetadataDocument: !Ref IdentityProviderSAMLMetadataDocument
      Tags:
        - Key: Name
          Value: !If
            - HasCustomName
            - !Ref IdentityProviderName
            - !Sub '${AWS::StackName}-saml-provider'
      AddPrivateKey: !If
        - HasPrivateKey
        - !Ref IdentityProviderAddPrivateKey
        - !Ref AWS::NoValue
      AssertionEncryptionMode: !If
        - HasEncryptionMode
        - !Ref IdentityProviderAssertionEncryptionMode
        - !Ref AWS::NoValue

Outputs:
  ProviderARN:
    Description: 'ARN of the created SAML Identity Provider'
    Value: !Ref SAMLProvider
    Export:
      Name: !Sub '${AWS::StackName}-ProviderARN'
  
  ProviderName:
    Description: 'Name of the SAML Identity Provider'
    Value: !If
      - HasCustomName
      - !Ref IdentityProviderName
      - !Sub '${AWS::StackName}-saml-provider'
    Export:
      Name: !Sub '${AWS::StackName}-ProviderName'
```

------