Contrôles Amazon Elastic Compute Cloud (Amazon EC2) - AWS Control Tower

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.

Contrôles Amazon Elastic Compute Cloud (Amazon EC2)

Rubriques

[CT.EC2.PR.1] Exiger un modèle de lancement Amazon EC2 pour configurer IMDSv2

Ce contrôle vérifie si vos modèles de lancement Amazon EC2 sont configurés avec Instance Metadata Service version 2 (IMDSv2).

  • Objectif de contrôle : appliquer le moindre privilège, protéger les configurations

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::LaunchTemplate

  • AWS CloudFormationrègle de garde : CT.EC2.PR.1spécification des règles

Détails et exemples

Explication

Les métadonnées d'instance configurent et gèrent vos instances en cours d'exécution. L'IMDS permet d'accéder à des informations d'identification temporaires fréquemment modifiées. Vous n'avez donc pas besoin de distribuer des informations d'identification sensibles aux instances, que ce soit manuellement ou par programmation. L'IMDS est attaché localement à chaque instance EC2. Il fonctionne sur une adresse IP spéciale 169.254.169.254. Cette adresse IP n'est accessible qu'aux logiciels qui s'exécutent sur l'instance.

La version 2 de l'IMDS ajoute des protections contre les vulnérabilités qui peuvent être utilisées pour accéder à l'IMDS : Open website application firewallsOpen reverse proxies, Server-side request forgery (SSRF) vulnerabilities et. 'Open Layer 3 firewalls and network address translation (NAT)

AWS Control Tower vous recommande de configurer vos instances EC2 avec IMDSv2.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux modèles de lancement Amazon EC2 qui autorisent l'accès aux métadonnées des instances.

Corrections en cas de défaillance des règles

Dans la LaunchTemplateData propriété, fournissez une MetadataOptions configuration et définissez la valeur de HttpTokens torequired.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Modèle de lancement Amazon EC2 - Exemple

Modèle de lancement Amazon EC2 configuré avec IMDSv2 activé. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2LaunchTemplate": { "Type": "AWS::EC2::LaunchTemplate", "Properties": { "LaunchTemplateData": { "InstanceType": "t3.micro", "ImageId": { "Ref": "LatestAmiId" }, "MetadataOptions": { "HttpTokens": "required" } } } } }

Exemple YAML

EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: InstanceType: t3.micro ImageId: !Ref 'LatestAmiId' MetadataOptions: HttpTokens: required

CT.EC2.PR.1spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_launch_template_imdsv2_check # # Description: # This control checks whether your Amazon EC2 launch templates are configured with Instance Metadata Service Version 2 (IMDSv2). # # Reports on: # AWS::EC2::LaunchTemplate # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any EC2 launch template resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData' has not been provided or 'LaunchTemplateData.MetadataOptions.HttpEndpoint' has # been provided and is equal to 'disabled' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData' has been provided # And: 'MetadataOptions.HttpEndpoint' in 'LaunchTemplateData' has not been provided or has been provided and # is equal to 'enabled' # And: 'MetadataOptions.HttpTokens' in 'LaunchTemplateData' has not been provided # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData' has been provided # And: 'MetadataOptions.HttpEndpoint' in 'LaunchTemplateData' has not been provided or has been provided and # is equal to 'enabled' # And: 'MetadataOptions.HttpTokens' in 'LaunchTemplateData' has been provided and set to a value other than 'required' # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData' has been provided # And: 'MetadataOptions.HttpEndpoint' in 'LaunchTemplateData' has not been provided or has been provided and # is equal to 'enabled' # And: 'MetadataOptions.HttpTokens' in 'LaunchTemplateData' has been provided and set to 'required' # Then: PASS # # Constants # let EC2_LAUNCH_TEMPLATE_TYPE = "AWS::EC2::LaunchTemplate" let INPUT_DOCUMENT = this # # Assignments # let ec2_launch_templates = Resources.*[ Type == %EC2_LAUNCH_TEMPLATE_TYPE ] # # Primary Rules # rule ec2_launch_template_imdsv2_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_launch_templates not empty { check(%ec2_launch_templates.Properties) << [CT.EC2.PR.1]: Require an Amazon EC2 launch template to have IMDSv2 configured [FIX]: Within the 'LaunchTemplateData' property, provide a 'MetadataOptions' configuration and set the value of 'HttpTokens' to 'required'. >> } rule ec2_launch_template_imdsv2_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_LAUNCH_TEMPLATE_TYPE) { check(%INPUT_DOCUMENT.%EC2_LAUNCH_TEMPLATE_TYPE.resourceProperties) << [CT.EC2.PR.1]: Require an Amazon EC2 launch template to have IMDSv2 configured [FIX]: Within the 'LaunchTemplateData' property, provide a 'MetadataOptions' configuration and set the value of 'HttpTokens' to 'required'. >> } # # Parameterized Rules # rule check(launch_template) { %launch_template [ # Scenario 2 filter_launch_template_imds_enabled(this) ] { LaunchTemplateData exists LaunchTemplateData is_struct LaunchTemplateData { # Scenario 3, 4 and 5 MetadataOptions exists MetadataOptions is_struct MetadataOptions { HttpTokens exists HttpTokens == "required" } } } } rule filter_launch_template_imds_enabled(launch_template) { %launch_template { LaunchTemplateData exists LaunchTemplateData is_struct LaunchTemplateData { MetadataOptions not exists or filter_metadata_options_imds_enabled(this) } } } rule filter_metadata_options_imds_enabled(metadata_options) { %metadata_options { MetadataOptions is_struct MetadataOptions { HttpEndpoint not exists or HttpEndpoint == "enabled" } } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.EC2.PR.1exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: InstanceType: t3.micro ImageId: Ref: LatestAmiId MetadataOptions: HttpTokens: required

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: InstanceType: t3.micro ImageId: Ref: LatestAmiId MetadataOptions: HttpTokens: optional

[CT.EC2.PR.2] Exiger que les modèles de lancement Amazon EC2 limitent la limite de sauts de jetons à un maximum d'un

Ce contrôle vérifie si une limite de sauts de jetons de métadonnées est définie sur un modèle de lancement Amazon EC2. 1

  • Objectif de contrôle : appliquer le moindre privilège, protéger les configurations

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::LaunchTemplate

  • AWS CloudFormationrègle de garde : CT.EC2.PR.2spécification des règles

Détails et exemples

Explication

L'Amazon Instance Metadata Service (IMDS) fournit des informations de métadonnées sur une instance Amazon EC2, utiles pour la configuration des applications. Le fait de restreindre la réponse HTTP PUT du service de métadonnées à l'instance EC2 protège l'IMDS contre toute utilisation non autorisée.

Le champ Time To Live (TTL) du paquet IP est réduit d'une unité à chaque saut. Cette réduction peut être utilisée pour garantir que le paquet ne voyage pas en dehors d'EC2. IMDSv2 protège les instances EC2 qui peuvent avoir été mal configurées en tant que routeurs ouverts, pare-feux de couche 3, VPN, tunnels ou périphériques NAT, empêchant ainsi les utilisateurs non autorisés de récupérer des métadonnées. Avec IMDSv2, la réponse PUT qui contient le jeton secret ne peut pas voyager en dehors de l'instance, car la limite de sauts de réponse aux métadonnées par défaut est fixée à 1. Toutefois, si cette valeur est supérieure à 1, le jeton peut quitter l'instance EC2.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux modèles de lancement Amazon EC2 qui autorisent l'accès aux métadonnées des instances.

  • Ce contrôle est incompatible avec les modèles de lancement Amazon EC2 qui nécessitent une limite de 2 sauts de jetons.

Corrections en cas de défaillance des règles

Dans la LaunchTemplateData propriété, fournissez une MetadataOptions configuration avec la valeur HttpPutResponseLimit set to1, ou omettez la HttpPutResponseLimit propriété pour adopter la valeur AWS CloudFormation par défaut de1.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Modèle de lancement Amazon EC2 - Exemple 1

Modèle de lancement Amazon EC2 configuré avec l'accès aux métadonnées de l'instance activé et une limite de sauts de 1 jetons définie par défaut. AWS CloudFormation L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2LaunchTemplate": { "Type": "AWS::EC2::LaunchTemplate", "Properties": { "LaunchTemplateData": { "MetadataOptions": { "HttpEndpoint": "enabled" } } } } }

Exemple YAML

EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: MetadataOptions: HttpEndpoint: enabled

Les exemples suivants montrent comment mettre en œuvre cette correction.

Modèle de lancement Amazon EC2 - Exemple 2

Modèle de lancement Amazon EC2 configuré avec l'accès aux métadonnées de l'instance activé et une limite de sauts de 1 jetons définie au moyen de la MetadataOptions propriété. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2LaunchTemplate": { "Type": "AWS::EC2::LaunchTemplate", "Properties": { "LaunchTemplateData": { "MetadataOptions": { "HttpEndpoint": "enabled", "HttpPutResponseHopLimit": 1 } } } } }

Exemple YAML

EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: MetadataOptions: HttpEndpoint: enabled HttpPutResponseHopLimit: 1

CT.EC2.PR.2spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_launch_template_token_hop_limit_check # # Description: # This control checks whether an Amazon EC2 launch template has a metadata token hop limit set to '1'. # # Reports on: # AWS::EC2::LaunchTemplate # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any EC2 launch template resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData.MetadataOptions' has been provided # And: 'LaunchTemplateData.MetadataOptions.HttpEndpoint' has been provided and is equal to 'disabled' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData.MetadataOptions' has been provided # And: 'LaunchTemplateData.MetadataOptions.HttpEndpoint' has not been provided or has been provided and is # equal to 'enabled' # And: 'LaunchTemplateData.MetadataOptions.HttpPutResponseHopLimit' has been provided and is not equal to # an integer of 1. # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData.MetadataOptions' has not been provided # Then: PASS # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData.MetadataOptions' has been provided # And: 'LaunchTemplateData.MetadataOptions.HttpEndpoint' has not been provided or has been provided and is # equal to 'enabled' # And: 'LaunchTemplateData.MetadataOptions.HttpPutResponseHopLimit' has not been provided # Then: PASS # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData.MetadataOptions' has been provided # And: 'LaunchTemplateData.MetadataOptions.HttpEndpoint' has not been provided or has been provided and is # equal to 'enabled' # And: 'LaunchTemplateData.MetadataOptions.HttpPutResponseHopLimit' has been provided and is equal to an # integer of 1. # Then: PASS # # Constants # let EC2_LAUNCH_TEMPLATE_TYPE = "AWS::EC2::LaunchTemplate" let INPUT_DOCUMENT = this # # Assignments # let ec2_launch_templates = Resources.*[ Type == %EC2_LAUNCH_TEMPLATE_TYPE ] # # Primary Rules # rule ec2_launch_template_token_hop_limit_check when is_cfn_template(this) %ec2_launch_templates not empty { check(%ec2_launch_templates.Properties) << [CT.EC2.PR.2]: Require that Amazon EC2 launch templates restrict the token hop limit to a maximum of one [FIX]: Within the 'LaunchTemplateData' property, provide a 'MetadataOptions' configuration with the value of 'HttpPutResponseLimit' set to '1', or omit the 'HttpPutResponseLimit' property to adopt the AWS CloudFormation default value of '1'. >> } rule ec2_launch_template_token_hop_limit_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_LAUNCH_TEMPLATE_TYPE) { check(%INPUT_DOCUMENT.%EC2_LAUNCH_TEMPLATE_TYPE.resourceProperties) << [CT.EC2.PR.2]: Require that Amazon EC2 launch templates restrict the token hop limit to a maximum of one [FIX]: Within the 'LaunchTemplateData' property, provide a 'MetadataOptions' configuration with the value of 'HttpPutResponseLimit' set to '1', or omit the 'HttpPutResponseLimit' property to adopt the AWS CloudFormation default value of '1'. >> } # # Parameterized Rules # rule check(ec2_launch_template) { %ec2_launch_template[ # Scenario 2, 3 and 4 filter_launch_template(this) ] { # Scenario 5 and 6 LaunchTemplateData { MetadataOptions not exists or MetadataOptions { HttpPutResponseHopLimit not exists or HttpPutResponseHopLimit == 1 } } } } rule filter_launch_template(ec2_launch_template) { %ec2_launch_template { LaunchTemplateData exists LaunchTemplateData is_struct LaunchTemplateData { MetadataOptions not exists or filter_metadata_options_provided(this) } } } rule filter_metadata_options_provided(options) { %options { MetadataOptions is_struct MetadataOptions { HttpEndpoint not exists or HttpEndpoint == "enabled" } } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.EC2.PR.2exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: InstanceType: t3.micro ImageId: Ref: LatestAmiId

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: MetadataOptions: HttpPutResponseHopLimit: 2

[CT.EC2.PR.3] Exiger qu'aucune règle du groupe de sécurité Amazon EC2 n'utilise la plage d'adresses IP source 0.0.0.0/0 ou ::/0 pour des ports autres que 80 et 443

Ce contrôle vérifie si une règle de groupe de sécurité Amazon EC2 contient la chaîne 0.0.0.0/0 ou s'il s'agit d'une ::/0 plage d'adresses IP source. Ce contrôle n'est pas déclenché si une règle autorise la connexion au port 80 ou 443 avec TCP, UDP, ICMP ou ICMPv6. L'utilisation de listes de préfixes gérées n'est pas prise en charge.

  • Objectif de contrôle : limiter l'accès au réseau

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources :AWS::EC2::SecurityGroup, AWS::EC2::SecurityGroupIngress

  • AWS CloudFormationrègle de garde : CT.EC2.PR.3spécification des règles

Détails et exemples

Explication

Les groupes de sécurité autorisent le filtrage avec état du trafic réseau entrant et sortant vers des ressources AWS. Interdire l'utilisation des chaînes 0.0.0.0/0 ou contribuer ::/0 à se protéger contre cette mauvaise configuration courante et encourage les utilisateurs à choisir une plage conforme aux principes du moindre privilège.

AWSrecommande une approche par couches, afin de garantir que l'accès au réseau est fourni uniquement dans la mesure où cela est nécessaire pour répondre aux besoins de votre entreprise. Les règles des groupes de sécurité doivent respecter le principe de l'accès le moins privilégié. L'accès illimité augmente les risques d'activités malveillantes. À moins qu'un port ne soit spécifiquement autorisé, le port doit refuser l'accès illimité (toute adresse IP avec un /0 suffixe).

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux ressources d'entrée du groupe de sécurité Amazon EC2 et du groupe de sécurité EC2 avec des règles d'entrée qui autorisent le trafic entrant en provenance ou 0.0.0.0/0 ::/0

  • Ce contrôle n'autorise pas l'utilisation de la SourcePrefixListId propriété sur les ressources Amazon EC2 Security Group et Amazon EC2 Security Group Ingress.

Corrections en cas de défaillance des règles

Assurez-vous que les groupes de sécurité disposent de règles d'entrée qui autorisent le trafic TCP ou UDP en provenance 0.0.0.0/0 ou ::/0 en provenance de ports 80 ou uniquement. 443

L'utilisation de listes de préfixes gérées n'est pas prise en charge.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Groupe de sécurité Amazon EC2 : premier exemple

Groupe de sécurité Amazon EC2 autorisant le trafic TCP entrant depuis un port. 0.0.0.0/0 80 L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "SecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": { "Fn::Sub": "${AWS::StackName}-example" }, "SecurityGroupIngress": [ { "IpProtocol": "tcp", "CidrIp": "0.0.0.0/0", "FromPort": 80, "ToPort": 80 } ] } } }

Exemple YAML

SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: !Sub '${AWS::StackName}-example' SecurityGroupIngress: - IpProtocol: tcp CidrIp: '0.0.0.0/0' FromPort: 80 ToPort: 80

Les exemples suivants montrent comment mettre en œuvre cette correction.

Groupe de sécurité Amazon EC2 : deuxième exemple

Groupe de sécurité Amazon EC2 autorisant le trafic TCP entrant depuis un port. 0.0.0.0/0 443 L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "SecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": { "Fn::Sub": "${AWS::StackName}-example" }, "SecurityGroupIngress": [ { "IpProtocol": "tcp", "CidrIp": "0.0.0.0/0", "FromPort": 443, "ToPort": 443 } ] } } }

Exemple YAML

SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: !Sub '${AWS::StackName}-example' SecurityGroupIngress: - IpProtocol: tcp CidrIp: '0.0.0.0/0' FromPort: 443 ToPort: 443

