Contrôles Elastic Load Balancing - 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 Elastic Load Balancing

Rubriques

[CT.ELASTICLOADBALANCING.PR.1] Exiger que les actions par défaut de l'écouteur de l'équilibreur de charge d'application redirigent toutes les requêtes HTTP vers HTTPS

Ce contrôle vérifie si la redirection HTTP vers HTTPS est configurée comme action par défaut sur les écouteurs HTTP des équilibreurs de charge d'application.

  • Objectif de contrôle : crypter les données en transit

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElasticLoadBalancingV2::Listener

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

Détails et exemples

Explication

Avant de commencer à utiliser votre Application Load Balancer, vous devez ajouter un ou plusieurs écouteurs. Un écouteur est un processus qui utilise le protocole et le port configurés pour vérifier les demandes de connexion. Les écouteurs prennent en charge les protocoles HTTP et HTTPS. Vous pouvez utiliser un écouteur HTTPS pour déléguer le travail de chiffrement et de déchiffrement à votre Application Load Balancer. Vous devez utiliser des actions de redirection avec Application Load Balancer pour rediriger toute requête HTTP client vers une requête HTTPS sur le port 443, afin d'appliquer le chiffrement en transit.

Considérations d'utilisation
  • Ce contrôle évalue uniquement les actions par défaut sur les écouteurs Application Load Balancer.

Remédiation en cas de défaillance des règles

Configurez une action de redirection HTTPS par défaut sur les écouteurs HTTP Application Load Balancer.

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

Application Load Balancer Listener : exemple

L'écouteur d'équilibrage de charge d'application est configuré avec une action par défaut qui redirige les requêtes HTTP sur le port 80 vers les requêtes HTTPS sur le port 443, en conservant le nom d'hôte, le chemin et la chaîne de requête d'origine. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "Listener": { "Type": "AWS::ElasticLoadBalancingV2::Listener", "Properties": { "LoadBalancerArn": { "Ref": "ApplicationLoadBalancer" }, "Port": 80, "Protocol": "HTTP", "DefaultActions": [ { "Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": 443, "Host": "#{host}", "Path": "/#{path}", "Query": "#{query}", "StatusCode": "HTTP_301" } } ] } } }

Exemple YAML

Listener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: LoadBalancerArn: !Ref 'ApplicationLoadBalancer' Port: 80 Protocol: HTTP DefaultActions: - Type: redirect RedirectConfig: Protocol: HTTPS Port: 443 Host: '#{host}' Path: /#{path} Query: '#{query}' StatusCode: HTTP_301

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # alb_http_to_https_redirection_check # # Description: # This control checks whether HTTP to HTTPS redirection is configured as a default action on HTTP listeners of Application Load Balancers. # # Reports on: # AWS::ElasticLoadBalancingV2::Listener # # 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 ElasticLoadBalancingV2 listener resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 listener # And: 'Protocol' is set to a value other than 'HTTP' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 listener # And: 'Protocol' is set to 'HTTP' # And: 'DefaultActions' is missing or is provided and an empty list # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 listener # And: 'Protocol' is set to 'HTTP' # And: 'DefaultActions' contains an action with 'Type' set to a value other than 'redirect' # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 listener # And: 'Protocol' is set to 'HTTP' # And: 'DefaultActions' contains an action with 'Type' set to a value of 'redirect' # And: 'RedirectConfig.Protocol' is missing or set to a value other than 'HTTPS' # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 listener # And: 'Protocol' is set to 'HTTP' # And: All 'DefaultActions' have an action with 'Type' set to a value of 'redirect' and # 'Protocol.RedirectConfig' set to the value 'HTTPS' # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_V2_LISTENER_TYPE = "AWS::ElasticLoadBalancingV2::Listener" let INPUT_DOCUMENT = this # # Assignments # let elb_v2_listeners = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_V2_LISTENER_TYPE ] # # Primary Rules # rule alb_http_to_https_redirection_check when is_cfn_template(%INPUT_DOCUMENT) %elb_v2_listeners not empty { check(%elb_v2_listeners.Properties) << [CT.ELASTICLOADBALANCING.PR.1]: Require any application load balancer listener default actions to redirect all HTTP requests to HTTPS [FIX]: Configure a default HTTPS redirect action on application load balancer HTTP listeners. >> } rule alb_http_to_https_redirection_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_V2_LISTENER_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_V2_LISTENER_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.1]: Require any application load balancer listener default actions to redirect all HTTP requests to HTTPS [FIX]: Configure a default HTTPS redirect action on application load balancer HTTP listeners. >> } # # Parameterized Rules # rule check(elbv2_listener) { %elbv2_listener [ # Scenario 2 Protocol in [ "HTTP" ] ] { # Scenarios 3 DefaultActions exists DefaultActions is_list DefaultActions not empty # Scenario 4 and 5 DefaultActions[*] { Type == "redirect" RedirectConfig exists RedirectConfig is_struct RedirectConfig { Protocol exists Protocol == "HTTPS" } } } } # # 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.ELASTICLOADBALANCING.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.

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 Listener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: LoadBalancerArn: Ref: ApplicationLoadBalancer Port: 80 Protocol: HTTP DefaultActions: - Type: redirect RedirectConfig: Protocol: HTTPS Port: 443 Host: "#{host}" Path: "/#{path}" Query: "#{query}" StatusCode: "HTTP_301"

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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 Listener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: LoadBalancerArn: Ref: ApplicationLoadBalancer Port: 80 Protocol: HTTP DefaultActions: - Type: redirect RedirectConfig: Protocol: HTTP Port: 8080 Host: "#{host}" Path: "/#{path}" Query: "#{query}" StatusCode: "HTTP_301"

[CT.ELASTICLOADBALANCING.PR.2] Exiger que toute application Amazon ELB ou tout équilibreur de charge réseau dispose d'un certificat AWS Certificate Manager

Ce contrôle vérifie si votre application Elastic Load Balancing (ELB) et vos équilibreurs de charge réseau utilisent des certificats fournis par AWS Certificate Manager (ACM).

  • Objectif de contrôle : crypter les données en transit

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

  • Comportement de contrôle : proactif

  • Types de ressources :AWS::ElasticLoadBalancingV2::Listener, AWS::ElasticLoadBalancingV2::ListenerCertificate

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

Détails et exemples

Explication

Pour créer un certificat, utilisez AWS Certificate Manager (ACM) ou un autre outil compatible avec les protocoles SSL et TLS, tel qu'OpenSSL. AWS Control Tower vous recommande de les utiliser AWS Certificate Manager pour créer ou importer des certificats pour votre équilibreur de charge.

AWS Certificate Managers'intègre aux équilibreurs de charge des applications Amazon ELB et aux équilibreurs de charge réseau, afin que vous puissiez déployer le certificat sur votre équilibreur de charge. Nous vous recommandons également de renouveler automatiquement ces certificats.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux écouteurs TLS Amazon ELB HTTPS et aux ressources de certificats d'écouteur ELB pour lesquels un ou plusieurs certificats sont configurés.

Remédiation en cas de défaillance des règles

Configurez la Certificates propriété pour utiliser les certificats fournis parAWS Certificate Manager.

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

Amazon ELB Listener : exemple

Écouteur HTTPS Amazon ELB configuré avec un AWS Certificate Manager certificat SSL. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ELBListener": { "Type": "AWS::ElasticLoadBalancingV2::Listener", "Properties": { "DefaultActions": [ { "Type": "forward", "TargetGroupArn": { "Ref": "TargetGroup" } } ], "LoadBalancerArn": { "Ref": "ApplicationLoadBalancer" }, "Protocol": "HTTPS", "Certificates": [ { "CertificateArn": { "Ref": "ACMCertificate" } } ], "Port": 443 } } }

Exemple YAML

ELBListener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: DefaultActions: - Type: forward TargetGroupArn: !Ref 'TargetGroup' LoadBalancerArn: !Ref 'ApplicationLoadBalancer' Protocol: HTTPS Certificates: - CertificateArn: !Ref 'ACMCertificate' Port: 443

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

Certificat Amazon ELB Listener - Exemple

Certificat d'écouteur Amazon ELB configuré avec un certificat AWS Certificate Manager SSL. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ELBListenerCertificate": { "Type": "AWS::ElasticLoadBalancingV2::ListenerCertificate", "Properties": { "ListenerArn": { "Ref": "Listener" }, "Certificates": [ { "CertificateArn": { "Ref": "ACMCertificate" } } ] } } }

Exemple YAML

ELBListenerCertificate: Type: AWS::ElasticLoadBalancingV2::ListenerCertificate Properties: ListenerArn: !Ref 'Listener' Certificates: - CertificateArn: !Ref 'ACMCertificate'

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elbv2_acm_certificate_required_check # # Description: # This control checks whether your Elastic Load Balancing (ELB) application and network load balancers use certificates provided by AWS Certificate Manager (ACM). # # Reports on: # AWS::ElasticLoadBalancingV2::Listener, AWS::ElasticLoadBalancingV2::ListenerCertificate # # 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 ElasticLoadBalancingV2 listener or listener certificate resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 listener resource # And: 'Protocol' is set to a value other than 'HTTPS' or 'TLS' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 listener certificate resource # And: 'Certificates' has not been provided or has been provided as an empty list # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 listener resource # And: 'Protocol' is set to 'HTTPS' or 'TLS' # And: 'Certificates' has not been provided or has been 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 ElasticLoadBalancingV2 listener resource # And: 'Protocol' is set to 'HTTPS' or 'TLS' # And: One or more items in 'Certificates' do not match an ACM certificate ARN # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 listener certificate resource # And: One or more items in 'Certificates' do not match an ACM certificate ARN # Then: FAIL # Scenario: 7 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 listener resource # And: 'Protocol' is set to 'HTTPS' or 'TLS' # And: All items in 'Certificates' match an ACM certificate ARN # Then: PASS # Scenario: 8 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 listener certificate resource # And: All items in 'Certificates' match an ACM certificate ARN # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_V2_LISTENER_TYPE = "AWS::ElasticLoadBalancingV2::Listener" let ELASTIC_LOAD_BALANCER_V2_CERTIFICATE_TYPE = "AWS::ElasticLoadBalancingV2::ListenerCertificate" let ACM_CERTIFICATE_ARN_PATTERN = /arn:aws[a-z0-9\-]*:acm:[a-z0-9\-]+:\d{12}:certificate\/[\w\-]{1,64}/ let INPUT_DOCUMENT = this # # Assignments # let elb_v2_listeners = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_V2_LISTENER_TYPE ] let elb_v2_certificates = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_V2_CERTIFICATE_TYPE ] # # Primary Rules # rule elbv2_acm_certificate_required_check when is_cfn_template(%INPUT_DOCUMENT) %elb_v2_listeners not empty { check_listener(%elb_v2_listeners.Properties) << [CT.ELASTICLOADBALANCING.PR.2]: Require any Amazon ELB application or network load balancer to have an AWS Certificate Manager certificate [FIX]: Configure the 'Certificates' property to use certificates provided by AWS Certificate Manager. >> } rule elbv2_acm_certificate_required_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_V2_LISTENER_TYPE) { check_listener(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_V2_LISTENER_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.2]: Require any Amazon ELB application or network load balancer to have an AWS Certificate Manager certificate [FIX]: Configure the 'Certificates' property to use certificates provided by AWS Certificate Manager. >> } rule elbv2_acm_certificate_required_check when is_cfn_template(%INPUT_DOCUMENT) %elb_v2_certificates not empty { check_elbv2_listener_certificate(%elb_v2_certificates.Properties) << [CT.ELASTICLOADBALANCING.PR.2]: Require any Amazon ELB application or network load balancer to have an AWS Certificate Manager certificate [FIX]: Configure the 'Certificates' property to use certificates provided by AWS Certificate Manager. >> } rule elbv2_acm_certificate_required_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_V2_CERTIFICATE_TYPE) { check_elbv2_listener_certificate(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_V2_CERTIFICATE_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.2]: Require any Amazon ELB application or network load balancer to have an AWS Certificate Manager certificate [FIX]: Configure the 'Certificates' property to use certificates provided by AWS Certificate Manager. >> } # # Parameterized Rules # rule check_listener(elbv2_listener) { %elbv2_listener[ # Scenario 2 Protocol in ["HTTPS", "TLS"] ] { # Scenarios 3 and 5 Certificates exists Certificates is_list Certificates not empty Certificates[*] { CertificateArn exists check_is_acm_certificate(CertificateArn) } } } rule check_elbv2_listener_certificate(listener_certificate) { %listener_certificate[ Certificates exists Certificates is_list Certificates not empty ] { # Scenarios 4 and 6 Certificates[*] { CertificateArn exists check_is_acm_certificate(CertificateArn) } } } rule check_is_acm_certificate(certificate) { %certificate { this == %ACM_CERTIFICATE_ARN_PATTERN or check_local_references(%INPUT_DOCUMENT, this, "AWS::CertificateManager::Certificate") } } # # 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 check_local_references(doc, reference_properties, referenced_resource_type) { %reference_properties { 'Fn::GetAtt' { query_for_resource(%doc, this[0], %referenced_resource_type) <<Local Stack reference was invalid>> } or Ref { query_for_resource(%doc, this, %referenced_resource_type) <<Local Stack reference was invalid>> } } } 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.ELASTICLOADBALANCING.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.

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ACMCertificate: Type: "AWS::CertificateManager::Certificate" Properties: DomainName: example.com ValidationMethod: DNS DomainValidationOptions: - DomainName: www.example.com HostedZoneId: ZZZHHHHWWWWAAA TargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Protocol: HTTP Port: 80 VpcId: Ref: VPC ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 Listener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: DefaultActions: - Type: forward TargetGroupArn: Ref: TargetGroup LoadBalancerArn: Ref: ApplicationLoadBalancer Protocol: HTTPS Certificates: - CertificateArn: Ref: ACMCertificate Port: 443

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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' TargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Protocol: HTTP Port: 80 VpcId: Ref: VPC ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 Listener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: DefaultActions: - Type: forward TargetGroupArn: Ref: TargetGroup LoadBalancerArn: Ref: ApplicationLoadBalancer Protocol: HTTPS Certificates: - CertificateArn: arn:aws:iam::123456789012:server-certificate/example-certificate Port: 443

