

# Protección de las funciones por etiqueta
<a name="attribute-based-access-control-example"></a>

Los siguientes pasos muestran una forma de configurar permisos para funciones mediante ABAC. En este escenario de ejemplo, creará cuatro políticas de permisos de IAM. A continuación, adjuntará estas políticas a un nuevo rol de IAM. Por último, creará un usuario de IAM y le concederá permiso para que asuma el nuevo rol.

**Topics**
+ [

## Requisitos previos
](#abac-prerequisites)
+ [

## Paso 1: solicitar etiquetas en las nuevas funciones
](#require-tag-on-create)
+ [

## Paso 2: permitir acciones basadas en etiquetas adjuntas a una función de Lambda y a una entidad principal de IAM
](#restrict-actions-function-tags)
+ [

## Paso 3: conceder permisos de lista
](#abac-list-permissions)
+ [

## Paso 4: conceder permisos de IAM
](#abac-iam-permissions)
+ [

## Paso 5: crear el rol de IAM
](#abac-create-role)
+ [

## Paso 6: crear el usuario de IAM
](#abac-create-user)
+ [

## Paso 7: probar los permisos
](#abac-test)
+ [

## Paso 8: Eliminar los recursos
](#abac-clean-up)

## Requisitos previos
<a name="abac-prerequisites"></a>

Asegúrese de que tiene un [rol de ejecución de Lambda](lambda-intro-execution-role.md). Utilizará este rol al conceder permisos de IAM y al crear una función de Lambda.

## Paso 1: solicitar etiquetas en las nuevas funciones
<a name="require-tag-on-create"></a>

Cuando se usa ABAC con Lambda, es una práctica recomendada solicitar que todas las funciones tengan etiquetas. Esto ayuda a garantizar que las políticas de permisos de ABAC funcionen según lo esperado.

[Cree una política de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor) similar al siguiente ejemplo: Esta política utiliza las claves de condición [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag), [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) y [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) para exigir que las funciones nuevas y la entidad principal de IAM que crea las funciones tengan la etiqueta `project`. El modificador `ForAllValues` garantiza que `project` sea la única etiqueta permitida. Si no incluye el modificador `ForAllValues`, los usuarios pueden agregar otras etiquetas a la función siempre que también pasen `project`.

**Example — Solicitar etiquetas en las nuevas funciones**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:TagResource"
      ],
      "Resource": "arn:aws:lambda:*:*:function:*",
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/project": "${aws:PrincipalTag/project}",
          "aws:ResourceTag/project": "${aws:PrincipalTag/project}"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": "project"
        }
      }
    }
  }
```

## Paso 2: permitir acciones basadas en etiquetas adjuntas a una función de Lambda y a una entidad principal de IAM
<a name="restrict-actions-function-tags"></a>

Describa cómo crear una segunda política de IAM mediante la clave de condición [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) para solicitar que la etiqueta de la entidad principal coincida con la etiqueta adjunta a la función. El siguiente ejemplo de política permite a las entidades principales con la etiqueta `project` invocar funciones con la etiqueta `project`. Si una función tiene otras etiquetas, se deniega la acción.

**Example — Solicitar etiquetas coincidentes en la función y la entidad principal de IAM**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "lambda:InvokeFunction",
          "lambda:GetFunction"
        ],
        "Resource": "arn:aws:lambda:*:*:function:*",
        "Condition": {
          "StringEquals": {
            "aws:ResourceTag/project": "${aws:PrincipalTag/project}"
          }
        }
      }
    ]
  }
```

## Paso 3: conceder permisos de lista
<a name="abac-list-permissions"></a>

Cree una política que permita a la entidad principal enumerar las funciones de Lambda y los roles de IAM. Esto permite a la entidad principal ver todas las funciones de Lambda y los roles de IAM en la consola y cuando llama a las acciones de la API.

**Example — Conceder permisos de lista de Lambda e IAM**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "AllResourcesLambdaNoTags",
        "Effect": "Allow",
        "Action": [
          "lambda:GetAccountSettings",
          "lambda:ListFunctions",
          "iam:ListRoles"
        ],
        "Resource": "*"
      }
    ]
  }
```

## Paso 4: conceder permisos de IAM
<a name="abac-iam-permissions"></a>

Cree una política que permita **iam:PassRole**. Este permiso es necesario al asignar un rol de ejecución a una función. En la siguiente política de ejemplo, reemplace el ARN de ejemplo por el ARN del rol de ejecución de Lambda.

**nota**  
No utilice la clave de condición de `ResourceTag` en una política con la acción `iam:PassRole`. No puede utilizar la etiqueta en un rol de IAM para controlar el acceso a quién puede pasar ese rol. Para obtener más información sobre los permisos necesarios a fin de pasar un rol a un servicio, consulte [Concesión de permisos a un usuario para pasar un rol a un servicio de AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html).

**Example — Conceder permiso para pasar el rol de ejecución**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
          "iam:PassRole"
        ],
        "Resource": "arn:aws:iam::111122223333:role/lambda-ex"
      }
    ]
  }
```

## Paso 5: crear el rol de IAM
<a name="abac-create-role"></a>

Es una práctica recomendada [utilizar roles para delegar permisos](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#delegate-using-roles). [Cree un rol de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console) denominado `abac-project-role`:
+ En **Step 1: Select trusted entity** (Paso 1: Seleccionar una entidad de confianza): seleccione **AWS account** (Cuenta de ) y luego **This account** (Esta cuenta).
+ En **Step 2: Add permissions** (Paso 2: agregar permisos): adjunte las cuatro políticas de IAM que creó en los pasos anteriores.
+ En **Step 3: Name, review, and create** (Paso 3: nombrar, revisar y crear): elija **Add tag** (Agregar etiqueta). En **Clave**, escriba `project`. No ingrese nada en **Value** (Valor).

## Paso 6: crear el usuario de IAM
<a name="abac-create-user"></a>

[Cree un usuario de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console) denominado `abac-test-user`. En la sección **Set permissions** (Establecer permisos), elija **Attach existing policies directly** (Adjuntar directamente las políticas existentes) y, a continuación, **Create policy** (Crear política). Escriba la siguiente definición de política. Reemplace *111122223333* por su [ID de cuenta de AWS](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html#FindingYourAccountIdentifiers). Esta política permite al `abac-test-user` asumir el `abac-project-role`.

**Example — Permitir que el usuario de IAM asuma el rol de ABAC**  

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::111122223333:role/abac-project-role"
    }
  }
```

------

## Paso 7: probar los permisos
<a name="abac-test"></a>

1. Inicie sesión en la consola de AWS como `abac-test-user`. Para obtener más información, consulte [Iniciar sesión como usuario de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/console.html#user-sign-in-page).

1. Cambie al rol `abac-project-role`. Para obtener más información, consulte [Cambiar a un rol (consola)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html).

1. [Cree una función de Lambda](configuration-tags.md#using-tags-with-the-console):
   + En **Permissions** (Permisos), elija **Change default execution role** (Cambiar rol de ejecución predeterminado) y, a continuación, en **Execution role** (Rol de ejecución), elija **Use an existing role** (Usar un rol existente). Elija el mismo rol de ejecución que utilizó en [Paso 4: conceder permisos de IAM](#abac-iam-permissions).
   + En **Advanced settings** (Configuración avanzada), elija **Enable tags** (Habilitar etiquetas) y, a continuación, **Add new tag** (Agregar nueva etiqueta). En **Clave**, escriba `project`. No ingrese nada en **Value** (Valor).

1. [Pruebe la función](testing-functions.md).

1. Cree una segunda función de Lambda y agregue una etiqueta diferente, como `environment`. Esta operación puede fallar porque la política de ABAC que creó en [Paso 1: solicitar etiquetas en las nuevas funciones](#require-tag-on-create) solo permite a la entidad principal crear funciones con la etiqueta `project`.

1. Cree una tercera función sin etiquetas. Esta operación puede fallar porque la política de ABAC que creó en [Paso 1: solicitar etiquetas en las nuevas funciones](#require-tag-on-create) solo permite a la entidad principal crear funciones sin etiquetas.

Esta estrategia de autorización permite controlar el acceso sin crear nuevas políticas para cada usuario nuevo. Para conceder acceso a los nuevos usuarios, basta con darles permiso a fin de que asuman el rol que corresponde a su proyecto asignado.

## Paso 8: Eliminar los recursos
<a name="abac-clean-up"></a>

**Para eliminar el rol de IAM**

1. Abra la [página Roles](https://console.aws.amazon.com/iam/home#/roles) en la consola de IAM.

1. Seleccione el rol que creó en el [paso 5](#abac-create-role).

1. Elija **Eliminar**.

1. Para confirmar la eliminación, escriba el nombre del rol en el campo de entrada de texto.

1. Elija **Eliminar**.

**Cómo eliminar el usuario de IAM**

1. Abra la [página Users](https://console.aws.amazon.com/iam/home#/users) en la consola de IAM;.

1. Seleccione el usuario de IAM que ha creado en el [paso 6](#abac-create-user).

1. Elija **Eliminar**.

1. Para confirmar la eliminación, escriba el nombre del usuario en el campo de entrada de texto.

1. Elija **Eliminar usuario**.

**Cómo eliminar la función de Lambda**

1. Abra la [página de Funciones](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Seleccione la función que ha creado.

1. Elija **Acciones**, **Eliminar**.

1. Escriba **confirm** en el campo de entrada de texto y seleccione **Delete** (Eliminar).