CT.EC2.PR.3spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # vpc_sg_open_only_to_authorized_ports_check # # Description: # This control checks whether the Amazon EC2 security group contains the string '0.0.0.0/0' or '::/0' as a source IP range. # This control is not triggered if a rule allows connection to port 80 or 443 with TCP, UDP, ICMP, or ICMPv6. # # Reports on: # AWS::EC2::SecurityGroup, AWS::EC2::SecurityGroupIngress # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document does not contain any Amazon EC2 security group or EC2 security group ingress resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document contains an Amazon EC2 security group resource or EC2 security group ingress resource # And: The EC2 security group or EC2 security group ingress resource does not allow inbound traffic from a source # prefix list and has no rules allowing inbound traffic from source '0.0.0.0/0' or '::/0' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document contains an Amazon EC2 security group resource or EC2 security group ingress resource # And: The EC2 security group or EC2 security group ingress resource has rules allowing inbound traffic # from a source prefix list, or source '0.0.0.0/0' or '::/0' # And: The EC2 security group or EC2 security group ingress resource has a rule that allows all traffic # ('IpProtocol' is set to '-1' or another protocol number) # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document contains an Amazon EC2 security group resource or EC2 security group ingress resource # And: The EC2 security group or EC2 security group ingress resource has rules allowing inbound traffic # from a source prefix list, or source '0.0.0.0/0' or '::/0' # And: The EC2 security group or EC2 security group ingress resource has no rules that allow all traffic # ('IpProtocol' is not set to '-1' or another protocol number) # And: Ports allowed are not in the list of allowed ports # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document contains an Amazon EC2 security group resource or EC2 security group ingress resource # And: The EC2 security group or EC2 security group ingress resource has rules allowing inbound traffic # from a source prefix list, or source '0.0.0.0/0' or '::/0' # And: The EC2 security group or EC2 security group ingress resource has no rules that allow all traffic # ('IpProtocol' is not set to '-1' or another protocol number) # And: Ports allowed are in the list of allowed ports # Then: PASS # # Constants # let SECURITY_GROUP_TYPE = "AWS::EC2::SecurityGroup" let SECURITY_GROUP_INGRESS_TYPE = "AWS::EC2::SecurityGroupIngress" let ALLOWED_PORTS = [80, 443] let AUTHORIZED_PROTOCOLS = ["tcp", "udp", "icmp", "icmpv6"] let UNRESTRICTED_IPV4_RANGES = ["0.0.0.0/0"] let UNRESTRICTED_IPV6_RANGES = ["::/0"] let INPUT_DOCUMENT = this # # Assignments # let ec2_security_groups = Resources[ Type == %SECURITY_GROUP_TYPE ] let ec2_security_group_ingress_rules = Resources[ Type == %SECURITY_GROUP_INGRESS_TYPE ] # # Primary Rules # rule vpc_sg_open_only_to_authorized_ports_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_security_groups not empty { check_security_group(%ec2_security_groups.Properties) << [CT.EC2.PR.3]: Require that any Amazon EC2 security group rule does not use the source IP range 0.0.0.0/0 or ::/0 for ports other than 80 and 443 [FIX]: Ensure that security groups with ingress rules that allow TCP or UDP traffic from '0.0.0.0/0' or '::/0' only allow traffic to ports 80 or 443. The use of managed prefix lists is not supported. >> } rule vpc_sg_open_only_to_authorized_ports_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_security_group_ingress_rules not empty { check_ingress_rule(%ec2_security_group_ingress_rules.Properties) << [CT.EC2.PR.3]: Require that any Amazon EC2 security group rule does not use the source IP range 0.0.0.0/0 or ::/0 for ports other than 80 and 443 [FIX]: Ensure that security groups with ingress rules that allow TCP or UDP traffic from '0.0.0.0/0' or '::/0' only allow traffic to ports 80 or 443. The use of managed prefix lists is not supported. >> } rule vpc_sg_open_only_to_authorized_ports_check when is_cfn_hook(%INPUT_DOCUMENT, %SECURITY_GROUP_TYPE) { check_security_group(%INPUT_DOCUMENT.%SECURITY_GROUP_TYPE.resourceProperties) << [CT.EC2.PR.3]: Require that any Amazon EC2 security group rule does not use the source IP range 0.0.0.0/0 or ::/0 for ports other than 80 and 443 [FIX]: Ensure that security groups with ingress rules that allow TCP or UDP traffic from '0.0.0.0/0' or '::/0' only allow traffic to ports 80 or 443. The use of managed prefix lists is not supported. >> } rule vpc_sg_open_only_to_authorized_ports_check when is_cfn_hook(%INPUT_DOCUMENT, %SECURITY_GROUP_INGRESS_TYPE) { check_ingress_rule(%INPUT_DOCUMENT.%SECURITY_GROUP_INGRESS_TYPE.resourceProperties) << [CT.EC2.PR.3]: Require that any Amazon EC2 security group rule does not use the source IP range 0.0.0.0/0 or ::/0 for ports other than 80 and 443 [FIX]: Ensure that security groups with ingress rules that allow TCP or UDP traffic from '0.0.0.0/0' or '::/0' only allow traffic to ports 80 or 443. The use of managed prefix lists is not supported. >> } # # Parameterized Rules # rule check_security_group(security_group) { %security_group [ SecurityGroupIngress exists SecurityGroupIngress is_list SecurityGroupIngress not empty ] { SecurityGroupIngress[*] { check_ingress_rule(this) } } } rule check_ingress_rule(ingress_rule) { %ingress_rule[ CidrIp in %UNRESTRICTED_IPV4_RANGES or CidrIpv6 in %UNRESTRICTED_IPV6_RANGES or SourcePrefixListId exists ] { # Scenario 3 IpProtocol exists IpProtocol in %AUTHORIZED_PROTOCOLS when IpProtocol in ["tcp", "udp"] { FromPort exists ToPort exists # Scenarios 4 and 5 check_ports(FromPort, ToPort) } } } rule check_ports(from_port, to_port) { %from_port in %ALLOWED_PORTS %to_port in %ALLOWED_PORTS %from_port in %to_port } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.EC2.PR.3exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Fn::Sub: ${AWS::StackName}-example SecurityGroupIngress: - IpProtocol: tcp CidrIp: 0.0.0.0/0 FromPort: 80 ToPort: 80

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: PrefixList: Type: AWS::EC2::PrefixList Properties: PrefixListName: Fn::Sub: ${AWS::StackName}-example AddressFamily: IPv4 MaxEntries: 10 Entries: - Cidr: "0.0.0.0/0" Description: Public internet SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Fn::Sub: ${AWS::StackName}-example SecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: Fn::GetAtt: [ SecurityGroup, GroupId ] IpProtocol: -1 SourcePrefixListId: Ref: PrefixList

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Fn::Sub: ${AWS::StackName}-example SecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: Fn::GetAtt: [ SecurityGroup, GroupId ] IpProtocol: udp CidrIp: 0.0.0.0/0 FromPort: 80 ToPort: 90

[CT.EC2.PR.4] Exiger qu'aucune règle du groupe de sécurité Amazon EC2 n'utilise la plage d'adresses IP source 0.0.0.0/0 ou ::/0 pour des ports à haut risque spécifiques

Ce contrôle vérifie si une règle de groupe de sécurité Amazon EC2 contenant les chaînes 0.0.0.0/0 ou en ::/0 tant que plage d'adresses IP source n'autorise pas le trafic TCP, UDP, ICMP ou ICMPv6 entrant vers les ports suivants :3389,,,20,23,110,143,3306,8080,1433,9200,9300,25,445,,135,21,1434, 43335432,5500. 5601 22 3000 5000 8088 8888 L'utilisation de listes de préfixes gérées n'est pas prise en charge.

  • Objectif de contrôle : limiter l'accès au réseau

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources :AWS::EC2::SecurityGroup, AWS::EC2::SecurityGroupIngress

  • AWS CloudFormationrègle de garde : CT.EC2.PR.4spécification des règles

Détails et exemples

Explication

Les groupes de sécurité autorisent le filtrage avec état du trafic réseau entrant et sortant vers des ressources AWS. Interdire l'utilisation des chaînes 0.0.0.0/0 ou contribuer ::/0 à se protéger contre cette mauvaise configuration courante et encourage les utilisateurs à choisir une plage conforme aux principes du moindre privilège.

AWSrecommande une approche par couches, afin de garantir que l'accès au réseau est fourni uniquement dans la mesure où cela est nécessaire pour répondre aux besoins de votre entreprise. Aucun groupe de sécurité ne doit autoriser un accès d'entrée illimité aux ports suivants :

3389, 20, 23, 110, 143, 3306, 8080, 1433, 9200, 9300, 25, 445, 135, 21, 1434, 4333, 5432, 5500, 5601, 22, 3000, 5000, 8088, 8888.

L'accès illimité (0.0.0.0/0) augmente les risques d'activités malveillantes, telles que le piratage, les denial-of-service attaques et la perte de données.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement au groupe de sécurité Amazon EC2 et aux ressources d'entrée du groupe de sécurité avec des règles d'entrée qui autorisent le trafic entrant en provenance ou. 0.0.0.0/0 ::/0

  • Ce contrôle n'autorise pas l'utilisation de la SourcePrefixListId propriété sur les ressources Amazon EC2 Security Group et Amazon EC2 Security Group Ingress.

Corrections en cas de défaillance des règles

Supprimez les règles d'entrée du groupe de sécurité Amazon EC2 qui autorisent le trafic en provenance 0.0.0.0/0 ou ::/0 à destination de ports à haut risque : 3389 20 23110,143,,3306,8080,1433,,9200,9300,25,445,,135,21,1434,4333,,5432,5500,5601,, 223000,5000. 8088 8888

L'utilisation de listes de préfixes gérées n'est pas prise en charge.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Groupe de sécurité Amazon EC2 : exemple

Le groupe de sécurité Amazon EC2 est configuré pour autoriser le trafic depuis la plage d'adresses IP source 0.0.0.0/0 ou ::/0 sur une plage de ports qui n'inclut pas de port à haut risque. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "SecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "sample-security-group", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "CidrIp": "0.0.0.0/0", "FromPort": 80, "ToPort": 80 } ] } } }

Exemple YAML

SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: sample-security-group SecurityGroupIngress: - IpProtocol: tcp CidrIp: '0.0.0.0/0' FromPort: 80 ToPort: 80

Les exemples suivants montrent comment mettre en œuvre cette correction.

Règle d'entrée du groupe de sécurité Amazon EC2 : exemple

Règle d'entrée du groupe de sécurité Amazon EC2 configurée pour autoriser le trafic provenant de la plage d'adresses IP source 0.0.0.0/0 ou ::/0 d'une plage de ports n'incluant pas de port à haut risque. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "SecurityGroupIngress": { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { "GroupId": { "Fn::GetAtt": [ "SecurityGroup", "GroupId" ] }, "IpProtocol": "tcp", "CidrIp": "0.0.0.0/0", "FromPort": 80, "ToPort": 90 } } }

Exemple YAML

SecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: !GetAtt 'SecurityGroup.GroupId' IpProtocol: tcp CidrIp: '0.0.0.0/0' FromPort: 80 ToPort: 90

CT.EC2.PR.4spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # vpc_sg_restricted_common_ports_check # # Description: # This control checks whether an Amazon EC2 security group rule that contains the strings '0.0.0.0/0' or '::/0' as a source IP range # does not allow incoming TCP, UDP, ICMP, ICMPv6 traffic to the following ports: '3389', '20', '23', '110', '143', # '3306', '8080', '1433', '9200', '9300', '25', '445', '135', '21', '1434', '4333', '5432', '5500', '5601', '22', '3000', '5000', # '8088', '8888'. # # Reports on: # AWS::EC2::SecurityGroup, AWS::EC2::SecurityGroupIngress # # Evaluates: # AWS CloudFormation, AWS CloudFormation Hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any EC2 security group or EC2 security group ingress resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 security group resource or EC2 security group ingress resource # And: EC2 security group or EC2 security group ingress resource does not allow inbound traffic from a source # prefix list and has no rules allowing inbound traffic from source '0.0.0.0/0' or '::/0' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 security group resource or EC2 security group ingress resource # And: EC2 security group or EC2 security group ingress resource has rules allowing inbound traffic # from a source prefix list, or source '0.0.0.0/0' or '::/0' # And: EC2 security group or EC2 security group ingress resource has a rule that allows all traffic # ('IpProtocol' is set to '-1' or another protocol number) # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 security group resource or EC2 security group ingress resource # And: EC2 security group or EC2 security group ingress resource has rules allowing inbound traffic # from a source prefix list, or source '0.0.0.0/0' or '::/0' # And: EC2 security group or EC2 security group ingress resource has no rules that allow all traffic # ('IpProtocol' is not set to '-1' or another protocol number) # And: Ports allowed are in the list of blocked ports # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 security group resource or EC2 security group ingress resource # And: EC2 security group or EC2 security group ingress resource has rules allowing inbound traffic # from a source prefix list, or source '0.0.0.0/0' or '::/0' # And: EC2 security group or EC2 security group ingress resource has no rules that allow all traffic # ('IpProtocol' is not set to '-1' or another protocol number) # And: Ports allowed are not in the list of blocked ports # Then: PASS # # Constants # let SECURITY_GROUP_TYPE = "AWS::EC2::SecurityGroup" let SECURITY_GROUP_INGRESS_TYPE = "AWS::EC2::SecurityGroupIngress" let BLOCKED_PORTS = [3389, 20, 23, 110, 143, 3306, 8080, 1433, 9200, 9300, 25, 445, 135, 21, 1434, 4333, 5432, 5500, 5601, 22, 3000, 5000, 8088, 8888] let AUTHORIZED_PROTOCOLS = ["tcp", "udp", "icmp", "icmpv6"] let UNRESTRICTED_IPV4_RANGES = ["0.0.0.0/0"] let UNRESTRICTED_IPV6_RANGES = ["::/0"] let INPUT_DOCUMENT = this # # Assignments # let ec2_security_groups = Resources[ Type == %SECURITY_GROUP_TYPE ] let ec2_security_group_ingress_rules = Resources[ Type == %SECURITY_GROUP_INGRESS_TYPE ] # # Primary Rules # rule vpc_sg_restricted_common_ports_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_security_groups not empty { check_security_group(%ec2_security_groups.Properties) << [CT.EC2.PR.4]: Require that any Amazon EC2 security group rule does not use the source IP range 0.0.0.0/0 or ::/0 for specific high-risk ports [FIX]: Remove Amazon EC2 security group ingress rules that allow traffic from '0.0.0.0/0' or '::/0' to high-risk ports: '3389', '20', '23', '110', '143', '3306', '8080', '1433', '9200', '9300', '25', '445', '135', '21', '1434', '4333', '5432', '5500', '5601', '22', '3000', '5000', '8088', '8888'. The use of managed prefix lists is not supported. >> } rule vpc_sg_restricted_common_ports_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_security_group_ingress_rules not empty { check_ingress_rule(%ec2_security_group_ingress_rules.Properties) << [CT.EC2.PR.4]: Require that any Amazon EC2 security group rule does not use the source IP range 0.0.0.0/0 or ::/0 for specific high-risk ports [FIX]: Remove Amazon EC2 security group ingress rules that allow traffic from '0.0.0.0/0' or '::/0' to high-risk ports: '3389', '20', '23', '110', '143', '3306', '8080', '1433', '9200', '9300', '25', '445', '135', '21', '1434', '4333', '5432', '5500', '5601', '22', '3000', '5000', '8088', '8888'. The use of managed prefix lists is not supported. >> } rule vpc_sg_restricted_common_ports_check when is_cfn_hook(%INPUT_DOCUMENT, %SECURITY_GROUP_TYPE) { check_security_group(%INPUT_DOCUMENT.%SECURITY_GROUP_TYPE.resourceProperties) << [CT.EC2.PR.4]: Require that any Amazon EC2 security group rule does not use the source IP range 0.0.0.0/0 or ::/0 for specific high-risk ports [FIX]: Remove Amazon EC2 security group ingress rules that allow traffic from '0.0.0.0/0' or '::/0' to high-risk ports: '3389', '20', '23', '110', '143', '3306', '8080', '1433', '9200', '9300', '25', '445', '135', '21', '1434', '4333', '5432', '5500', '5601', '22', '3000', '5000', '8088', '8888'. The use of managed prefix lists is not supported. >> } rule vpc_sg_restricted_common_ports_check when is_cfn_hook(%INPUT_DOCUMENT, %SECURITY_GROUP_INGRESS_TYPE) { check_ingress_rule(%INPUT_DOCUMENT.%SECURITY_GROUP_INGRESS_TYPE.resourceProperties) << [CT.EC2.PR.4]: Require that any Amazon EC2 security group ruledoes not use the source IP range 0.0.0.0/0 or ::/0 for specific high-risk ports [FIX]: Remove Amazon EC2 security group ingress rules that allow traffic from '0.0.0.0/0' or '::/0' to high-risk ports: '3389', '20', '23', '110', '143', '3306', '8080', '1433', '9200', '9300', '25', '445', '135', '21', '1434', '4333', '5432', '5500', '5601', '22', '3000', '5000', '8088', '8888'. The use of managed prefix lists is not supported. >> } # # Parameterized Rules # rule check_security_group(security_group) { %security_group [ SecurityGroupIngress exists SecurityGroupIngress is_list SecurityGroupIngress not empty ] { SecurityGroupIngress[*] { check_ingress_rule(this) } } } rule check_ingress_rule(ingress_rule) { %ingress_rule[ CidrIp in %UNRESTRICTED_IPV4_RANGES or CidrIpv6 in %UNRESTRICTED_IPV6_RANGES or SourcePrefixListId exists ] { # Scenario 3 IpProtocol exists IpProtocol in %AUTHORIZED_PROTOCOLS when IpProtocol in ["tcp", "udp"] { FromPort exists ToPort exists let ingress_block = this %BLOCKED_PORTS.* { # Scenarios 4 and 5 check_ports(this, %ingress_block.FromPort, %ingress_block.ToPort) } } } } rule check_ports(port, FromPort, ToPort) { %FromPort > %port or %ToPort < %port } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.EC2.PR.4exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Fn::Sub: ${AWS::StackName}-example SecurityGroupIngress: - IpProtocol: tcp CidrIp: 0.0.0.0/0 FromPort: 80 ToPort: 80

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: PrefixList: Type: AWS::EC2::PrefixList Properties: PrefixListName: Fn::Sub: ${AWS::StackName}-example AddressFamily: IPv4 MaxEntries: 10 Entries: - Cidr: "0.0.0.0/0" Description: Public internet SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Fn::Sub: ${AWS::StackName}-example SecurityGroupIngress: - IpProtocol: -1 SourcePrefixListId: Ref: PrefixList

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Fn::Sub: ${AWS::StackName}-example SecurityGroupIngress: - IpProtocol: tcp CidrIp: 0.0.0.0/0 FromPort: 22 ToPort: 22

[CT.EC2.PR.5] Exigez n'importe quelle ACL du réseau Amazon EC2 pour empêcher l'entrée de 0.0.0.0/0 vers le port 22 ou le port 3389

Ce contrôle vérifie si l'entrée entrante de l'ACL du réseau Amazon EC2 autorise le trafic entrant (0.0.0.0/0ou::/0) illimité pour le SSH ou le RDP.

  • Objectif de contrôle : limiter l'accès au réseau

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::NetworkAclEntry

  • AWS CloudFormationrègle de garde : CT.EC2.PR.5spécification des règles

Détails et exemples

Explication

L'accès aux ports d'administration du serveur distant, tels que le port 22 (SSH) et le port 3389 (RDP), ne doit pas être accessible au public, car ces ports peuvent permettre un accès involontaire aux ressources de votre VPC.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux ressources d'entrée ACL du réseau Amazon EC2 qui autorisent le trafic entrant sans restriction.

Corrections en cas de défaillance des règles

Pour les entrées ACL du réseau Amazon EC2 qui autorisent la connectivité entrante sur le port 22 ou le port 3389, indiquez une plage d'adresses CIDR comprise CidrBlock ou interdisant le trafic provenant de toutes Ipv6CidrBlock les sources.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Entrée ACL sur le réseau Amazon EC2 - Exemple 1

Entrée ACL réseau Amazon EC2 configurée pour autoriser le trafic TCP IPv4 entrant illimité dans une plage de ports à l'exception du port 22 (SSH) et du port 3389 (RDP). L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "NetworkAclEntry": { "Type": "AWS::EC2::NetworkAclEntry", "Properties": { "CidrBlock": "0.0.0.0/0", "Egress": false, "NetworkAclId": { "Ref": "NACL" }, "Protocol": 6, "PortRange": { "From": 2000, "To": 2005 }, "RuleAction": "allow", "RuleNumber": 100 } } }

Exemple YAML

NetworkAclEntry: Type: AWS::EC2::NetworkAclEntry Properties: CidrBlock: '0.0.0.0/0' Egress: false NetworkAclId: !Ref 'NACL' Protocol: 6 PortRange: From: 2000 To: 2005 RuleAction: allow RuleNumber: 100

Les exemples suivants montrent comment mettre en œuvre cette correction.

Entrée ACL sur le réseau Amazon EC2 - Exemple 2

Entrée ACL réseau Amazon EC2 configurée pour autoriser le trafic UDP IPv6 entrant illimité dans une plage de ports à l'exception du port 3389 (RDP). L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "NetworkAclEntry": { "Type": "AWS::EC2::NetworkAclEntry", "Properties": { "Ipv6CidrBlock": "::/0", "Egress": false, "NetworkAclId": { "Ref": "NACL" }, "Protocol": 17, "PortRange": { "From": 100, "To": 200 }, "RuleAction": "allow", "RuleNumber": 100 } } }