[CT.ELASTICLOADBALANCING.PR.3] Exiger que tout équilibreur de charge d'application soit activé en mode défensif ou en mode d'atténuation de la désynchronisation le plus strict

Ce contrôle vérifie qu'un Application Load Balancer est configuré avec le mode d'atténuation defensive ou qu'il le strictest désynchronise.

  • Objectif de contrôle : protéger l'intégrité des données

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElasticLoadBalancingV2::LoadBalancer

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

Détails et exemples

Explication

Les problèmes de désynchronisation (désynchronisation) HTTP peuvent entraîner un trafic de demandes et rendre les applications vulnérables aux files d'attente de demandes ou à l'empoisonnement du cache. À leur tour, ces vulnérabilités peuvent entraîner un bourrage d'informations d'identification ou l'exécution de commandes non autorisées. Lorsqu'ils sont configurés avec le mode défensif ou le mode d'atténuation de la désynchronisation le plus strict, les équilibreurs de charge d'application peuvent protéger votre application contre les problèmes de sécurité pouvant être causés par la désynchronisation HTTP.

Remédiation en cas de défaillance des règles

Omettez l'attribut de l'équilibreur de charge routing.http.desync_mitigation_mode ou définissez l'attribut sur l'un des defensive attributs ou. strictest

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

Application Load Balancer : exemple

Application Load Balancer configuré avec le mode d'atténuation de la defensive désynchronisation, au moyen des paramètres par défaut d'AWS. CloudFormation L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ApplicationLoadBalancer": { "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer", "Properties": { "Scheme": "internal", "Subnets": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "IpAddressType": "ipv4", "Type": "application" } } }

Exemple YAML

ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' IpAddressType: ipv4 Type: application

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

Application Load Balancer : exemple

Application Load Balancer configuré avec le mode d'atténuation de la strictest désynchronisation, au moyen de l'attribut Load Balancer. routing.http.desync_mitigation_mode L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ApplicationLoadBalancer": { "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer", "Properties": { "Scheme": "internal", "Subnets": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "IpAddressType": "ipv4", "Type": "application", "LoadBalancerAttributes": [ { "Key": "routing.http.desync_mitigation_mode", "Value": "strictest" } ] } } }

Exemple YAML

ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' IpAddressType: ipv4 Type: application LoadBalancerAttributes: - Key: routing.http.desync_mitigation_mode Value: strictest

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # alb_desync_mode_check # # Description: # This control checks to ensure that an Application Load Balancer is configured with 'defensive' or 'strictest' desync mitigation mode. # # Reports on: # AWS::ElasticLoadBalancingV2::LoadBalancer # # 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 ELBv2 load balancer resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 load balancer resource # And: 'Type' is set to a value other than 'application' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 load balancer resource # And: 'Type' is set to 'application' for the ELBv2 load balancer resource # And: 'LoadBalancerAttributes' have been specified on the ELBv2 load balancer resource # And: The 'LoadBalancerAttribute' 'routing.http.desync_mitigation_mode' has been provided # and is not one of 'defensive' or 'strictest' # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 load balancer resource # And: 'Type' is set to 'application' for the ELBv2 load balancer resource # And: 'LoadBalancerAttributes' have not been specified on the ELBv2 load balancer resource or specified # as an empty list # Then: PASS # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 load balancer resource # And: 'Type' is set to 'application' for the ELBv2 load balancer resource # And: 'LoadBalancerAttributes' have been specified on the ELBv2 load balancer resource # And: 'routing.http.desync_mitigation_mode' has not been provided as a 'LoadBalancerAttribute' # Then: PASS # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 load balancer resource # And: 'Type' is set to 'application' for the ELBv2 load balancer resource # And: 'LoadBalancerAttributes' have been specified on the ELBv2 load balancer resource # And: The 'LoadBalancerAttribute' 'routing.http.desync_mitigation_mode' has been provided # and is one of 'defensive' or 'strictest' # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_V2_TYPE = "AWS::ElasticLoadBalancingV2::LoadBalancer" let ALLOWED_DESYNC_MODES = [ "defensive", "strictest" ] let INPUT_DOCUMENT = this # # Assignments # let elastic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_V2_TYPE ] # # Primary Rules # rule alb_desync_mode_check when is_cfn_template(%INPUT_DOCUMENT) %elastic_load_balancers not empty { check(%elastic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.3]: Require any application load balancer to have defensive or strictest desync mitigation mode activated [FIX]: Omit the load balancer attribute 'routing.http.desync_mitigation_mode' or set the attribute to one of 'defensive' or 'strictest'. >> } rule alb_desync_mode_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_V2_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_V2_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.3]: Require any application load balancer to have defensive or strictest desync mitigation mode activated [FIX]: Omit the load balancer attribute 'routing.http.desync_mitigation_mode' or set the attribute to one of 'defensive' or 'strictest'. >> } # # Parameterized Rules # rule check(elastic_load_balancer) { %elastic_load_balancer[ # Scenario 2 Type == "application" ] { # Scenario 4 LoadBalancerAttributes not exists or check_application_load_balancer_attributes(this) } } rule check_application_load_balancer_attributes(application_load_balancer) { %application_load_balancer { LoadBalancerAttributes is_list LoadBalancerAttributes[ # Scenario 5 Key exists Key == "routing.http.desync_mitigation_mode" ] { # Scenarios 3 and 6 Value exists Value in %ALLOWED_DESYNC_MODES } } } # # 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.ELASTICLOADBALANCING.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: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 Type: application LoadBalancerAttributes: - Key: routing.http.desync_mitigation_mode Value: strictest

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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 Type: application LoadBalancerAttributes: - Key: routing.http.desync_mitigation_mode Value: monitor

[CT.ELASTICLOADBALANCING.PR.4] Exiger que tout équilibreur de charge d'application soit configuré pour supprimer les en-têtes HTTP

Ce contrôle vérifie si les équilibreurs de charge d'application sont configurés pour supprimer les en-têtes HTTP non valides.

  • 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::ElasticLoadBalancingV2::LoadBalancer

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

Détails et exemples

Explication

Par défaut, les équilibreurs de charge d'application ne sont pas configurés pour supprimer les valeurs d'en-tête HTTP non valides. La suppression de ces valeurs d'en-tête empêche les attaques de désynchronisation HTTP.

Remédiation en cas de défaillance des règles

Définissez l'attribut de l'équilibreur de charge routing.http.drop_invalid_header_fields.enabled surtrue.

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

Application Load Balancer : exemple

Application Load Balancer configuré pour supprimer les en-têtes HTTP non valides. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ApplicationLoadBalancer": { "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer", "Properties": { "Scheme": "internal", "Type": "application", "Subnets": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "IpAddressType": "ipv4", "LoadBalancerAttributes": [ { "Key": "routing.http.drop_invalid_header_fields.enabled", "Value": "true" } ] } } }

Exemple YAML

ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Type: application Subnets: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' IpAddressType: ipv4 LoadBalancerAttributes: - Key: routing.http.drop_invalid_header_fields.enabled Value: 'true'

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # alb_http_drop_invalid_header_enabled_check # # Description: # This control checks whether Application Load Balancers are configured to drop non-valid HTTP headers. # # Reports on: # AWS::ElasticLoadBalancingV2::LoadBalancer # # 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 ELBv2 load balancer resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 load balancer resource # And: 'Type' is set to a value other than 'application' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 load balancer resource # And: 'Type' is set to 'application' for the ELBv2 load balancer resource # And: 'LoadBalancerAttributes' have not been specified on the ELBv2 load balancer resource # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 load balancer resource # And: 'Type' is set to 'application' for the ELBv2 load balancer resource # And: 'LoadBalancerAttributes' have been specified on the ELBv2 load balancer resource # And: 'routing.http.drop_invalid_header_fields.enabled' has not been provided as a 'LoadBalancerAttribute' # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 load balancer resource # And: 'Type' is set to 'application' for the ELBv2 load balancer resource # And: 'LoadBalancerAttributes' have been specified on the ELBv2 load balancer resource # And: The 'LoadBalancerAttribute' 'routing.http.drop_invalid_header_fields.enabled' has been provided # and is set to bool(false) or string(false) # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 load balancer resource # And: 'Type' is set to 'application' for the ELBv2 load balancer resource # And: 'LoadBalancerAttributes' have been specified on the ELBv2 load balancer resource # And: The 'LoadBalancerAttribute' 'routing.http.drop_invalid_header_fields.enabled' has been provided and # is set to bool(true) or string(true) # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_V2_TYPE = "AWS::ElasticLoadBalancingV2::LoadBalancer" let INPUT_DOCUMENT = this # # Assignments # let elastic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_V2_TYPE ] # # Primary Rules # rule alb_http_drop_invalid_header_enabled_check when is_cfn_template(%INPUT_DOCUMENT) %elastic_load_balancers not empty { check(%elastic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.4]: Require that any application load balancer must be configured to drop HTTP headers [FIX]: Set the load balancer attribute 'routing.http.drop_invalid_header_fields.enabled' to 'true'. >> } rule alb_http_drop_invalid_header_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_V2_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_V2_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.4]: Require that any application load balancer must be configured to drop HTTP headers [FIX]: Set the load balancer attribute 'routing.http.drop_invalid_header_fields.enabled' to 'true'. >> } # # Parameterized Rules # rule check(elastic_load_balancer) { %elastic_load_balancer[ Type == "application" ] { # Scenario 2 LoadBalancerAttributes exists LoadBalancerAttributes is_list LoadBalancerAttributes not empty # Scenario 3, 4 and 5 some LoadBalancerAttributes[*] { Key exists Value exists Key == "routing.http.drop_invalid_header_fields.enabled" Value in [ true, "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.ELASTICLOADBALANCING.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: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Type: application Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 LoadBalancerAttributes: - Key: routing.http.drop_invalid_header_fields.enabled Value: "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: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Type: application Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 LoadBalancerAttributes: - Key: routing.http.drop_invalid_header_fields.enabled Value: "false"

