Tutorial de IAM: use una plantilla de AWS CloudFormation para crear un rol de IAM federado de SAML - AWS Identity and Access Management

Tutorial de IAM: use una plantilla de AWS CloudFormation para crear un rol de IAM federado de SAML

Si tiene un proveedor de identidades (IdP) de SAML existente configurado en su cuenta de AWS, puede crear funciones de IAM federadas que confíen en ese IdP. En este tutorial, se muestra cómo usar una plantilla de AWS CloudFormation para crear un rol de IAM federado de SAML que puedan asumir los usuarios autenticados a través de su IdP externo.

La plantilla crea un rol de IAM federado con una política de confianza que permite que el IdP de SAML asuma el rol. Los usuarios autenticados por su IdP externo pueden asumir este rol para acceder a los recursos de AWS en función de los permisos que están adjuntos al rol.

El recurso desplegado consta de los siguientes elementos:

  • Un rol de IAM federado que confía en su IdP de SAML existente.

  • Políticas administradas configurables que se pueden adjuntar al rol para conceder permisos específicos.

  • Configuraciones opcionales de límite de permisos y duración de las sesiones.

Requisitos previos

En este tutorial se presupone que los elementos siguientes ya existen:

Crear un rol federado de SAML con AWS CloudFormation

Para crear el rol federado de SAML, debe crear una plantilla de CloudFormation y utilizarla para crear una pila que contenga el rol.

Crear la plantilla

Primero, cree la plantilla de CloudFormation.

  1. En la sección Plantilla, haga clic en el icono de copia de la pestaña JSON o YAML para copiar el contenido de la plantilla.

  2. Pegue el contenido de la plantilla en un archivo nuevo.

  3. Guarde el archivo localmente.

Creación de la pila

A continuación, utilice la plantilla que creó para aprovisionar una pila de CloudFormation.

  1. Abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation.

  2. En la página Pilas, para Crear pila elija Con nuevos recursos (estándar).

  3. En Especificar plantilla:

    1. En Requisito previo, elija Seleccionar una plantilla existente.

    2. En Especificar plantilla, elija Cargar un archivo de plantilla.

    3. Seleccione Elegir archivo para navegar hasta el archivo y seleccionarlo.

    4. Elija Siguiente.

  4. Especifique los siguientes detalles de la pila:

    1. Introduzca un nombre de pila.

    2. Para SAMLProviderARN, introduzca el ARN de su IdP de SAML existente. Debe estar en el formato arn:aws:iam::123456789012:saml-provider/YourProviderName.

      Ejemplo: arn:aws:iam::123456789012:saml-provider/CompanyIdP

      nota

      Si creó su IdP de SAML con el tutorial de Tutorial de IAM: use una plantilla de AWS CloudFormation para crear un proveedor de identidades (IdP) de SAML, puede encontrar el ARN del proveedor en la pestaña de resultados de esa pila de CloudFormation.

    3. Para RoleName, puede dejar este campo vacío para generar automáticamente un nombre basado en el nombre de la pila o introducir un nombre personalizado para el rol de IAM.

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

    4. Para otros parámetros, acepte los valores predeterminados o introduzca los propios en función de sus requisitos:

      • RoleSessionDuration: duración máxima de la sesión en segundos (3600-43 200, el valor predeterminado es 7200)

        Ejemplo: 14400 (4 horas)

      • RolePermissionsBoundary: ARN opcional de una política de límite de permisos

        Ejemplo: arn:aws:iam::123456789012:policy/DeveloperBoundary

      • RolePath: ruta para el rol de IAM (el valor predeterminado es /)

        Ejemplo: /saml-roles/

      • ManagedPolicy1-5: se pueden adjuntar ARN opcionales de hasta 5 políticas administradas

        Ejemplo de ManagedPolicy1: arn:aws:iam::aws:policy/ReadOnlyAccess

        Ejemplo de ManagedPolicy2: arn:aws:iam::123456789012:policy/CustomPolicy

    5. Elija Siguiente.

  5. Configure las opciones la pila:

    1. En las opciones de error de pila, seleccione Eliminar todos los recursos recién creados.

      nota

      Si elige esta opción, evita que se le facturen los recursos cuya política de eliminación especifique que se conservarán incluso si se produce un error durante la creación de la pila.

    2. Acepte todos los demás valores predeterminados.

    3. En Capacidades, seleccione la casilla para aceptar que CloudFormation puede crear recursos de IAM en su cuenta.

    4. Elija Siguiente.

  6. Revise los detalles de la pila y elija Enviar.

AWS CloudFormation crea el stack. Una vez completada la creación de la pila, los recursos de la pila están listos para usarse. Puede usar la pestaña Recursos de la página de detalles de la pila para ver los recursos que se aprovisionaron en su cuenta.

La pila generará el siguiente valor, que puede ver en la pestaña Resultados:

  • RoleARN: el ARN del rol de IAM creado (por ejemplo, arn:aws:iam::123456789012:role/SAML-Developer-Access o arn:aws:iam::123456789012:role/stack-name-a1b2c3d4 si se utiliza un nombre generado automáticamente).

Necesitará este ARN del rol al configurar su IDP para enviar los atributos de SAML adecuados para la asunción del rol.

Probar el rol federado de SAML