Exemple YAML

NetworkAclEntry: Type: AWS::EC2::NetworkAclEntry Properties: Ipv6CidrBlock: ::/0 Egress: false NetworkAclId: !Ref 'NACL' Protocol: 17 PortRange: From: 100 To: 200 RuleAction: allow RuleNumber: 100

CT.EC2.PR.5spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # nacl_no_unrestricted_ssh_rdp_check # # Description: # This control checks whether the Amazon EC2 network ACL inbound entry allows unrestricted incoming traffic ('0.0.0.0/0' or '::/0') for SSH or RDP. # # Reports on: # AWS::EC2::NetworkAclEntry # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any EC2 network ACL entry resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains a EC2 network ACL entry resource # And: EC2 network ACL entry resource has no CIDR block allowing inbound traffic # from source '0.0.0.0/0' or '::/0' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains a EC2 network ACL entry resource # And: EC2 network ACL entry resource allows inbound traffic # from source '0.0.0.0/0' or '::/0' # And: EC2 network ACL entry resource allows all traffic # ('IpProtocol' is set to '-1') # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains a EC2 network ACL entry resource # And: EC2 network ACL entry resource allows inbound traffic # from source '0.0.0.0/0' or '::/0' # And: EC2 network ACL entry resource allows TCP (protocol 6) traffic # And: EC2 network ACL entry resource allows traffic from a PortRange that includes 22 # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains a EC2 network ACL entry resource # And: EC2 network ACL entry resource allows inbound traffic # from source '0.0.0.0/0' or '::/0' # And: EC2 network ACL entry resource allows TCP (protocol 6) or UDP (protocol 17) traffic # And: EC2 network ACL entry resource allows traffic from a PortRange that includes 3389 # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains a EC2 network ACL entry resource # And: EC2 network ACL entry resource allows inbound traffic # from source '0.0.0.0/0' or '::/0' # And: EC2 network ACL entry resource allows TCP (protocol 6) traffic # And: EC2 network ACL entry resource allows traffic from a PortRange that excludes 22 # Then: PASS # Scenario: 7 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains a EC2 network ACL entry resource # And: EC2 network ACL entry resource allows inbound traffic # from source '0.0.0.0/0' or '::/0' # And: EC2 network ACL entry resource allows TCP (protocol 6) or UDP (protocol 17) traffic # And: EC2 network ACL entry resource allows traffic from a PortRange that excludes 3389 # Then: PASS # # Constants # let NETWORK_ACL_TYPE = "AWS::EC2::NetworkAclEntry" let INPUT_DOCUMENT = this let ALL_TRAFFIC_PROTOCOL = [-1, "-1"] let TCP_PROTOCOL = [6, "6"] let UDP_PROTOCOL = [17, "17"] let UNRESTRICTED_IPV4_RANGES = ["0.0.0.0/0"] let UNRESTRICTED_IPV6_RANGES = ["::/0"] let SSH_PORT = 22 let RDP_PORT = 3389 # # Assignments # let nacl_entries = Resources.*[ Type == %NETWORK_ACL_TYPE ] # # Primary Rules # rule nacl_no_unrestricted_ssh_rdp_check when is_cfn_template(%INPUT_DOCUMENT) %nacl_entries not empty { check(%nacl_entries.Properties) << [CT.EC2.PR.5]: Require any Amazon EC2 network ACL to prevent ingress from 0.0.0.0/0 to port 22 or port 3389 [FIX]: For Amazon EC2 network ACL entries that allow inbound connectivity on port 22 or port 3389, provide a CIDR range in 'CidrBlock' or 'Ipv6CidrBlock' that does not allow traffic from all sources. >> } rule nacl_no_unrestricted_ssh_rdp_check when is_cfn_hook(%INPUT_DOCUMENT, %NETWORK_ACL_TYPE) { check(%INPUT_DOCUMENT.%NETWORK_ACL_TYPE.resourceProperties) << [CT.EC2.PR.5]: Require any Amazon EC2 network ACL to prevent ingress from 0.0.0.0/0 to port 22 or port 3389 [FIX]: For Amazon EC2 network ACL entries that allow inbound connectivity on port 22 or port 3389, provide a CIDR range in 'CidrBlock' or 'Ipv6CidrBlock' that does not allow traffic from all sources. >> } # # Parameterized Rules # rule check(nacl_entry) { %nacl_entry [ # Scenario 2 filter_allow_unrestricted_ingress(this) ] { # Scenario 3 Protocol exists Protocol not in %ALL_TRAFFIC_PROTOCOL # Scenario 4, 6 check_for_open_ssh(this) # Scenario 5, 7 check_for_open_rdp(this) } } rule filter_allow_unrestricted_ingress(nacl_entry) { Egress not exists or Egress != true CidrBlock in %UNRESTRICTED_IPV4_RANGES or Ipv6CidrBlock in %UNRESTRICTED_IPV6_RANGES RuleAction == "allow" } rule check_for_open_ssh(nacl_entry) { %nacl_entry [ Protocol in %TCP_PROTOCOL ] { check_port_range_exists(this) check_ports(%SSH_PORT, PortRange.From, PortRange.To) } } rule check_for_open_rdp(nacl_entry) { %nacl_entry [ Protocol in %TCP_PROTOCOL or Protocol in %UDP_PROTOCOL ] { check_port_range_exists(this) check_ports(%RDP_PORT, PortRange.From, PortRange.To) } } rule check_port_range_exists(nacl_entry) { PortRange exists PortRange is_struct PortRange { From exists To exists } } rule check_ports(port, nacl_from_port, nacl_to_port) { %nacl_from_port > %port or %nacl_to_port < %port } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, NETWORK_ACL_TYPE) { %doc.%NETWORK_ACL_TYPE.resourceProperties exists }

CT.EC2.PR.5exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 192.168.0.0/16 NACL: Type: AWS::EC2::NetworkAcl Properties: VpcId: Ref: VPC NetworkAclEntry: Type: AWS::EC2::NetworkAclEntry Properties: CidrBlock: 0.0.0.0/0 Egress: false NetworkAclId: Ref: NACL Protocol: 6 PortRange: From: 2000 To: 2005 RuleAction: allow RuleNumber: 100

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 192.168.0.0/16 NACL: Type: AWS::EC2::NetworkAcl Properties: VpcId: Ref: VPC NetworkAclEntry: Type: AWS::EC2::NetworkAclEntry Properties: CidrBlock: 0.0.0.0/0 Egress: false NetworkAclId: Ref: NACL Protocol: 6 PortRange: From: 3000 To: 3500 RuleAction: allow RuleNumber: 100

[CT.EC2.PR.6] Exiger que les passerelles de transit Amazon EC2 refusent les demandes de pièces jointes automatiques Amazon VPC

Ce contrôle vérifie si les passerelles de transit Amazon EC2 sont configurées pour accepter automatiquement les demandes de pièces jointes Amazon VPC.

  • Objectif de contrôle : limiter l'accès au réseau

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::TransitGateway

  • AWS CloudFormationrègle de garde : CT.EC2.PR.6spécification des règles

Détails et exemples

Explication

L'activation de cette AutoAcceptSharedAttachments propriété configure une passerelle de transit pour accepter automatiquement les demandes de pièce jointe VPC entre comptes, sans vérifier la demande ou le compte d'origine de la pièce jointe. Conformément aux meilleures pratiques en matière d'autorisation et d'authentification, nous vous recommandons de désactiver cette fonctionnalité afin de garantir que seules les demandes de pièces jointes VPC autorisées sont acceptées.

Corrections en cas de défaillance des règles

Omettez la AutoAcceptSharedAttachments propriété ou définissez la propriété sur. disable

Les exemples suivants montrent comment mettre en œuvre cette correction.

AWS Transit Gateway : exemple

AWS Transit Gateway est configuré pour désactiver l'acceptation automatique des pièces jointes Amazon VPC entre comptes. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "TransitGateway": { "Type": "AWS::EC2::TransitGateway", "Properties": { "AutoAcceptSharedAttachments": "disable" } } }

Exemple YAML

TransitGateway: Type: AWS::EC2::TransitGateway Properties: AutoAcceptSharedAttachments: disable

CT.EC2.PR.6spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_transit_gateway_auto_vpc_attach_disabled_check # # Description: # This control checks whether Amazon EC2 transit gateways are configured to accept Amazon VPC attachment requests automatically. # # Reports on: # AWS::EC2::TransitGateway # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any EC2 transit gateway resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 transit gateway resource # And: 'AutoAcceptSharedAttachments' configuration has been provided and is set to a value other than 'disable' # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 transit gateway resource # And: 'AutoAcceptSharedAttachments' configuration has not been provided # Then: PASS # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 transit gateway resource # And: 'AutoAcceptSharedAttachments' configuration has been provided and set to 'disable' # Then: PASS # # Constants # let EC2_TRANSIT_GATEWAY_TYPE = "AWS::EC2::TransitGateway" let INPUT_DOCUMENT = this # # Assignments # let ec2_transit_gateway = Resources.*[ Type == %EC2_TRANSIT_GATEWAY_TYPE ] # # Primary Rules # rule ec2_transit_gateway_auto_vpc_attach_disabled_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_transit_gateway not empty { check(%ec2_transit_gateway.Properties) << [CT.EC2.PR.6]: Require that Amazon EC2 transit gateways refuse automatic Amazon VPC attachment requests [FIX]: Omit the 'AutoAcceptSharedAttachments' property or set the property to 'disable'. >> } rule ec2_transit_gateway_auto_vpc_attach_disabled_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_TRANSIT_GATEWAY_TYPE) { check(%INPUT_DOCUMENT.%EC2_TRANSIT_GATEWAY_TYPE.resourceProperties) << [CT.EC2.PR.6]: Require that Amazon EC2 transit gateways refuse automatic Amazon VPC attachment requests [FIX]: Omit the 'AutoAcceptSharedAttachments' property or set the property to 'disable'. >> } # # Parameterized Rules # rule check(ec2_transit_gateway) { %ec2_transit_gateway { # Scenario 3 AutoAcceptSharedAttachments not exists or # Scenario 2 and 4 AutoAcceptSharedAttachments == "disable" } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.EC2.PR.6exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: TransitGateway: Type: AWS::EC2::TransitGateway Properties: AutoAcceptSharedAttachments: disable

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: TransitGateway: Type: AWS::EC2::TransitGateway Properties: AutoAcceptSharedAttachments: enable

[CT.EC2.PR.7] Exiger qu'une ressource de volume Amazon EBS soit chiffrée au repos lorsqu'elle est définie au moyen de la AWS::EC2::Instance BlockDeviceMappingspropriété ou du type de AWS::EC2::Volumeressource

Ce contrôle vérifie si votre volume autonome Amazon EC2 EBS et votre volume Amazon Elastic Block Store (EBS) créés via les mappages de périphériques par blocs d'instances EC2 sont chiffrés au repos. Plus précisément, il vérifie que la propriété Encrypted est définie sur true dans la définition de ressource de volume EBS ou dans la propriété de définition de ressource d'une instance EC2. BlockDeviceMappings

  • Objectif de contrôle : crypter les données au repos

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources :AWS::EC2::Instance, AWS::EC2::Volume

  • AWS CloudFormationrègle de garde : CT.EC2.PR.7spécification des règles

Détails et exemples

Explication

Pour renforcer la sécurité de vos données sensibles dans les volumes Amazon EC2 EBS, vous devez activer le chiffrement EBS au repos. Le chiffrement Amazon EBS offre une solution simple de chiffrement pour vos ressources EBS, qui n'exige pas de développer, contrôler ni sécuriser votre propre infrastructure de gestion de clés. Il utilise des clés KMS lors de la création de volumes chiffrés et de snapshots.

Les volumes Amazon Elastic Block Store (EBS) peuvent être hérités de :

  • L'Amazon Machine Image (AMI) spécifiée avec la ImageId propriété

  • Le modèle de lancement spécifié avec la LaunchTemplateId propriété

Considérations d'utilisation
  • Pour les mappages de périphériques par blocs d'instance Amazon EC2, ce contrôle ne vérifie aucun mappage de périphérique par blocs créé au moyen d'un modèle de lancement EC2 ou hérité via l'AMI à partir de laquelle l'instance est lancée.

Corrections en cas de défaillance des règles

Définissez Encryption ce paramètre sur true sur les volumes Amazon EC2 EBS.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Instance Amazon EC2 : exemple

Instance Amazon EC2 avec un volume EBS chiffré. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": { "Ref": "LatestAmiId" }, "InstanceType": "t3.micro", "NetworkInterfaces": [ { "DeviceIndex": 0, "SubnetId": { "Ref": "Subnet" }, "AssociatePublicIpAddress": false } ], "BlockDeviceMappings": [ { "DeviceName": "/dev/sdm", "Ebs": { "VolumeType": "gp3", "Iops": 200, "Encrypted": true, "DeleteOnTermination": true, "VolumeSize": 20 } } ] } } }

Exemple YAML

EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: !Ref 'LatestAmiId' InstanceType: t3.micro NetworkInterfaces: - DeviceIndex: 0 SubnetId: !Ref 'Subnet' AssociatePublicIpAddress: false BlockDeviceMappings: - DeviceName: /dev/sdm Ebs: VolumeType: gp3 Iops: 200 Encrypted: true DeleteOnTermination: true VolumeSize: 20

Les exemples suivants montrent comment mettre en œuvre cette correction.

Volume Amazon EBS - Exemple

Volume Amazon EBS avec chiffrement configuré. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EBSVolume": { "Type": "AWS::EC2::Volume", "Properties": { "Size": 100, "AvailabilityZone": { "Fn::Select": [ 0, { "Fn::GetAZs": "" } ] }, "Encrypted": true } } }

Exemple YAML

EBSVolume: Type: AWS::EC2::Volume Properties: Size: 100 AvailabilityZone: !Select - 0 - !GetAZs '' Encrypted: true

CT.EC2.PR.7spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_encrypted_volumes_check # # Description: # Checks whether standalone Amazon EC2 EBS volumes and new EC2 EBS volumes created through EC2 instance # Block Device Mappings are encrypted at rest. # # Reports on: # AWS::EC2::Instance, AWS::EC2::Volume # # Evaluates: # AWS CloudFormation, CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document does not contain any Amazon EC2 volume resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'BlockDeviceMappings' has not been provided or has been provided as an empty list # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'BlockDeviceMappings' has been provided as a non-empty list # And: 'Ebs' has been provided in a 'BlockDeviceMappings' configuration # And: 'Encrypted' has not been provided in the 'Ebs' configuration # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'BlockDeviceMappings' has been provided as a non-empty list # And: 'Ebs' has been provided in a 'BlockDeviceMappings' configuration # And: 'Encrypted' has been provided in the 'Ebs' configuration and set to bool(false) # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document contains an EC2 volume resource # And: 'Encrypted' on the EC2 volume has not been provided # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document contains an EC2 volume resource # And: 'Encrypted' on the EC2 volume has been provided and is set to bool(false) # Then: FAIL # Scenario: 7 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'BlockDeviceMappings' has been provided as a non-empty list # And: 'Ebs' has been provided in a 'BlockDeviceMappings' configuration # And: 'Encrypted' has been provided in the 'Ebs' configuration and set to bool(true) # Then: PASS # Scenario: 8 # Given: The input document is an AWS CloudFormation or CloudFormation hook document # And: The input document contains an EC2 volume resource # And: 'Encrypted' on the EC2 volume has been provided and is set to bool(true) # Then: PASS # # Constants # let EC2_VOLUME_TYPE = "AWS::EC2::Volume" let EC2_INSTANCE_TYPE = "AWS::EC2::Instance" let INPUT_DOCUMENT = this # # Assignments # let ec2_volumes = Resources.*[ Type == %EC2_VOLUME_TYPE ] let ec2_instances = Resources.*[ Type == %EC2_INSTANCE_TYPE ] # # Primary Rules # rule ec2_encrypted_volumes_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_volumes not empty { check_volume(%ec2_volumes.Properties) << [CT.EC2.PR.7]: Require that an Amazon EBS volume attached to an Amazon EC2 instance is encrypted at rest [FIX]: Set 'Encryption' to true on EC2 EBS Volumes. >> } rule ec2_encrypted_volumes_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_VOLUME_TYPE) { check_volume(%INPUT_DOCUMENT.%EC2_VOLUME_TYPE.resourceProperties) << [CT.EC2.PR.7]: Require that an Amazon EBS volume attached to an Amazon EC2 instance is encrypted at rest [FIX]: Set 'Encryption' to true on EC2 EBS Volumes. >> } rule ec2_encrypted_volumes_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_instances not empty { check_instance(%ec2_instances.Properties) << [CT.EC2.PR.7]: Require that an Amazon EBS volume attached to an Amazon EC2 instance is encrypted at rest [FIX]: Set 'Encryption' to true on EC2 EBS Volumes. >> } rule ec2_encrypted_volumes_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_INSTANCE_TYPE) { check_instance(%INPUT_DOCUMENT.%EC2_INSTANCE_TYPE.resourceProperties) << [CT.EC2.PR.7]: Require that an Amazon EBS volume attached to an Amazon EC2 instance is encrypted at rest [FIX]: Set 'Encryption' to true on EC2 EBS Volumes. >> } # # Parameterized Rules # rule check_instance(ec2_instance) { %ec2_instance[ filter_ec2_instance_block_device_mappings(this) ] { BlockDeviceMappings[ Ebs exists Ebs is_struct ] { check_volume(Ebs) } } } rule check_volume(ec2_volume) { %ec2_volume { # Scenario 2 Encrypted exists # Scenarios 3 and 4 Encrypted == true } } rule filter_ec2_instance_block_device_mappings(ec2_instance) { %ec2_instance { BlockDeviceMappings exists BlockDeviceMappings is_list BlockDeviceMappings not empty } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.EC2.PR.7exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: Ref: LatestAmiId InstanceType: t3.micro NetworkInterfaces: - DeviceIndex: 0 SubnetId: Ref: Subnet AssociatePublicIpAddress: false BlockDeviceMappings: - DeviceName: "/dev/sdm" Ebs: VolumeType: gp3 Iops: 200 Encrypted: true DeleteOnTermination: true VolumeSize: 20

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: Ref: LatestAmiId InstanceType: t3.micro NetworkInterfaces: - DeviceIndex: 0 SubnetId: Ref: Subnet AssociatePublicIpAddress: false BlockDeviceMappings: - DeviceName: "/dev/sdm" Ebs: VolumeType: gp3 Iops: 200 Encrypted: false DeleteOnTermination: true VolumeSize: 20

[CT.EC2.PR.8] Exiger qu'une instance Amazon EC2 soit définie AssociatePublicIpAddresssur false sur une nouvelle interface réseau créée au moyen de la NetworkInterfacespropriété de la ressource AWS::EC2::Instance

