

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: usa un CloudFormation modello per creare un SAML Identity Provider (IdP)
<a name="tutorial_saml-idp"></a>

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

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, crea un CloudFormation modello e utilizzalo 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 [Modello](#tutorial_saml-idp-template) sezione, scegli l'icona di copia nella ** scheda ** JSON ** o ** YAML per copiare il contenuto 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 eseguire il provisioning di uno stack. CloudFormation 

1. Apri la CloudFormation console all'indirizzo [ 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. Puoi lasciare questo campo vuoto per ** IdentityProviderName ** generare automaticamente un nome in base al 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 di 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 del comando Python e incollalo nel ** IdentityProviderSAMLMetadataDocument ** campo.

      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 decrittografare 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 ** Capacità**, seleziona la casella per confermare che ciò CloudFormation potrebbe 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 risorse dello stack 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 o `my-saml-stack-saml-provider` se hai utilizzato il nome predefinito).

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>

Dopo aver creato l'IdP SAML, puoi verificarne la configurazione e annotare il 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. Rivedi il documento di metadati per assicurarti che corrisponda a quanto fornito dal tuo IdP esterno.

Il tuo IdP SAML è ora pronto per essere utilizzato dai ruoli IAM federati. Puoi creare ruoli che considerino attendibile 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 per questo tutorial creerà la seguente risorsa nel tuo account:

[`AWS::IAM::SAMLProvider`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html): un IdP SAML che stabilisce la fiducia tra AWS 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 campo per il nome generato automaticamente)

  Esempio: `CompanyIdP` o `EnterpriseSSO`
+ **IdentityProviderSAMLMetadataDocument**- Il documento di metadati SAML del tuo IdP esterno (formattato come riga singola)
+ **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'
```

------