[CT.ELASTICLOADBALANCING.PR.5] Exiger que la protection contre la suppression de l'équilibreur de charge des applications soit activée

Vérifie si la protection contre les suppressions est activée dans Elastic Load Balancing (ELB).

  • Objectif de contrôle : améliorer la disponibilité

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElasticLoadBalancingV2::LoadBalancer

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

Détails et exemples

Explication

Activez la protection contre la suppression pour empêcher la suppression de votre Application Load Balancer.

Remédiation en cas de défaillance des règles

Définissez l'attribut de l'équilibreur de charge deletion_protection.enabled surtrue.

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

Application Load Balancer : exemple

Application Load Balancer configuré avec la protection contre les suppressions active. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "Elb": { "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer", "Properties": { "Scheme": "internal", "Type": "application", "Subnets": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "IpAddressType": "ipv4", "LoadBalancerAttributes": [ { "Key": "deletion_protection.enabled", "Value": "true" } ] } } }

Exemple YAML

Elb: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Type: application Subnets: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' IpAddressType: ipv4 LoadBalancerAttributes: - Key: deletion_protection.enabled Value: 'true'

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elbv2_deletion_protection_enabled_check # # Description: # Checks whether Elastic Load Balancing (ELB) has deletion protection activated. # # Reports on: # AWS::ElasticLoadBalancingV2::LoadBalancer # # 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 ELBv2 LoadBalancer resource # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 LoadBalancer resource # And: 'LoadBalancerAttributes' have not been specified or is an empty list on the ELBv2 resource # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 LoadBalancer resource # And: 'LoadBalancerAttributes' have been specified on the ELBv2 LoadBalancer resource # And: 'deletion_protection.enabled' has not been provided as a 'LoadBalancerAttribute' # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 LoadBalancer resource # And: 'LoadBalancerAttributes' have been specified on the ELBv2 LoadBalancer resource # And: The 'LoadBalancerAttribute' 'deletion_protection.enabled' has been provided and is set to bool(false) or # string(false) # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 LoadBalancer Resource # And: 'LoadBalancerAttributes' have been specified on the ELBv2 LoadBalancer resource # And: The 'LoadBalancerAttribute' 'deletion_protection.enabled' has been provided and is set to bool(true) or # string(true) # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_V2_TYPE = "AWS::ElasticLoadBalancingV2::LoadBalancer" let INPUT_DOCUMENT = this # # Assignments # let elastic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_V2_TYPE ] # # Primary Rules # rule elbv2_deletion_protection_enabled_check when is_cfn_template(%INPUT_DOCUMENT) %elastic_load_balancers not empty { check(%elastic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.5]: Require that application load balancer deletion protection is activated [FIX]: Set the load balancer attribute 'deletion_protection.enabled' to 'true'. >> } rule elbv2_deletion_protection_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_V2_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_V2_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.5]: Require that application load balancer deletion protection is activated [FIX]: Set the load balancer attribute 'deletion_protection.enabled' to 'true'. >> } # # Parameterized Rules # rule check(elastic_load_balancer) { %elastic_load_balancer { # Scenario 2 LoadBalancerAttributes exists LoadBalancerAttributes is_list LoadBalancerAttributes not empty # Scenario 3, 4 and 5 some LoadBalancerAttributes[*] { Key exists Value exists Key == "deletion_protection.enabled" Value in [ true, "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.ELASTICLOADBALANCING.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: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Type: application Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 LoadBalancerAttributes: - Key: deletion_protection.enabled Value: "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: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Type: application Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 LoadBalancerAttributes: - Key: deletion_protection.enabled Value: "false"

[CT.ELASTICLOADBALANCING.PR.6] Exiger que la journalisation des accès aux applications et à l'équilibreur de charge réseau soit activée

Ce contrôle vérifie si la journalisation est activée dans votre application Elastic Load Balancing (ELB) et dans vos équilibreurs de charge réseau.

  • 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::ElasticLoadBalancingV2::LoadBalancer

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

Détails et exemples

Explication

Elastic Load Balancing fournit des journaux d'accès qui capturent des informations détaillées sur les demandes envoyées à votre équilibreur de charge. Chaque journal contient des informations comme l'heure à laquelle la demande a été reçue, l'adresse IP du client, les latences, les chemins de demande et les réponses du serveur. Vous pouvez utiliser ces journaux d'accès pour analyser les modèles de trafic et résoudre des problèmes.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux types d'équilibreurs de charge ELB et. application network

Remédiation en cas de défaillance des règles

Définissez l'attribut de l'équilibreur de charge access_logs.s3.enabled sur true et configurez-le access_logs.s3.bucket pour atteindre un compartiment S3 configuré pour recevoir les journaux d'accès à l'équilibreur de charge d'application ou à l'équilibreur de charge réseau.

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

Application Load Balancer : exemple

Application Load Balancer configuré avec l'enregistrement des accès activé. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ApplicationLoadBalancer": { "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer", "Properties": { "Scheme": "internal", "Subnets": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "IpAddressType": "ipv4", "Type": "application", "LoadBalancerAttributes": [ { "Key": "access_logs.s3.enabled", "Value": true }, { "Key": "access_logs.s3.bucket", "Value": { "Ref": "LoggingBucket" } } ] } } }

Exemple YAML

ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' IpAddressType: ipv4 Type: application LoadBalancerAttributes: - Key: access_logs.s3.enabled Value: true - Key: access_logs.s3.bucket Value: !Ref 'LoggingBucket'

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

Network Load Balancer - Exemple

Network Load Balancer configuré avec l'enregistrement des accès activé. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "NetworkLoadBalancer": { "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer", "Properties": { "Scheme": "internal", "Subnets": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "IpAddressType": "ipv4", "Type": "network", "LoadBalancerAttributes": [ { "Key": "access_logs.s3.enabled", "Value": true }, { "Key": "access_logs.s3.bucket", "Value": { "Ref": "LoggingBucket" } } ] } } }

Exemple YAML

NetworkLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' IpAddressType: ipv4 Type: network LoadBalancerAttributes: - Key: access_logs.s3.enabled Value: true - Key: access_logs.s3.bucket Value: !Ref 'LoggingBucket'

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elbv2_logging_enabled_check # # Description: # This control checks whether your Elastic Load Balancing (ELB) application and network load balancers have logging activated. # # Reports on: # AWS::ElasticLoadBalancingV2::LoadBalancer # # 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 ElasticLoadBalancingV2 LoadBalancer resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 LoadBalancer resource # And: 'Type' is set to a value other than 'application' or 'network' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 LoadBalancer resource # And: The LoadBalancer is of type 'application' or 'network' # And: 'LoadBalancerAttributes' has not been provided or is an empty list # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 LoadBalancer resource # And: The LoadBalancer is of type 'application' or 'network' # And: A 'LoadBalancerAttributes' with Key 'access_logs.s3.enabled' and 'access_logs.s3.bucket' # has not been provided # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 LoadBalancer resource # And: The LoadBalancer is of type 'application' or 'network' # And: A 'LoadBalancerAttributes' with Key 'access_logs.s3.enabled' and 'access_logs.s3.bucket' has been provided # And: 'access_logs.s3.enabled' is set to bool(false) or string(false) # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 LoadBalancer resource # And: The LoadBalancer is of type 'application' or 'network' # And: A 'LoadBalancerAttributes' with Key 'access_logs.s3.enabled' and 'access_logs.s3.bucket' has been provided # And: 'access_logs.s3.enabled' is set to bool(true) or string(true) # And: 'access_logs.s3.bucket' is missing or an empty string value # Then: FAIL # Scenario: 7 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancingV2 LoadBalancer resource # And: The LoadBalancer is of type 'application' # And: A 'LoadBalancerAttributes' with Key 'access_logs.s3.enabled' has been provided # And: 'access_logs.s3.enabled' is set to bool(true) or string(true) # And: 'access_logs.s3.bucket' is provided and a non-empty string value or valid local reference # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_V2_TYPE = "AWS::ElasticLoadBalancingV2::LoadBalancer" let INPUT_DOCUMENT = this # # Assignments # let elastic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_V2_TYPE ] # # Primary Rules # rule elbv2_logging_enabled_check when is_cfn_template(%INPUT_DOCUMENT) %elastic_load_balancers not empty { check(%elastic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.6]: Require that application and network load balancer access logging is activated [FIX]: Set the load balancer attribute 'access_logs.s3.enabled' to 'true', and set 'access_logs.s3.bucket' to reach an Amazon S3 bucket that's configured to receive application load balancer or network load balancer access logs. >> } rule elbv2_logging_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_V2_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_V2_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.6]: Require that application and network load balancer access logging is activated [FIX]: Set the load balancer attribute 'access_logs.s3.enabled' to 'true', and set 'access_logs.s3.bucket' to reach an Amazon S3 bucket that's configured to receive application load balancer or network load balancer access logs. >> } # # Parameterized Rules # rule check(elastic_load_balancer) { %elastic_load_balancer[ Type in ["application", "network"] ] { # Scenario 3 LoadBalancerAttributes exists LoadBalancerAttributes is_list LoadBalancerAttributes not empty # Scenario 4, 5, 6 and 7 some LoadBalancerAttributes[*] { Key exists Value exists Key == "access_logs.s3.enabled" Value in [ true, "true" ] } some LoadBalancerAttributes[*] { Key exists Value exists Key == "access_logs.s3.bucket" check_is_string_and_not_empty(Value) or check_local_references(%INPUT_DOCUMENT, Value, "AWS::S3::Bucket") } } } # # 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 check_is_string_and_not_empty(value) { %value { this is_string this != /\A\s*\z/ } } rule check_local_references(doc, reference_properties, referenced_resource_type) { %reference_properties { 'Fn::GetAtt' { query_for_resource(%doc, this[0], %referenced_resource_type) <<Local Stack reference was invalid>> } or Ref { query_for_resource(%doc, this, %referenced_resource_type) <<Local Stack reference was invalid>> } } } 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.ELASTICLOADBALANCING.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.