Ce contrôle vérifie si votre instance Amazon EC2 est configurée pour ne pas associer d'adresse IP publique par défaut. Ce contrôle nécessite notamment de configurer le AssociatePublicIpAddressparamètre sur false sur une nouvelle interface réseau créée au moyen de la NetworkInterfacespropriété.

  • Objectif de contrôle : limiter l'accès au réseau

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::Instance

  • AWS CloudFormationrègle de garde : CT.EC2.PR.8spécification des règles

Détails et exemples

Ce contrôle est incompatible avec AWS Cloud9

Il existe un problème de compatibilité avec AWS Cloud9 ce contrôle proactif d'AWS Control Tower[CT.EC2.PR.8] Exiger qu'une instance Amazon EC2 soit définie AssociatePublicIpAddresssur false sur une nouvelle interface réseau créée au moyen de la NetworkInterfacespropriété de la ressource AWS::EC2::Instance. Si ce contrôle est activé, vous ne pouvez pas créer d'environnement Amazon EC2 dans. AWS Cloud9 Pour plus d'informations, consultez DépannageAWS Cloud9.

Explication

Une adresse IPv4 publique est une adresse IP accessible depuis Internet. Si vous lancez votre instance avec une adresse IP publique, votre instance EC2 est accessible depuis Internet. Une adresse IPv4 privée est une adresse IP qui n'est pas accessible depuis Internet. Vous pouvez utiliser des adresses IPv4 privées pour la communication entre les instances EC2 d'un même VPC ou de votre réseau privé connecté.

Les adresses IPv6 sont uniques au monde et sont donc accessibles depuis Internet. Cependant, par défaut, tous les sous-réseaux ont l'attribut d'adressage IPv6 défini sur false.

Les paramètres de l'interface réseau peuvent être hérités du modèle de lancement spécifié avec la LaunchTemplateIdpropriété.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement à une nouvelle interface réseau créée au moyen de la NetworkInterfacespropriété, où a n'NetworkInterfaceIda pas été spécifié.

  • Ce contrôle nécessite que les informations de sous-réseau soient spécifiées dans une NetworkInterfaces configuration plutôt que dans la SubnetId propriété de niveau racine.

  • Ce contrôle ne vérifie pas une interface réseau qui peut être créée dans un modèle de lancement Amazon EC2 qui peut être référencé par la LaunchTemplateIdpropriété.

  • Il existe un problème de compatibilité avec AWS Cloud9 ce contrôle proactif d'AWS Control Tower. Si ce contrôle est activé, vous ne pouvez pas créer d'environnement Amazon EC2 dans. AWS Cloud9

Corrections en cas de défaillance des règles

Spécifiez les interfaces réseau à l'aide de la NetworkInterfaces propriété plutôt que de la SubnetId propriété de niveau racine. AssociatePublicIpAddressDéfini sur false dans chaque NetworkInterfaces configuration.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Instance Amazon EC2 : exemple

Instance Amazon EC2 configurée avec une nouvelle interface qui désactive l'association d'adresses IP publiques lors de la création. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "InstanceType": "t3.micro", "ImageId": { "Ref": "LatestAmiId" }, "NetworkInterfaces": [ { "DeviceIndex": 0, "SubnetId": { "Ref": "Subnet" }, "AssociatePublicIpAddress": false } ] } } }

Exemple YAML

EC2Instance: Type: AWS::EC2::Instance Properties: InstanceType: t3.micro ImageId: !Ref 'LatestAmiId' NetworkInterfaces: - DeviceIndex: 0 SubnetId: !Ref 'Subnet' AssociatePublicIpAddress: false

CT.EC2.PR.8spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_instance_no_public_ip_check # # Description: # This control checks whether your Amazon EC2 instance is configured to associate a public IP address. # # Reports on: # AWS::EC2::Instance # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any EC2 instance resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'NetworkInterfaces' is not present on the EC2 instance resource or is an empty list # And: 'SubnetId' is not provided as a top-level resource property # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'NetworkInterfaces' is present on the EC2 instance resource as a non-empty list # And: 'NetworkInterfaceId' is present for a configuration in 'NetworkInterfaces' and is a non-empty string or # valid local reference # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'NetworkInterfaces' is not provided # And: 'SubnetId' is provided as a top-level resource property # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'NetworkInterfaces' is present on the EC2 instance resource with one or more configurations # And: 'NetworkInterfaceId' is not present or is present and and is an empty string or invalid local reference for # a configuration in 'NetworkInterfaces' # And: 'AssociatePublicIpAddress' is not present for a configuration in 'NetworkInterfaces' # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'NetworkInterfaces' is present on the EC2 instance resource # And: 'NetworkInterfaceId' is not present or is present and and is an empty string or invalid local reference for # a configuration in 'NetworkInterfaces' # And: 'AssociatePublicIpAddress' is present for a configuration in 'NetworkInterfaces' # And: 'AssociatePublicIpAddress' is set to bool(true) # Then: FAIL # Scenario: 7 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'NetworkInterfaces' is present on the EC2 instance resource # And: 'NetworkInterfaceId' is not present or is present and and is an empty string or invalid local reference for # a configuration in 'NetworkInterfaces' # And: 'AssociatePublicIpAddress' is present for a configuration in 'NetworkInterfaces' # And: 'AssociatePublicIpAddress' is set to bool(false) # Then: PASS # # Constants # let EC2_INSTANCE_TYPE = "AWS::EC2::Instance" let INPUT_DOCUMENT = this # # Assignments # let ec2_instances = Resources.*[ Type == %EC2_INSTANCE_TYPE ] # # Primary Rules # rule ec2_instance_no_public_ip_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_instances not empty { check(%ec2_instances.Properties) << [CT.EC2.PR.8]: Require any Amazon EC2 instance to have a non-public IP address [FIX]: Specify network interfaces using the 'NetworkInterfaces' property instead of the root level 'SubnetId' property. Set 'AssociatePublicIpAddress' to false within each 'NetworkInterfaces' configuration. >> } rule ec2_instance_no_public_ip_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_INSTANCE_TYPE) { check(%INPUT_DOCUMENT.%EC2_INSTANCE_TYPE.resourceProperties) << [CT.EC2.PR.8]: Require any Amazon EC2 instance to have a non-public IP address [FIX]: Specify network interfaces using the 'NetworkInterfaces' property instead of the root level 'SubnetId' property. Set 'AssociatePublicIpAddress' to false within each 'NetworkInterfaces' configuration. >> } # # Parameterized Rules # rule check(ec2_instance) { %ec2_instance[ SubnetId exists ] { # Scenario 5 SubnetId not exists } %ec2_instance[ # Scenario 2 NetworkInterfaces exists NetworkInterfaces is_list NetworkInterfaces not empty ] { NetworkInterfaces[ # Scenario 3 and 4 filter_network_interfaces(this) ] { # Scenario 6 AssociatePublicIpAddress exists # Scenarios 7 and 8 AssociatePublicIpAddress == false } } } rule filter_network_interfaces(network_interface) { %network_interface { NetworkInterfaceId not exists or filter_property_is_empty_string(NetworkInterfaceId) or filter_exclude_valid_local_reference(%INPUT_DOCUMENT, NetworkInterfaceId, "AWS::EC2::NetworkInterface") } } rule filter_property_is_empty_string(value) { %value { this is_string this == /\A\s*\z/ } } rule filter_exclude_valid_local_reference(doc, reference_properties, referenced_resource_type) { %reference_properties { this not is_string this is_struct when this.'Fn::GetAtt' exists { 'Fn::GetAtt' { when filter_query_template_resources(%doc, this[0], %referenced_resource_type) { this not exists } this exists } } when this.'Fn::GetAtt' not exists { this exists } } } rule filter_query_template_resources(doc, resource_key, referenced_resource_type) { let referenced_resource = %doc.Resources[ keys == %resource_key ] %referenced_resource not empty %referenced_resource { Type in %referenced_resource_type } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.EC2.PR.8exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' EC2Instance: Type: AWS::EC2::Instance Properties: InstanceType: t3.micro ImageId: Ref: LatestAmiId NetworkInterfaces: - DeviceIndex: 0 SubnetId: Ref: Subnet AssociatePublicIpAddress: false

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' EC2Instance: Type: AWS::EC2::Instance Properties: InstanceType: t3.micro ImageId: Ref: LatestAmiId SubnetId: Ref: Subnet

[CT.EC2.PR.9] Exiger qu'aucun modèle de lancement Amazon EC2 n'attribue automatiquement d'adresses IP publiques aux interfaces réseau

Ce contrôle vérifie si vos modèles de lancement Amazon EC2 sont configurés pour attribuer des adresses IP publiques aux interfaces réseau.

  • Objectif de contrôle : limiter l'accès au réseau

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::LaunchTemplate

  • AWS CloudFormationrègle de garde : CT.EC2.PR.9spécification des règles

Détails et exemples

Explication

Une adresse IP publique est une adresse IP accessible depuis Internet. Si vous configurez vos interfaces réseau avec une adresse IP publique, les ressources associées à ces interfaces réseau sont accessibles depuis Internet. Les ressources EC2 ne doivent pas être accessibles au public, car cela peut permettre un accès involontaire à vos serveurs d'applications.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux nouvelles interfaces réseau créées au moyen de la NetworkInterfaceId propriété in LaunchTemplateData (NetworkInterfacesconfigurations où a n'NetworkInterfaceIda pas été spécifié).

  • Ce contrôle nécessite AssociatePublicIpAddress de configurer false les nouvelles interfaces réseau créées à l'aide de la NetworkInterfaces propriété inLaunchTemplateData.

Corrections en cas de défaillance des règles

AssociatePublicIpAddressRéglez sur false dans chaque NetworkInterfaces configuration dansLaunchTemplateData.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Modèle de lancement Amazon EC2 - Exemple

Modèle de lancement Amazon EC2 configuré avec une interface réseau qui désactive l'association d'adresses IP publiques. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2LaunchTemplate": { "Type": "AWS::EC2::LaunchTemplate", "Properties": { "LaunchTemplateData": { "NetworkInterfaces": [ { "DeviceIndex": 0, "SubnetId": { "Ref": "Subnet" }, "AssociatePublicIpAddress": false } ] } } } }

Exemple YAML

EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: NetworkInterfaces: - DeviceIndex: 0 SubnetId: !Ref 'Subnet' AssociatePublicIpAddress: false

CT.EC2.PR.9spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_launch_template_public_ip_disabled_check # # Description: # This control checks whether your Amazon EC2 launch templates are configured to assign public IP addresses to network interfaces. # # Reports on: # AWS::EC2::LaunchTemplate # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any Amazon EC2 launch template resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 launch template resource # And: 'NetworkInterfaces' is not provided in 'LaunchTemplateData' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 launch template resource # And: 'LaunchTemplateData.NetworkInterfaces' is present on the Amazon EC2 launch template resource as a non empty list # And: 'NetworkInterfaceId' is present for a configuration in 'NetworkInterfaces' and is a non-empty string or # valid local reference # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 launch template resource # And: 'LaunchTemplateData.NetworkInterfaces' is present on the Amazon EC2 launch template resource # And: 'NetworkInterfaceId' is not present or is present and is an empty string or invalid local reference for # a configuration in 'NetworkInterfaces' # And: 'AssociatePublicIpAddress' is not present for a configuration in 'NetworkInterfaces' # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 launch template resource # And: 'LaunchTemplateData.NetworkInterfaces' is present on the Amazon EC2 launch template resource # And: 'NetworkInterfaceId' is not present or is present and is an empty string or invalid local reference for # a configuration in 'NetworkInterfaces' # And: 'AssociatePublicIpAddress' is present for a configuration in 'NetworkInterfaces' # And: 'AssociatePublicIpAddress' is set to bool(true) # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 launch template resource # And: 'LaunchTemplateData.NetworkInterfaces' is present on the Amazon EC2 launch template resource # And: 'NetworkInterfaceId' is not present or is present and is an empty string or invalid local reference for # a configuration in 'NetworkInterfaces' # And: 'AssociatePublicIpAddress' is present for a configuration in 'NetworkInterfaces' # And: 'AssociatePublicIpAddress' is set to bool(false) # Then: PASS # # Constants # let EC2_LAUNCH_TEMPLATE_TYPE = "AWS::EC2::LaunchTemplate" let INPUT_DOCUMENT = this # # Assignments # let ec2_launch_templates = Resources.*[ Type == %EC2_LAUNCH_TEMPLATE_TYPE ] # # Primary Rules # rule ec2_launch_template_public_ip_disabled_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_launch_templates not empty { check(%ec2_launch_templates.Properties) << [CT.EC2.PR.9]: Require any Amazon EC2 launch template not to auto-assign public IP addresses to network interfaces [FIX]: Set 'AssociatePublicIpAddress' to 'false' within each 'NetworkInterfaces' configuration in 'LaunchTemplateData'. >> } rule ec2_launch_template_public_ip_disabled_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_LAUNCH_TEMPLATE_TYPE) { check(%INPUT_DOCUMENT.%EC2_LAUNCH_TEMPLATE_TYPE.resourceProperties) << [CT.EC2.PR.9]: Require any Amazon EC2 launch template not to auto-assign public IP addresses to network interfaces [FIX]: Set 'AssociatePublicIpAddress' to 'false' within each 'NetworkInterfaces' configuration in 'LaunchTemplateData'. >> } # # Parameterized Rules # rule check(ec2_launch_templates) { %ec2_launch_templates[ # Scenario 2 filter_launch_template(this) ] { LaunchTemplateData { NetworkInterfaces[ # Scenario 3 and 4 filter_network_interfaces(this) ] { # Scenario 5 and 6 AssociatePublicIpAddress exists AssociatePublicIpAddress == false } } } } rule filter_launch_template(ec2_launch_template) { %ec2_launch_template { LaunchTemplateData exists LaunchTemplateData is_struct LaunchTemplateData { NetworkInterfaces exists NetworkInterfaces is_list NetworkInterfaces not empty } } } rule filter_network_interfaces(network_interface) { %network_interface { NetworkInterfaceId not exists or filter_property_is_empty_string(NetworkInterfaceId) or filter_exclude_valid_local_reference(%INPUT_DOCUMENT, NetworkInterfaceId, "AWS::EC2::NetworkInterface") } } rule filter_property_is_empty_string(value) { %value { this is_string this == /\A\s*\z/ } } rule filter_exclude_valid_local_reference(doc, reference_properties, referenced_resource_type) { %reference_properties { this not is_string this is_struct when this.'Fn::GetAtt' exists { 'Fn::GetAtt' { when query_for_resource(%doc, this[0], %referenced_resource_type) { this not exists } this exists } } when this.'Fn::GetAtt' not exists { this exists } } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists } rule query_for_resource(doc, resource_key, referenced_resource_type) { let referenced_resource = %doc.Resources[ keys == %resource_key ] %referenced_resource not empty %referenced_resource { Type == %referenced_resource_type } }

CT.EC2.PR.9exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: NetworkInterfaces: - DeviceIndex: 0 SubnetId: Ref: Subnet AssociatePublicIpAddress: false

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: NetworkInterfaces: - DeviceIndex: 0 SubnetId: Ref: Subnet AssociatePublicIpAddress: true

[CT.EC2.PR.10] Exiger les modèles de lancement Amazon EC2 pour activer la surveillance CloudWatch détaillée d'Amazon

Ce contrôle vérifie si la surveillance détaillée est activée sur le modèle de lancement Amazon EC2.

  • Objectif de contrôle : établir une journalisation et une surveillance

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::LaunchTemplate

  • AWS CloudFormationrègle de garde : CT.EC2.PR.10spécification des règles

Détails et exemples

Explication

La surveillance est essentielle pour assurer la fiabilité, la disponibilité et les performances de vos solutions AWS. Vous devez recueillir les données de surveillance de toutes les parties de votre solution AWS de telle sorte que vous puissiez déboguer plus facilement un éventuelle défaillance multipoint. Du point de vue de la sécurité, la journalisation est également une fonctionnalité importante pour permettre les futurs efforts de criminalistique en cas d'incident de sécurité.

Corrections en cas de défaillance des règles

DansLaunchTemplateData, fournissez une Monitoring configuration Enabled définie surtrue.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Modèle de lancement Amazon EC2 - Exemple

Modèle de lancement Amazon EC2 configuré avec la surveillance détaillée activée. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2LaunchTemplate": { "Type": "AWS::EC2::LaunchTemplate", "Properties": { "LaunchTemplateData": { "Monitoring": { "Enabled": true } } } } }

Exemple YAML

EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: Monitoring: Enabled: true

CT.EC2.PR.10spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_launch_template_monitoring_enabled_check # # Description: # This control checks whether the Amazon EC2 launch template has detailed monitoring enabled. # # Reports on: # AWS::EC2::LaunchTemplate # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any EC2 launch template resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData.Monitoring.Enabled' has not been provided or has been provided and is empty. # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData.Monitoring.Enabled' has been provided # And: 'LaunchTemplateData.Monitoring.Enabled' is equal to a value other than bool(true) # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'LaunchTemplateData.Monitoring.Enabled' has been provided # And: 'LaunchTemplateData.Monitoring.Enabled' is equal to bool(true) # Then: PASS # # Constants # let EC2_LAUNCH_TEMPLATE_TYPE = "AWS::EC2::LaunchTemplate" let INPUT_DOCUMENT = this # # Assignments # let ec2_launch_templates = Resources.*[ Type == %EC2_LAUNCH_TEMPLATE_TYPE ] # # Primary Rules # rule ec2_launch_template_monitoring_enabled_check when is_cfn_template(this) %ec2_launch_templates not empty { check(%ec2_launch_templates.Properties) << [CT.EC2.PR.10]: Require Amazon EC2 launch templates to have Amazon CloudWatch detailed monitoring activated [FIX]: In 'LaunchTemplateData', provide a 'Monitoring' configuration with 'Enabled' set to 'true'. >> } rule ec2_launch_template_monitoring_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_LAUNCH_TEMPLATE_TYPE) { check(%INPUT_DOCUMENT.%EC2_LAUNCH_TEMPLATE_TYPE.resourceProperties) << [CT.EC2.PR.10]: Require Amazon EC2 launch templates to have Amazon CloudWatch detailed monitoring activated [FIX]: In 'LaunchTemplateData', provide a 'Monitoring' configuration with 'Enabled' set to 'true'. >> } # # Parameterized Rules # rule check(ec2_launch_template) { %ec2_launch_template { # Scenario 2 LaunchTemplateData exists LaunchTemplateData is_struct LaunchTemplateData { Monitoring exists Monitoring is_struct # Scenario 3 and 4 Monitoring { Enabled exists Enabled == true } } } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.EC2.PR.10exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: Monitoring: Enabled: true

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: EC2LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: Monitoring: Enabled: false

[CT.EC2.PR.11] Exiger qu'un sous-réseau Amazon EC2 n'attribue pas automatiquement d'adresses IP publiques

Ce contrôle vérifie si vos sous-réseaux Amazon VPC attribuent automatiquement des adresses IP publiques.

  • Objectif de contrôle : limiter l'accès au réseau

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::Subnet

  • AWS CloudFormationrègle de garde : CT.EC2.PR.11spécification des règles

