

# Tutorial de IAM: use una plantilla de CloudFormation para crear un rol de IAM federado de SAML
<a name="tutorial_saml-federated-role"></a>

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 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
<a name="tutorial_saml-federated-role-prereqs"></a>

En este tutorial se presupone que los elementos siguientes ya existen:
+ Un IdP de SAML existente configurado en su cuenta de AWS. Si no lo tiene, puede crear uno con el tutorial de [Tutorial de IAM: use una plantilla de CloudFormation para crear un proveedor de identidades (IdP) de SAML](tutorial_saml-idp.md).
+ El ARN de su IdP de SAML, que deberá especificar como parámetro durante la creación de la pila.
+ Python 3.6 o una versión posterior instalada en su máquina local para ejecutar el comando de Python utilizado en este tutorial a fin de formatear el archivo XML de metadatos SAML de su IdP.

## Crear un rol federado de SAML con CloudFormation
<a name="tutorial_saml-federated-role-create"></a>

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
<a name="tutorial_saml-federated-role-file"></a>

Primero, cree la plantilla de CloudFormation.

1. En la sección [Plantilla](#tutorial_saml-federated-role-template), haga clic en el icono de copia de la pestaña **JSON** o **YAML** para copiar el contenido de la plantilla.

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

1. Guarde el archivo localmente.

### Creación de la pila
<a name="tutorial_saml-federated-role-stack"></a>

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

1. Abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

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

1. En Especificar plantilla:

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

   1. En **Especificar plantilla**, elija **Cargar un archivo de plantilla**.

   1. Seleccione **Elegir archivo** para navegar hasta el archivo y seleccionarlo.

   1. Elija **Siguiente**.

1. Especifique los siguientes detalles de la pila:

   1. Introduzca un nombre de pila.

   1. 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 CloudFormation para crear un proveedor de identidades (IdP) de SAML](tutorial_saml-idp.md), puede encontrar el ARN del proveedor en la pestaña de resultados de esa pila de CloudFormation.

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

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

   1. Elija **Siguiente**.

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

   1. Acepte todos los demás valores predeterminados.

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

   1. Elija **Siguiente**.

1. Revise los detalles de la pila y elija **Enviar**.

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
<a name="tutorial_saml-federated-role-using"></a>

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

1. Seleccione **Roles** en el panel de navegación.

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

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

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

1. 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
<a name="tutorial_saml-federated-role-delete"></a>

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

1. Abra la consola de CloudFormation.

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

### Recursos
<a name="tutorial_saml-federated-role-template-resources"></a>

La plantilla de CloudFormation para este tutorial crea el siguiente recurso en su cuenta:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html): un rol de IAM federado que pueden asumir los usuarios autenticados a través del IdP de SAML.

### Configuración
<a name="tutorial_saml-federated-role-configuration"></a>

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
<a name="tutorial_saml-federated-role-template"></a>

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'
```

------