

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Implemente controles de acceso basados en atributos de detección para subredes públicas mediante AWS Config
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config"></a>

*Alberto Menéndez, Amazon Web Services*

## Resumen
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config-summary"></a>

Las arquitecturas de redes perimetrales distribuidas se basan en la seguridad perimetral de la red que se ejecuta junto con las cargas de trabajo de sus nubes privadas virtuales (). VPCs Esto proporciona una escalabilidad sin precedentes en comparación con el enfoque centralizado más común. Si bien la implementación de subredes públicas en las cuentas de carga de trabajo puede ofrecer beneficios, también presenta nuevos riesgos de seguridad porque aumenta la superficie expuesta a ataques. Le recomendamos que implemente solo los recursos de Elastic Load Balancing, como los balanceadores de carga de aplicaciones o las puertas de enlace NAT, en las subredes públicas de estos. VPCs El uso de equilibradores de carga y puertas de enlace NAT en subredes públicas dedicadas lo ayuda a implementar un control detallado del tráfico entrante y saliente.

Le recomendamos que implemente controles preventivos y de detección para limitar los tipos de recursos que se pueden implementar en las subredes públicas. Para obtener más información sobre el uso del control de acceso basado en atributos (ABAC) para implementar controles preventivos en las subredes públicas, consulte [Implementación de controles de acceso preventivos basados en atributos para las subredes públicas](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-preventative-attribute-based-access-controls-for-public-subnets.html). Si bien son eficaces en la mayoría de las situaciones, es posible que estos controles preventivos no aborden todos los casos de uso posibles. Por lo tanto, este patrón se basa en el enfoque ABAC y lo ayuda a configurar alertas sobre los recursos no conformes que se despliegan en las subredes públicas. La solución comprueba si las interfaces de red elásticas pertenecen a un recurso que no está permitido en las subredes públicas.

