Tutoriel IAM : Utiliser un CloudFormation modèle pour créer un fournisseur d'identité SAML (IdP) - AWS Identity and Access Management

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Tutoriel IAM : Utiliser un CloudFormation modèle pour créer un fournisseur d'identité SAML (IdP)

Pour configurer la fédération SAML pour votre AWS compte, vous devez créer un fournisseur d'identité SAML (IdP). Ce didacticiel explique comment utiliser un CloudFormation modèle pour créer un IdP SAML qui établit la confiance AWS entre et votre IdP externe.

Le modèle crée un IdP SAML configuré avec le document de métadonnées de votre IdP. Les rôles IAM fédérés peuvent ensuite référencer cet IdP pour permettre aux utilisateurs authentifiés depuis votre IdP externe d'accéder aux ressources. AWS

La ressource déployée consiste en un IdP SAML configuré avec le document de métadonnées de votre IdP et des paramètres de chiffrement facultatifs.

Conditions préalables

Le didacticiel présume que vous avez déjà ce qui suit en place :

  • Python 3.6 ou version ultérieure installée sur votre ordinateur local pour exécuter la commande Python utilisée dans ce didacticiel afin de formater le fichier XML des métadonnées SAML de votre IdP.

  • Un document de métadonnées SAML provenant de votre IdP externe enregistré sous forme de fichier XML.

Créez un IdP SAML en utilisant CloudFormation

Pour créer l'IdP SAML, vous allez créer CloudFormation un modèle et l'utiliser pour créer une pile contenant la ressource IdP.

Création du modèle

Créez d'abord le CloudFormation modèle.

  1. Dans la section Modèle, cliquez sur l’icône de copie dans l’onglet JSON ou YAML pour copier le contenu du modèle.

  2. Copiez le contenu du modèle dans un nouveau fichier.

  3. Enregistrez le fichier au niveau local.

Créez la pile .

Ensuite, utilisez le modèle que vous avez enregistré pour approvisionner une CloudFormation pile.

  1. Ouvrez la CloudFormation console à l'adresse https://console.aws.amazon.com/cloudformation.

  2. Sur la page Piles, dans le menu Créer une pile, choisissez Avec de nouvelles ressources (standard).

  3. Spécifiez un modèle :

    1. Sous Prérequis, choisissez Choisir un modèle existant.

    2. Sous Spécifier le modèle, sélectionnez Charger un modèle de fichier.

    3. Choisissez Choisir un fichier, accédez au fichier du modèle, puis sélectionnez-le.

    4. Choisissez Suivant.

  4. Spécifiez les détails de la pile suivants :

    1. Saisissez le nom de la pile.

    2. En IdentityProviderNameeffet, vous pouvez laisser ce champ vide pour générer automatiquement un nom basé sur le nom de la pile, ou saisir un nom personnalisé pour votre IdP SAML. Les noms personnalisés doivent contenir uniquement des caractères alphanumériques, des points, des traits de soulignement et des tirets.

    3. Pour IdentityProviderSAMLMetadataDocument, vous devez formater votre fichier XML de métadonnées SAML sur une seule ligne avant de le coller dans ce champ. Cela est nécessaire car la CloudFormation console exige que le contenu XML soit formaté sur une seule ligne lorsqu'il est transmis via les paramètres de la console.

      Utilisez la commande Python suivante pour reformater votre fichier 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
      Note

      Le document de métadonnées SAML de l’IdP doit être formaté en une seule ligne pour la saisie des paramètres de la console. La commande Python supprime les sauts de ligne et les espaces supplémentaires afin de créer le format requis tout en conservant l’intégralité du contenu et de la structure d’origine.

      Copiez le résultat de la commande Python et collez-le dans le champ IdentityProviderSAMLMetadataDocument.

      Exemple de document de métadonnées SAML formaté (abrégé) :

      <?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. Pour les autres paramètres, acceptez les valeurs par défaut ou saisissez les vôtres en fonction de vos besoins :

      • IdentityProviderAddPrivateKey- Clé privée optionnelle pour déchiffrer les assertions SAML

      • IdentityProviderAssertionEncryptionMode- Facultatif, définit le mode de chiffrement pour les assertions SAML (autorisé, obligatoire ou vide)

    5. Choisissez Suivant.

  5. Configurez les options de pile :

    1. Sous Options d’échec de pile, choisissez Supprimer toutes les ressources nouvellement créées.

      Note

      Le choix de cette option vous évite d’être facturé pour des ressources dont la politique de suppression indique qu’elles doivent être conservées même en cas d’échec de la création de la pile.

    2. Acceptez toutes les autres valeurs par défaut.

    3. Sous Fonctionnalités, cochez la case pour confirmer que des ressources IAM CloudFormation peuvent être créées dans votre compte.

    4. Choisissez Suivant.

  6. Vérifiez les détails de la pile et choisissez Envoyer.

