

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.

# Déployez des contrôles d'accès basés sur des attributs de détection pour les sous-réseaux publics en utilisant AWS Config
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config"></a>

*Alberto Menéndez, Amazon Web Services*

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

Les architectures de réseau de périphérie distribuées reposent sur une sécurité de périphérie du réseau qui s'exécute parallèlement aux charges de travail dans leurs clouds privés virtuels (VPCs). Cela permet une évolutivité sans précédent par rapport à l'approche centralisée plus courante. Bien que le déploiement de sous-réseaux publics dans les comptes de charge de travail puisse présenter des avantages, il présente également de nouveaux risques de sécurité car il augmente la surface d'attaque. Nous vous recommandons de déployer uniquement des ressources Elastic Load Balancing, telles que des équilibreurs de charge d'application ou des passerelles NAT dans leurs sous-réseaux publics. VPCs L'utilisation d'équilibreurs de charge et de passerelles NAT dans des sous-réseaux publics dédiés vous permet de mettre en œuvre un contrôle précis du trafic entrant et sortant.

Nous vous recommandons de mettre en œuvre des contrôles préventifs et de détection afin de limiter les types de ressources pouvant être déployées dans les sous-réseaux publics. Pour plus d'informations sur l'utilisation du contrôle d'accès basé sur les attributs (ABAC) pour déployer des contrôles préventifs pour les sous-réseaux publics, voir [Déployer des contrôles d'accès préventifs basés sur les attributs](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-preventative-attribute-based-access-controls-for-public-subnets.html) pour les sous-réseaux publics. Bien qu'ils soient efficaces dans la plupart des situations, ces contrôles préventifs peuvent ne pas répondre à tous les cas d'utilisation possibles. Par conséquent, ce modèle s'appuie sur l'approche ABAC et vous aide à configurer des alertes concernant les ressources non conformes déployées dans des sous-réseaux publics. La solution vérifie si les interfaces réseau élastiques appartiennent à une ressource non autorisée dans les sous-réseaux publics.