Una vez que se haya creado el rol federado de SAML, puede verificar su configuración y probar la configuración de la federación.

  1. Abra la consola de IAM en https://console.aws.amazon.com/iam/.

  2. Seleccione Roles en el panel de navegación.

  3. Busque y seleccione el rol federado que acaba de crear.

    Si proporcionó un nombre de rol personalizado, búsquelo. Si dejó el parámetro RoleName vacío, el rol tendrá un nombre generado automáticamente que se basa en el nombre de la pila y un identificador único.

  4. Seleccione la pestaña Relaciones de confianza para revisar la política de confianza.

    La política de confianza debe mostrar que se confía en su IdP de SAML para asumir este rol con la condición de que la audiencia de SAML (SAML:aud) coincida con https://signin.aws.amazon.com/saml.

  5. Seleccione la pestaña Permisos para revisar las políticas asociadas.

    Puede ver todas las políticas administradas que se adjuntaron al rol durante su creación.

  6. Anote el ARN de rol que se muestra en la página de resumen del rol.

    Necesitará este ARN para configurar su IdP externo y permitir que los usuarios asuman este rol.

El rol federado de SAML ya está listo para usarse. Configure su IdP externo para incluir el ARN de este rol en las aserciones de SAML, y los usuarios autenticados podrán asumir este rol para acceder a los recursos de AWS.

Limpieza: elimine recursos

Como último paso, eliminará la pila y los recursos que contiene.

  1. Abra la consola de AWS CloudFormation.

  2. En la página Pilas, seleccione la pila creada a partir de la plantilla, seleccione Eliminar y, a continuación, confirme Eliminar.

    CloudFormation inicia la eliminación de la pila y de todos los recursos que incluye.

Detalles de la plantilla de CloudFormation

Recursos

La plantilla de AWS CloudFormation para este tutorial crea el siguiente recurso en su cuenta:

  • AWS::IAM::Role: un rol de IAM federado que pueden asumir los usuarios autenticados a través del IdP de SAML.

Configuración

La plantilla incluye los siguientes parámetros configurables:

  • RoleName: nombre del rol de IAM (déjelo en blanco para que el nombre se genere automáticamente)

  • SAMLProviderARN: ARN del IdP de SAML (obligatorio)

  • RoleSessionDuration: duración máxima de la sesión en segundos (3600-43 200, el valor predeterminado es 7200)

  • RolePermissionsBoundary: ARN opcional de una política de límite de permisos

  • RolePath: ruta para el rol de IAM (el valor predeterminado es /)

  • ManagedPolicy1-5: se pueden adjuntar ARN opcionales de hasta 5 políticas administradas

Plantilla de CloudFormation

Guarde el siguiente código JSON o YAML como un archivo independiente para usarlo como plantilla de CloudFormation en este tutorial.

JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "[AWSDocs] IAM: tutorial_saml-federated-role", "Parameters": { "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 +=,.@-" }, "SAMLProviderARN": { "Type": "String", "Description": "ARN of the SAML Identity Provider", "AllowedPattern": "^arn:aws:iam::\\d{12}:saml-provider/[a-zA-Z0-9._-]+$", "ConstraintDescription": "Must be a valid SAML provider ARN" }, "RoleSessionDuration": { "Type": "Number", "Description": "The maximum session duration (in seconds) that you want to set for the specified role (3600-43200)", "MinValue": 3600, "MaxValue": 43200, "Default": 7200 }, "RolePermissionsBoundary": { "Type": "String", "Description": "Optional ARN of the permissions boundary policy (leave empty for none)", "Default": "" }, "RolePath": { "Type": "String", "Description": "Path for the IAM role (must start and end with /)", "Default": "/", "AllowedPattern": "^\/.*\/$|^\/$", "ConstraintDescription": "Role path must start and end with forward slash (/)" }, "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": { "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"}, ""]}]} }, "Resources": { "SAMLFederatedRole": { "Type": "AWS::IAM::Role", "Properties": { "RoleName": {"Fn::If": ["HasCustomRoleName", {"Ref": "RoleName"}, {"Ref": "AWS::NoValue"}]}, "Description": "IAM role with SAML provider trust", "MaxSessionDuration": {"Ref": "RoleSessionDuration"}, "PermissionsBoundary": {"Fn::If": ["HasPermissionsBoundary", {"Ref": "RolePermissionsBoundary"}, {"Ref": "AWS::NoValue"}]}, "Path": {"Ref": "RolePath"}, "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": {"Ref": "SAMLProviderARN"} }, "Action": "sts:AssumeRoleWithSAML", "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"} } } } }
YAML
AWSTemplateFormatVersion: '2010-09-09' Description: '[AWSDocs] IAM: tutorial_saml-federated-role' Parameters: 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 +=,.@-' SAMLProviderARN: Type: String Description: 'ARN of the SAML Identity Provider' AllowedPattern: '^arn:aws:iam::\d{12}:saml-provider/[a-zA-Z0-9._-]+$' ConstraintDescription: 'Must be a valid SAML provider ARN' RoleSessionDuration: Type: Number Description: 'The maximum session duration (in seconds) that you want to set for the specified role (3600-43200)' MinValue: 3600 MaxValue: 43200 Default: 7200 RolePermissionsBoundary: Type: String Description: Optional ARN of the permissions boundary policy (leave empty for none) Default: "" RolePath: Type: String Description: 'Path for the IAM role (must start and end with /)' Default: "/" AllowedPattern: '^\/.*\/$|^\/$' ConstraintDescription: 'Role path must start and end with forward slash (/)' 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: 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, ""]] Resources: SAMLFederatedRole: Type: 'AWS::IAM::Role' Properties: RoleName: !If - HasCustomRoleName - !Ref RoleName - !Ref AWS::NoValue Description: 'IAM role with SAML provider trust' MaxSessionDuration: !Ref RoleSessionDuration PermissionsBoundary: !If - HasPermissionsBoundary - !Ref RolePermissionsBoundary - !Ref AWS::NoValue Path: !Ref RolePath AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Federated: !Ref SAMLProviderARN Action: 'sts:AssumeRoleWithSAML' 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'