Détails et exemples

Explication

Tous les sous-réseaux possèdent un attribut qui détermine si une interface réseau créée dans le sous-réseau reçoit automatiquement une adresse IPv4 publique. Lorsqu'elles sont lancées dans des sous-réseaux sur lesquels cet attribut est activé, les instances reçoivent une adresse IP publique attribuée à leur interface réseau principale.

Considérations d'utilisation
  • Ce contrôle désactive l'attribution automatique d'adresses IP publiques pour les nouvelles interfaces réseau dans les sous-réseaux Amazon VPC.

  • Lorsque ce contrôle est activé, des adresses IP publiques peuvent être attribuées aux interfaces réseau au moyen de paramètres au niveau des ressources. (Par exemple, l'attribution d'une adresse IP publique peut être effectuée au moment du lancement de l'instance EC2.)

Corrections en cas de défaillance des règles

Omettez la MapPublicIpOnLaunch propriété pour utiliser la configuration par défaut, ou définissez la MapPublicIpOnLaunch propriété sur. false

Les exemples suivants montrent comment mettre en œuvre cette correction.

Sous-réseau Amazon VPC : premier exemple

Le sous-réseau Amazon VPC est configuré pour désactiver l'attribution automatique d'adresses IP publiques par défaut. AWS CloudFormation L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "Subnet": { "Type": "AWS::EC2::Subnet", "Properties": { "VpcId": { "Ref": "VPC" }, "CidrBlock": "10.0.0.0/24", "AvailabilityZone": { "Fn::Select": [ 0, { "Fn::GetAZs": "" } ] } } } }

Exemple YAML

Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref 'VPC' CidrBlock: 10.0.0.0/24 AvailabilityZone: !Select - 0 - !GetAZs ''

Les exemples suivants montrent comment mettre en œuvre cette correction.

Sous-réseau Amazon VPC : deuxième exemple

Le sous-réseau Amazon VPC est configuré pour désactiver l'attribution automatique d'adresses IP publiques au moyen de la propriété. MapPublicIpOnLaunch L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "Subnet": { "Type": "AWS::EC2::Subnet", "Properties": { "VpcId": { "Ref": "VPC" }, "CidrBlock": "10.0.0.0/24", "AvailabilityZone": { "Fn::Select": [ 0, { "Fn::GetAZs": "" } ] }, "MapPublicIpOnLaunch": false } } }

Exemple YAML

Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref 'VPC' CidrBlock: 10.0.0.0/24 AvailabilityZone: !Select - 0 - !GetAZs '' MapPublicIpOnLaunch: false

CT.EC2.PR.11spécification des règles

# ################################### ## Rule Specification ## ##################################### # # # Rule Identifier: # subnet_auto_assign_public_ip_disabled_check # # Description: # This control checks whether your Amazon VPC subnets automatically assign public IP addresses. # # Reports on: # AWS::EC2::Subnet # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any EC2 subnet resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 subnet resource # And: 'MapPublicIpOnLaunch' is present and set to bool(true) # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 subnet resource # And: 'MapPublicIpOnLaunch' is not present # Then: PASS # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 subnet resource # And: 'MapPublicIpOnLaunch' is present and set to bool(false) # Then: PASS # # Constants # let EC2_SUBNET_TYPE = "AWS::EC2::Subnet" let INPUT_DOCUMENT = this # # Assignments # let ec2_subnets = Resources.*[ Type == %EC2_SUBNET_TYPE ] # # Primary Rules # rule subnet_auto_assign_public_ip_disabled_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_subnets not empty { check(%ec2_subnets.Properties) << [CT.EC2.PR.11]: Require that an Amazon EC2 subnet does not automatically assign public IP addresses [FIX]: Omit the 'MapPublicIpOnLaunch' property to use the default configuration, or set the 'MapPublicIpOnLaunch' property to 'false'. >> } rule subnet_auto_assign_public_ip_disabled_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_SUBNET_TYPE) { check(%INPUT_DOCUMENT.%EC2_SUBNET_TYPE.resourceProperties) << [CT.EC2.PR.11]: Require that an Amazon EC2 subnet does not automatically assign public IP addresses [FIX]: Omit the 'MapPublicIpOnLaunch' property to use the default configuration, or set the 'MapPublicIpOnLaunch' property to 'false'. >> } # # Parameterized Rules # rule check(ec2_subnet) { %ec2_subnet { # Scenario 3 MapPublicIpOnLaunch not exists or # Scenarios 2 and 4 MapPublicIpOnLaunch == false } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.EC2.PR.11exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: ''

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' MapPublicIpOnLaunch: true

[CT.EC2.PR.12] Exiger qu'une instance Amazon EC2 spécifie au plus une interface réseau au moyen de la NetworkInterfacespropriété de la ressource AWS::EC2::Instance

Ce contrôle vérifie si votre instance Amazon Elastic Compute Cloud (Amazon EC2) utilise plusieurs ENI (Elastic Network Interfaces). Plus précisément, il vérifie si une AWS::EC2::Instanceressource spécifie plusieurs ENI dans la NetworkInterfacespropriété.

  • Objectif de contrôle : protéger les configurations

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::Instance

  • AWS CloudFormationrègle de garde : CT.EC2.PR.12spécification des règles

Détails et exemples

Explication

Plusieurs ENI peuvent provoquer des instances à double hébergement, c'est-à-dire des instances dotées de plusieurs sous-réseaux. Cette duplication peut accroître la complexité de la sécurité du réseau et introduire des chemins et des accès réseau non intentionnels.

Les paramètres de l'interface réseau peuvent être hérités du modèle de lancement spécifié avec la LaunchTemplateIdpropriété.

Considérations d'utilisation
  • Ce contrôle ne vérifie pas une interface réseau qui peut être spécifiée dans un modèle de lancement Amazon EC2 et référencée par la LaunchTemplateIdpropriété.

  • Cette règle est incompatible avec les scénarios dans lesquels la NetworkInterfacespropriété doit être utilisée pour spécifier plusieurs ENI. Par exemple, ce contrôle peut échouer si une instance Amazon EC2 appartenant à un cluster Amazon EKS spécifie plusieurs ENI au moyen de cette propriété. NetworkInterfaces

Corrections en cas de défaillance des règles

Configurez les instances Amazon EC2 avec une seule ENI.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Instance Amazon EC2 : exemple

Instance EC2 dotée d'une interface réseau unique. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": { "Ref": "LatestAmiId" }, "NetworkInterfaces": [ { "SubnetId": { "Ref": "TestSubnet" }, "DeviceIndex": 0 } ] } } }

Exemple YAML

EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: !Ref 'LatestAmiId' NetworkInterfaces: - SubnetId: !Ref 'TestSubnet' DeviceIndex: 0

CT.EC2.PR.12spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_instance_multiple_eni_check # # Description: # Checks whether Amazon Elastic Compute Cloud (Amazon EC2) instances use multiple ENIs (Elastic Network Interfaces) # or Elastic Fabric Adapters (EFAs). # # Reports on: # AWS::EC2::Instance # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any Amazon EC2 instance resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'NetworkInterfaces' is not present or is present and contains 0 configurations # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'NetworkInterfaces' is present and contains >1 configurations # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'NetworkInterfaces' is present # And: 'NetworkInterfaces' is present and contains 1 configuration # Then: PASS # # Constants # let EC2_INSTANCE_TYPE = "AWS::EC2::Instance" let INPUT_DOCUMENT = this # # Assignments # let ec2_instances = Resources.*[ Type == %EC2_INSTANCE_TYPE ] # # Primary Rules # rule ec2_instance_multiple_eni_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_instances not empty { check(%ec2_instances.Properties) << [CT.EC2.PR.12]: Require an Amazon EC2 instance to configure one ENI only [FIX]: Configure Amazon EC2 instances with only one ENI. >> } rule ec2_instance_multiple_eni_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_INSTANCE_TYPE) { check(%INPUT_DOCUMENT.%EC2_INSTANCE_TYPE.resourceProperties) << [CT.EC2.PR.12]: Require an Amazon EC2 instance to configure one ENI only [FIX]: Configure Amazon EC2 instances with only one ENI. >> } # # Parameterized Rules # rule check(ec2_instance) { %ec2_instance [ # Scenario 2 NetworkInterfaces exists NetworkInterfaces is_list NetworkInterfaces not empty ] { # Scenario 3 and 4 NetworkInterfaces[1] not exists } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

CT.EC2.PR.12exemples de modèles

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: Ref: LatestAmiId InstanceType: t3.micro NetworkInterfaces: - SubnetId: Ref: Subnet DeviceIndex: 0

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: Ref: LatestAmiId InstanceType: t3.micro NetworkInterfaces: - SubnetId: Ref: Subnet DeviceIndex: 0 - SubnetId: Ref: Subnet DeviceIndex: 1

[CT.EC2.PR.13] Exiger l'activation de la surveillance détaillée sur une instance Amazon EC2

Ce contrôle vérifie si la surveillance détaillée est activée sur une instance Amazon EC2.

  • Objectif de contrôle : établir une journalisation et une surveillance

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::Instance

  • AWS CloudFormationrègle de garde : Spécification de la règle CT.EC2.PR.13

Détails et exemples

Explication

Par défaut, toutes les instances Amazon EC2 sont créées avec une surveillance de base qui envoie des journaux au niveau de l'hôte à Amazon CloudWatch toutes les cinq (5) minutes. Grâce à une surveillance détaillée, les journaux au niveau de l'hôte sont collectés toutes les (1) minutes, ce qui permet de détecter plus rapidement d'éventuelles activités malveillantes ou anormales.

Considérations d'utilisation
  • Lorsque vous activez le suivi détaillé, vous êtes facturé par métrique envoyée à CloudWatch. Vous n’êtes pas facturé pour le stockage des données. Pour plus d'informations, consultez la page de CloudWatch tarification d'Amazon.

Corrections en cas de défaillance des règles

Définissez Monitoring sur true.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Instance EC2 - Exemple