Pour ce faire, ce modèle utilise des [règles AWS Config personnalisées](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_develop-rules.html) et [ABAC](https://aws.amazon.com/identity/attribute-based-access-control/). La règle personnalisée traite la configuration d'une interface elastic network à chaque fois qu'elle est créée ou modifiée. À un niveau élevé, cette règle exécute deux actions pour déterminer si l'interface réseau est conforme :

1. Pour déterminer si l'interface réseau est couverte par la règle, celle-ci vérifie si le sous-réseau possède des [AWS balises](https://docs.aws.amazon.com/tag-editor/latest/userguide/tagging.html) spécifiques indiquant qu'il s'agit d'un sous-réseau public. Par exemple, cette balise peut être`IsPublicFacing=True`.

1. Si l'interface réseau est déployée dans un sous-réseau public, la règle vérifie qui Service AWS a créé cette ressource. Si la ressource n'est pas une ressource Elastic Load Balancing ou une passerelle NAT, elle la marque comme non conforme.

## Conditions préalables et limitations
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config-prereqs"></a>

**Conditions préalables**
+ Un actif Compte AWS
+ AWS Config, [configuré](https://docs.aws.amazon.com/config/latest/developerguide/gs-console.html) dans le compte de charge de travail
+ Autorisations pour déployer les ressources requises dans le compte de charge de travail
+ Un VPC avec des sous-réseaux publics
+ Balises correctement appliquées pour identifier les sous-réseaux publics cibles
+ (Facultatif) Une organisation dans AWS Organizations
+ (Facultatif) Un compte de sécurité central qui est l'administrateur délégué pour AWS Config et AWS Security Hub CSPM

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

**Architecture cible**

![\[Utilisation d'une règle personnalisée AWS Config pour détecter les ressources non conformes dans les sous-réseaux publics\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/85d54ead-7f00-4381-89fb-cffe307c4cfc/images/a8c19913-d260-4b70-96ba-732bb1b9881f.png)


Le diagramme illustre les éléments suivants :

1. Lorsqu'une ressource Elastic Network Interface (`AWS::EC2::NetworkInterface`) est déployée ou modifiée, elle AWS Config capture l'événement et la configuration.

1. AWS Config compare cet événement à la règle personnalisée utilisée pour évaluer la configuration.

1. La AWS Lambda fonction associée à cette règle personnalisée est invoquée. La fonction évalue la ressource et applique la logique spécifiée pour déterminer si la configuration de la ressource est `COMPLIANT` `NON_COMPLIANT` ou`NOT_APPLICABLE`.

1. S'il est déterminé qu'une ressource l'est`NON_COMPLIANT`, AWS Config envoie une alerte via Amazon Simple Notification Service (Amazon SNS).    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config.html)

**Logique d'évaluation de la fonction Lambda**

Le schéma suivant montre la logique appliquée par la fonction Lambda pour évaluer la conformité de l'interface Elastic Network.

![\[Schéma de la logique de la fonction Lambda\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/85d54ead-7f00-4381-89fb-cffe307c4cfc/images/9575e20f-142b-4eba-b34d-3b9bda163144.png)


**Automatisation et mise à l'échelle**

Ce modèle est une solution de détective. Vous pouvez également le compléter par une règle de correction afin de résoudre automatiquement les ressources non conformes. Pour plus d'informations, voir Corriger [les ressources non conformes à l'aide AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/remediation.html) de règles.

Vous pouvez adapter cette solution en :
+ Appliquer les AWS balises correspondantes que vous définissez pour identifier les sous-réseaux destinés au public. Pour plus d'informations, consultez la section [Politiques relatives aux balises](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_tag-policies.html) dans la AWS Organizations documentation.
+ Configuration d'un compte de sécurité central qui applique la règle AWS Config personnalisée à chaque compte de charge de travail de l'organisation. Pour plus d'informations, voir [Automatiser la conformité des configurations à grande échelle dans AWS](https://aws.amazon.com/blogs/mt/automate-configuration-compliance-at-scale-in-aws/) (article de AWS blog).
+  AWS Config Intégrer AWS Security Hub CSPM afin de capturer, de centraliser et de notifier à grande échelle. Pour plus d'informations, consultez [la section Configuration AWS Config](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-prereq-config.html) dans la AWS Security Hub CSPM documentation.

## Outils
<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)fournit une vue détaillée des ressources de votre ordinateur Compte AWS et de la façon dont elles sont configurées. Il vous aide à identifier les liens entre les ressources et l'évolution de leurs configurations au fil du temps.
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) répartit le trafic applicatif ou réseau entrant sur plusieurs cibles. Par exemple, vous pouvez répartir le trafic entre les instances, les conteneurs et les adresses IP d'Amazon Elastic Compute Cloud (Amazon EC2) dans une ou plusieurs zones de disponibilité.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) est un service de calcul qui vous aide à exécuter du code sans avoir à allouer ni à gérer des serveurs. Il exécute votre code uniquement lorsque cela est nécessaire et évolue automatiquement, de sorte que vous ne payez que pour le temps de calcul que vous utilisez.
+ [Amazon Simple Notification Service (Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)) vous aide à coordonner et à gérer l'échange de messages entre les éditeurs et les clients, y compris les serveurs Web et les adresses e-mail. 
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) vous aide à lancer AWS des ressources dans un réseau virtuel que vous avez défini. Ce réseau virtuel ressemble à un réseau traditionnel que vous pourriez exécuter dans votre propre centre de données et présente l'avantage d'utiliser l'infrastructure évolutive d' AWS.

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

Pour plus d'exemples et de bonnes pratiques en matière de développement de AWS Config règles personnalisées, consultez le [référentiel de AWS Config règles](https://github.com/awslabs/aws-config-rules) officiel sur GitHub.

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

### Déploiement de la solution
<a name="deploy-the-solution"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez la fonction Lambda. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config.html) | AWS général | 
| Ajoutez des autorisations au rôle d'exécution de la fonction Lambda. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config.html) | AWS général | 
| Récupérez la fonction Lambda Amazon Resource Name (ARN). | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config.html) | AWS général | 
| Créez la règle AWS Config personnalisée. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config.html) | AWS général | 
| Configurez les notifications. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config.html) | AWS général | 

### Tester la solution
<a name="test-the-solution"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez une ressource conforme. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config.html) | AWS général | 
| Créez une ressource non conforme. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config.html) | AWS général | 
| Créez une ressource non applicable. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config.html) | AWS général | 

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

**AWS documentation**
+ [Configuration AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/gs-console.html)
+ [AWS Config règles personnalisées](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_develop-rules.html)
+ [ABAC pour AWS](https://aws.amazon.com/identity/attribute-based-access-control/)
+ [Déployez des contrôles d'accès préventifs basés sur les attributs pour les sous-réseaux publics](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-preventative-attribute-based-access-controls-for-public-subnets.html)

**Autres AWS ressources**
+ [Automatisez la conformité des configurations à grande échelle dans AWS](https://aws.amazon.com/blogs/mt/automate-configuration-compliance-at-scale-in-aws/)
+ [Architectures d'inspection distribuées avec Gateway Load Balancer](https://d1.awsstatic.com/architecture-diagrams/ArchitectureDiagrams/distributed-inspection-architectures-gwlb-ra.pdf)

## Informations supplémentaires
<a name="deploy-detective-attribute-based-access-controls-for-public-subnets-by-using-aws-config-additional"></a>

Voici un exemple de fonction Lambda fourni à des fins de démonstration.

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