Mappings: RegionToELBAccountId: us-east-1: AccountId: '127311923021' us-west-1: AccountId: '027434742980' us-west-2: AccountId: '797873946194' ca-central-1: AccountId: '985666609251' eu-west-1: AccountId: '156460612806' ap-northeast-1: AccountId: '582318560864' ap-northeast-2: AccountId: '600734575887' ap-southeast-1: AccountId: '114774131450' ap-southeast-2: AccountId: '783225319266' ap-south-1: AccountId: '718504428378' us-east-2: AccountId: '033677994240' sa-east-1: AccountId: '507241528517' eu-central-1: AccountId: '054676820928' af-south-1: AccountId: '098369216593' ap-east-1: AccountId: '754344448648' ap-southeast-3: AccountId: '589379963580' ap-northeast-3: AccountId: '383597477331' eu-west-2: AccountId: '652711504416' eu-south-1: AccountId: '635631232127' eu-west-3: AccountId: '009996457667' eu-north-1: AccountId: '897822967062' me-south-1: AccountId: '076674570225' us-gov-west-1: AccountId: '048591011584' us-gov-east-1: AccountId: '190560391635' RegionToARNPrefix: us-east-1: ARNPrefix: 'arn:aws:' us-west-1: ARNPrefix: 'arn:aws:' us-west-2: ARNPrefix: 'arn:aws:' ca-central-1: ARNPrefix: 'arn:aws:' eu-west-1: ARNPrefix: 'arn:aws:' ap-northeast-1: ARNPrefix: 'arn:aws:' ap-northeast-2: ARNPrefix: 'arn:aws:' ap-southeast-1: ARNPrefix: 'arn:aws:' ap-southeast-2: ARNPrefix: 'arn:aws:' ap-south-1: ARNPrefix: 'arn:aws:' us-east-2: ARNPrefix: 'arn:aws:' sa-east-1: ARNPrefix: 'arn:aws:' eu-central-1: ARNPrefix: 'arn:aws:' af-south-1: ARNPrefix: 'arn:aws:' ap-east-1: ARNPrefix: 'arn:aws:' ap-southeast-3: ARNPrefix: 'arn:aws:' ap-northeast-3: ARNPrefix: 'arn:aws:' eu-west-2: ARNPrefix: 'arn:aws:' eu-south-1: ARNPrefix: 'arn:aws:' eu-west-3: ARNPrefix: 'arn:aws:' eu-north-1: ARNPrefix: 'arn:aws:' me-south-1: ARNPrefix: 'arn:aws:' us-gov-west-1: ARNPrefix: 'arn:aws-us-gov:' us-gov-east-1: ARNPrefix: 'arn:aws-us-gov:' Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' LoggingBucket: Type: AWS::S3::Bucket LoggingBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: Ref: LoggingBucket PolicyDocument: Version: 2012-10-17 Statement: - Action: - 's3:PutObject' Effect: Allow Resource: Fn::Join: - '' - - Fn::FindInMap: [RegionToARNPrefix, !Ref 'AWS::Region', ARNPrefix] - 's3:::' - Ref: LoggingBucket - /AWSLogs/ - Ref: AWS::AccountId - /* Principal: AWS: Fn::FindInMap: [RegionToELBAccountId, !Ref 'AWS::Region', AccountId] ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 Type: application LoadBalancerAttributes: - Key: access_logs.s3.enabled Value: true - Key: access_logs.s3.bucket Value: Ref: LoggingBucket

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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 Type: application

[CT.ELASTICLOADBALANCING.PR.7] Exiger que n'importe quel équilibreur de charge classique ait plusieurs zones de disponibilité configurées

Ce contrôle vérifie si un équilibreur de charge classique Elastic Load Balancing (ELB) a été configuré avec plusieurs zones de disponibilité.

  • Objectif de contrôle : améliorer la disponibilité

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElasticLoadBalancing::LoadBalancer

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

Détails et exemples

Explication

Un Classic Load Balancer peut être configuré pour répartir les demandes entrantes entre les instances Amazon EC2 au sein d'une seule zone de disponibilité ou de plusieurs zones de disponibilité. Un Classic Load Balancer qui ne couvre pas plusieurs zones de disponibilité ne peut pas rediriger le trafic vers des cibles situées dans une autre zone de disponibilité, au cas où la seule zone de disponibilité configurée deviendrait indisponible.

Remédiation en cas de défaillance des règles

Configurez les équilibreurs de charge classiques avec au moins deux sous-réseaux ou zones de disponibilité.

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

Classic Load Balancer - Exemple 1

Classic Load Balancer configuré avec deux zones de disponibilité. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ClassicLoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "Scheme": "internet-facing", "Listeners": [ { "InstancePort": "80", "InstanceProtocol": "HTTP", "LoadBalancerPort": "443", "Protocol": "HTTPS", "PolicyNames": [ "Sample-SSLNegotiation-Policy" ], "SSLCertificateId": { "Ref": "ACMCertificate" } } ], "Policies": [ { "PolicyName": "Sample-SSLNegotiation-Policy", "PolicyType": "SSLNegotiationPolicyType", "Attributes": [ { "Name": "Reference-Security-Policy", "Value": "ELBSecurityPolicy-TLS-1-2-2017-01" } ] } ], "AvailabilityZones": [ { "Fn::Select": [ 0, { "Fn::GetAZs": "" } ] }, { "Fn::Select": [ 1, { "Fn::GetAZs": "" } ] } ] } } }

Exemple YAML

ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internet-facing Listeners: - InstancePort: '80' InstanceProtocol: HTTP LoadBalancerPort: '443' Protocol: HTTPS PolicyNames: - Sample-SSLNegotiation-Policy SSLCertificateId: !Ref 'ACMCertificate' Policies: - PolicyName: Sample-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 AvailabilityZones: - !Select - 0 - !GetAZs '' - !Select - 1 - !GetAZs ''

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

Classic Load Balancer - Deuxième exemple

Classic Load Balancer configuré avec deux sous-réseaux. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ClassicLoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "Scheme": "internet-facing", "Listeners": [ { "InstancePort": "80", "InstanceProtocol": "HTTP", "LoadBalancerPort": "443", "Protocol": "HTTPS", "PolicyNames": [ "Sample-SSLNegotiation-Policy" ], "SSLCertificateId": { "Ref": "ACMCertificate" } } ], "Policies": [ { "PolicyName": "Sample-SSLNegotiation-Policy", "PolicyType": "SSLNegotiationPolicyType", "Attributes": [ { "Name": "Reference-Security-Policy", "Value": "ELBSecurityPolicy-TLS-1-2-2017-01" } ] } ], "AvailabilityZones": [ { "Fn::Select": [ 0, { "Fn::GetAZs": "" } ] }, { "Fn::Select": [ 1, { "Fn::GetAZs": "" } ] } ] } } }

Exemple YAML

ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internet-facing Listeners: - InstancePort: '80' InstanceProtocol: HTTP LoadBalancerPort: '443' Protocol: HTTPS PolicyNames: - Sample-SSLNegotiation-Policy SSLCertificateId: !Ref 'ACMCertificate' Policies: - PolicyName: Sample-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 AvailabilityZones: - !Select - 0 - !GetAZs '' - !Select - 1 - !GetAZs ''

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elb_multiple_az_check # # Description: # This control checks whether an Elastic Load Balancing (ELB) Classic Load Balancer has been configured with multiple Availability Zones. # # Reports on: # AWS::ElasticLoadBalancing::LoadBalancer # # 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 Elastic Load Balancing load balancer resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: Neither 'AvailabilityZones' or 'Subnets' have been specified # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: 'AvailabilityZones' been specified on the Elastic Load Balancing load balancer resource # And: The number of entries in 'AvailabilityZones' is < 2 or the number of # unique 'AvailabilityZones' provided is less than 2 (< 2) # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: 'Subnets' been specified on the Elastic Load Balancing load balancer resource # And: The number of entries in 'Subnets' is < 2 # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: 'AvailabilityZones' been specified on the Elastic Load Balancing load balancer resource # And: The number of entries in 'AvailabilityZones' is >= 2 # Then: PASS # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: 'Subnets' been specified on the Elastic Load Balancing load balancer resource # And: The number of entries in 'Subnets' is >= 2 # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_TYPE = "AWS::ElasticLoadBalancing::LoadBalancer" let INPUT_DOCUMENT = this # # Assignments # let classic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_TYPE ] # # Primary Rules # rule elb_multiple_az_check when is_cfn_template(%INPUT_DOCUMENT) %classic_load_balancers not empty { check(%classic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.7]: Require any classic load balancer to have multiple Availability Zones configured [FIX]: Configure Classic Load Balancers with two or more subnets or Availability Zones. >> } rule elb_multiple_az_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.7]: Require any classic load balancer to have multiple Availability Zones configured [FIX]: Configure Classic Load Balancers with two or more subnets or Availability Zones. >> } # # Parameterized Rules # rule check(classic_load_balancer) { %classic_load_balancer { # Scenario 2 AvailabilityZones exists or Subnets exists when AvailabilityZones exists { # Scenarios 3 and 5 two_or_more_entries(AvailabilityZones) AvailabilityZones[0] not in AvailabilityZones[1] } when Subnets exists { # Scenarios 4 and 6 two_or_more_entries(Subnets) } } } rule two_or_more_entries(list_property) { %list_property { this is_list this not empty this[0] exists this[1] 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.ELASTICLOADBALANCING.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.

Resources: ACMCertificate: Type: "AWS::CertificateManager::Certificate" Properties: DomainName: example.com ValidationMethod: DNS DomainValidationOptions: - DomainName: www.example.com HostedZoneId: ZZZHHHHWWWWAAA ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internet-facing Listeners: - Protocol: HTTPS InstancePort: '80' InstanceProtocol: HTTP LoadBalancerPort: '443' PolicyNames: - Example-SSLNegotiation-Policy SSLCertificateId: Ref: ACMCertificate Policies: - PolicyName: Example-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 AvailabilityZones: - Fn::Select: - 0 - Fn::GetAZs: '' - Fn::Select: - 1 - 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 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Listeners: - Protocol: HTTP InstancePort: 80 LoadBalancerPort: 80 Subnets: - Ref: Subnet

[CT.ELASTICLOADBALANCING.PR.8] Exiger que tout écouteur SSL/HTTPS d'un équilibreur de charge classique dispose d'un certificat fourni par AWS Certificate Manager

Ce contrôle vérifie si les équilibreurs de charge classiques utilisent les certificats HTTPS/SSL fournis par. AWS Certificate Manager

  • Objectif de contrôle : crypter les données en transit

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElasticLoadBalancing::LoadBalancer

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

Détails et exemples

Explication

Pour créer un certificat, vous pouvez utiliser ACM ou un outil compatible avec les protocoles SSL et TLS, comme OpenSSL. Security Hub vous recommande d'utiliser ACM pour créer ou importer des certificats pour votre équilibreur de charge.

ACM s'intègre aux équilibreurs de charge classiques, afin que vous puissiez déployer le certificat sur votre équilibreur de charge. Vous devez également renouveler ces certificats automatiquement.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux équilibreurs de charge classiques configurés avec des écouteurs HTTPS ou SSL.

Remédiation en cas de défaillance des règles

Configurez les équilibreurs de charge classiques pour utiliser les certificats fournis par AWS Certificate Manager (ACM).

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

Classic Load Balancer - Exemple

Classic Load Balancer configuré avec un écouteur HTTPS et AWS Certificate Manager un certificat SSL. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ClassicLoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "Scheme": "internal", "Subnets": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "Policies": [ { "PolicyName": "Example-SSLNegotiation-Policy", "PolicyType": "SSLNegotiationPolicyType", "Attributes": [ { "Name": "Reference-Security-Policy", "Value": "ELBSecurityPolicy-TLS-1-2-2017-01" } ] } ], "Listeners": [ { "InstancePort": "80", "InstanceProtocol": "HTTP", "LoadBalancerPort": "443", "Protocol": "HTTPS", "PolicyNames": [ "Example-SSLNegotiation-Policy" ], "SSLCertificateId": { "Ref": "ACMCertificate" } } ] } } }