Instance EC2 avec surveillance détaillée activée. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "Parameters": { "LatestAmiId": { "Description": "Region specific latest AMI ID from the Parameter Store", "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>", "Default": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2" } }, "Resources": { "VPC": { "Type": "AWS::EC2::VPC", "Properties": { "CidrBlock": "10.0.0.0/16", "EnableDnsSupport": "true", "EnableDnsHostnames": "true" } }, "Subnet": { "Type": "AWS::EC2::Subnet", "Properties": { "VpcId": { "Ref": "VPC" }, "CidrBlock": "10.0.0.0/24" } }, "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": { "Ref": "LatestAmiId" }, "InstanceType": "t3.micro", "NetworkInterfaces": [ { "SubnetId": { "Ref": "Subnet" }, "DeviceIndex": 0 } ], "Monitoring": true } } } }

Exemple YAML

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref 'VPC' CidrBlock: 10.0.0.0/24 EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: !Ref 'LatestAmiId' InstanceType: t3.micro NetworkInterfaces: - SubnetId: !Ref 'Subnet' DeviceIndex: 0 Monitoring: true

Spécification de la règle CT.EC2.PR.13

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_instance_detailed_monitoring_enabled_check # # Description: # This control checks whether an Amazon EC2 instance has detailed monitoring enabled. # # Reports on: # AWS::EC2::Instance # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any EC2 instance resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'Monitoring' has not been provided # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 instance resource # And: 'Monitoring' has been provided and set to a value other than bool(true) # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation Hook Document # And: The input document contains an EC2 instance resource # And: 'Monitoring' has been provided and set to bool(true) # Then: PASS # # Constants # let EC2_INSTANCE_TYPE = "AWS::EC2::Instance" let INPUT_DOCUMENT = this # # Assignments # let ec2_instances = Resources.*[ Type == %EC2_INSTANCE_TYPE ] # # Primary Rules # rule ec2_instance_detailed_monitoring_enabled_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_instances not empty { check(%ec2_instances.Properties) << [CT.EC2.PR.13]: Require an Amazon EC2 instance to have detailed monitoring enabled [FIX]: Set 'Monitoring' to 'true'. >> } rule ec2_instance_detailed_monitoring_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_INSTANCE_TYPE) { check(%INPUT_DOCUMENT.%EC2_INSTANCE_TYPE.resourceProperties) << [CT.EC2.PR.13]: Require an Amazon EC2 instance to have detailed monitoring enabled [FIX]: Set 'Monitoring' to 'true'. >> } # # Parameterized Rules # rule check(ec2_instance) { %ec2_instance { # Scenario 2 Monitoring exists # Scenarios 3 and 4 Monitoring == true } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.EC2.PR.13

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: Ref: LatestAmiId InstanceType: t3.micro NetworkInterfaces: - SubnetId: Ref: Subnet DeviceIndex: 0 Monitoring: true

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: Ref: LatestAmiId InstanceType: t3.micro NetworkInterfaces: - SubnetId: Ref: Subnet DeviceIndex: 0 Monitoring: false

[CT.EC2.PR.14] Exiger un volume Amazon EBS configuré via un modèle de lancement Amazon EC2 pour chiffrer les données au repos

Ce contrôle vérifie si un modèle de lancement Amazon EC2 avec des mappages de périphériques par blocs de volume EBS est configuré pour activer le chiffrement des volumes EBS.

  • Objectif de contrôle : crypter les données au repos

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::LaunchTemplate

  • AWS CloudFormationrègle de garde : Spécification de la règle CT.EC2.PR.14

Détails et exemples

Explication

Pour renforcer la sécurité de vos données sensibles dans un volume EBS, vous devez activer le chiffrement EBS au repos. Amazon EBS Encryption propose une solution de chiffrement simple pour vos ressources EBS. Il ne vous oblige pas à créer, maintenir et sécuriser votre propre infrastructure de gestion des clés, et il utilise des clés KMS pour créer des volumes chiffrés et des instantanés.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement à un modèle de lancement EC2 qui spécifie les mappages de périphériques en mode bloc EBS.

  • Lorsque vous lancez une instance à l’aide d’un modèle de lancement, vous pouvez remplacer les paramètres spécifiés dans le modèle de lancement. Pour vous assurer que le chiffrement est activé pour les mappages de périphériques par blocs EBS lorsque vous lancez une instance avec un modèle de lancement au moyen de la AWS::EC2::Instance ressource, utilisez ce contrôle conjointement avec. CT.EC2.PR.7

Corrections en cas de défaillance des règles

Pour chaque entrée du BlockDeviceMappings paramètre avec une Ebs configuration, définissez ce paramètre Encryption sur true.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Modèle de lancement Amazon EC2 - Exemple

Modèle de lancement Amazon EC2 configuré avec un mappage de périphériques par blocs EBS sur lequel le chiffrement des volumes est activé. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "LaunchTemplate": { "Type": "AWS::EC2::LaunchTemplate", "Properties": { "LaunchTemplateData": { "BlockDeviceMappings": [ { "DeviceName": "/dev/sdc", "Ebs": { "Encrypted": true } } ] } } } }

Exemple YAML

LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: BlockDeviceMappings: - DeviceName: /dev/sdc Ebs: Encrypted: true

Spécification de la règle CT.EC2.PR.14

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_launch_template_encrypted_volumes_check # # Description: # This control checks whether an Amazon EC2 launch template with EBS volume block device mappings is configured to enable EBS volume encryption. # # Reports on: # AWS::EC2::LaunchTemplate # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any EC2 launch template resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'BlockDeviceMappings' in 'LaunchTemplateData' has not been provided or has # been provided as an empty list # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'BlockDeviceMappings' in 'LaunchTemplateData' been provided as a non-empty list # And: No entries in 'BlockDeviceMappings' contain 'Ebs' as a struct # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'BlockDeviceMappings' in 'LaunchTemplateData' been provided as a non-empty list # And: An entry in 'BlockDeviceMappings' contains 'Ebs' as a struct # And: In the same entry, 'Encrypted' in 'Ebs' has not been provided or has been provided # and set to a value other than bool(true) # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an EC2 launch template resource # And: 'BlockDeviceMappings' in 'LaunchTemplateData' been provided as a non-empty list # And: An entry in 'BlockDeviceMappings' contains 'Ebs' as a struct # And: In the same entry, 'Encrypted' in 'Ebs' has not been provided or has been provided # and set to bool(true) # Then: PASS # # Constants # let EC2_LAUNCH_TEMPLATE_TYPE = "AWS::EC2::LaunchTemplate" let INPUT_DOCUMENT = this # # Assignments # let ec2_launch_templates = Resources.*[ Type == %EC2_LAUNCH_TEMPLATE_TYPE ] # # Primary Rules # rule ec2_launch_template_encrypted_volumes_check when is_cfn_template(this) %ec2_launch_templates not empty { check(%ec2_launch_templates.Properties) << [CT.EC2.PR.14]: Require an Amazon EBS volume configured through an Amazon EC2 launch template to encrypt data at rest [FIX]: For every entry in the 'BlockDeviceMappings' parameter with an 'Ebs' configuration, set 'Encryption' to true. >> } rule ec2_launch_template_encrypted_volumes_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_LAUNCH_TEMPLATE_TYPE) { check(%INPUT_DOCUMENT.%EC2_LAUNCH_TEMPLATE_TYPE.resourceProperties) << [CT.EC2.PR.14]: Require an Amazon EBS volume configured through an Amazon EC2 launch template to encrypt data at rest [FIX]: For every entry in the 'BlockDeviceMappings' parameter with an 'Ebs' configuration, set 'Encryption' to true. >> } # # Parameterized Rules # rule check(ec2_launch_template) { %ec2_launch_template [ # Scenarios 2 and 3 filter_launch_template_contains_ebs_block_device_mappings(this) ] { LaunchTemplateData { BlockDeviceMappings[ Ebs exists Ebs is_struct ] { Ebs { # Scenarios 4 and 5 Encrypted exists Encrypted == true } } } } } rule filter_launch_template_contains_ebs_block_device_mappings(launch_template) { %launch_template { LaunchTemplateData exists LaunchTemplateData is_struct LaunchTemplateData { BlockDeviceMappings exists BlockDeviceMappings is_list BlockDeviceMappings not empty some BlockDeviceMappings[*] { Ebs exists Ebs is_struct } } } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.EC2.PR.14

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: BlockDeviceMappings: - DeviceName: /dev/sdc Ebs: Encrypted: true

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: BlockDeviceMappings: - DeviceName: /dev/sdc Ebs: Encrypted: false

[CT.EC2.PR.15] Exiger qu'une instance Amazon EC2 utilise un type d'instance AWS Nitro lors de la création à partir du type de ressource « » AWS::EC2::LaunchTemplate

Ce contrôle vérifie si les modèles de lancement Amazon EC2 qui spécifient un type d'instance Amazon EC2 ou utilisent une sélection d'instance basée sur des attributs spécifient AWS uniquement les types d'instances Nitro.

  • Objectif de contrôle : protéger l'intégrité des données, appliquer le moindre privilège

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::LaunchTemplate

  • AWS CloudFormationrègle de garde : Spécification de la règle CT.EC2.PR.15

Détails et exemples

Explication

Le système AWS Nitro est un ensemble de composants matériels et logiciels conçus AWS pour garantir des performances, une disponibilité et une sécurité élevées. Le système Nitro fournit une sécurité renforcée qui surveille, protège et vérifie en permanence le matériel et le microprogramme de l'instance. AWS Nitro transfère les ressources de virtualisation vers du matériel et des logiciels dédiés, ce qui minimise la surface d'attaque. Enfin, le système Nitro dispose d'un modèle de sécurité verrouillé qui interdit l'accès administratif, éliminant ainsi le risque d'erreur humaine ou de falsification.

Pour plus d'informations sur les types d'instances Nitro, consultez Instances créées sur le système Nitro dans le guide de l'utilisateur Amazon EC2 pour les instances Linux.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux modèles de lancement qui spécifient un type d'instance Amazon EC2 au moyen de la InstanceType propriété ou qui utilisent la sélection d'instance basée sur les attributs au moyen de la InstanceRequirements propriété.

  • Lorsque vous lancez une instance à l’aide d’un modèle de lancement, vous pouvez remplacer les paramètres spécifiés dans le modèle de lancement. Pour lancer des instances avec un type d'instance Nitro lors de l'utilisation d'un modèle de lancement, utilisez ce contrôle conjointement avec les contrôles proactifs associés.

Corrections en cas de défaillance des règles

Lorsqu'il InstanceType LaunchTemplateData est fourni, définissez un type InstanceType d'instance Amazon EC2 basé sur le système AWS Nitro. Lorsqu'il InstanceRequirements LaunchTemplateData est fourni, définissez AllowedInstanceTypes une liste de types d'instances Amazon EC2 basée sur le système AWS Nitro.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Modèle de lancement Amazon EC2 - Exemple 1

Un modèle de lancement Amazon EC2 configuré avec un type d'instance basé sur le système AWS Nitro. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "LaunchTemplate": { "Type": "AWS::EC2::LaunchTemplate", "Properties": { "LaunchTemplateData": { "InstanceType": "t3.micro" } } } }

Exemple YAML

LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: InstanceType: t3.micro

Les exemples suivants montrent comment mettre en œuvre cette correction.

Modèle de lancement Amazon EC2 - Exemple 2

Un modèle de lancement Amazon EC2 configuré avec une configuration des exigences d'instance qui inclut les instances autorisées basées sur le système AWS Nitro. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "LaunchTemplate": { "Type": "AWS::EC2::LaunchTemplate", "Properties": { "LaunchTemplateData": { "InstanceRequirements": { "AllowedInstanceTypes": [ "m5.*", "c5.*" ], "VCpuCount": { "Max": 16, "Min": 1 }, "MemoryMiB": { "Min": 1024, "Max": 17000 } } } } } }

Exemple YAML

LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: InstanceRequirements: AllowedInstanceTypes: - m5.* - c5.* VCpuCount: Max: 16 Min: 1 MemoryMiB: Min: 1024 Max: 17000

Spécification de la règle CT.EC2.PR.15

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_launch_template_nitro_instance_type_check # # Description: # This control checks whether Amazon EC2 launch templates that specify an Amazon EC2 instance type or use attribute based instance selection, specify only AWS Nitro instance types. # # Reports on: # AWS::EC2::LaunchTemplate # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any Amazon EC2 instance resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceType' or 'InstanceRequirements' in 'LaunchTemplateData' has not been provided # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceType' in 'LaunchTemplateData' has been provided # And: 'InstanceType' has been set to a non-Nitro instance type # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceRequirements' in 'LaunchTemplateData' has been provided as a struct # And: In 'InstanceRequirements', 'AllowedInstanceTypes' has not been provided or provided as # an empty list # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceRequirements' in 'LaunchTemplateData' has been provided as a struct # And: In 'InstanceRequirements', 'AllowedInstanceTypes' has been provided as a non-empty list # that contains one or more non-Nitro instance types # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceType' in 'LaunchTemplateData' has been provided # And: 'InstanceType' has been set to a Nitro instance type # Then: PASS # Scenario: 7 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceRequirements' in 'LaunchTemplateData' has been provided as a struct # And: In 'InstanceRequirements', 'AllowedInstanceTypes' has been provided as a non-empty list # that contains only Nitro instance types # Then: PASS # # Constants # let INPUT_DOCUMENT = this let EC2_LAUNCH_TEMPLATE_TYPE = "AWS::EC2::LaunchTemplate" let NITRO_INSTANCE_TYPES = [ /^a1\./, /^c5\./, /^c5a\./, /^c5ad\./, /^c5d\./, /^c5n\./, /^c6a\./, /^c6g\./, /^c6gd\./, /^c6gn\./, /^c6i\./, /^c6id\./, /^c6in\./, /^c7g\./, /^c7gd\./, /^c7gn\./, /^c7i\./, /^d3\./, /^d3en\./, /^dl1\./, /^g4ad\./, /^g4dn\./, /^g5\./, /^g5g\./, /^hpc6a\./, /^hpc6id\./, /^hpc7a\./, /^hpc7g\./, /^i3.metal$/, /^i3en\./, /^i4g\./, /^i4i\./, /^im4gn\./, /^inf1\./, /^inf2\./, /^is4gen\./, /^m5\./, /^m5a\./, /^m5ad\./, /^m5d\./, /^m5dn\./, /^m5n\./, /^m5zn\./, /^m6a\./, /^m6g\./, /^m6gd\./, /^m6i\./, /^m6id\./, /^m6idn\./, /^m6in\./, /^m7a\./, /^m7g\./, /^m7gd\./, /^m7i\./, /^m7i-flex\./, /^mac1.metal$/, /^mac2.metal$/, /^mac2-m2pro.metal$/, /^p3dn\./, /^p4d\./, /^p4de\./, /^p5\./, /^r5\./, /^r5a\./, /^r5ad\./, /^r5b\./, /^r5d\./, /^r5dn\./, /^r5n\./, /^r6a\./, /^r6g\./, /^r6gd\./, /^r6i\./, /^r6id\./, /^r6idn\./, /^r6in\./, /^r7g\./, /^r7gd\./, /^t3\./, /^t3a\./, /^t4g\./, /^trn1\./, /^trn1n\./, /^u-12tb1\./, /^u-18tb1\./, /^u-24tb1\./, /^u-3tb1\./, /^u-6tb1\./, /^u-9tb1\./, /^vt1\./, /^x2gd\./, /^x2idn\./, /^x2iedn\./, /^x2iezn\./, /^z1d\./ ] # # Assignments # let ec2_launch_templates = Resources.*[ Type == %EC2_LAUNCH_TEMPLATE_TYPE ] # # Primary Rules # rule ec2_launch_template_nitro_instance_type_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_launch_templates not empty { check(%ec2_launch_templates.Properties) << [CT.EC2.PR.15]: Require an Amazon EC2 instance to use an AWS Nitro instance type when creating from the 'AWS::EC2::LaunchTemplate' resource type [FIX]: When InstanceType in LaunchTemplateData has been provided, set InstanceType to an Amazon EC2 instance type that is based on the AWS Nitro system. When InstanceRequirements in LaunchTemplateData has been provided, set AllowedInstanceTypes to a list of Amazon EC2 instance types based on the AWS Nitro system. >> } rule ec2_launch_template_nitro_instance_type_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_LAUNCH_TEMPLATE_TYPE) { check(%INPUT_DOCUMENT.%EC2_LAUNCH_TEMPLATE_TYPE.resourceProperties) << [CT.EC2.PR.15]: Require an Amazon EC2 instance to use an AWS Nitro instance type when creating from the 'AWS::EC2::LaunchTemplate' resource type [FIX]: When InstanceType in LaunchTemplateData has been provided, set InstanceType to an Amazon EC2 instance type that is based on the AWS Nitro system. When InstanceRequirements in LaunchTemplateData has been provided, set AllowedInstanceTypes to a list of Amazon EC2 instance types based on the AWS Nitro system. >> } # # Parameterized Rules # rule check(ec2_launch_template) { %ec2_launch_template[ # Scenario 2 filter_instance_type_provided(this) ] { LaunchTemplateData { # Scenarios 3 and 6 InstanceType in %NITRO_INSTANCE_TYPES } } %ec2_launch_template[ # Scenario 2 filter_instance_requirements_provided(this) ] { LaunchTemplateData { InstanceRequirements is_struct InstanceRequirements { # Scenarios 4, 5 and 7 AllowedInstanceTypes exists AllowedInstanceTypes is_list AllowedInstanceTypes not empty AllowedInstanceTypes[*] in %NITRO_INSTANCE_TYPES } } } } rule filter_instance_type_provided(ec2_launch_template) { %ec2_launch_template { LaunchTemplateData exists LaunchTemplateData is_struct LaunchTemplateData { InstanceType exists } } } rule filter_instance_requirements_provided(ec2_launch_template) { %ec2_launch_template { LaunchTemplateData exists LaunchTemplateData is_struct LaunchTemplateData { InstanceRequirements exists } } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.EC2.PR.15

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: InstanceType: t3.micro

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: InstanceRequirements: AllowedInstanceTypes: - m5.* - c5.* VCpuCount: Max: 16 Min: 1 MemoryMiB: Min: 1024 Max: 17000

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: InstanceType: t2.micro

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: InstanceRequirements: AllowedInstanceTypes: - t2.micro VCpuCount: Max: 16 Min: 1 MemoryMiB: Min: 1024 Max: 17000

[CT.EC2.PR.16] Exiger qu'une instance Amazon EC2 utilise un type d'instance AWS Nitro lorsqu'elle est créée à l'aide du type de ressource « » AWS::EC2::Instance

Ce contrôle vérifie si une instance Amazon EC2 est configurée pour s'exécuter à l'aide d'un type d'instance AWS Nitro.

  • Objectif de contrôle : protéger l'intégrité des données, appliquer le moindre privilège

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::Instance

  • AWS CloudFormationrègle de garde : Spécification de la règle CT.EC2.PR.16

Détails et exemples

Explication

Le système Nitro est un ensemble de composants matériels et logiciels conçus AWS pour garantir des performances, une disponibilité et une sécurité élevées. Le système Nitro offre une sécurité renforcée car il surveille, protège et vérifie en permanence le matériel et le microprogramme de l'instance. Les ressources de virtualisation sont déchargées vers du matériel et des logiciels dédiés, minimisant ainsi la surface d'attaque. Le modèle de sécurité du système Nitro est verrouillé pour empêcher l'accès administratif, réduisant ainsi les risques d'erreur humaine et de falsification.

Considérations d'utilisation
  • Ce contrôle nécessite que la InstanceType propriété soit fournie et définie sur un type d'instance Nitro. Ce paramètre vous empêche d'hériter d'un type d'instance, par le biais d'un modèle de lancement Amazon EC2.

Corrections en cas de défaillance des règles

Définissez la valeur de la InstanceType propriété sur un type d'instance Amazon EC2 basé sur le système AWS Nitro.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Instance Amazon EC2 : exemple

Une instance Amazon EC2 configurée avec un type d'instance basé sur le système AWS Nitro. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": { "Ref": "LatestAmiId" }, "InstanceType": "t3.micro" } } }

Exemple YAML

EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: !Ref 'LatestAmiId' InstanceType: t3.micro

Spécification de la règle CT.EC2.PR.16

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_instance_nitro_instance_type_check # # Description: # This control checks whether an Amazon EC2 instance is configured to run using an AWS Nitro instance type. # # Reports on: # AWS::EC2::Instance # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any Amazon EC2 instance resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceType' has not been provided # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceType' been provided and set to a non-Nitro instance type # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceType' been provided and set to a Nitro instance type # Then: PASS # # Constants # let INPUT_DOCUMENT = this let EC2_INSTANCE_TYPE = "AWS::EC2::Instance" let NITRO_INSTANCE_TYPES = [ /^a1\./, /^c5\./, /^c5a\./, /^c5ad\./, /^c5d\./, /^c5n\./, /^c6a\./, /^c6g\./, /^c6gd\./, /^c6gn\./, /^c6i\./, /^c6id\./, /^c6in\./, /^c7g\./, /^c7gd\./, /^c7gn\./, /^c7i\./, /^d3\./, /^d3en\./, /^dl1\./, /^g4ad\./, /^g4dn\./, /^g5\./, /^g5g\./, /^hpc6a\./, /^hpc6id\./, /^hpc7a\./, /^hpc7g\./, /^i3.metal$/, /^i3en\./, /^i4g\./, /^i4i\./, /^im4gn\./, /^inf1\./, /^inf2\./, /^is4gen\./, /^m5\./, /^m5a\./, /^m5ad\./, /^m5d\./, /^m5dn\./, /^m5n\./, /^m5zn\./, /^m6a\./, /^m6g\./, /^m6gd\./, /^m6i\./, /^m6id\./, /^m6idn\./, /^m6in\./, /^m7a\./, /^m7g\./, /^m7gd\./, /^m7i\./, /^m7i-flex\./, /^mac1.metal$/, /^mac2-m2pro.metal$/, /^mac2.metal$/, /^p3dn\./, /^p4d\./, /^p4de\./, /^p5\./, /^r5\./, /^r5a\./, /^r5ad\./, /^r5b\./, /^r5d\./, /^r5dn\./, /^r5n\./, /^r6a\./, /^r6g\./, /^r6gd\./, /^r6i\./, /^r6id\./, /^r6idn\./, /^r6in\./, /^r7a\./, /^r7g\./, /^r7gd\./, /^r7iz\./, /^t3\./, /^t3a\./, /^t4g\./, /^trn1\./, /^trn1n\./, /^u-12tb1\./, /^u-18tb1\./, /^u-24tb1\./, /^u-3tb1\./, /^u-6tb1\./, /^u-9tb1\./, /^vt1\./, /^x2gd\./, /^x2idn\./, /^x2iedn\./, /^x2iezn\./, /^z1d\./ ] # # Assignments # let ec2_instances = Resources.*[ Type == %EC2_INSTANCE_TYPE ] # # Primary Rules # rule ec2_instance_nitro_instance_type_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_instances not empty { check(%ec2_instances.Properties) << [CT.EC2.PR.16]: Require an Amazon EC2 instance to use an AWS Nitro instance type when created using the 'AWS::EC2::Instance' resource type [FIX]: Set the value of the InstanceType property to an Amazon EC2 instance type based on the AWS Nitro system. >> } rule ec2_instance_nitro_instance_type_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_INSTANCE_TYPE) { check(%INPUT_DOCUMENT.%EC2_INSTANCE_TYPE.resourceProperties) << [CT.EC2.PR.16]: Require an Amazon EC2 instance to use an AWS Nitro instance type when created using the 'AWS::EC2::Instance' resource type [FIX]: Set the value of the InstanceType property to an Amazon EC2 instance type based on the AWS Nitro system. >> } # # Parameterized Rules # rule check(ec2_instance) { %ec2_instance { # Scenario 2 InstanceType exists # Scenarios 3 and 4 InstanceType in %NITRO_INSTANCE_TYPES } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.EC2.PR.16

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value "AWS::EC2::Image::Id" Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: Ref: LatestAmiId InstanceType: t3.micro

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value "AWS::EC2::Image::Id" Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: Ref: LatestAmiId InstanceType: t2.micro

[CT.EC2.PR.17] Exiger qu'un hôte dédié Amazon EC2 utilise un type d'instance AWS Nitro

Ce contrôle vérifie si un hôte dédié Amazon EC2 est configuré pour fonctionner à l'aide d'un type ou d'une famille d'instances AWS Nitro.

  • Objectif de contrôle : protéger l'intégrité des données, appliquer le moindre privilège

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::Host

  • AWS CloudFormationrègle de garde : Spécification de la règle CT.EC2.PR.17

Détails et exemples

Explication

Le système Nitro est un ensemble de composants matériels et logiciels conçus AWS pour garantir des performances, une disponibilité et une sécurité élevées. Le système Nitro offre une sécurité renforcée car il surveille, protège et vérifie en permanence le matériel et le microprogramme de l'instance. Les ressources de virtualisation sont déchargées vers du matériel et des logiciels dédiés, minimisant ainsi la surface d'attaque. Le modèle de sécurité du système Nitro est verrouillé pour empêcher l'accès administratif, réduisant ainsi les risques d'erreur humaine et de falsification.

Considérations d'utilisation
  • Lorsque vous allouez un hôte dédié dans votre compte, vous pouvez choisir une configuration qui prend en charge un seul type d'instance ou plusieurs types d'instances au sein d'une même famille d'instances. Le nombre d’instances que vous pouvez exécuter sur un hôte dépend de la configuration que vous choisissez. Consultez la section Configurations de capacité des instances dans le guide de l'utilisateur Amazon EC2 pour les instances Linux pour obtenir des informations sur la prise en charge des types d'instances uniques et multiples.

Corrections en cas de défaillance des règles

Définissez la valeur de la InstanceType propriété sur un type d'instance Amazon EC2 basé sur le système AWS Nitro et prenant en charge les hôtes dédiés, ou définissez la valeur de la InstanceFamily propriété sur une famille d'instances Amazon EC2 basée sur le système AWS Nitro et prenant en charge les hôtes dédiés et plusieurs types d'instances.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Hôte Amazon EC2 : premier exemple

Un hôte dédié Amazon EC2 configuré avec une famille d'instances basée sur le système AWS Nitro et prenant en charge les hôtes dédiés et plusieurs types d'instances. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "DedicatedHost": { "Type": "AWS::EC2::Host", "Properties": { "AutoPlacement": "on", "AvailabilityZone": { "Fn::Select": [ 0, { "Fn::GetAZs": "" } ] }, "InstanceFamily": "m5" } } }

Exemple YAML

DedicatedHost: Type: AWS::EC2::Host Properties: AutoPlacement: 'on' AvailabilityZone: !Select - 0 - !GetAZs '' InstanceFamily: m5

Les exemples suivants montrent comment mettre en œuvre cette correction.

Hôte Amazon EC2 : deuxième exemple

Un hôte dédié Amazon EC2 configuré avec un type d'instance basé sur le système AWS Nitro et prenant en charge les hôtes dédiés. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "DedicatedHost": { "Type": "AWS::EC2::Host", "Properties": { "AutoPlacement": "on", "AvailabilityZone": { "Fn::Select": [ 0, { "Fn::GetAZs": "" } ] }, "InstanceType": "m6a.large" } } }

Exemple YAML

DedicatedHost: Type: AWS::EC2::Host Properties: AutoPlacement: 'on' AvailabilityZone: !Select - 0 - !GetAZs '' InstanceType: m6a.large