CloudFormation crée la pile. Une fois la création de la pile terminée, les ressources de la pile sont prêtes à être utilisées. Vous pouvez utiliser l’onglet Ressources de la page détaillée de la pile pour afficher les ressources provisionnées dans votre compte.

La pile produira les valeurs suivantes, que vous pouvez consulter dans l’onglet Sorties :

  • ProviderARN : l’ARN de l’IdP SAML créé (par exemple, arn:aws:iam::123456789012:saml-provider/CompanyIdP). Vous aurez besoin de cet ARN pour créer des rôles qui font confiance à ce fournisseur.

  • ProviderName: nom de l'IdP SAML créé (par exempleCompanyIdP, si vous avez spécifié un nom personnalisé my-saml-stack-saml-provider ou si vous avez utilisé le nom par défaut).

Ces sorties sont également exportées, ce qui permet à d’autres piles CloudFormation de les importer à l’aide de la fonction Fn::ImportValue.

Vérifier l’IdP SAML

Une fois l’IdP SAML créé, vous pouvez vérifier sa configuration et noter son ARN pour l’utiliser avec les rôles fédérés.

  1. Ouvrez la console IAM à l’adresse https://console.aws.amazon.com/iam/.

  2. Dans le panneau de navigation, sélectionnez Identity providers (Fournisseurs d'identité).

    Vous devez voir votre IdP SAML nouvellement créé dans la liste.

  3. Choisissez le nom de l’IdP pour en afficher les détails.

    Sur la page de détails de l’IdP, vous pouvez consulter le document de métadonnées SAML et d’autres détails de configuration.

  4. Notez l’ARN du fournisseur affiché sur la page de détails.

    Vous aurez besoin de cet ARN pour créer des rôles IAM fédérés qui font confiance à cet IdP.

  5. Vérifiez le document de métadonnées pour vous assurer qu’il correspond à ce que vous avez fourni à partir de votre IdP externe.

Votre IdP SAML est désormais prêt à être utilisé par les rôles IAM fédérés. Vous pouvez créer des rôles qui font confiance à cet IdP afin de permettre aux utilisateurs authentifiés de votre IdP externe d'assumer ces rôles et d'accéder aux ressources. AWS

Nettoyage : supprimez les ressources

Enfin, vous allez supprimer la pile et les ressources qu’elle contient.

  1. Ouvrez la CloudFormation console.

  2. Sur la page Piles, choisissez la pile créée à partir du modèle, choisissez Supprimer, puis confirmez Supprimer.

    CloudFormation initie la suppression de la pile et de toutes les ressources qu'elle contient.

CloudFormation détails du modèle

Ressources

Le CloudFormation modèle de ce didacticiel créera la ressource suivante dans votre compte :

AWS::IAM::SAMLProvider: un IdP SAML qui établit la confiance AWS entre et votre IdP externe.

Configuration

Le modèle comprend les paramètres configurables suivants :

  • IdentityProviderName- Le nom de votre IdP SAML (laissez le champ vide pour le nom généré automatiquement)

    Exemple : CompanyIdP ou EnterpriseSSO

  • IdentityProviderSAMLMetadataDocument - Le document de métadonnées SAML de votre IdP externe (formaté sur une seule ligne)

  • IdentityProviderAddPrivateKey- Clé privée optionnelle pour déchiffrer les assertions SAML

  • IdentityProviderAssertionEncryptionMode- Facultatif, définit le mode de chiffrement pour les assertions SAML

CloudFormation modèle

Enregistrez le code JSON ou YAML suivant dans un fichier distinct à utiliser comme CloudFormation modèle pour ce didacticiel.

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'