Exemple YAML

ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Subnets: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' Policies: - PolicyName: Example-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 Listeners: - InstancePort: '80' InstanceProtocol: HTTP LoadBalancerPort: '443' Protocol: HTTPS PolicyNames: - Example-SSLNegotiation-Policy SSLCertificateId: !Ref 'ACMCertificate'

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elb_acm_certificate_required_check # # Description: # This control checks whether Classic Load Balancers use HTTPS/SSL certificates provided by AWS Certificate Manager. # # Reports on: # AWS::ElasticLoadBalancing::LoadBalancer # # 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 Elastic Load Balancing load balancer resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: There are no HTTPS or SSL 'Listeners' configured on the load balancer resource # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: There are one or more HTTPS or SSL 'Listeners' configured on the load balancer resource # And: 'SSLCertificateId' on load balancer HTTPS or SSL 'Listeners' is missing or not a valid ACM certificate ARN # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: There are one or more HTTPS or SSL 'Listeners' configured on the load balancer resource # And: 'SSLCertificateId' matches an ACM certificate ARN for all 'HTTPS' and 'SSL' 'Listeners' # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_TYPE = "AWS::ElasticLoadBalancing::LoadBalancer" let ACM_CERTIFICATE_ARN_PATTERN = /arn:aws[a-z0-9\-]*:acm:[a-z0-9\-]+:\d{12}:certificate\/[\w\-]{1,64}/ let SECURE_LISTENER_PROTOCOLS = ["HTTPS", "SSL"] let INPUT_DOCUMENT = this # # Assignments # let classic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_TYPE ] # # Primary Rules # rule elb_acm_certificate_required_check when is_cfn_template(%INPUT_DOCUMENT) %classic_load_balancers not empty { check(%classic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.8]: Require any classic load balancer SSL/HTTPS listener to have a certificate provided by AWS Certificate Manager [FIX]: Configure Classic Load Balancers to use certificates provided by AWS Certificate Manager (ACM). >> } rule elb_acm_certificate_required_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.8]: Require any classic load balancer SSL/HTTPS listener to have a certificate provided by AWS Certificate Manager [FIX]: Configure Classic Load Balancers to use certificates provided by AWS Certificate Manager (ACM). >> } # # Parameterized Rules # rule check(classic_load_balancer) { %classic_load_balancer [ filter_load_balancer_with_listeners(this) ] { Listeners [ filter_secure_listeners(this) ] { # Scenarios 3 and 4 SSLCertificateId exists SSLCertificateId == %ACM_CERTIFICATE_ARN_PATTERN or check_local_references(%INPUT_DOCUMENT, SSLCertificateId, "AWS::CertificateManager::Certificate") } } } rule filter_load_balancer_with_listeners(classic_load_balancer) { %classic_load_balancer { Listeners exists Listeners is_list Listeners not empty } } rule filter_secure_listeners(listener) { %listener { Protocol exists Protocol in %SECURE_LISTENER_PROTOCOLS } } # # 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 check_local_references(doc, reference_properties, referenced_resource_type) { %reference_properties { 'Fn::GetAtt' { query_for_resource(%doc, this[0], %referenced_resource_type) <<Local Stack reference was invalid>> } or Ref { query_for_resource(%doc, this, %referenced_resource_type) <<Local Stack reference was invalid>> } } } 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.ELASTICLOADBALANCING.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.

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ACMCertificate: Type: "AWS::CertificateManager::Certificate" Properties: DomainName: example.com ValidationMethod: DNS DomainValidationOptions: - DomainName: www.example.com HostedZoneId: ZZZHHHHWWWWAAA ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo Policies: - PolicyName: Example-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 Listeners: - InstancePort: '80' InstanceProtocol: HTTP LoadBalancerPort: '443' Protocol: HTTPS PolicyNames: - Example-SSLNegotiation-Policy SSLCertificateId: Ref: ACMCertificate

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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo Policies: - PolicyName: Example-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 Listeners: - InstancePort: '80' InstanceProtocol: HTTP LoadBalancerPort: '443' Protocol: HTTPS PolicyNames: - Example-SSLNegotiation-Policy SSLCertificateId: arn:aws:iam::123456789012:server-certificate/example-certificate

[CT.ELASTICLOADBALANCING.PR.9] Exiger qu'une application AWS ELB ou un écouteur Classic Load Balancer soit configuré avec une terminaison HTTPS ou TLS

Ce contrôle vérifie si vos écouteurs frontaux Elastic Load Balancing (ELB) Classic Load Balancer sont configurés avec les protocoles HTTPS ou SSL.

  • Objectif de contrôle : crypter les données en transit

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElasticLoadBalancing::LoadBalancer

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

Détails et exemples

Explication

Avant de commencer à utiliser un équilibreur de charge, vous devez ajouter un ou plusieurs écouteurs. Un écouteur est un processus qui utilise le protocole et le port configurés pour vérifier les demandes de connexion. Les écouteurs peuvent prendre en charge les protocoles HTTP et HTTPS/TLS. Vous devez toujours utiliser un écouteur HTTPS ou TLS, afin que l'équilibreur de charge effectue le chiffrement et le déchiffrement en transit.

Remédiation en cas de défaillance des règles

Configurez les écouteurs frontaux Classic Load Balancer avec les protocoles HTTPS ou SSL.

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

Classic Load Balancer - Exemple 1

Classic Load Balancer configuré avec un écouteur HTTPS. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "LoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "Scheme": "internal", "Subnets": [ { "Ref": "Subnet" } ], "Listeners": [ { "Protocol": "HTTPS", "SSLCertificateId": { "Ref": "ACMCertificate" }, "InstancePort": 80, "LoadBalancerPort": 443 } ] } } }

Exemple YAML

LoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Subnets: - !Ref 'Subnet' Listeners: - Protocol: HTTPS SSLCertificateId: !Ref 'ACMCertificate' InstancePort: 80 LoadBalancerPort: 443

Les exemples suivants montrent comment implémenter cette correction.

Classic Load Balancer - Deuxième exemple

Classic Load Balancer configuré avec un écouteur SSL. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "LoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "Scheme": "internal", "Subnets": [ { "Ref": "Subnet" } ], "Listeners": [ { "Protocol": "SSL", "SSLCertificateId": { "Ref": "ACMCertificate" }, "InstancePort": 80, "LoadBalancerPort": 443 } ] } } }

Exemple YAML

LoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Subnets: - !Ref 'Subnet' Listeners: - Protocol: SSL SSLCertificateId: !Ref 'ACMCertificate' InstancePort: 80 LoadBalancerPort: 443

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elb_tls_https_listeners_only_check # # Description: # Checks whether Classic Load Balancer front-end listeners are configured with HTTPS or SSL protocols. # # Reports on: # AWS::ElasticLoadBalancing::LoadBalancer # # 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 Elastic Load Balancing LoadBalancer resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancing LoadBalancer resource # And: 'Listeners' has not been provided or is provided with a value of an empty list # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancing LoadBalancer resource # And: 'Protocol' on LoadBalancer 'Listeners' is not set to 'HTTPS' or 'SSL' # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElasticLoadBalancing LoadBalancer resource # And: 'Protocol' is set to 'HTTPS' or 'SSL' for all 'Listeners' # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_TYPE = "AWS::ElasticLoadBalancing::LoadBalancer" let INPUT_DOCUMENT = this # # Assignments # let classic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_TYPE ] # # Primary Rules # rule elb_tls_https_listeners_only_check when is_cfn_template(%INPUT_DOCUMENT) %classic_load_balancers not empty { check(%classic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.9]: Require that an AWS ELB Application or Classic Load Balancer listener is configured with HTTPS or TLS termination [FIX]: Configure Classic Load Balancer front-end listeners with HTTPS or SSL protocols. >> } rule elb_tls_https_listeners_only_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.9]: Require that an AWS ELB Application or Classic Load Balancer listener is configured with HTTPS or TLS termination [FIX]: Configure Classic Load Balancer front-end listeners with HTTPS or SSL protocols. >> } # # Parameterized Rules # rule check(classic_load_balancer) { %classic_load_balancer { # Scenario 2 Listeners exists Listeners is_list Listeners not empty # Scenarios 3 and 4 Listeners[*] { Protocol exists Protocol in ["HTTPS", "SSL"] } } } # # 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.ELASTICLOADBALANCING.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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo Listeners: - Protocol: HTTPS SSLCertificateId: arn:aws:acm:us-east-1:123456789012:certificate/12345678-12ab-34cd-56ef-12345678 InstancePort: 80 LoadBalancerPort: 443

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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo Listeners: - Protocol: HTTP InstancePort: 80 LoadBalancerPort: 80

[CT.ELASTICLOADBALANCING.PR.10] Nécessite une application ELB ou un équilibreur de charge classique pour activer la journalisation

Ce contrôle vérifie si la journalisation est activée sur les équilibreurs de charge classiques.

  • 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::ElasticLoadBalancing::LoadBalancer

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

Détails et exemples

Explication

Elastic Load Balancing fournit des journaux d'accès qui capturent des informations détaillées sur les demandes envoyées à votre équilibreur de charge. Chaque journal contient des informations comme l'heure à laquelle la demande a été reçue, l'adresse IP du client, les latences, les chemins de demande et les réponses du serveur. Vous pouvez utiliser ces journaux d'accès pour analyser les modèles de trafic et résoudre des problèmes.

Remédiation en cas de défaillance des règles

Définissez AccessLoggingPolicy et fournissez un S3BucketName compartiment Amazon S3 configuré pour recevoir les journaux d'accès aux équilibreurs de charge classiques.

Les exemples suivants montrent comment implémenter cette correction.

Classic Load Balancer - Exemple

Classic Load Balancer configuré avec un écouteur HTTPS et une journalisation des accès. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ClassicLoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "Scheme": "internal", "Listeners": [ { "Protocol": "HTTPS", "InstancePort": 80, "LoadBalancerPort": 443 } ], "Subnets": [ { "Ref": "Subnet" } ], "AccessLoggingPolicy": { "Enabled": true, "S3BucketName": { "Ref": "LoggingBucket" } } } } }