Spécification de la règle CT.EC2.PR.17

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_host_nitro_check # # Description: # This control checks whether an Amazon EC2 dedicated host is configured to run using an AWS Nitro instance type or family. # # Reports on: # AWS::EC2::Host # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any Amazon EC2 dedicated host resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains a Amazon EC2 dedicated host resource # And: 'InstanceFamily' or 'InstanceType' have not been provided # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains a Amazon EC2 dedicated host resource # And: 'InstanceType' has not been provided # And: 'InstanceFamily' has been provided and set to an instance family other than # a Nitro instance family with support for both dedicated hosts and multiple # instance types # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains a Amazon EC2 dedicated host resource # And: 'InstanceFamily' has not been provided # And: 'InstanceType' has been provided and set to an instance type other than # a Nitro instance type with dedicated host support # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains a Amazon EC2 dedicated host resource # And: 'InstanceType' has not been provided # And: 'InstanceFamily' has been provided and set to a Nitro instance family with # support for both dedicated hosts and multiple instance types # Then: PASS # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains a Amazon EC2 dedicated host resource # And: 'InstanceFamily' has not been provided # And: 'InstanceType' has been provided and set to a Nitro instance type with # dedicated host support # Then: PASS # # Constants # let INPUT_DOCUMENT = this let EC2_DEDICATED_HOST_TYPE = "AWS::EC2::Host" let NITRO_INSTANCE_FAMILIES_WITH_DEDICATED_HOST_SUPPORT = [ /^a1$/, /^m5$/, /^m5n$/, /^m6i$/, /^c5$/, /^c5n$/, /^c6i$/, /^r5$/, /^r5n$/, /^r6i$/, /^t3$/ ] let NITRO_INSTANCE_TYPES_WITH_DEDICATED_HOST_SUPPORT = [ /^a1\./, /^c5\./, /^c5d\./, /^c5n\./, /^c6a\./, /^c6g\./, /^c6gd\./, /^c6gn\./, /^c6i\./, /^c6id\./, /^c6in\./, /^c7g\./, /^c7gd\./, /^c7gn\./, /^c7i\./, /^dl1\./, /^g4ad\./, /^g4dn\./, /^g5\./, /^g5g\./, /^i3.metal$/, /^i3en\./, /^i4g\./, /^i4i\./, /^im4gn\./, /^inf1\./, /^inf2\./, /^m5\./, /^m5d\./, /^m5dn\./, /^m5n\./, /^m5zn\./, /^m6a\./, /^m6g\./, /^m6gd\./, /^m6i\./, /^m6id\./, /^m6idn\./, /^m6in\./, /^m7a\./, /^m7g\./, /^m7gd\./, /^m7i\./, /^mac1.metal$/, /^mac2-m2pro.metal$/, /^mac2.metal$/, /^p4d\./, /^p4de\./, /^p5\./, /^r5\./, /^r5b\./, /^r5d\./, /^r5dn\./, /^r5n\./, /^r6a\./, /^r6g\./, /^r6gd\./, /^r6i\./, /^r6id\./, /^r6idn\./, /^r6in\./, /^r7a\./, /^r7g\./, /^r7gd\./, /^r7iz\./, /^t3\./, /^trn1\./, /^u-12tb1\./, /^u-18tb1\./, /^u-24tb1\./, /^u-6tb1\./, /^u-9tb1\./, /^x2gd\./, /^x2idn\./, /^x2iedn\./, /^x2iezn\./, /^z1d\./ ] # # Assignments # let ec2_dedicated_hosts = Resources.*[ Type == %EC2_DEDICATED_HOST_TYPE ] # # Primary Rules # rule ec2_host_nitro_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_dedicated_hosts not empty { check(%ec2_dedicated_hosts.Properties) << [CT.EC2.PR.17]: Require an Amazon EC2 dedicated host to use an AWS Nitro instance type [FIX]: Set the value of the InstanceType property to an Amazon EC2 instance type that is based on the AWS Nitro system, and that supports dedicated hosts, or set the value of the InstanceFamily property to an Amazon EC2 instance family that is based on the AWS Nitro system, and that supports dedicated hosts and multiple instance types. >> } rule ec2_host_nitro_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_DEDICATED_HOST_TYPE) { check(%INPUT_DOCUMENT.%EC2_DEDICATED_HOST_TYPE.resourceProperties) << [CT.EC2.PR.17]: Require an Amazon EC2 dedicated host to use an AWS Nitro instance type [FIX]: Set the value of the InstanceType property to an Amazon EC2 instance type that is based on the AWS Nitro system, and that supports dedicated hosts, or set the value of the InstanceFamily property to an Amazon EC2 instance family that is based on the AWS Nitro system, and that supports dedicated hosts and multiple instance types. >> } # # Parameterized Rules # rule check(ec2_dedicated_host) { %ec2_dedicated_host { # Scenario 2 InstanceFamily exists or InstanceType exists } %ec2_dedicated_host[ InstanceFamily exists ] { # Scenario 3 and 5 InstanceFamily in %NITRO_INSTANCE_FAMILIES_WITH_DEDICATED_HOST_SUPPORT } %ec2_dedicated_host[ InstanceType exists ] { # Scenario 4 and 6 InstanceType in %NITRO_INSTANCE_TYPES_WITH_DEDICATED_HOST_SUPPORT } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.EC2.PR.17

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: DedicatedHost: Type: AWS::EC2::Host Properties: AutoPlacement: 'on' AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' InstanceFamily: m5

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Resources: DedicatedHost: Type: AWS::EC2::Host Properties: AutoPlacement: 'on' AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' InstanceType: m6a.large

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Resources: DedicatedHost: Type: AWS::EC2::Host Properties: AutoPlacement: 'on' AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' InstanceType: c4.large

[CT.EC2.PR.18] Exiger qu'une flotte Amazon EC2 remplace uniquement les modèles de lancement par les types d'instances AWS Nitro

Ce contrôle vérifie que les flottes Amazon EC2 remplacent uniquement les modèles de lancement par des types d'instances Nitro. AWS

  • Objectif de contrôle : protéger l'intégrité des données, appliquer le moindre privilège

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::EC2Fleet

  • AWS CloudFormationrègle de garde : Spécification de la règle CT.EC2.PR.18

Détails et exemples

Explication

Le système Nitro est un ensemble de composants matériels et logiciels conçus AWS pour garantir des performances, une disponibilité et une sécurité élevées. Le système Nitro offre une sécurité renforcée car il surveille, protège et vérifie en permanence le matériel et le microprogramme de l'instance. Les ressources de virtualisation sont déchargées vers du matériel et des logiciels dédiés, minimisant ainsi la surface d'attaque. Le modèle de sécurité du système Nitro est verrouillé pour empêcher l'accès administratif, réduisant ainsi les risques d'erreur humaine et de falsification.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement lorsque des remplacements de modèles de lancement ont été fournis, en particulier lorsque des entrées ont été spécifiées pour LaunchTemplateConfigs spécifier un ou plusieurs modèles Overrides qui incluent également des valeurs InstanceType ou InstanceRequirements des propriétés.

  • Ce contrôle ne vérifie pas le type d'instance configuré sur un modèle de lancement. Pour vous assurer que les modèles de lancement utilisent les types d'instances Nitro, utilisez ce contrôle conjointement avec les contrôles connexes qui vérifient les modèles de lancement pour les types d'instances Nitro.

Corrections en cas de défaillance des règles

Pour toute entrée du LaunchTemplateConfigs paramètre, s'il possède une ou plusieurs propriétés Overrides qui incluent également des InstanceRequirements champs InstanceType ou des champs, définissez la valeur du InstanceType champ sur un type d'instance EC2 basé sur le système AWS Nitro, ou définissez la valeur du AllowedInstanceTypes champ dans la InstanceRequirements propriété sur un ou plusieurs types d'instance EC2 basés sur le système AWS Nitro.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Amazon EC2 Fleet : premier exemple

Une flotte Amazon EC2 configurée avec un remplacement du modèle de lancement et un type d'instance basé sur le AWS système Nitro. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2Fleet": { "Type": "AWS::EC2::EC2Fleet", "Properties": { "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "on-demand" }, "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateId": { "Ref": "LaunchTemplate" }, "Version": { "Fn::GetAtt": [ "LaunchTemplate", "LatestVersionNumber" ] } }, "Overrides": [ { "InstanceType": "t3.micro" } ] } ] } } }

Exemple YAML

EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: !Ref 'LaunchTemplate' Version: !GetAtt 'LaunchTemplate.LatestVersionNumber' Overrides: - InstanceType: t3.micro

Les exemples suivants montrent comment mettre en œuvre cette correction.

Amazon EC2 Fleet : deuxième exemple

Une flotte Amazon EC2 configurée avec une dérogation au modèle de lancement et des exigences d'instance qui spécifient une liste d'instances autorisées en fonction du AWS système Nitro. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2Fleet": { "Type": "AWS::EC2::EC2Fleet", "Properties": { "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "on-demand" }, "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateId": { "Ref": "LaunchTemplate" }, "Version": { "Fn::GetAtt": [ "LaunchTemplate", "LatestVersionNumber" ] } }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 2, "Max": 4 }, "MemoryMiB": { "Min": 4000, "Max": 8000 }, "AllowedInstanceTypes": [ "m5.*", "c5.*" ] } } ] } ] } } }

Exemple YAML

EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: !Ref 'LaunchTemplate' Version: !GetAtt 'LaunchTemplate.LatestVersionNumber' Overrides: - InstanceRequirements: VCpuCount: Min: 2 Max: 4 MemoryMiB: Min: 4000 Max: 8000 AllowedInstanceTypes: - m5.* - c5.*

Spécification de la règle CT.EC2.PR.18

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_fleet_nitro_instance_override_check # # Description: # This control checks that Amazon EC2 fleets only override launch templates with AWS Nitro instance types. # # Reports on: # AWS::EC2::EC2Fleet # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any Amazon EC2 fleet resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: For every entry in 'LaunchTemplateConfigs', 'Overrides' has not been provided # or has been provided as an empty list # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: For an entry in 'LaunchTemplateConfigs', 'Overrides' has been provided as a non-empty list # And: For the same entry in 'LaunchTemplateConfigs', no entries in 'Overrides' include # 'InstanceType' or 'InstanceRequirements' # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: 'Overrides' in 'LaunchTemplateConfigs' has been provided as a non-empty list # And: For an entry in 'Overrides', 'InstanceType' has been provided and set to an instance type # other than a Nitro instance type # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: 'Overrides' in 'LaunchTemplateConfigs' has been provided as a non-empty list # And: For an entry in 'Overrides', 'InstanceRequirements' has been provided # And: For the same entry in 'Overrides', 'AllowedInstanceTypes' has not been provided or has been # provided as an empty list # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: 'Overrides' in 'LaunchTemplateConfigs' has been provided as a non-empty list # And: For an entry in 'Overrides', 'InstanceRequirements' has been provided # And: For the same entry in 'Overrides', 'AllowedInstanceTypes' has not been provided as a non-empty list # And: An entry in 'AllowedInstanceTypes' is set to an instance type other than a Nitro instance type # Then: FAIL # Scenario: 7 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: 'Overrides' in 'LaunchTemplateConfigs' has been provided as a non-empty list # And: For an entry in 'Overrides', 'InstanceType' has been provided and set to a Nitro instance type # Then: PASS # Scenario: 8 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: 'Overrides' in 'LaunchTemplateConfigs' has been provided as a non-empty list # And: For an entry in 'Overrides', 'InstanceRequirements' has been provided # And: For the same entry in 'Overrides', 'AllowedInstanceTypes' has not been provided as a non-empty list # And: Every entry in 'AllowedInstanceTypes' is set to a Nitro instance type # Then: PASS # # Constants # let INPUT_DOCUMENT = this let EC2_FLEET_TYPE = "AWS::EC2::EC2Fleet" let NITRO_INSTANCE_TYPES = [ /^a1\./, /^c5\./, /^c5a\./, /^c5ad\./, /^c5d\./, /^c5n\./, /^c6a\./, /^c6g\./, /^c6gd\./, /^c6gn\./, /^c6i\./, /^c6id\./, /^c6in\./, /^c7g\./, /^c7gd\./, /^c7gn\./, /^c7i\./, /^d3\./, /^d3en\./, /^dl1\./, /^g4ad\./, /^g4dn\./, /^g5\./, /^g5g\./, /^hpc6a\./, /^hpc6id\./, /^hpc7a\./, /^hpc7g\./, /^i3.metal$/, /^i3en\./, /^i4g\./, /^i4i\./, /^im4gn\./, /^inf1\./, /^inf2\./, /^is4gen\./, /^m5\./, /^m5a\./, /^m5ad\./, /^m5d\./, /^m5dn\./, /^m5n\./, /^m5zn\./, /^m6a\./, /^m6g\./, /^m6gd\./, /^m6i\./, /^m6id\./, /^m6idn\./, /^m6in\./, /^m7a\./, /^m7g\./, /^m7gd\./, /^m7i\./, /^m7i-flex\./, /^mac1.metal$/, /^mac2-m2pro.metal$/, /^mac2.metal$/, /^p3dn\./, /^p4d\./, /^p4de\./, /^p5\./, /^r5\./, /^r5a\./, /^r5ad\./, /^r5b\./, /^r5d\./, /^r5dn\./, /^r5n\./, /^r6a\./, /^r6g\./, /^r6gd\./, /^r6i\./, /^r6id\./, /^r6idn\./, /^r6in\./, /^r7a\./, /^r7g\./, /^r7gd\./, /^r7iz\./, /^t3\./, /^t3a\./, /^t4g\./, /^trn1\./, /^trn1n\./, /^u-12tb1\./, /^u-18tb1\./, /^u-24tb1\./, /^u-3tb1\./, /^u-6tb1\./, /^u-9tb1\./, /^vt1\./, /^x2gd\./, /^x2idn\./, /^x2iedn\./, /^x2iezn\./, /^z1d\./ ] # # Assignments # let ec2_fleets = Resources.*[ Type == %EC2_FLEET_TYPE ] # # Primary Rules # rule ec2_fleet_nitro_instance_override_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_fleets not empty { check(%ec2_fleets.Properties) << [CT.EC2.PR.18]: Require an Amazon EC2 fleet to override only those launch templates with AWS Nitro instance types [FIX]: For any entry in the LaunchTemplateConfigs parameter, if it has one or more Overrides properties that also include 'InstanceType' or 'InstanceRequirements' fields, set the value of the 'InstanceType' field to an Amazon EC2 instance type based on the AWS Nitro system, or set the value of the 'AllowedInstanceTypes' field in the InstanceRequirements property to one or more Amazon EC2 instance types that are based on the AWS Nitro system. >> } rule ec2_fleet_nitro_instance_override_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_FLEET_TYPE) { check(%INPUT_DOCUMENT.%EC2_FLEET_TYPE.resourceProperties) << [CT.EC2.PR.18]: Require an Amazon EC2 fleet to override only those launch templates with AWS Nitro instance types [FIX]: For any entry in the LaunchTemplateConfigs parameter, if it has one or more Overrides properties that also include 'InstanceType' or 'InstanceRequirements' fields, set the value of the 'InstanceType' field to an Amazon EC2 instance type based on the AWS Nitro system, or set the value of the 'AllowedInstanceTypes' field in the InstanceRequirements property to one or more Amazon EC2 instance types that are based on the AWS Nitro system. >> } # # Parameterized Rules # rule check(ec2_fleet) { %ec2_fleet [ # Scenarios 2 and 3 filter_launch_template_overrides(this) ] { LaunchTemplateConfigs[*] { Overrides[ InstanceType exists ] { # Scenarios 4 and 7 InstanceType in %NITRO_INSTANCE_TYPES } Overrides[ InstanceRequirements exists ] { InstanceRequirements { # Scenarios 5, 6 and 8 AllowedInstanceTypes exists AllowedInstanceTypes is_list AllowedInstanceTypes not empty AllowedInstanceTypes[*] in %NITRO_INSTANCE_TYPES } } } } } rule filter_launch_template_overrides(ec2_fleet) { %ec2_fleet { LaunchTemplateConfigs exists LaunchTemplateConfigs is_list LaunchTemplateConfigs not empty some LaunchTemplateConfigs[*] { Overrides exists Overrides is_list Overrides not empty some Overrides[*] { InstanceType exists or InstanceRequirements exists } } } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.EC2.PR.18

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value "AWS::EC2::Image::Id" Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: ImageId: Ref: LatestAmiId EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: Ref: LaunchTemplate Version: Fn::GetAtt: [LaunchTemplate, LatestVersionNumber] Overrides: - InstanceType: t3.micro

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value "AWS::EC2::Image::Id" Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: ImageId: Ref: LatestAmiId EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: Ref: LaunchTemplate Version: Fn::GetAtt: [LaunchTemplate, LatestVersionNumber] Overrides: - InstanceRequirements: VCpuCount: Min: 2 Max: 4 MemoryMiB: Min: 4000 Max: 8000 AllowedInstanceTypes: - m5.* - c5.*

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value "AWS::EC2::Image::Id" Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: ImageId: Ref: LatestAmiId EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: Ref: LaunchTemplate Version: Fn::GetAtt: [LaunchTemplate, LatestVersionNumber] Overrides: - InstanceType: t2.micro

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value "AWS::EC2::Image::Id" Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: ImageId: Ref: LatestAmiId EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: Ref: LaunchTemplate Version: Fn::GetAtt: [LaunchTemplate, LatestVersionNumber] Overrides: - InstanceRequirements: VCpuCount: Min: 0 Max: 4 MemoryMiB: Min: 0 Max: 4000 AllowedInstanceTypes: - c4.large

[CT.EC2.PR.19] Exiger qu'une instance Amazon EC2/Amazon EC2 utilise un type d'instance AWS Nitro qui prend en charge le chiffrement en transit entre les instances lorsqu'elles sont créées à l'aide du type de ressource AWS::EC2::Instance

Ce contrôle vérifie si une instance Amazon EC2 a été configurée pour s'exécuter à l'aide d'un type d'instance Nitro qui prend en charge le chiffrement en transit entre les instances.

  • Objectif de contrôle : crypter les données en transit, protéger l'intégrité des données, appliquer le moindre privilège

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::Instance

  • AWS CloudFormationrègle de garde : Spécification de la règle CT.EC2.PR.19

Détails et exemples

Explication

Le système Nitro est un ensemble de composants matériels et logiciels conçus AWS pour garantir des performances, une disponibilité et une sécurité élevées. Le système Nitro offre une sécurité renforcée car il surveille, protège et vérifie en permanence le matériel et le microprogramme de l'instance. Les ressources de virtualisation sont déchargées vers du matériel et des logiciels dédiés, minimisant ainsi la surface d'attaque. Le modèle de sécurité du système Nitro est verrouillé pour empêcher l'accès administratif, réduisant ainsi les risques d'erreur humaine et de falsification.

AWSfournit une connectivité sécurisée et privée entre les instances Amazon EC2 de tous types. En outre, certains types d'instances utilisent les capacités de déchargement du matériel Nitro System sous-jacent pour chiffrer automatiquement le trafic en transit entre les instances. Ce processus de chiffrement utilise les algorithmes AEAD (Authentiated Encryption with Associated Data), avec un cryptage de 256 bits. Cela n'a aucun impact sur les performances du réseau.