Para lograrlo, este patrón utiliza [reglas de AWS Config personalizadas](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_develop-rules.html) y [ABAC](https://aws.amazon.com/identity/attribute-based-access-control/). La regla personalizada procesa la configuración de una interfaz de red elástica cada vez que se crea o modifica. En un nivel superior, esta regla realiza dos acciones para determinar si la interfaz de red es compatible:

1. Para determinar si la interfaz de red está dentro del ámbito de aplicación de la regla, la regla comprueba si la subred tiene [etiquetas de AWS](https://docs.aws.amazon.com/tag-editor/latest/userguide/tagging.html) específicas que indican que es una subred pública. Por ejemplo, esta etiqueta podría ser `IsPublicFacing=True`.

1. Si la interfaz de red se implementa en una subred pública, la regla comprueba quién creó este recurso. Servicio de AWS Si el recurso no es un recurso de Elastic Load Balancing o una puerta de enlace de NAT, lo marca como no conforme.

## Requisitos previos y limitaciones
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config-prereqs"></a>

**Requisitos previos **
+ Un activo Cuenta de AWS
+ AWS Config[configurado](https://docs.aws.amazon.com/config/latest/developerguide/gs-console.html) en la cuenta de carga de trabajo
+ Permisos para implementar los recursos necesarios en la cuenta de carga de trabajo
+ Una VPC con subredes públicas
+ Etiquetas aplicadas correctamente para identificar las subredes públicas de destino
+ (Opcional) Una organización en AWS Organizations
+ (Opcional) Una cuenta de seguridad central que es la administradora delegada de AWS Config y AWS Security Hub CSPM

## Arquitectura
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config-architecture"></a>

**Arquitectura de destino**

![Uso de una regla personalizada de AWS Config para detectar recursos no conformes en subredes públicas](https://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/85d54ead-7f00-4381-89fb-cffe307c4cfc/images/a8c19913-d260-4b70-96ba-732bb1b9881f.png)


En el siguiente diagrama se ilustra lo siguiente:

1. Cuando se implementa o modifica un recurso de interface de red elástica (`AWS::EC2::NetworkInterface`), AWS Config captura el evento y la configuración.

1. AWS Config compara este evento con la regla personalizada utilizada para evaluar la configuración.

1. Se invoca la AWS Lambda función asociada a esta regla personalizada. La función evalúa el recurso y aplica la lógica especificada para determinar si la configuración del recurso es `COMPLIANT`, `NON_COMPLIANT` o `NOT_APPLICABLE`.

1. Si se determina que un recurso lo es`NON_COMPLIANT`, AWS Config envía una alerta a través de Amazon Simple Notification Service (Amazon SNS).


<table>
<tbody>
</tbody>
</table>


**Lógica de evaluación de funciones de Lambda**

El siguiente diagrama muestra la lógica aplicada por la función de Lambda para evaluar la conformidad de la interfaz de red elástica.

![Diagrama de la lógica de la función de Lambda](https://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/85d54ead-7f00-4381-89fb-cffe307c4cfc/images/9575e20f-142b-4eba-b34d-3b9bda163144.png)


**Automatización y escala**

Este patrón es una solución detectivesca. También puede complementarlo con una regla de corrección para resolver automáticamente cualquier recurso que no cumpla con las normas. Para obtener más información, consulte [Remediar recursos no conformes con AWS Config reglas](https://docs.aws.amazon.com/config/latest/developerguide/remediation.html).

Puede escalar esta solución de la siguiente manera:
+ Exigir la aplicación de las AWS etiquetas correspondientes que establezca para identificar las subredes públicas. Para obtener más información, consulte [las políticas de etiquetas](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_tag-policies.html) en la documentación. AWS Organizations 
+ Configurar una cuenta de seguridad central que aplique la regla AWS Config personalizada a todas las cuentas de carga de trabajo de la organización. Para obtener más información, consulte [Automatizar el cumplimiento de la configuración a gran escala AWS](https://aws.amazon.com/blogs/mt/automate-configuration-compliance-at-scale-in-aws/) (entrada del AWS blog).
+ Integrarse AWS Config con AWS Security Hub CSPM para capturar, centralizar y notificar a escala. Para obtener más información, consulte [Configuración AWS Config](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-prereq-config.html) en la AWS Security Hub CSPM documentación.

## Tools (Herramientas)
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config-tools"></a>
+ [AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html)proporciona una vista detallada de los recursos que tiene Cuenta de AWS y de cómo están configurados. Le ayuda a identificar cómo se relacionan los recursos entre sí y cómo han cambiado sus configuraciones a lo largo del tiempo.
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) permite distribuir el tráfico entrante de las aplicaciones o de la red entre varios destinos. Por ejemplo, puede distribuir el tráfico entre instancias, contenedores y direcciones IP de Amazon Elastic Compute Cloud (Amazon EC2) en una o más zonas de disponibilidad.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.
+ [Amazon Simple Notification Service (Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)) le permite coordinar y administrar el intercambio de mensajes entre publicadores y clientes, incluidos los servidores web y las direcciones de correo electrónico. 
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) le ayuda a lanzar AWS recursos en una red virtual que haya definido. Esa red virtual es similar a la red tradicional que utiliza en su propio centro de datos, con los beneficios de usar la infraestructura escalable de AWS.

## Prácticas recomendadas
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config-best-practices"></a>

Para obtener más ejemplos y prácticas recomendadas para desarrollar AWS Config reglas personalizadas, consulte el [repositorio de AWS Config reglas](https://github.com/awslabs/aws-config-rules) oficial en GitHub.

## Epics
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config-epics"></a>

### Implementar la solución
<a name="deploy-the-solution"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Crear la función de Lambda. | 1. Inicie sesión en la [AWS Lambda consola y Consola de administración de AWS, a continuación, ábrala](https://console.aws.amazon.com/lambda/).<br />2. En la página **Functions (Funciones)**, seleccione **Create function (Crear función)**.<br />3. Seleccione **Crear desde cero**.<br />4. En el panel de **Información básica**, para el **Nombre de la función** introduzca un nombre.<br />5. En **Tiempo de ejecución**, seleccione **Python 3.12**.<br />6. Deje la **arquitectura** establecida en **x86\_64**.<br />7. Seleccione **Creación de función**.<br />8. Elija la pestaña **Código**.<br />9. En el explorador de archivos, elija **lambda\_function.py**.<br />10. Pegue el código de ejemplo que se proporciona en la sección [Información adicional](#deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config-additional) en este patrón en la pestaña **lambda\_function.py**. Personalice el código de ejemplo para identificar cualquier lógica de evaluación personalizada de la función `evaluate_change_notification_compliance`.<br />11. Elija **Implementar**. | AWS general | 
| Todos estos permisos se agregan al rol de ejecución de la función de Lambda. | 1. Seleccione **Funciones** en el panel de navegación.<br />2. Elegir la función que acaba de crear.<br />3. Elija **Configuration** (Configuración) y, a continuación, seleccione **Permissions** (Permisos).<br />4. Elija el nombre del rol para abrirlo en la consola AWS Identity and Access Management (IAM).<br />5. En la pestaña **Políticas de permisos**, elija **Agregar permisos** y después **Crear política insertada**.<br />6. Elija **JSON**.<br />7. Pegue la siguiente política en el editor de políticas. Esto permite a las funciones de Lambda:Obtener los detalles de las etiquetas de subred.Envíe el resultado de la conformidad a AWS Config.<pre>{<br /><br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Action": [<br />                "config:PutEvaluations",<br />                "ec2:DescribeSubnets"<br />            ],<br />            "Resource": "*",<br />            "Effect": "Allow"<br />        }<br />    ]<br />}</pre><br />8. Elija **Siguiente**.<br />9. Escriba un nombre para la política y elija **Create policy (Crear política)**. | AWS general | 
| Recuperar el nombre de recurso de Amazon (ARN) de la función de Lambda. | 1. Abra la [consola de Lambda](https://console.aws.amazon.com/lambda/).<br />2. Seleccione **Funciones** en el panel de navegación.<br />3. Elegir la función que acaba de crear.<br />4. En la sección **Información general de la función**, en **ARN de la función**, copie el valor. | AWS general | 
| Cree la regla AWS Config personalizada. | 1. Abra la [consola de AWS Config](https://console.aws.amazon.com/config/).<br />2. En la página **Rules (Reglas)**, seleccione **Add rule (Añadir regla)**.<br />3. En la página **Especificar tipo de regla**, elija **Cree una regla personalizada de Lambda** y, a continuación, elija **Siguiente**.<br />4. En la página **Configurar regla**, haga lo siguiente:Introduzca un nombre y una descripción.En **ARN de la función AWS Lambda **, pegue el ARN que copió anteriormente.Para **Tipo de desencadenador**, elija **Cuando cambia la configuración**.En **Ámbito de cambios**, elija **Recursos**.En **Tipo de recurso**, elija **AWS EC2 NetworkInterface**.Elija **Siguiente**.<br />5. En la página **Revisar y crear**, revise la configuración de su regla y, a continuación, seleccione **Guardar**. | AWS general | 
| Configure las notificaciones. | 1. Siga las instrucciones de [Creación de un tema de Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html) para crear un tema de Amazon SNS.<br />2. Siga las instrucciones de [Suscripción a un tema de Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html) para configurar un punto de conexión que reciba notificaciones del tema Amazon SNS.<br />3. Sigue las instrucciones de [Cómo puedo recibir una notificación cuando un AWS recurso no cumple con las normas AWS Config](https://aws.amazon.com/premiumsupport/knowledge-center/config-resource-non-compliant/) para configurar una EventBridge regla de Amazon personalizada para tus recursos no conformes. | AWS general | 

### Pruebe la solución
<a name="test-the-solution"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un recurso compatible. | 1. Siga las instrucciones siguientes para crear uno de los recursos compatibles en una subred pública:[Cree una puerta de enlace NAT](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-creating)[Getting started with Network Load Balancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancer-getting-started.html)[Creación de un equilibrador de carga de aplicación](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-application-load-balancer.html)<br />2. Una vez creado el recurso, la regla AWS Config personalizada evalúa las interfaces de red elásticas asociadas al recurso. Marca estas interfaces de red como `COMPLIANT`. AWS Config Para ver los recursos en él, sigue estos pasos:Abra la [consola de AWS Config](https://console.aws.amazon.com/config/).En la página **Reglas**, seleccione su regla.En la página de **detalles de la regla**, vaya al final de la página.En **Recursos incluidos en el ámbito de aplicación**, seleccione **Conforme**. Confirme que ve las interfaces IDs de red que se crearon.Para obtener más información sobre la configuración de la interfaz de red, elija el ID del recurso. | AWS general | 
| Cree un recurso no conforme. | 1. Siga las instrucciones siguientes para crear un recurso no conforme en una subred pública:[Lanza una EC2 instancia de Amazon](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-launch-instance)[Creación de una instancia de base de datos de Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html)[Crear un punto final de VPC](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)<br />2. Una vez creado el recurso, la regla AWS Config personalizada evalúa las interfaces de red elásticas asociadas al recurso. Marca estas interfaces de red como `NON_COMPLIANT`. AWS Config Para ver los recursos en él, sigue estos pasos:Abra la [consola de AWS Config](https://console.aws.amazon.com/config/).En la página **Reglas**, seleccione su regla.En la página de **detalles de la regla**, vaya al final de la página.En **Recursos incluidos en el ámbito**, selecciona **NonCompliant**. Confirme que ve las interfaces IDs de red que se crearon.Para obtener más información sobre la configuración de la interfaz de red, elija el ID del recurso.<br />3. Confirme que recibe la notificación en el punto de conexión que configuró en Amazon SNS. | AWS general | 
| Cree un recurso que no sea aplicable. | 1. En una subred privada, cree cualquier recurso que requiera una interfaz de red elástica.<br />2. Una vez creado el recurso, la regla AWS Config personalizada evalúa las interfaces de red elásticas asociadas al recurso. Marca estas interfaces de red como `NOT_APPLICABLE`. Estos recursos no se muestran en la AWS Config consola. | AWS general | 

## Recursos relacionados
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config-resources"></a>

**AWS documentación**
+ [Configuración AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/gs-console.html)
+ [AWS Config reglas personalizadas](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_develop-rules.html)
+ [ABAC para AWS](https://aws.amazon.com/identity/attribute-based-access-control/)
+ [Implementación de controles de acceso preventivos basados en atributos para las subredes públicas](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-preventative-attribute-based-access-controls-for-public-subnets.html)

**Otros recursos AWS **
+ [Automatice el cumplimiento de la configuración a gran escala AWS](https://aws.amazon.com/blogs/mt/automate-configuration-compliance-at-scale-in-aws/)
+ [Arquitecturas de inspección distribuida con el Equilibrador de carga de puerta de enlace](https://d1.awsstatic.com/architecture-diagrams/ArchitectureDiagrams/distributed-inspection-architectures-gwlb-ra.pdf)

## Información adicional
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config-additional"></a>

El siguiente es un ejemplo de una función de Lambda que se proporciona con fines de demostración.

```
import boto3
import json
import os

# Init clients
config_client = boto3.client('config')
ec2_client = boto3.client('ec2')

def lambda_handler(event, context):

    # Init values
    compliance_value = 'NOT_APPLICABLE'
    invoking_event = json.loads(event['invokingEvent'])
    configuration_item = invoking_event['configurationItem']
    
    status = configuration_item['configurationItemStatus']
    eventLeftScope = event['eventLeftScope']

    # First check if the event configuration applies. Ex. resource event is not delete
    if (status == 'OK' or status == 'ResourceDiscovered') and not eventLeftScope:
        compliance_value = evaluate_change_notification_compliance(configuration_item)
    
    
    config_client.put_evaluations(
       Evaluations=[
           {
               'ComplianceResourceType': invoking_event['configurationItem']['resourceType'],
               'ComplianceResourceId': invoking_event['configurationItem']['resourceId'],
               'ComplianceType': compliance_value,
               'OrderingTimestamp': invoking_event['configurationItem']['configurationItemCaptureTime']
           },
       ],
       ResultToken=event['resultToken'])
    
# Function with the logs to evaluate the resource
def evaluate_change_notification_compliance(configuration_item):
    is_in_scope = is_in_scope_subnet(configuration_item['configuration']['subnetId'])
    
    if (configuration_item['resourceType'] != 'AWS::EC2::NetworkInterface') or not is_in_scope:
        return 'NOT_APPLICABLE'

    else:
        alb_condition = configuration_item['configuration']['requesterId'] in ['amazon-elb']
        nlb_condition = configuration_item['configuration']['interfaceType'] in ['network_load_balancer']
        nat_gateway_condition = configuration_item['configuration']['interfaceType'] in ['nat_gateway']

        if alb_condition or nlb_condition or nat_gateway_condition:
            return 'COMPLIANT'
    return 'NON_COMPLIANT'

# Function to check if elastic network interface is in public subnet
def is_in_scope_subnet(eni_subnet):

    subnet_description = ec2_client.describe_subnets(
        SubnetIds=[eni_subnet]
    )

    for subnet in subnet_description['Subnets']:
        for tag in subnet['Tags']:
            if tag['Key'] == os.environ.get('TAG_KEY') and tag['Value'] == os.environ.get('TAG_VALUE'):
                return True
    
    return False
```