Exemple YAML

ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Listeners: - Protocol: HTTPS InstancePort: 80 LoadBalancerPort: 443 Subnets: - !Ref 'Subnet' AccessLoggingPolicy: Enabled: true S3BucketName: !Ref 'LoggingBucket'

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elb_logging_enabled_check # # Description: # This control checks whether Classic Load Balancers have logging enabled. # # Reports on: # AWS::ElasticLoadBalancing::LoadBalancer # # 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 Elastic Load Balancing load balancer resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: 'AccessLoggingPolicy' 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 Elastic Load Balancing load balancer resource # And: 'AccessLoggingPolicy' has been provided # And: 'Enabled' in 'AccessLoggingPolicy' is missing or has been set to bool(false) or 'S3BucketName' is missing # or empty string value # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: 'AccessLoggingPolicy' has been provided # And: 'Enabled' has been provided in 'AccessLoggingPolicy' and has been set to bool(true) # And: 'S3BucketName' has been provided in 'AccessLoggingPolicy' as a non-empty string value or # valid local reference # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_TYPE = "AWS::ElasticLoadBalancing::LoadBalancer" let INPUT_DOCUMENT = this # # Assignments # let classic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_TYPE ] # # Primary Rules # rule elb_logging_enabled_check when is_cfn_template(%INPUT_DOCUMENT) %classic_load_balancers not empty { check(%classic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.10]: Require an ELB application or classic load balancer to have logging activated [FIX]: Set an 'AccessLoggingPolicy' and provide an 'S3BucketName' with an Amazon S3 bucket configured to receive classic load balancer access logs. >> } rule elb_logging_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.10]: Require an ELB application or classic load balancer to have logging activated [FIX]: Set an 'AccessLoggingPolicy' and provide an 'S3BucketName' with an Amazon S3 bucket configured to receive classic load balancer access logs. >> } # # Parameterized Rules # rule check(classic_load_balancer) { %classic_load_balancer { # Scenario 2 AccessLoggingPolicy exists AccessLoggingPolicy is_struct AccessLoggingPolicy { # Scenario 3 and 4 Enabled exists Enabled == true S3BucketName exists check_is_string_and_not_empty(S3BucketName) or check_local_references(%INPUT_DOCUMENT, S3BucketName, "AWS::S3::Bucket") } } } # # 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 check_is_string_and_not_empty(value) { %value { this is_string this != /\A\s*\z/ } } rule check_local_references(doc, reference_properties, referenced_resource_type) { %reference_properties { 'Fn::GetAtt' { query_for_resource(%doc, this[0], %referenced_resource_type) <<Local Stack reference was invalid>> } or Ref { query_for_resource(%doc, this, %referenced_resource_type) <<Local Stack reference was invalid>> } } } 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.ELASTICLOADBALANCING.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.

Mappings: RegionToELBAccountId: us-east-1: AccountId: '127311923021' us-west-1: AccountId: '027434742980' us-west-2: AccountId: '797873946194' ca-central-1: AccountId: '985666609251' eu-west-1: AccountId: '156460612806' ap-northeast-1: AccountId: '582318560864' ap-northeast-2: AccountId: '600734575887' ap-southeast-1: AccountId: '114774131450' ap-southeast-2: AccountId: '783225319266' ap-south-1: AccountId: '718504428378' us-east-2: AccountId: '033677994240' sa-east-1: AccountId: '507241528517' eu-central-1: AccountId: '054676820928' af-south-1: AccountId: '098369216593' ap-east-1: AccountId: '754344448648' ap-southeast-3: AccountId: '589379963580' ap-northeast-3: AccountId: '383597477331' eu-west-2: AccountId: '652711504416' eu-south-1: AccountId: '635631232127' eu-west-3: AccountId: '009996457667' eu-north-1: AccountId: '897822967062' me-south-1: AccountId: '076674570225' us-gov-west-1: AccountId: '048591011584' us-gov-east-1: AccountId: '190560391635' RegionToARNPrefix: us-east-1: ARNPrefix: 'arn:aws:' us-west-1: ARNPrefix: 'arn:aws:' us-west-2: ARNPrefix: 'arn:aws:' ca-central-1: ARNPrefix: 'arn:aws:' eu-west-1: ARNPrefix: 'arn:aws:' ap-northeast-1: ARNPrefix: 'arn:aws:' ap-northeast-2: ARNPrefix: 'arn:aws:' ap-southeast-1: ARNPrefix: 'arn:aws:' ap-southeast-2: ARNPrefix: 'arn:aws:' ap-south-1: ARNPrefix: 'arn:aws:' us-east-2: ARNPrefix: 'arn:aws:' sa-east-1: ARNPrefix: 'arn:aws:' eu-central-1: ARNPrefix: 'arn:aws:' af-south-1: ARNPrefix: 'arn:aws:' ap-east-1: ARNPrefix: 'arn:aws:' ap-southeast-3: ARNPrefix: 'arn:aws:' ap-northeast-3: ARNPrefix: 'arn:aws:' eu-west-2: ARNPrefix: 'arn:aws:' eu-south-1: ARNPrefix: 'arn:aws:' eu-west-3: ARNPrefix: 'arn:aws:' eu-north-1: ARNPrefix: 'arn:aws:' me-south-1: ARNPrefix: 'arn:aws:' us-gov-west-1: ARNPrefix: 'arn:aws-us-gov:' us-gov-east-1: ARNPrefix: 'arn:aws-us-gov:' Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' LoggingBucket: Type: AWS::S3::Bucket LoggingBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: Ref: LoggingBucket PolicyDocument: Version: 2012-10-17 Statement: - Action: - 's3:PutObject' Effect: Allow Resource: Fn::Join: - '' - - Fn::FindInMap: [RegionToARNPrefix, !Ref 'AWS::Region', ARNPrefix] - 's3:::' - Ref: LoggingBucket - /AWSLogs/ - Ref: AWS::AccountId - /* Principal: AWS: Fn::FindInMap: [RegionToELBAccountId, !Ref 'AWS::Region', AccountId] ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Listeners: - Protocol: HTTP InstancePort: 80 LoadBalancerPort: 80 Subnets: - Ref: SubnetOne - Ref: SubnetTwo AccessLoggingPolicy: Enabled: true S3BucketName: Ref: LoggingBucket

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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Listeners: - Protocol: HTTP InstancePort: 80 LoadBalancerPort: 80 Subnets: - Ref: SubnetOne - Ref: SubnetTwo

[CT.ELASTICLOADBALANCING.PR.11] Exiger que la vidange des connexions soit activée sur tout équilibreur de charge ELB classique

Ce contrôle vérifie si le drainage des connexions est configuré pour les équilibreurs de charge classiques Elastic Load Balancing (ELB).

  • Objectif de contrôle : améliorer la résilience

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElasticLoadBalancing::LoadBalancer

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

Détails et exemples

Explication

L'activation du drainage des connexions sur les équilibreurs de charge classiques garantit que l'équilibreur de charge cesse d'envoyer des demandes aux instances dont l'enregistrement est annulé ou qui ne fonctionnent pas correctement. Cela permet de maintenir ouvertes les connexions existantes. Cette configuration est particulièrement utile pour les instances des groupes Auto Scaling, afin de garantir que les connexions ne sont pas interrompues brusquement.

Remédiation en cas de défaillance des règles

Configurez un équilibreur de charge classique ConnectionDrainingPolicy sur Elastic Load Balancing.

Les exemples suivants montrent comment implémenter cette correction.

Classic Load Balancer - Exemple

Classic Load Balancer configuré avec une vidange de connexion active. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ClassicLoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "Scheme": "internal", "Listeners": [ { "InstancePort": "80", "InstanceProtocol": "HTTP", "LoadBalancerPort": "443", "Protocol": "HTTPS", "PolicyNames": [ "Example-SSLNegotiation-Policy" ], "SSLCertificateId": { "Ref": "ACMCertificate" } } ], "Policies": [ { "PolicyName": "Example-SSLNegotiation-Policy", "PolicyType": "SSLNegotiationPolicyType", "Attributes": [ { "Name": "Reference-Security-Policy", "Value": "ELBSecurityPolicy-TLS-1-2-2017-01" } ] } ], "Subnets": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "ConnectionDrainingPolicy": { "Enabled": true } } } }

Exemple YAML

ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Listeners: - InstancePort: '80' InstanceProtocol: HTTP LoadBalancerPort: '443' Protocol: HTTPS PolicyNames: - Example-SSLNegotiation-Policy SSLCertificateId: !Ref 'ACMCertificate' Policies: - PolicyName: Example-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 Subnets: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' ConnectionDrainingPolicy: Enabled: true

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elb_connection_draining_enabled_check # # Description: # This control checks whether Elastic Load Balancing (ELB) Classic Load Balancers have connection draining configured. # # Reports on: # AWS::ElasticLoadBalancing::LoadBalancer # # 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 Elastic Load Balancing load balancer resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: 'ConnectionDrainingPolicy' has not been specified # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: 'ConnectionDrainingPolicy' has been specified # And: 'Enabled' in 'ConnectionDrainingPolicy' is missing or has been set to bool(false) # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing load balancer resource # And: 'ConnectionDrainingPolicy' has been specified # And: 'Enabled' in 'ConnectionDrainingPolicy' has been set to bool(true) # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_TYPE = "AWS::ElasticLoadBalancing::LoadBalancer" let INPUT_DOCUMENT = this # # Assignments # let classic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_TYPE ] # # Primary Rules # rule elb_connection_draining_enabled_check when is_cfn_template(%INPUT_DOCUMENT) %classic_load_balancers not empty { check(%classic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.11]: Require any ELB classic load balancer to have connection draining activated [FIX]: Configure a 'ConnectionDrainingPolicy' on Elastic Load Balancing Classic Load Balancers. >> } rule elb_connection_draining_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.11]: Require any ELB classic load balancer to have connection draining activated [FIX]: Configure a 'ConnectionDrainingPolicy' on Elastic Load Balancing Classic Load Balancers. >> } # # Parameterized Rules # rule check(classic_load_balancer) { %classic_load_balancer { # Scenario 2 ConnectionDrainingPolicy exists ConnectionDrainingPolicy is_struct ConnectionDrainingPolicy { # Scenario 3 and 4 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.ELASTICLOADBALANCING.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 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ACMCertificate: Type: "AWS::CertificateManager::Certificate" Properties: DomainName: example.com ValidationMethod: DNS DomainValidationOptions: - DomainName: www.example.com HostedZoneId: ZZZHHHHWWWWAAA ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Listeners: - InstancePort: '80' InstanceProtocol: HTTP LoadBalancerPort: '443' Protocol: HTTPS PolicyNames: - Example-SSLNegotiation-Policy SSLCertificateId: Ref: ACMCertificate Policies: - PolicyName: Example-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 Subnets: - Ref: SubnetOne - Ref: SubnetTwo ConnectionDrainingPolicy: 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: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Listeners: - Protocol: HTTP InstancePort: 80 LoadBalancerPort: 80 Subnets: - Ref: SubnetOne - Ref: SubnetTwo

[CT.ELASTICLOADBALANCING.PR.12] Exiger que tout écouteur SSL/HTTPS d'un équilibreur de charge ELB classique dispose d'une politique de sécurité prédéfinie avec une configuration solide

Ce contrôle vérifie si les écouteurs HTTPS/SSL Elastic Load Balancing (ELB) Classic Load Balancer utilisent la politique de sécurité prédéfinie. ELBSecurityPolicy-TLS-1-2-2017-01

  • 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::ElasticLoadBalancing::LoadBalancer

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

Détails et exemples

Explication

Une politique de sécurité est une combinaison de protocoles SSL, de chiffrements et de l'option de préférence d'ordre du serveur. Les politiques prédéfinies contrôlent les chiffrements, les protocoles et les ordres de préférence qui fournissent une assistance lors des négociations SSL entre un client et un équilibreur de charge.

L'utilisation ELBSecurityPolicy-TLS-1-2-2017-01 peut vous aider à respecter les normes de conformité et de sécurité qui vous obligent à désactiver des versions spécifiques de SSL et TLS.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux équilibreurs de charge Elastic Load Balancing Classic configurés avec des écouteurs HTTPS ou SSL.

Remédiation en cas de défaillance des règles

Configurez les écouteurs HTTPS/SSL Classic Load Balancer pour utiliser la politique de sécurité prédéfinie appelée. ELBSecurityPolicy-TLS-1-2-2017-01

Les exemples suivants montrent comment implémenter cette correction.

Classic Load Balancer - Exemple