Considérations d'utilisation
  • Ce contrôle nécessite que la InstanceType propriété soit fournie et définie sur un type d'instance Nitro qui prend en charge le chiffrement lors du transit entre les instances. Ce paramètre vous empêche d'hériter d'un type d'instance par le biais d'un modèle de lancement Amazon EC2.

  • Pour prendre en charge le chiffrement du trafic en transit entre les instances, outre l'utilisation de l'un des types d'instances Amazon EC2 requis par ce contrôle, les instances doivent se trouver dans la même région et appartenir au même VPC ou au même groupe de VPC homologues, dans lequel le trafic ne passe pas par un périphérique ou un service réseau virtuel, tel qu'un équilibreur de charge ou une passerelle de transit.

Corrections en cas de défaillance des règles

Défini InstanceType sur un type d'instance Amazon EC2 basé sur le système AWS Nitro qui prend en charge le chiffrement en transit entre les instances.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Instance Amazon EC2 : exemple

Une instance Amazon EC2 configurée avec un type d'instance basé sur le système AWS Nitro et qui prend en charge le chiffrement lors du transit entre les instances. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": { "Ref": "LatestAmiId" }, "InstanceType": "t3.micro" } } }

Exemple YAML

EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: !Ref 'LatestAmiId' InstanceType: t3.micro

Spécification de la règle CT.EC2.PR.19

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_instance_nitro_encryption_in_transit_check # # Description: # This control checks whether an Amazon EC2 instance has been configured to run using a Nitro instance type that supports encryption in-transit between instances. # # Reports on: # AWS::EC2::Instance # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any Amazon EC2 instance resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceType' has not been provided # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceType' been provided and set to an instance type other than a Nitro # instance type that supports encryption in-transit between instances # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 instance resource # And: 'InstanceType' been provided and set to a Nitro instance type that supports # encryption in-transit between instances # Then: PASS # # Constants # let INPUT_DOCUMENT = this let EC2_INSTANCE_TYPE = "AWS::EC2::Instance" let NITRO_ENCRYPTION_IN_TRANSIT_INSTANCE_TYPES = [ /^c5a\./, /^c5ad\./, /^c5n\./, /^c6a\./, /^c6gn\./, /^c6i\./, /^c6id\./, /^c6in\./, /^c7g\./, /^c7gd\./, /^c7gn\./, /^c7i\./, /^d3\./, /^d3en\./, /^dl1\./, /^g4ad\./, /^g4dn\./, /^g5\./, /^hpc6a\./, /^hpc6id\./, /^hpc7a\./, /^hpc7g\./, /^i3en\./, /^i4g\./, /^i4i\./, /^im4gn\./, /^inf1\./, /^inf2\./, /^is4gen\./, /^m5dn\./, /^m5n\./, /^m5zn\./, /^m6a\./, /^m6i\./, /^m6id\./, /^m6idn\./, /^m6in\./, /^m7a\./, /^m7g\./, /^m7gd\./, /^m7i\./, /^m7i-flex\./, /^p3dn\./, /^p4d\./, /^p4de\./, /^p5\./, /^r5dn\./, /^r5n\./, /^r6a\./, /^r6i\./, /^r6id\./, /^r6idn\./, /^r6in\./, /^r7a\./, /^r7g\./, /^r7gd\./, /^r7iz\./, /^trn1\./, /^trn1n\./, /^u-12tb1\./, /^u-18tb1\./, /^u-24tb1\./, /^u-3tb1\./, /^u-6tb1\./, /^u-9tb1\./, /^vt1\./, /^x2idn\./, /^x2iedn\./, /^x2iezn\./ ] # # Assignments # let ec2_instances = Resources.*[ Type == %EC2_INSTANCE_TYPE ] # # Primary Rules # rule ec2_instance_nitro_encryption_in_transit_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_instances not empty { check(%ec2_instances.Properties) << [CT.EC2.PR.19]: Require an Amazon EC2 instance to use a nitro instance type that supports encryption in-transit between instances when created using the AWS::EC2::Instance resource type [FIX]: Set 'InstanceType' to an Amazon EC2 instance type based on the AWS Nitro system that supports encryption in-transit between instances. >> } rule ec2_instance_nitro_encryption_in_transit_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_INSTANCE_TYPE) { check(%INPUT_DOCUMENT.%EC2_INSTANCE_TYPE.resourceProperties) << [CT.EC2.PR.19]: Require an Amazon EC2 instance to use a nitro instance type that supports encryption in-transit between instances when created using the AWS::EC2::Instance resource type [FIX]: Set 'InstanceType' to an Amazon EC2 instance type based on the AWS Nitro system that supports encryption in-transit between instances. >> } # # Parameterized Rules # rule check(ec2_instance) { %ec2_instance { # Scenario 2 InstanceType exists # Scenarios 3 and 4 InstanceType in %NITRO_ENCRYPTION_IN_TRANSIT_INSTANCE_TYPES } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.EC2.PR.19

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value 'AWS::EC2::Image::Id' Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: Ref: LatestAmiId InstanceType: c5a.large

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value 'AWS::EC2::Image::Id' Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: Ref: LatestAmiId InstanceType: t2.micro

[CT.EC2.PR.20] Exigez d'une flotte Amazon EC2 qu'elle remplace uniquement les modèles de lancement par des types d'instances AWS Nitro qui prennent en charge le chiffrement lors du transit entre les instances

Ce contrôle vérifie si une flotte Amazon EC2 remplace uniquement les modèles de lancement basés sur les types d'instances AWS Nitro qui prennent en charge le chiffrement lors du transit entre les instances.

  • Objectif de contrôle : crypter les données en transit, protéger l'intégrité des données, appliquer le moindre privilège

  • Mise en œuvre : règle de AWS CloudFormation garde

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::EC2::EC2Fleet

  • AWS CloudFormationrègle de garde : Spécification de la règle CT.EC2.PR.20

Détails et exemples

Explication

Le système Nitro est un ensemble de composants matériels et logiciels conçus AWS pour garantir des performances, une disponibilité et une sécurité élevées. Le système Nitro offre une sécurité renforcée car il surveille, protège et vérifie en permanence le matériel et le microprogramme de l'instance. Les ressources de virtualisation sont déchargées vers du matériel et des logiciels dédiés, minimisant ainsi la surface d'attaque. Le modèle de sécurité du système Nitro est verrouillé pour empêcher l'accès administratif, réduisant ainsi les risques d'erreur humaine et de falsification.

AWSfournit une connectivité sécurisée et privée entre les instances Amazon EC2 de tous types. En outre, certains types d'instances utilisent les capacités de déchargement du matériel Nitro System sous-jacent pour chiffrer automatiquement le trafic en transit entre les instances. Ce processus de chiffrement utilise les algorithmes AEAD (Authentiated Encryption with Associated Data), avec un cryptage de 256 bits. Cela n'a aucun impact sur les performances du réseau.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement lorsque des remplacements de modèles de lancement ont été fournis, en particulier lorsque des entrées ont été spécifiées pour LaunchTemplateConfigs spécifier un ou plusieurs modèles Overrides qui incluent également des valeurs InstanceType ou InstanceRequirements des propriétés.

  • Ce contrôle ne vérifie pas le type d'instance configuré sur un modèle de lancement. Pour vous assurer que les modèles de lancement utilisent des types d'instances Nitro qui prennent en charge le chiffrement en transit entre les instances, utilisez ce contrôle conjointement avec les contrôles connexes qui vérifient les modèles de lancement pour les types d'instances Nitro et que les types d'instances Nitro prennent en charge le chiffrement pendant le transit entre les instances.

  • Pour prendre en charge le chiffrement du trafic en transit entre les instances, outre l'utilisation de l'un des types d'instances EC2 requis par ce contrôle, les instances doivent se trouver dans le même Région AWS VPC ou dans le même groupe de VPC homologues, dans lequel le trafic ne passe pas par un périphérique ou un service réseau virtuel, tel qu'un équilibreur de charge ou une passerelle de transit.

Corrections en cas de défaillance des règles

Pour toute entrée dans le LaunchTemplateConfigs paramètre, s'il possède une ou plusieurs propriétés de remplacement qui incluent InstanceType également des InstanceRequirements champs, définissez la valeur du InstanceType champ sur un type d'instance Amazon EC2 basé sur AWS le système Nitro et qui prend en charge le chiffrement en transit entre les instances, ou définissez la valeur du AllowedInstanceTypes champ dans InstanceRequirements la propriété sur un ou plusieurs types d'instances Amazon EC2 basés sur le système Nitro et prenant en charge AWS le chiffrement en transit entre les instances.

Les exemples suivants montrent comment mettre en œuvre cette correction.

Amazon EC2 Fleet : premier exemple

Un parc Amazon EC2 configuré avec un remplacement du modèle de lancement et un type d'instance basé sur le système AWS Nitro et prenant en charge le chiffrement lors du transit entre les instances. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2Fleet": { "Type": "AWS::EC2::EC2Fleet", "Properties": { "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "on-demand" }, "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateId": { "Ref": "LaunchTemplate" }, "Version": { "Fn::GetAtt": [ "LaunchTemplate", "LatestVersionNumber" ] } }, "Overrides": [ { "InstanceType": "c5a.large" } ] } ] } } }

Exemple YAML

EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: !Ref 'LaunchTemplate' Version: !GetAtt 'LaunchTemplate.LatestVersionNumber' Overrides: - InstanceType: c5a.large

Les exemples suivants montrent comment mettre en œuvre cette correction.

Amazon EC2 Fleet : deuxième exemple

Une flotte Amazon EC2 configurée avec une dérogation au modèle de lancement et des exigences d'instance qui spécifient une liste d'instances autorisées, basées sur le système AWS Nitro et prenant en charge le chiffrement lors du transit entre les instances. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EC2Fleet": { "Type": "AWS::EC2::EC2Fleet", "Properties": { "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "on-demand" }, "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateId": { "Ref": "LaunchTemplate" }, "Version": { "Fn::GetAtt": [ "LaunchTemplate", "LatestVersionNumber" ] } }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 2, "Max": 4 }, "MemoryMiB": { "Min": 4000, "Max": 8000 }, "AllowedInstanceTypes": [ "m6a.*", "c5a.*" ] } } ] } ] } } }

Exemple YAML

EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: !Ref 'LaunchTemplate' Version: !GetAtt 'LaunchTemplate.LatestVersionNumber' Overrides: - InstanceRequirements: VCpuCount: Min: 2 Max: 4 MemoryMiB: Min: 4000 Max: 8000 AllowedInstanceTypes: - m6a.* - c5a.*

Spécification de la règle CT.EC2.PR.20

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # ec2_fleet_nitro_encryption_in_transit_override_check # # Description: # This control checks whether an Amazon EC2 fleet overrides only the launch templates based upon AWS Nitro instance types that support encryption in transit between instances. # # Reports on: # AWS::EC2::EC2Fleet # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any EC2 fleet resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: For every entry in 'LaunchTemplateConfigs', 'Overrides' has not been provided # or has been provided as an empty list # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: For an entry in 'LaunchTemplateConfigs', 'Overrides' has been provided as a non-empty list # And: For the same entry in 'LaunchTemplateConfigs', no entries in 'Overrides' include # 'InstanceType' or 'InstanceRequirements' # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: 'Overrides' in 'LaunchTemplateConfigs' has been provided as a non-empty list # And: For an entry in 'Overrides', 'InstanceType' has been provided and set to an instance type # other than a Nitro instance type that supports encryption in-transit between instances # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: 'Overrides' in 'LaunchTemplateConfigs' has been provided as a non-empty list # And: For an entry in 'Overrides', 'InstanceRequirements' has been provided # And: For the same entry in 'Overrides', 'AllowedInstanceTypes' has not been provided or has been # provided as an empty list # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: 'Overrides' in 'LaunchTemplateConfigs' has been provided as a non-empty list # And: For an entry in 'Overrides', 'InstanceRequirements' has been provided # And: For the same entry in 'Overrides', 'AllowedInstanceTypes' has been provided as a non-empty list # And: An entry in 'AllowedInstanceTypes' is set to an instance type other than a Nitro instance # type that supports encryption in-transit between instances # Then: FAIL # Scenario: 7 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: 'Overrides' in 'LaunchTemplateConfigs' has been provided as a non-empty list # And: For an entry in 'Overrides', 'InstanceType' has been provided and set to a Nitro instance type that # supports encryption in-transit between instances # Then: PASS # Scenario: 8 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EC2 fleet resource # And: 'Overrides' in 'LaunchTemplateConfigs' has been provided as a non-empty list # And: For an entry in 'Overrides', 'InstanceRequirements' has been provided # And: For the same entry in 'Overrides', 'AllowedInstanceTypes' has been provided as a non-empty list # And: Every entry in 'AllowedInstanceTypes' is set to a Nitro instance type that # supports encryption in-transit between instances # Then: PASS # # Constants # let INPUT_DOCUMENT = this let EC2_FLEET_TYPE = "AWS::EC2::EC2Fleet" let NITRO_ENCRYPTION_IN_TRANSIT_INSTANCE_TYPES = [ /^c5a\./, /^c5ad\./, /^c5n\./, /^c6a\./, /^c6gn\./, /^c6i\./, /^c6id\./, /^c6in\./, /^c7g\./, /^c7gd\./, /^c7gn\./, /^c7i\./, /^d3\./, /^d3en\./, /^dl1\./, /^g4ad\./, /^g4dn\./, /^g5\./, /^hpc6a\./, /^hpc6id\./, /^hpc7a\./, /^hpc7g\./, /^i3en\./, /^i4g\./, /^i4i\./, /^im4gn\./, /^inf1\./, /^inf2\./, /^is4gen\./, /^m5dn\./, /^m5n\./, /^m5zn\./, /^m6a\./, /^m6i\./, /^m6id\./, /^m6idn\./, /^m6in\./, /^m7a\./, /^m7g\./, /^m7gd\./, /^m7i\./, /^m7i-flex\./, /^p3dn\./, /^p4d\./, /^p4de\./, /^p5\./, /^r5dn\./, /^r5n\./, /^r6a\./, /^r6i\./, /^r6id\./, /^r6idn\./, /^r6in\./, /^r7a\./, /^r7g\./, /^r7gd\./, /^r7iz\./, /^trn1\./, /^trn1n\./, /^u-12tb1\./, /^u-18tb1\./, /^u-24tb1\./, /^u-3tb1\./, /^u-6tb1\./, /^u-9tb1\./, /^vt1\./, /^x2idn\./, /^x2iedn\./, /^x2iezn\./ ] # # Assignments # let ec2_fleets = Resources.*[ Type == %EC2_FLEET_TYPE ] # # Primary Rules # rule ec2_fleet_nitro_encryption_in_transit_override_check when is_cfn_template(%INPUT_DOCUMENT) %ec2_fleets not empty { check(%ec2_fleets.Properties) << [CT.EC2.PR.20]: Require an Amazon Amazon EC2 fleet to override only those launch templates with AWS Nitro instance types that support encryption in transit between instances [FIX]: For any entry in the LaunchTemplateConfigs parameter, if it has one or more Overrides properties that also include 'InstanceType' or 'InstanceRequirements' fields, set the value of the InstanceType field to an EC2 instance type that's based on the AWS Nitro system, and that supports encryption in transit between instances, or set the value of the AllowedInstanceTypes field in the InstanceRequirements property to one or more EC2 instance types that are based on the AWS Nitro system, and that support encryption in transit between instances. >> } rule ec2_fleet_nitro_encryption_in_transit_override_check when is_cfn_hook(%INPUT_DOCUMENT, %EC2_FLEET_TYPE) { check(%INPUT_DOCUMENT.%EC2_FLEET_TYPE.resourceProperties) << [CT.EC2.PR.20]: Require an Amazon EC2 fleet to override only those launch templates with AWS Nitro instance types that support encryption in transit between instances [FIX]: For any entry in the LaunchTemplateConfigs parameter, if it has one or more Overrides properties that also include 'InstanceType' or 'InstanceRequirements' fields, set the value of the InstanceType field to an Amazon EC2 instance type that's based on the AWS Nitro system, and that supports encryption in transit between instances, or set the value of the AllowedInstanceTypes field in the InstanceRequirements property to one or more Amazon EC2 instance types that are based on the AWS Nitro system, and that support encryption in transit between instances. >> } # # Parameterized Rules # rule check(ec2_fleet) { %ec2_fleet [ # Scenarios 2 and 3 filter_launch_template_overrides(this) ] { LaunchTemplateConfigs[*] { Overrides[ InstanceType exists ] { # Scenarios 4 and 7 InstanceType in %NITRO_ENCRYPTION_IN_TRANSIT_INSTANCE_TYPES } Overrides[ InstanceRequirements exists ] { InstanceRequirements { # Scenarios 5, 6 and 8 AllowedInstanceTypes exists AllowedInstanceTypes is_list AllowedInstanceTypes not empty AllowedInstanceTypes[*] in %NITRO_ENCRYPTION_IN_TRANSIT_INSTANCE_TYPES } } } } } rule filter_launch_template_overrides(ec2_fleet) { %ec2_fleet { LaunchTemplateConfigs exists LaunchTemplateConfigs is_list LaunchTemplateConfigs not empty some LaunchTemplateConfigs[*] { Overrides exists Overrides is_list Overrides not empty some Overrides[*] { InstanceType exists or InstanceRequirements exists } } } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.EC2.PR.20

Vous pouvez consulter des exemples d'artefacts de test PASS et FAIL pour les contrôles proactifs de l'AWS Control Tower.

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value 'AWS::EC2::Image::Id' Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: ImageId: Ref: LatestAmiId EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: Ref: LaunchTemplate Version: Fn::GetAtt: [LaunchTemplate, LatestVersionNumber] Overrides: - InstanceType: c5a.large

Exemple PASS - Utilisez ce modèle pour vérifier la conformité de la création d'une ressource.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value 'AWS::EC2::Image::Id' Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: ImageId: Ref: LatestAmiId EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: Ref: LaunchTemplate Version: Fn::GetAtt: [LaunchTemplate, LatestVersionNumber] Overrides: - InstanceRequirements: VCpuCount: Min: 2 Max: 4 MemoryMiB: Min: 4000 Max: 8000 AllowedInstanceTypes: - m6a.* - c5a.*

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value 'AWS::EC2::Image::Id' Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: ImageId: Ref: LatestAmiId EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: Ref: LaunchTemplate Version: Fn::GetAtt: [LaunchTemplate, LatestVersionNumber] Overrides: - InstanceType: t2.micro

Exemple d'échec : utilisez ce modèle pour vérifier que le contrôle empêche la création de ressources non conformes.

Parameters: LatestAmiId: Description: Region specific latest AMI ID from the Parameter Store Type: AWS::SSM::Parameter::Value 'AWS::EC2::Image::Id' Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 Resources: LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateData: ImageId: Ref: LatestAmiId EC2Fleet: Type: AWS::EC2::EC2Fleet Properties: TargetCapacitySpecification: TotalTargetCapacity: 1 DefaultTargetCapacityType: on-demand LaunchTemplateConfigs: - LaunchTemplateSpecification: LaunchTemplateId: Ref: LaunchTemplate Version: Fn::GetAtt: [LaunchTemplate, LatestVersionNumber] Overrides: - InstanceRequirements: VCpuCount: Min: 0 Max: 4 MemoryMiB: Min: 0 Max: 4000 AllowedInstanceTypes: - c4.large