Classic Load Balancer configuré avec un écouteur HTTPS et une politique de négociation SSL qui fait référence à la politique de sécurité ELBSecurityPolicy-TLS-1-2-2017-01 prédéfinie pour les équilibreurs de charge classiques. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ClassicLoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "Scheme": "internal", "Subnets": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "Policies": [ { "PolicyName": "Example-SSLNegotiation-Policy", "PolicyType": "SSLNegotiationPolicyType", "Attributes": [ { "Name": "Reference-Security-Policy", "Value": "ELBSecurityPolicy-TLS-1-2-2017-01" } ] } ], "Listeners": [ { "InstancePort": 80, "InstanceProtocol": "HTTP", "LoadBalancerPort": 443, "Protocol": "HTTPS", "SSLCertificateId": { "Ref": "ACMCertificate" }, "PolicyNames": [ "Example-SSLNegotiation-Policy" ] } ] } } }

Exemple YAML

ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Subnets: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' Policies: - PolicyName: Example-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 Listeners: - InstancePort: 80 InstanceProtocol: HTTP LoadBalancerPort: 443 Protocol: HTTPS SSLCertificateId: !Ref 'ACMCertificate' PolicyNames: - Example-SSLNegotiation-Policy

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elb_predefined_security_policy_ssl_check # # Description: # This control checks whether Elastic Load Balancing (ELB) Classic Load Balancer HTTPS/SSL listeners use the predefined security policy 'ELBSecurityPolicy-TLS-1-2-2017-01'. # # Reports on: # AWS::ElasticLoadBalancing::LoadBalancer # # 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 Elastic Load Balancing LoadBalancer resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing LoadBalancer resource # And: There are no HTTPS or SSL 'Listeners' configured on the Elastic Load Balancing LoadBalancer resource # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing LoadBalancer resource # And: 'Policies' does not contain a policy with 'PolicyType' equal to 'SSLNegotiationPolicyType' # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing LoadBalancer resource # And: 'Policies' contains a policy with 'PolicyType' equal to 'SSLNegotiationPolicyType' # And: 'Policies' is missing a 'Reference-Security-Policy' with a value of # 'ELBSecurityPolicy-TLS-1-2-2017-01' # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing LoadBalancer resource # And: 'Policies' contains a policy with 'PolicyType' equal to 'SSLNegotiationPolicyType' # And: 'Policies' contains a 'Reference-Security-Policy' with a value of # 'ELBSecurityPolicy-TLS-1-2-2017-01' # And: A 'HTTPS' or 'SSL' Listener on the LoadBalancer resource does not reference the secure policy # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing LoadBalancer resource # And: 'Policies' contains a policy with 'PolicyType' equal to 'SSLNegotiationPolicyType' # And: 'Policies' contains a 'Reference-Security-Policy' with a value of # 'ELBSecurityPolicy-TLS-1-2-2017-01' # And: All 'HTTPS' and 'SSL' Listeners on the LoadBalancer resource reference the secure policy # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_TYPE = "AWS::ElasticLoadBalancing::LoadBalancer" let VALID_REFERENCE_SECURITY_POLICIES = [ "ELBSecurityPolicy-TLS-1-2-2017-01" ] let INPUT_DOCUMENT = this # # Assignments # let classic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_TYPE ] # # Primary Rules # rule elb_predefined_security_policy_ssl_check when is_cfn_template(%INPUT_DOCUMENT) %classic_load_balancers not empty { check(%classic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.12]: Require any ELB classic load balancer SSL/HTTPS listener to have a predefined security policy with a strong configuration [FIX]: Configure classic load balancer HTTPS/SSL listeners to use the predefined security policy called ELBSecurityPolicy-TLS-1-2-2017-01. >> } rule elb_predefined_security_policy_ssl_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.12]: Require any ELB classic load balancer SSL/HTTPS listener to have a predefined security policy with a strong configuration [FIX]: Configure classic load balancer HTTPS/SSL listeners to use the predefined security policy called ELBSecurityPolicy-TLS-1-2-2017-01. >> } # # Parameterized Rules # rule check(classic_load_balancer) { %classic_load_balancer { let elb = this # Scenario 2 Listeners[ Protocol in ["HTTPS", "SSL"] ] { %elb.Policies exists %elb.Policies is_list %elb.Policies not empty let secure_policies = %elb.Policies[ PolicyType == "SSLNegotiationPolicyType" some Attributes[*] { Name == "Reference-Security-Policy" Value in %VALID_REFERENCE_SECURITY_POLICIES } ].PolicyName # Scenarios 3 and 4 %secure_policies not empty # Scenarios 5 and 6 PolicyNames exists PolicyNames is_list PolicyNames not empty some PolicyNames.* in %secure_policies } } } # # 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.ELASTICLOADBALANCING.PR.12 exemples 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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ACMCertificate: Type: "AWS::CertificateManager::Certificate" Properties: DomainName: example.com ValidationMethod: DNS DomainValidationOptions: - DomainName: www.example.com HostedZoneId: ZZZHHHHWWWWAAA ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo Policies: - PolicyName: Example-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 Listeners: - InstancePort: 80 InstanceProtocol: HTTP LoadBalancerPort: 443 Protocol: HTTPS SSLCertificateId: Ref: ACMCertificate PolicyNames: - Example-SSLNegotiation-Policy

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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Subnets: - Ref: SubnetOne - Ref: SubnetTwo Policies: - PolicyName: Example-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-2016-08 Listeners: - InstancePort: 80 InstanceProtocol: HTTP LoadBalancerPort: 443 Protocol: HTTPS SSLCertificateId: arn:aws:iam::123456789012:server-certificate/example-certificate PolicyNames: - Example-SSLNegotiation-Policy

[CT.ELASTICLOADBALANCING.PR.13] Exiger que l'équilibrage de charge entre zones soit activé sur tout équilibreur de charge ELB classique

Ce contrôle vérifie si l'équilibrage de charge entre zones est configuré pour votre Classic Load Balancer.

  • Objectif de contrôle : améliorer la disponibilité

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElasticLoadBalancing::LoadBalancer

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

Détails et exemples

Explication

Un nœud d'équilibrage de charge répartit le trafic entre les cibles enregistrées dans sa zone de disponibilité. Lorsque l'équilibrage de charge entre zones est désactivé, chaque nœud d'équilibreur de charge distribue le trafic uniquement entre les cibles enregistrées dans sa propre zone de disponibilité. Si le nombre de cibles enregistrées n'est pas le même dans toutes les zones de disponibilité, le trafic n'est pas réparti de manière uniforme, de sorte que les instances d'une zone peuvent être surutilisées par rapport aux instances d'une autre zone. Lorsque l'équilibrage de charge entre zones est activé, chaque nœud d'équilibreur de charge de votre équilibreur de charge classique répartit les demandes de manière uniforme entre les instances enregistrées dans toutes les zones de disponibilité activées.

Remédiation en cas de défaillance des règles

Réglez true sur CrossZone les équilibreurs de charge classiques.

Les exemples suivants montrent comment implémenter cette correction.

Classic Load Balancer - Exemple

Classic Load Balancer configuré avec un équilibrage de charge entre zones actif. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ClassicLoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "Scheme": "internal", "Listeners": [ { "InstancePort": "80", "InstanceProtocol": "HTTP", "LoadBalancerPort": "443", "Protocol": "HTTPS", "PolicyNames": [ "Sample-SSLNegotiation-Policy" ], "SSLCertificateId": { "Ref": "ACMCertificate" } } ], "Policies": [ { "PolicyName": "Sample-SSLNegotiation-Policy", "PolicyType": "SSLNegotiationPolicyType", "Attributes": [ { "Name": "Reference-Security-Policy", "Value": "ELBSecurityPolicy-TLS-1-2-2017-01" } ] } ], "Subnets": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "CrossZone": true } } }

Exemple YAML

ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Listeners: - InstancePort: '80' InstanceProtocol: HTTP LoadBalancerPort: '443' Protocol: HTTPS PolicyNames: - Sample-SSLNegotiation-Policy SSLCertificateId: !Ref 'ACMCertificate' Policies: - PolicyName: Sample-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 Subnets: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' CrossZone: true

CT.ELASTICLOADBALANCING.PR.13spécification des règles

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elb_cross_zone_load_balancing_enabled_check # # Description: # This control checks whether cross-zone load balancing is configured for your Classic Load Balancer. # # Reports on: # AWS::ElasticLoadBalancing::LoadBalancer # # 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 Elastic Load Balancing LoadBalancer resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing LoadBalancer resource # And: 'CrossZone' has not been specified # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing LoadBalancer resource # And: 'CrossZone' has been specified and set to bool(false) # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing LoadBalancer resource # And: 'CrossZone' has been specified and set to bool(true) # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_TYPE = "AWS::ElasticLoadBalancing::LoadBalancer" let INPUT_DOCUMENT = this # # Assignments # let classic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_TYPE ] # # Primary Rules # rule elb_cross_zone_load_balancing_enabled_check when is_cfn_template(%INPUT_DOCUMENT) %classic_load_balancers not empty { check(%classic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.13]: Require any ELB classic load balancer to have cross-zone load balancing activated [FIX]: Set 'CrossZone' to 'true' on Classic Load Balancers. >> } rule elb_cross_zone_load_balancing_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.13]: Require any ELB classic load balancer to have cross-zone load balancing activated [FIX]: Set 'CrossZone' to 'true' on Classic Load Balancers. >> } # # Parameterized Rules # rule check(classic_load_balancer) { %classic_load_balancer { # Scenario 2 CrossZone exists # Scenario 3 and 4 CrossZone == 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.ELASTICLOADBALANCING.PR.13exemples 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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ACMCertificate: Type: "AWS::CertificateManager::Certificate" Properties: DomainName: example.com ValidationMethod: DNS DomainValidationOptions: - DomainName: www.example.com HostedZoneId: ZZZHHHHWWWWAAA ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Listeners: - InstancePort: '80' InstanceProtocol: HTTP LoadBalancerPort: '443' Protocol: HTTPS PolicyNames: - Example-SSLNegotiation-Policy SSLCertificateId: Ref: ACMCertificate Policies: - PolicyName: Example-SSLNegotiation-Policy PolicyType: SSLNegotiationPolicyType Attributes: - Name: Reference-Security-Policy Value: ELBSecurityPolicy-TLS-1-2-2017-01 Subnets: - Ref: SubnetOne - Ref: SubnetTwo CrossZone: 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: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' ClassicLoadBalancer: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: Scheme: internal Listeners: - Protocol: HTTP InstancePort: 80 LoadBalancerPort: 80 Subnets: - Ref: SubnetOne - Ref: SubnetTwo CrossZone: false

[CT.ELASTICLOADBALANCING.PR.14] Exiger l'activation de l'équilibrage de charge entre zones sur un Network Load Balancer

Ce contrôle vérifie si un Network Load Balancer (NLB) est configuré avec un équilibrage de charge entre zones.

  • Objectif de contrôle : améliorer la résilience, améliorer la disponibilité

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElasticLoadBalancingV2::LoadBalancer

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

Détails et exemples

Explication

Les nœuds de votre équilibreur de charge distribuent les requêtes des clients à des cibles enregistrées. Lorsque l'équilibrage de charge entre zones est activé, chaque nœud d'équilibreur de charge distribue le trafic entre les cibles enregistrées dans toutes les zones de disponibilité activées. Lorsque l'équilibrage de charge entre zones n'est pas activé, chaque nœud d'équilibreur de charge distribue le trafic uniquement entre les cibles enregistrées dans sa propre zone de disponibilité.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement à un Network Load Balancer (Typeofnetwork).

  • Avec un Network Load Balancer, l'équilibrage de charge entre zones est désactivé par défaut au niveau de l'équilibreur de charge. Vous pouvez l'activer à tout moment. Pour les groupes cibles, le paramètre par défaut est d'utiliser le paramètre d'équilibrage de charge, mais vous pouvez le remplacer en activant ou en désactivant explicitement l'équilibrage de charge entre zones, au niveau du groupe cible. Pour vous assurer que l'équilibrage de charge entre zones est configuré sur les groupes cibles, utilisez ce contrôle conjointement avecCT.ELASTICLOADBALANCING.PR.15.

Remédiation en cas de défaillance des règles

Définissez l'attribut de l'équilibreur de charge load_balancing.cross_zone.enabled surtrue.

Les exemples suivants montrent comment implémenter cette correction.

Network Load Balancer - Exemple

Network Load Balancer configuré avec l'équilibrage de charge entre zones activé. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "NetworkLoadBalancer": { "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer", "Properties": { "Scheme": "internal", "Type": "network", "Subnets": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "IpAddressType": "ipv4", "LoadBalancerAttributes": [ { "Key": "load_balancing.cross_zone.enabled", "Value": true } ] } } }

Exemple YAML

NetworkLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Type: network Subnets: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' IpAddressType: ipv4 LoadBalancerAttributes: - Key: load_balancing.cross_zone.enabled Value: true

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # nlb_cross_zone_load_balancing_enabled_check # # Description: # This control checks whether a Network Load Balancer (NLB) is configured with cross-zone load balancing. # # Reports on: # AWS::ElasticLoadBalancingV2::LoadBalancer # # 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 ELBv2 Load Balancer resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 Load Balancer resource # And: 'Type' has been provided and is set to a value other than 'network' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 Load Balancer resource # And: 'Type' has been provided and set to 'network' # And: 'LoadBalancerAttributes' has not been provided or has been provided as an empty list # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 Load Balancer resource # And: 'Type' has been provided and set to 'network' # And: 'LoadBalancerAttributes' has been provided as a non-empty list # And: 'LoadBalancerAttributes' does not contain an entry with a 'Key' equal to 'load_balancing.cross_zone.enabled' # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 Load Balancer resource # And: 'Type' has been provided and set to 'network' # And: 'LoadBalancerAttributes' has been provided as a non-empty list # And: 'LoadBalancerAttributes' contains an entry with a 'Key' equal to 'load_balancing.cross_zone.enabled' and # 'Value' equal to a value other than bool(true) or string(true) # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ELBv2 Load Balancer resource # And: 'Type' has been provided and set to 'network' # And: 'LoadBalancerAttributes' has been provided as a non-empty list # And: 'LoadBalancerAttributes' contains an entry with a 'Key' equal to 'load_balancing.cross_zone.enabled' and # 'Value' equal to bool(true) or string(true) # Then: PASS # # Constants # let ELASTIC_LOAD_BALANCER_V2_TYPE = "AWS::ElasticLoadBalancingV2::LoadBalancer" let INPUT_DOCUMENT = this # # Assignments # let elastic_load_balancers = Resources.*[ Type == %ELASTIC_LOAD_BALANCER_V2_TYPE ] # # Primary Rules # rule nlb_cross_zone_load_balancing_enabled_check when is_cfn_template(%INPUT_DOCUMENT) %elastic_load_balancers not empty { check(%elastic_load_balancers.Properties) << [CT.ELASTICLOADBALANCING.PR.14]: Require a Network Load Balancer to have cross-zone load balancing activated [FIX]: Set the load balancer attribute 'load_balancing.cross_zone.enabled' to 'true'. >> } rule nlb_cross_zone_load_balancing_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTIC_LOAD_BALANCER_V2_TYPE) { check(%INPUT_DOCUMENT.%ELASTIC_LOAD_BALANCER_V2_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.14]: Require a Network Load Balancer to have cross-zone load balancing activated [FIX]: Set the load balancer attribute 'load_balancing.cross_zone.enabled' to 'true'. >> } # # Parameterized Rules # rule check(elastic_load_balancer) { %elastic_load_balancer[ Type == "network" ] { # Scenario 2 LoadBalancerAttributes exists LoadBalancerAttributes is_list LoadBalancerAttributes not empty # Scenarios 3, 4 and 5 some LoadBalancerAttributes[*] { Key exists Value exists Key == "load_balancing.cross_zone.enabled" Value in [ true, "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.ELASTICLOADBALANCING.PR.14 exemples 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' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: Vpc CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: Vpc CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' NetworkLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Type: network Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4 LoadBalancerAttributes: - Key: load_balancing.cross_zone.enabled Value: 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: Vpc: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' SubnetOne: Type: AWS::EC2::Subnet Properties: VpcId: Ref: Vpc CidrBlock: 10.0.0.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetTwo: Type: AWS::EC2::Subnet Properties: VpcId: Ref: Vpc CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: '' NetworkLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internal Type: network Subnets: - Ref: SubnetOne - Ref: SubnetTwo IpAddressType: ipv4

[CT.ELASTICLOADBALANCING.PR.15] Exiger qu'un groupe cible Elastic Load Balancing v2 ne désactive pas explicitement l'équilibrage de charge entre zones

Ce contrôle vérifie si un groupe cible Elastic Load Balancing v2 est configuré de telle sorte qu'il ne désactive pas explicitement l'équilibrage de charge entre zones.

  • Objectif de contrôle : améliorer la disponibilité

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElasticLoadBalancingV2::TargetGroup

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

Détails et exemples

Explication

Les nœuds de votre équilibreur de charge distribuent les requêtes des clients à des cibles enregistrées. Lorsque l'équilibrage de charge entre zones est activé, chaque nœud d'équilibreur de charge distribue le trafic entre les cibles enregistrées dans toutes les zones de disponibilité activées. Lorsque l'équilibrage de charge entre zones n'est pas activé, chaque nœud d'équilibreur de charge distribue le trafic uniquement entre les cibles enregistrées dans sa zone de disponibilité.

Le paramètre d'équilibrage de charge entre zones du groupe cible détermine le comportement d'équilibrage de charge pour l'ensemble du groupe cible. Par exemple, si l'équilibrage de charge entre zones est activé au niveau de l'équilibreur de charge, mais pas au niveau du groupe cible, le trafic envoyé au groupe cible n'est pas acheminé entre les zones de disponibilité.

Considérations d'utilisation
  • Ce contrôle vérifie uniquement que l'équilibrage de charge entre zones n'a pas été explicitement désactivé sur un groupe cible ELB. Pour vous assurer que l'équilibrage de charge entre zones est activé, veillez à activer ce contrôle en conjonction avec les commandes proactives associées qui vérifient directement les équilibreurs de charge.

  • Si vous activez la répartition de charge entre zones, vous ne pouvez pas démarrer de changement de zone. Pour plus d'informations, consultez [Resources supported for zonal shift] (https://docs.aws.amazon.com/r53recovery/latest/dg/ arc-zonal-shift .resource-types.html) dans le manuel du développeur Amazon Route 53 Application Recovery Controller.

Remédiation en cas de défaillance des règles

Ne définissez pas l'attribut de l'équilibreur de charge load_balancing.cross_zone.enabled pour adopter la valeur par défaut deuse_load_balancer_configuration. Ne définissez pas explicitement l'attribut sur true, ni sur la valeuruse_load_balancer_configuration.

Les exemples suivants montrent comment implémenter cette correction.

Groupe cible d'Elastic Load Balancer - Exemple

Le groupe cible Elastic Load Balancer est configuré pour permettre l'équilibrage de charge entre zones. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "TargetGroup": { "Type": "AWS::ElasticLoadBalancingV2::TargetGroup", "Properties": { "Protocol": "HTTP", "Port": 80, "VpcId": { "Ref": "VPC" }, "TargetGroupAttributes": [ { "Key": "load_balancing.cross_zone.enabled", "Value": true } ] } } }

Exemple YAML

TargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Protocol: HTTP Port: 80 VpcId: !Ref 'VPC' TargetGroupAttributes: - Key: load_balancing.cross_zone.enabled Value: true

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elbv2_target_group_cross_zone_check # # Description: # This control checks whether an Elastic Load Balancing v2 target group is configured so that it does not explicitly turn off cross-zone load balancing. # # Reports on: # AWS::ElasticLoadBalancingV2::TargetGroup # # 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 Elastic Load Balancing v2 target group resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing v2 target group resource # And: 'TargetGroupAttributes' has been provided as a non-empty list # And: 'TargetGroupAttributes' contain an entry with a 'Key' equal to 'load_balancing.cross_zone.enabled' # and 'Value' equal to a value other than bool(true), 'true' or 'use_load_balancer_configuration' # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing v2 target group resource # And: 'TargetGroupAttributes' has not been provided or has been provided as a list that # does not contain an entry with a 'Key' equal to 'load_balancing.cross_zone.enabled' # Then: PASS # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Elastic Load Balancing v2 target group resource # And: 'TargetGroupAttributes' has been provided as a non-empty list # And: 'TargetGroupAttributes' contains an entry with a 'Key' equal to 'load_balancing.cross_zone.enabled' and # 'Value' equal to bool(true), string(true) or 'use_load_balancer_configuration' # Then: PASS # # Constants # let INPUT_DOCUMENT = this let ELBV2_TARGET_GROUP_TYPE = "AWS::ElasticLoadBalancingV2::TargetGroup" let ALLOWED_CROSS_ZONE_VALUES = ["true", true, "use_load_balancer_configuration"] # # Assignments # let elbv2_target_groups = Resources.*[ Type == %ELBV2_TARGET_GROUP_TYPE ] # # Primary Rules # rule elbv2_target_group_cross_zone_check when is_cfn_template(%INPUT_DOCUMENT) %elbv2_target_groups not empty { check(%elbv2_target_groups.Properties) << [CT.ELASTICLOADBALANCING.PR.15]: Require that an Elastic Load Balancing v2 target group does not explicitly disable cross-zone load balancing [FIX]: Do not set the load balancer attribute 'load_balancing.cross_zone.enabled' to adopt the default value of 'use_load_balancer_configuration'. Do not explicitly set the attribute to true, nor to the value 'use_load_balancer_configuration'. >> } rule elbv2_target_group_cross_zone_check when is_cfn_hook(%INPUT_DOCUMENT, %ELBV2_TARGET_GROUP_TYPE) { check(%INPUT_DOCUMENT.%ELBV2_TARGET_GROUP_TYPE.resourceProperties) << [CT.ELASTICLOADBALANCING.PR.15]: Require that an Elastic Load Balancing v2 target group does not explicitly disable cross-zone load balancing [FIX]: Do not set the load balancer attribute 'load_balancing.cross_zone.enabled' to adopt the default value of 'use_load_balancer_configuration'. Do not explicitly set the attribute to true, nor to the value 'use_load_balancer_configuration'. >> } # # Parameterized Rules # rule check(elbv2_target_group) { %elbv2_target_group { # Scenarios 2 and 3 TargetGroupAttributes not exists or check_target_group_with_attributes(this) } } rule check_target_group_with_attributes(target_group) { %target_group { TargetGroupAttributes exists TargetGroupAttributes is_list TargetGroupAttributes[ Key exists Key == "load_balancing.cross_zone.enabled" ] { # Scenario 4 Value exists Value in %ALLOWED_CROSS_ZONE_VALUES } } } # # 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.ELASTICLOADBALANCING.PR.15 exemples 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 TargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Protocol: HTTP Port: 80 VpcId: Ref: VPC TargetGroupAttributes: - Key: load_balancing.cross_zone.enabled Value: 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: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: true EnableDnsHostnames: true TargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: Protocol: HTTP Port: 80 VpcId: Ref: VPC TargetGroupAttributes: - Key: load_balancing.cross_zone.enabled Value: false