ElastiCache Contrôles Amazon - 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.

ElastiCache Contrôles Amazon

[CT.ELASTICACHE.PR.1] Exiger que les sauvegardes automatiques soient activées sur un cluster ElastiCache Amazon pour Redis

Ce contrôle vérifie si les sauvegardes automatiques sont activées sur un cluster Amazon ElastiCache Redis.

  • 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::ElastiCache::CacheCluster

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

Détails et exemples

Explication

Lorsque les sauvegardes automatiques sont activées, Amazon ElastiCache crée une sauvegarde du cluster quotidiennement. Il n'y a aucun impact sur le cluster et le changement est immédiat. Les sauvegardes automatiques peuvent constituer une protection contre la perte de données. En cas de panne, vous pouvez créer un nouveau cluster et restaurer vos données à partir de la sauvegarde la plus récente.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux clusters de ElastiCache cache Amazon dotés d'un type de moteur redis

Corrections en cas de défaillance des règles

Définissez la valeur du SnapshotRetentionLimit paramètre sur une valeur entière supérieure à 0.

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

Amazon ElastiCache Cache Cluster : exemple

Un cluster de ElastiCache cache Amazon configuré avec les sauvegardes automatiques activées. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "CacheCluster": { "Type": "AWS::ElastiCache::CacheCluster", "Properties": { "Engine": "redis", "NumCacheNodes": 1, "CacheNodeType": "cache.t3.micro", "VpcSecurityGroupIds": [ { "Ref": "SecurityGroup" } ], "CacheSubnetGroupName": { "Ref": "SubnetGroup" }, "SnapshotRetentionLimit": 5 } } }

Exemple YAML

CacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: Engine: redis NumCacheNodes: 1 CacheNodeType: cache.t3.micro VpcSecurityGroupIds: - !Ref 'SecurityGroup' CacheSubnetGroupName: !Ref 'SubnetGroup' SnapshotRetentionLimit: 5

Spécification de la règle CT.ELASTICACHE.PR.1

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elasticache_redis_cluster_auto_backup_check # # Description: # This control checks whether an Amazon ElastiCache Redis cluster has automatic backups enabled. # # Reports on: # AWS::ElastiCache::CacheCluster # # 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 ElastiCache cache cluster resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache CacheCluster resource # And: 'Engine' has not been provided or has been provided and is not set to 'redis' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache cache cluster resource # And: 'Engine' has been provided and set to 'redis' # And: 'SnapshotRetentionLimit' has not been provided # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache cache cluster resource # And: 'Engine' has been provided and set to 'redis' # And: 'SnapshotRetentionLimit' has been provided and set to a non-integer value or an integer value of 0 # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache cache cluster resource # And: 'Engine' has been provided and set to 'redis' # And: 'SnapshotRetentionLimit' has been provided and set to an integer value greater than 0 # Then: PASS # # Constants # let ELASTICACHE_CACHE_CLUSTER_TYPE = "AWS::ElastiCache::CacheCluster" let REDIS_ENGINE_TYPE = "redis" let INPUT_DOCUMENT = this # # Assignments # let elasticache_clusters = Resources.*[ Type == %ELASTICACHE_CACHE_CLUSTER_TYPE ] # # Primary Rules # rule elasticache_redis_cluster_auto_backup_check when is_cfn_template(%INPUT_DOCUMENT) %elasticache_clusters not empty { check(%elasticache_clusters.Properties) << [CT.ELASTICACHE.PR.1]: Require an Amazon ElastiCache for Redis cluster to have automatic backups activated [FIX]: Set the value of the 'SnapshotRetentionLimit' parameter to an integer value greater than 0. >> } rule elasticache_redis_cluster_auto_backup_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTICACHE_CACHE_CLUSTER_TYPE) { check(%INPUT_DOCUMENT.%ELASTICACHE_CACHE_CLUSTER_TYPE.resourceProperties) << [CT.ELASTICACHE.PR.1]: Require an Amazon ElastiCache for Redis cluster to have automatic backups activated [FIX]: Set the value of the 'SnapshotRetentionLimit' parameter to an integer value greater than 0. >> } # # Parameterized Rules # rule check(elasticache_cache_cluster) { %elasticache_cache_cluster [ # Scenario 2 Engine exists Engine == %REDIS_ENGINE_TYPE ] { # Scenarios 3, 4 and 5 SnapshotRetentionLimit exists SnapshotRetentionLimit > 0 } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.ELASTICACHE.PR.1

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

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

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/16 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: test VpcId: Ref: VPC SecurityGroupIngress: - FromPort: 443 IpProtocol: tcp ToPort: 443 CidrIp: 0.0.0.0/0 SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Cache Subnet Group SubnetIds: - Ref: Subnet CacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: Engine: redis NumCacheNodes: 1 CacheNodeType: cache.t3.micro VpcSecurityGroupIds: - Ref: SecurityGroup CacheSubnetGroupName: Ref: SubnetGroup SnapshotRetentionLimit: 5

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

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/16 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: test VpcId: Ref: VPC SecurityGroupIngress: - FromPort: 443 IpProtocol: tcp ToPort: 443 CidrIp: 0.0.0.0/0 SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Cache Subnet Group SubnetIds: - Ref: Subnet CacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: Engine: redis NumCacheNodes: 1 CacheNodeType: cache.t3.micro VpcSecurityGroupIds: - Ref: SecurityGroup CacheSubnetGroupName: Ref: SubnetGroup SnapshotRetentionLimit: 0

[CT.ELASTICACHE.PR.2] Exiger qu'un cluster Amazon ElastiCache pour Redis active les mises à niveau automatiques des versions mineures

Ce contrôle vérifie si les mises à niveau automatiques ElastiCache des versions mineures sont activées dans un cluster Amazon pour Redis.

  • Objectif de contrôle : gérer les vulnérabilités

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElastiCache::CacheCluster

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

Détails et exemples

Explication

En activant les mises à niveau automatiques des versions mineures, vous vous assurez que les dernières mises à jour des versions mineures des clusters de ElastiCache cache Amazon sont installées. Ces mises à niveau peuvent inclure des correctifs de sécurité et des corrections de bogues. La mise à jour de l'installation des correctifs est une étape importante de la sécurisation des systèmes.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux clusters de ElastiCache cache Amazon dotés d'un type de moteur redis et d'une version de moteur 6.0 ou ultérieure.

Corrections en cas de défaillance des règles

Définissez la valeur du AutoMinorVersionUpgrade paramètre sur true.

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

Amazon ElastiCache Cache Cluster : exemple

Un cluster de ElastiCache cache Amazon configuré avec les mises à niveau automatiques des versions mineures activées. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ElastCacheCacheCluster": { "Type": "AWS::ElastiCache::CacheCluster", "Properties": { "CacheNodeType": "cache.t3.micro", "NumCacheNodes": "1", "VpcSecurityGroupIds": [ { "Fn::GetAtt": [ "SecurityGroup", "GroupId" ] } ], "Engine": "redis", "EngineVersion": 6.0, "AutoMinorVersionUpgrade": true } } }

Exemple YAML

ElastCacheCacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: CacheNodeType: cache.t3.micro NumCacheNodes: '1' VpcSecurityGroupIds: - !GetAtt 'SecurityGroup.GroupId' Engine: redis EngineVersion: 6.0 AutoMinorVersionUpgrade: true

Spécification de la règle CT.ELASTICACHE.PR.2

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elasticache_auto_minor_version_upgrade_check # # Description: # This control checks whether an Amazon ElastiCache for Redis cluster has automatic minor version upgrades enabled. # # Reports on: # AWS::ElastiCache::CacheCluster # # 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 ElastiCache cluster resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache cluster resource # And: 'Engine' has not been provided or has been provided and is not set to 'redis' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache cluster resource # And: 'Engine' has been provided and is set to 'redis' # And: 'EngineVersion' has been provided and set to a version less than 6 # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache cluster resource # And: 'Engine' has been provided and is set to 'redis' # And: 'EngineVersion' has not been provided or 'EngineVersion' has been provided and set # to a version greater than or equal to 6 # And: 'AutoMinorVersionUpgrade' 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 ElastiCache cluster resource # And: 'Engine' has been provided and is set to 'redis' # And: 'EngineVersion' has not been provided or 'EngineVersion' has been provided and set # to a version greater than or equal to 6 # And: 'AutoMinorVersionUpgrade' has been provided and set to a value other than bool(true) # Then: FAIL # Scenario: 6 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache cluster resource # And: 'Engine' has been provided and is set to 'redis' # And: 'EngineVersion' has not been provided or 'EngineVersion' has been provided and set # to a version greater than or equal to 6 # And: 'AutoMinorVersionUpgrade' has been provided and set to bool(true) # Then: PASS # # Constants # let ELASTICACHE_CLUSTER_TYPE = "AWS::ElastiCache::CacheCluster" let INPUT_DOCUMENT = this let REDIS_ENGINE_TYPE = "redis" let UNSUPPORTED_REDIS_ENGINE_VERSIONS_FOR_AUTO_UPGRADE = [ /^2\./, /^3\./, /^4\./, /^5\./ ] # # Assignments # let elasticache_clusters = Resources.*[ Type == %ELASTICACHE_CLUSTER_TYPE ] # # Primary Rules # rule elasticache_auto_minor_version_upgrade_check when is_cfn_template(%INPUT_DOCUMENT) %elasticache_clusters not empty { check(%elasticache_clusters.Properties) << [CT.ELASTICACHE.PR.2]: Require an Amazon ElastiCache for Redis cluster to have automatic minor version upgrades activated [FIX]: Set the value of the 'AutoMinorVersionUpgrade' parameter to true. >> } rule elasticache_auto_minor_version_upgrade_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTICACHE_CLUSTER_TYPE) { check(%INPUT_DOCUMENT.%ELASTICACHE_CLUSTER_TYPE.resourceProperties) << [CT.ELASTICACHE.PR.2]: Require an Amazon ElastiCache for Redis cluster to have automatic minor version upgrades activated [FIX]: Set the value of the 'AutoMinorVersionUpgrade' parameter to true. >> } # # Parameterized Rules # rule check(elasticache_clusters) { %elasticache_clusters [ # Scenario 2 Engine exists Engine == %REDIS_ENGINE_TYPE # Scenario 3 EngineVersion not exists or EngineVersion not in %UNSUPPORTED_REDIS_ENGINE_VERSIONS_FOR_AUTO_UPGRADE ] { # Scenario 4, 5 and 6 AutoMinorVersionUpgrade exists AutoMinorVersionUpgrade == true } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.ELASTICACHE.PR.2

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

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

Resources: SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Example security group SecurityGroupIngress: - IpProtocol: tcp FromPort: 11211 ToPort: 11211 CidrIp: 10.0.0.0/24 ElastCacheCacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: CacheNodeType: cache.t3.micro NumCacheNodes: '1' VpcSecurityGroupIds: - Fn::GetAtt: - SecurityGroup - GroupId Engine: redis AutoMinorVersionUpgrade: 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: SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Example security group SecurityGroupIngress: - IpProtocol: tcp FromPort: 11211 ToPort: 11211 CidrIp: 10.0.0.0/24 ElastCacheCacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: CacheNodeType: cache.t3.micro NumCacheNodes: '1' VpcSecurityGroupIds: - Fn::GetAtt: - SecurityGroup - GroupId Engine: redis AutoMinorVersionUpgrade: false

[CT.ELASTICACHE.PR.3] Exiger qu'un groupe de réplication ElastiCache Amazon pour Redis active le basculement automatique

Ce contrôle vérifie si le basculement automatique ElastiCache est activé sur un groupe de réplication Amazon Redis.

  • 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::ElastiCache::ReplicationGroup

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

Détails et exemples

Explication

Lorsque le basculement automatique est activé pour un groupe de réplication, le rôle du nœud principal passe automatiquement à l'une des répliques lues. Cette promotion basée sur le basculement et les répliques vous permet de reprendre l'écriture sur le nouveau serveur principal dès que la promotion est terminée, réduisant ainsi le temps d'arrêt global en cas de panne.

Corrections en cas de défaillance des règles

Définissez la valeur du AutomaticFailoverEnabled paramètre sur true.

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

Amazon ElastiCache Replication Group : exemple

Un groupe de ElastiCache réplication Amazon configuré avec le basculement automatique activé. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ReplicationGroup": { "Type": "AWS::ElastiCache::ReplicationGroup", "Properties": { "ReplicationGroupDescription": "Sample replication group", "CacheNodeType": "cache.t3.micro", "SecurityGroupIds": [ { "Ref": "SecurityGroup" } ], "CacheSubnetGroupName": { "Ref": "SubnetGroup" }, "NumCacheClusters": 2, "Engine": "redis", "AutomaticFailoverEnabled": true } } }

Exemple YAML

ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Sample replication group CacheNodeType: cache.t3.micro SecurityGroupIds: - !Ref 'SecurityGroup' CacheSubnetGroupName: !Ref 'SubnetGroup' NumCacheClusters: 2 Engine: redis AutomaticFailoverEnabled: true

Spécification de la règle CT.ELASTICACHE.PR.3

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elasticache_repl_grp_backup_enabled_check # # Description: # This control checks whether an Amazon ElastiCache Redis replication group has automatic failover enabled. # # Reports on: # AWS::ElastiCache::ReplicationGroup # # 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 ElastiCache replication 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 ElastiCache replication group resource # And: 'Engine' has not been provided or has been provided and is not set to 'redis' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache replication group resource # And: 'Engine' has been provided and set to 'redis' # And: 'AutomaticFailoverEnabled' has not been provided # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache replication group resource # And: 'Engine' has been provided and set to 'redis' # And: 'AutomaticFailoverEnabled' has been provided and is set to a value other than bool(true) # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache replication group resource # And: 'Engine' has been provided and set to 'redis' # And: 'AutomaticFailoverEnabled' has been provided and is set to a value of bool(true) # Then: PASS # # Constants # let ELASTICACHE_REPLICATION_GROUP_TYPE = "AWS::ElastiCache::ReplicationGroup" let REDIS_ENGINE_TYPE = "redis" let INPUT_DOCUMENT = this # # Assignments # let elasticache_replication_groups = Resources.*[ Type == %ELASTICACHE_REPLICATION_GROUP_TYPE ] # # Primary Rules # rule elasticache_repl_grp_auto_failover_enabled_check when is_cfn_template(%INPUT_DOCUMENT) %elasticache_replication_groups not empty { check(%elasticache_replication_groups.Properties) << [CT.ELASTICACHE.PR.3]: Require an Amazon ElastiCache for Redis replication group to have automatic failover activated [FIX]: Set the value of the 'AutomaticFailoverEnabled' parameter to true. >> } rule elasticache_repl_grp_auto_failover_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTICACHE_REPLICATION_GROUP_TYPE) { check(%INPUT_DOCUMENT.%ELASTICACHE_REPLICATION_GROUP_TYPE.resourceProperties) << [CT.ELASTICACHE.PR.3]: Require an Amazon ElastiCache for Redis replication group to have automatic failover activated [FIX]: Set the value of the 'AutomaticFailoverEnabled' parameter to true. >> } # # Parameterized Rules # rule check(elasticache_replication_group) { %elasticache_replication_group [ # Scenario 2 Engine exists Engine == %REDIS_ENGINE_TYPE ] { # Scenarios 3, 4 and 5 AutomaticFailoverEnabled exists AutomaticFailoverEnabled == true } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.ELASTICACHE.PR.3

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

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

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/16 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Example security group VpcId: Ref: VPC SecurityGroupIngress: - FromPort: 443 IpProtocol: tcp ToPort: 443 CidrIp: 0.0.0.0/0 SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Example subnet group SubnetIds: - Ref: Subnet ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Fn::Sub: ${AWS::StackName}-example CacheNodeType: cache.t3.micro SecurityGroupIds: - Ref: SecurityGroup CacheSubnetGroupName: Ref: SubnetGroup NumCacheClusters: 2 Engine: redis AutomaticFailoverEnabled: 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 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/16 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Example security group VpcId: Ref: VPC SecurityGroupIngress: - FromPort: 443 IpProtocol: tcp ToPort: 443 CidrIp: 0.0.0.0/0 SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Example subnet group SubnetIds: - Ref: Subnet ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Fn::Sub: ${AWS::StackName}-example CacheNodeType: cache.t3.micro SecurityGroupIds: - Ref: SecurityGroup CacheSubnetGroupName: Ref: SubnetGroup NumCacheClusters: 2 Engine: redis AutomaticFailoverEnabled: false

[CT.ELASTICACHE.PR.4] Exiger que le chiffrement au repos soit activé sur un groupe de réplication ElastiCache Amazon

Ce contrôle vérifie si le encryption-at-rest paramètre est activé pour un groupe de ElastiCache réplication Amazon.

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

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElastiCache::ReplicationGroup

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

Détails et exemples

Explication

Le chiffrement des données au repos est une bonne pratique recommandée qui ajoute une couche de gestion des accès à vos données. En cas de compromission de vos nœuds de ElastiCache réplication Amazon, ce encryption-at-rest paramètre garantit que vos données sont protégées contre tout accès involontaire.

Considérations d'utilisation
  • Ce contrôle nécessite l'utilisation du chiffrement au repos, qui n'est pris en charge que pour les groupes de réplication dotés de versions du moteur Redis 3.2.6 ou supérieures.

Corrections en cas de défaillance des règles

Définissez la valeur du AtRestEncryptionEnabled paramètre sur true.

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

Amazon ElastiCache Replication Group : exemple

Groupe ElastiCache de réplication Amazon configuré avec le chiffrement au repos activé. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ElastiCacheReplicationGroup": { "Type": "AWS::ElastiCache::ReplicationGroup", "Properties": { "CacheSubnetGroupName": { "Ref": "SubnetGroup" }, "CacheNodeType": "cache.t3.medium", "NumCacheClusters": 2, "Engine": "redis", "ReplicationGroupDescription": "Sample replication group", "AtRestEncryptionEnabled": true } } }

Exemple YAML

ElastiCacheReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: CacheSubnetGroupName: !Ref 'SubnetGroup' CacheNodeType: cache.t3.medium NumCacheClusters: 2 Engine: redis ReplicationGroupDescription: Sample replication group AtRestEncryptionEnabled: true

Spécification de la règle CT.ELASTICACHE.PR.4

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elasticache_repl_grp_encrypted_at_rest_check # # Description: # This control checks whether an Amazon ElastiCache replication group has the encryption-at-rest setting enabled. # # Reports on: # AWS::ElastiCache::ReplicationGroup # # 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 ElastiCache ReplicationGroup resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache ReplicationGroup resource # And: 'Engine' has not been provided or has been provided and is not set to 'redis' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache ReplicationGroup resource # And: 'Engine' has been provided and set to 'redis' # And: 'AtRestEncryptionEnabled' has not been provided # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache ReplicationGroup resource # And: 'Engine' has been provided and set to 'redis' # And: 'AtRestEncryptionEnabled' has been provided and is set to a value other than bool(true) # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache ReplicationGroup resource # And: 'Engine' has been provided and set to 'redis' # And: 'AtRestEncryptionEnabled' has been provided and is set to a value of bool(true) # Then: PASS # # Constants # let ELASTICACHE_REPLICATION_GROUP_TYPE = "AWS::ElastiCache::ReplicationGroup" let INPUT_DOCUMENT = this # # Assignments # let elasticache_replication_groups = Resources.*[ Type == %ELASTICACHE_REPLICATION_GROUP_TYPE ] # # Primary Rules # rule elasticache_repl_grp_encrypted_at_rest_check when is_cfn_template(%INPUT_DOCUMENT) %elasticache_replication_groups not empty { check(%elasticache_replication_groups.Properties) << [CT.ELASTICACHE.PR.4]: Require an Amazon ElastiCache replication group to have encryption at rest activated [FIX]: Set the value of the 'AtRestEncryptionEnabled' parameter to true. >> } rule elasticache_repl_grp_encrypted_at_rest_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTICACHE_REPLICATION_GROUP_TYPE) { check(%INPUT_DOCUMENT.%ELASTICACHE_REPLICATION_GROUP_TYPE.resourceProperties) << [CT.ELASTICACHE.PR.4]: Require an Amazon ElastiCache replication group to have encryption at rest activated [FIX]: Set the value of the 'AtRestEncryptionEnabled' parameter to true. >> } # # Parameterized Rules # rule check(elasticache_replication_group) { %elasticache_replication_group [ # Scenario 2 filter_elasticache_replication_group(this) ] { # Scenario 3 AtRestEncryptionEnabled exists # Scenarios 4 and 5 AtRestEncryptionEnabled == true } } rule filter_elasticache_replication_group(elasticache_replication_group) { %elasticache_replication_group { Engine exists Engine == "redis" } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.ELASTICACHE.PR.4

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

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

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Example subnet group SubnetIds: - Ref: Subnet ElastiCacheReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: CacheSubnetGroupName: Ref: SubnetGroup CacheNodeType: cache.t3.medium NumCacheClusters: 2 Engine: redis ReplicationGroupDescription: Example replication group AtRestEncryptionEnabled: 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' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Example subnet group SubnetIds: - Ref: Subnet ElastiCacheReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: CacheSubnetGroupName: Ref: SubnetGroup CacheNodeType: cache.t3.medium NumCacheClusters: 2 Engine: redis ReplicationGroupDescription: Example replication group AtRestEncryptionEnabled: false

[CT.ELASTICACHE.PR.5] Exiger qu'un groupe de réplication ElastiCache Amazon pour Redis active le chiffrement en transit

Ce contrôle vérifie si un groupe de ElastiCache réplication Amazon est encryption-in-transit activé.

  • 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::ElastiCache::ReplicationGroup

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

Détails et exemples

Explication

Le protocole TLS peut être utilisé pour empêcher les attaquants potentiels d'espionner ou de manipuler le trafic réseau en utilisant des attaques similaires. person-in-the-middle Le chiffrement ElastiCache en transit d'Amazon est une fonctionnalité facultative que vous pouvez utiliser pour protéger vos données lorsqu'elles sont déplacées d'un endroit à un autre.

Considérations d'utilisation
  • E ncryption-in-transit est pris en charge sur les groupes de ElastiCache réplication Amazon exécutant les versions 3.2.6, 4.0.10 et ultérieures de Redis.

  • Puisque le traitement nécessitait de chiffrer et de déchiffrer les données aux points de terminaison, l'implémentation du chiffrement en transit peut réduire la performance. Nous vous recommandons de comparer le chiffrement en transit à l'absence de chiffrement sur vos propres données afin de déterminer l'impact encryption-in-transit sur les performances de votre mise en œuvre.

Corrections en cas de défaillance des règles

Définissez la valeur du TransitEncryptionEnabled paramètre sur true.

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

Amazon ElastiCache Replication Group : exemple

Groupe ElastiCache de réplication Amazon configuré avec encryption-in-transit Activé. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ReplicationGroup": { "Type": "AWS::ElastiCache::ReplicationGroup", "Properties": { "ReplicationGroupDescription": "Sample replication group", "CacheNodeType": "cache.t3.micro", "SecurityGroupIds": [ { "Ref": "SecurityGroup" } ], "CacheSubnetGroupName": { "Ref": "SubnetGroup" }, "NumCacheClusters": 2, "Engine": "redis", "TransitEncryptionEnabled": true } } }

Exemple YAML

ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Sample replication group CacheNodeType: cache.t3.micro SecurityGroupIds: - !Ref 'SecurityGroup' CacheSubnetGroupName: !Ref 'SubnetGroup' NumCacheClusters: 2 Engine: redis TransitEncryptionEnabled: true

Spécification de la règle CT.ELASTICACHE.PR.5

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elasticache_repl_grp_encrypted_in_transit_check # # Description: # This control checks whether an Amazon ElastiCache replication group has encryption-in-transit enabled. # # Reports on: # AWS::ElastiCache::ReplicationGroup # # 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 ElastiCache ReplicationGroup resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache ReplicationGroup resource # And: 'Engine' has not been provided or has been provided and is not set to 'redis' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache ReplicationGroup resource # And: 'Engine' has been provided and set to 'redis' # And: 'TransitEncryptionEnabled' has not been provided # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache ReplicationGroup resource # And: 'Engine' has been provided and set to 'redis' # And: 'TransitEncryptionEnabled' has been provided and set to a value other than bool(true) # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache ReplicationGroup resource # And: 'Engine' has been provided and set to 'redis' # And: 'TransitEncryptionEnabled' has been provided and set to bool(true) # Then: PASS # # Constants # let ELASTICACHE_REPLICATION_GROUP_TYPE = "AWS::ElastiCache::ReplicationGroup" let REDIS_ENGINE_TYPE = "redis" let INPUT_DOCUMENT = this # # Assignments # let elasticache_replication_groups = Resources.*[ Type == %ELASTICACHE_REPLICATION_GROUP_TYPE ] # # Primary Rules # rule elasticache_repl_grp_encrypted_in_transit_check when is_cfn_template(%INPUT_DOCUMENT) %elasticache_replication_groups not empty { check(%elasticache_replication_groups.Properties) << [CT.ELASTICACHE.PR.5]: Require an Amazon ElastiCache for Redis replication group to have encryption in transit activated [FIX]: Set the value of the 'TransitEncryptionEnabled' parameter to true. >> } rule elasticache_repl_grp_encrypted_in_transit_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTICACHE_REPLICATION_GROUP_TYPE) { check(%INPUT_DOCUMENT.%ELASTICACHE_REPLICATION_GROUP_TYPE.resourceProperties) << [CT.ELASTICACHE.PR.5]: Require an Amazon ElastiCache for Redis replication group to have encryption in transit activated [FIX]: Set the value of the 'TransitEncryptionEnabled' parameter to true. >> } # # Parameterized Rules # rule check(elasticache_replication_group) { %elasticache_replication_group [ # Scenario 2 Engine exists Engine == %REDIS_ENGINE_TYPE ] { # Scenarios 3, 4 and 5 TransitEncryptionEnabled exists TransitEncryptionEnabled == true } } # # Utility Rules # rule is_cfn_template(doc) { %doc { AWSTemplateFormatVersion exists or Resources exists } } rule is_cfn_hook(doc, RESOURCE_TYPE) { %doc.%RESOURCE_TYPE.resourceProperties exists }

Exemples de modèles CT.ELASTICACHE.PR.5

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

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

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/16 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Example security group VpcId: Ref: VPC SecurityGroupIngress: - FromPort: 443 IpProtocol: tcp ToPort: 443 CidrIp: 0.0.0.0/0 SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Example subnet group SubnetIds: - Ref: Subnet ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Fn::Sub: ${AWS::StackName}-example CacheNodeType: cache.t3.micro SecurityGroupIds: - Ref: SecurityGroup CacheSubnetGroupName: Ref: SubnetGroup NumCacheClusters: 2 Engine: redis TransitEncryptionEnabled: 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 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/16 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Example security group VpcId: Ref: VPC SecurityGroupIngress: - FromPort: 443 IpProtocol: tcp ToPort: 443 CidrIp: 0.0.0.0/0 SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Example subnet group SubnetIds: - Ref: Subnet ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Fn::Sub: ${AWS::StackName}-example CacheNodeType: cache.t3.micro SecurityGroupIds: - Ref: SecurityGroup CacheSubnetGroupName: Ref: SubnetGroup NumCacheClusters: 2 Engine: redis TransitEncryptionEnabled: false

[CT.ELASTICACHE.PR.6] Exiger qu'un cluster de cache ElastiCache Amazon utilise un groupe de sous-réseaux personnalisé

Ce contrôle vérifie si un cluster de ElastiCache cache Amazon est configuré avec un groupe de sous-réseaux personnalisé.

  • 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::ElastiCache::CacheCluster

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

Détails et exemples

Explication

Lorsque vous lancez un ElastiCache cluster, AWS crée un groupe de sous-réseaux par défaut s'il n'en existe pas encore. Le groupe par défaut utilise les sous-réseaux du VPC par défaut. L'utilisation de groupes de sous-réseaux personnalisés vous permet de restreindre davantage l'accès réseau aux ElastiCache clusters.

Considérations d'utilisation
  • Cette règle évalue si un cluster de ElastiCache cache Amazon a été configuré avec un groupe de sous-réseaux personnalisé.

  • Les groupes de sous-réseaux personnalisés peuvent contenir des sous-réseaux résidant dans l'Amazon VPC par défaut.

Corrections en cas de défaillance des règles

Définissez le CacheSubnetGroupName paramètre sur le nom d'un groupe de sous-réseaux de ElastiCache cache Amazon personnalisé.

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

Amazon ElastiCache Cache Cluster : exemple

Un cluster de ElastiCache cache Amazon configuré avec un groupe de sous-réseaux personnalisé. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ElasticacheCluster": { "Type": "AWS::ElastiCache::CacheCluster", "Properties": { "Engine": "memcached", "CacheNodeType": "cache.t3.micro", "NumCacheNodes": "1", "CacheSubnetGroupName": { "Ref": "SubnetGroup" }, "VpcSecurityGroupIds": [ { "Fn::GetAtt": [ "SecurityGroup", "GroupId" ] } ] } } }

Exemple YAML

ElasticacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: Engine: memcached CacheNodeType: cache.t3.micro NumCacheNodes: '1' CacheSubnetGroupName: !Ref 'SubnetGroup' VpcSecurityGroupIds: - !GetAtt 'SecurityGroup.GroupId'

Spécification de la règle CT.ELASTICACHE.PR.6

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elasticache_subnet_group_check # # Description: # This control checks whether an Amazon ElastiCache cache cluster is configured with a custom subnet group. # # Reports on: # AWS::ElastiCache::CacheCluster # # 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 ElastiCache cluster resources # Then: SKIP # Scenario: 2 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache cluster resource # And: 'CacheSubnetGroupName' 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 ElastiCache cluster resource # And: 'CacheSubnetGroupName' has been provided as an empty string or as a non-valid local reference # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache cluster resource # And: 'CacheSubnetGroupName' has been provided and set to a value of 'default' # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache cluster resource # And: 'CacheSubnetGroupName' has been provided as a non-empty string or a valid local reference # Then: PASS # # Constants # let ELASTICACHE_CACHE_CLUSTER_TYPE = "AWS::ElastiCache::CacheCluster" let INPUT_DOCUMENT = this # # Assignments # let elasticache_cache_clusters = Resources.*[ Type == %ELASTICACHE_CACHE_CLUSTER_TYPE ] # # Primary Rules # rule elasticache_subnet_group_check when is_cfn_template(%INPUT_DOCUMENT) %elasticache_cache_clusters not empty { check(%elasticache_cache_clusters.Properties) << [CT.ELASTICACHE.PR.6]: Require an Amazon ElastiCache cache cluster to use a custom subnet group [FIX]: Set the 'CacheSubnetGroupName' parameter to the name of a custom Amazon ElastiCache cache subnet group. >> } rule elasticache_subnet_group_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTICACHE_CACHE_CLUSTER_TYPE) { check(%INPUT_DOCUMENT.%ELASTICACHE_CACHE_CLUSTER_TYPE.resourceProperties) << [CT.ELASTICACHE.PR.6]: Require an Amazon ElastiCache cache cluster to use a custom subnet group [FIX]: Set the 'CacheSubnetGroupName' parameter to the name of a custom Amazon ElastiCache cache subnet group. >> } # # Parameterized Rules # rule check(elasticache_cache_cluster) { %elasticache_cache_cluster { # Scenario 2 CacheSubnetGroupName exists # Scenarios 3, 4 and 5 check_subnet_group_is_not_default(this) or check_local_references(%INPUT_DOCUMENT, CacheSubnetGroupName, "AWS::ElastiCache::SubnetGroup") } } rule check_subnet_group_is_not_default(elasticache_cache_cluster) { %elasticache_cache_cluster { check_is_string_and_not_empty(CacheSubnetGroupName) CacheSubnetGroupName != "default" } } # # 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 } }

Exemples de modèles CT.ELASTICACHE.PR.6

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

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

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: 'true' EnableDnsHostnames: 'true' Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Example subnet group SubnetIds: - Ref: Subnet SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Example security group VpcId: Ref: VPC SecurityGroupIngress: - IpProtocol: tcp FromPort: 11211 ToPort: 11211 CidrIp: 10.0.0.0/24 CacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: Engine: memcached CacheNodeType: cache.t3.micro NumCacheNodes: '1' CacheSubnetGroupName: Ref: SubnetGroup VpcSecurityGroupIds: - Fn::GetAtt: [SecurityGroup, GroupId]

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

Resources: SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Example security group SecurityGroupIngress: - IpProtocol: tcp FromPort: 11211 ToPort: 11211 CidrIp: 10.0.0.0/24 CacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: Engine: memcached CacheNodeType: cache.t3.micro NumCacheNodes: '1' VpcSecurityGroupIds: - Fn::GetAtt: [SecurityGroup, GroupId]

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

Resources: SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Example security group SecurityGroupIngress: - IpProtocol: tcp FromPort: 11211 ToPort: 11211 CidrIp: 10.0.0.0/24 CacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: Engine: memcached CacheNodeType: cache.t3.micro NumCacheNodes: '1' CacheSubnetGroupName: default VpcSecurityGroupIds: - Fn::GetAtt: [SecurityGroup, GroupId]

[CT.ELASTICACHE.PR.7] Exiger un groupe de réplication ElastiCache Amazon de versions antérieures de Redis pour activer Redis AUTH

Ce contrôle vérifie si Redis AUTH est activé sur un groupe de ElastiCache réplication Amazon doté d'une version de moteur antérieure à la version 6.0.

  • Objectif de contrôle : appliquer le moindre privilège

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElastiCache::ReplicationGroup

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

Détails et exemples

Explication

Les jetons d'authentification Redis, ou mots de passe, permettent à Redis d'exiger un mot de passe avant d'autoriser les clients à exécuter des commandes, améliorant ainsi la sécurité des données.

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux groupes de ElastiCache réplication Amazon des versions du moteur Redis antérieures à six (6).

  • Ce contrôle doit encryption-in-transit être activé sur les groupes de réplication au moyen de la TransitEncryptionEnabled propriété.

Corrections en cas de défaillance des règles

Définissez la valeur du AuthToken paramètre sur une chaîne comprise entre 16 et 128 caractères, qui contient uniquement des caractères ASCII imprimables et ne contient aucun caractère non alphanumérique en dehors de l'ensemble (! , &,

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

Amazon ElastiCache Replication Group : exemple

Un groupe de ElastiCache réplication Amazon configuré avec l'authentification Redis AUTH activée. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ReplicationGroup": { "Type": "AWS::ElastiCache::ReplicationGroup", "Properties": { "ReplicationGroupDescription": "Sample replication group", "CacheNodeType": "cache.t3.micro", "SecurityGroupIds": [ { "Ref": "SecurityGroup" } ], "CacheSubnetGroupName": { "Ref": "SubnetGroup" }, "NumCacheClusters": 2, "Engine": "redis", "EngineVersion": "5.0.6", "TransitEncryptionEnabled": true, "AuthToken": { "Fn::Sub": "{{resolve:secretsmanager:${ReplicationGroupSecret}::password}}" } } } }

Exemple YAML

ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Sample replication group CacheNodeType: cache.t3.micro SecurityGroupIds: - !Ref 'SecurityGroup' CacheSubnetGroupName: !Ref 'SubnetGroup' NumCacheClusters: 2 Engine: redis EngineVersion: 5.0.6 TransitEncryptionEnabled: true AuthToken: !Sub '{{resolve:secretsmanager:${ReplicationGroupSecret}::password}}'

Spécification de la règle CT.ELASTICACHE.PR.7

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elasticache_repl_grp_redis_auth_enabled_check # # Description: # This control checks whether an Amazon ElastiCache replication group with an engine version earlier than 6.0 has Redis AUTH enabled. # # Reports on: # AWS::ElastiCache::ReplicationGroup # # 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 ElastiCache replication 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 ElastiCache replication group resource # And: 'Engine' has not been provided or has been provided and is not set to 'redis' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache replication group resource # And: 'Engine' has been provided and is set to 'redis' # And: 'EngineVersion' has not been provided or has been provided and set to a version greater than or equal to 6 # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache replication group resource # And: 'Engine' has been provided and is set to 'redis' # And: 'EngineVersion' has been provided and set to a version less than 6 # And: 'AuthToken' has not been provided or has been provided and set to an empty string # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an ElastiCache replication group resource # And: 'Engine' has been provided and is set to 'redis' # And: 'EngineVersion' has been provided and set to a version less than 6 # And: 'AuthToken' has been provided and set to a non-empty string # Then: PASS # # Constants # let ELASTICACHE_REPLICATION_GROUP_TYPE = "AWS::ElastiCache::ReplicationGroup" let REDIS_ENGINE_TYPE = "redis" let SUPPORTED_REDIS_ENGINE_VERSIONS_FOR_REDIS_AUTH = [ /^2\./, /^3\./, /^4\./, /^5\./ ] let INPUT_DOCUMENT = this # # Assignments # let elasticache_replication_groups = Resources.*[ Type == %ELASTICACHE_REPLICATION_GROUP_TYPE ] # # Primary Rules # rule elasticache_repl_grp_redis_auth_enabled_check when is_cfn_template(%INPUT_DOCUMENT) %elasticache_replication_groups not empty { check(%elasticache_replication_groups.Properties) << [CT.ELASTICACHE.PR.7]: Require an Amazon ElastiCache replication group of earlier Redis versions to have Redis AUTH activated [FIX]: Set the value of the 'AuthToken' parameter to a string between 16 characters and 128 characters in length, which contains only printable ASCII characters and does not contain non-alphanumeric characters outside of the set (!, &, >> } rule elasticache_repl_grp_redis_auth_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTICACHE_REPLICATION_GROUP_TYPE) { check(%INPUT_DOCUMENT.%ELASTICACHE_REPLICATION_GROUP_TYPE.resourceProperties) << [CT.ELASTICACHE.PR.7]: Require an Amazon ElastiCache replication group of earlier Redis versions to have Redis AUTH activated [FIX]: Set the value of the 'AuthToken' parameter to a string between 16 characters and 128 characters in length, which contains only printable ASCII characters and does not contain non-alphanumeric characters outside of the set (!, &, >> } # # Parameterized Rules # rule check(elasticache_replication_group) { %elasticache_replication_group [ # Scenario 2 Engine exists Engine == %REDIS_ENGINE_TYPE # Scenario 3 EngineVersion exists EngineVersion in %SUPPORTED_REDIS_ENGINE_VERSIONS_FOR_REDIS_AUTH ] { # Scenarios 4 and 5 AuthToken exists check_is_string_and_not_empty(AuthToken) } } # # 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/ } }

Exemples de modèles CT.ELASTICACHE.PR.7

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

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

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/16 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Example security group VpcId: Ref: VPC SecurityGroupIngress: - FromPort: 443 IpProtocol: tcp ToPort: 443 CidrIp: 0.0.0.0/0 SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Cache subnet group SubnetIds: - Ref: Subnet ReplicationGroupSecret: Type: AWS::SecretsManager::Secret Properties: Description: Replication group secret GenerateSecretString: SecretStringTemplate: "{}" GenerateStringKey: password PasswordLength: 64 ExcludePunctuation: true ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Fn::Sub: ${AWS::StackName}-example CacheNodeType: cache.t3.micro SecurityGroupIds: - Ref: SecurityGroup CacheSubnetGroupName: Ref: SubnetGroup NumCacheClusters: 2 Engine: redis EngineVersion: 5.0.6 TransitEncryptionEnabled: true AuthToken: Fn::Sub: '{{resolve:secretsmanager:${ReplicationGroupSecret}::password}}'

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

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/16 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Example security group VpcId: Ref: VPC SecurityGroupIngress: - FromPort: 443 IpProtocol: tcp ToPort: 443 CidrIp: 0.0.0.0/0 SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Cache subnet group SubnetIds: - Ref: Subnet ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Fn::Sub: ${AWS::StackName}-example CacheNodeType: cache.t3.micro SecurityGroupIds: - Ref: SecurityGroup CacheSubnetGroupName: Ref: SubnetGroup NumCacheClusters: 2 Engine: redis EngineVersion: 3.2.6 TransitEncryptionEnabled: true

[CT.ELASTICACHE.PR.8] Exiger un groupe de ElastiCache réplication Amazon des versions ultérieures de Redis pour activer l'authentification RBAC

Ce contrôle vérifie si l'authentification RBAC est activée pour les groupes de ElastiCache réplication Amazon dont la version du moteur est supérieure ou égale à 6.0.

  • Objectif de contrôle : appliquer le moindre privilège

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

  • Comportement de contrôle : proactif

  • Types de ressources : AWS::ElastiCache::ReplicationGroup

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

Détails et exemples

Explication

Le contrôle d'accès basé sur les rôles (RBAC) vous aide à créer des utilisateurs et à leur attribuer des autorisations spécifiques à l'aide d'une chaîne d'accès. Vous assignez les utilisateurs à des groupes d'utilisateurs correspondant à un rôle spécifique, tels que les administrateurs ou les ressources humaines. Les rôles sont déployés sur les groupes de réplication Amazon ElastiCache pour Redis. Cette technique établit des limites de sécurité entre les clients utilisant les mêmes groupes de réplication Redis et empêche les clients d'avoir accès aux données des autres clients. Si vous utilisez l'authentification RBAC via Redis AUTH, cela réduit le nombre d'informations d'identification requises pour un accès authentifié à un groupe de réplication Amazon. ElastiCache

Considérations d'utilisation
  • Ce contrôle s'applique uniquement aux groupes de ElastiCache réplication Amazon des versions du moteur Redis supérieures ou égales à 6.0

  • Ce contrôle nécessite que le chiffrement en transit soit activé sur les groupes de réplication au moyen de la TransitEncryptionEnabled propriété

Corrections en cas de défaillance des règles

Définissez la valeur de la UserGroupIds propriété sur une liste contenant au moins un identifiant de groupe ElastiCache d'utilisateurs Amazon.

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

Amazon ElastiCache Replication Group : exemple

Un groupe de ElastiCache réplication Amazon configuré avec l'authentification RBAC activée. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "ReplicationGroup": { "Type": "AWS::ElastiCache::ReplicationGroup", "Properties": { "ReplicationGroupDescription": "Sample replication group", "CacheNodeType": "cache.t3.micro", "SecurityGroupIds": [ { "Ref": "SecurityGroup" } ], "CacheSubnetGroupName": { "Ref": "SubnetGroup" }, "NumCacheClusters": 2, "Engine": "redis", "EngineVersion": 6.2, "TransitEncryptionEnabled": true, "UserGroupIds": [ { "Ref": "UserGroup" } ] } } }

Exemple YAML

ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Sample replication group CacheNodeType: cache.t3.micro SecurityGroupIds: - !Ref 'SecurityGroup' CacheSubnetGroupName: !Ref 'SubnetGroup' NumCacheClusters: 2 Engine: redis EngineVersion: 6.2 TransitEncryptionEnabled: true UserGroupIds: - !Ref 'UserGroup'

Spécification de la règle CT.ELASTICACHE.PR.8

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # elasticache_repl_grp_rbac_auth_enabled_check # # Description: # This control checks whether Amazon ElastiCache replication groups with an engine version greater than or equal to 6.0 have RBAC authentication enabled. # # Reports on: # AWS::ElastiCache::ReplicationGroup # # Evaluates: # AWS CloudFormation, AWS CloudFormation hook # # Rule Parameters: # None # # Scenarios: # Scenario: 1 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document does not contain any Amazon ElastiCache replication 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 Amazon ElastiCache replication group resource # And: 'Engine' has not been provided or has been provided and is not set to 'redis' # Then: SKIP # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon ElastiCache replication group resource # And: 'Engine' has been provided and is set to 'redis' # And: 'EngineVersion' has been provided and set to a version less than 6 # Then: SKIP # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon ElastiCache replication group resource # And: 'Engine' has been provided and set to 'redis' # And: 'EngineVersion' has not been provided or has been provided and set to a version greater than or equal to 6 # And: 'UserGroupIds' has not been provided or has been provided as an empty list or a list containing an empty # string or invalid local reference # Then: FAIL # Scenario: 5 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon ElastiCache replication group resource # And: 'Engine' has been provided and set to 'redis' # And: 'EngineVersion' has not been provided or has been provided and set to a version greater than or equal to 6 # And: 'UserGroupIds' has been provided as a list containing non-empty strings or valid local references # Then: PASS # # Constants # let ELASTICACHE_REPLICATION_GROUP_TYPE = "AWS::ElastiCache::ReplicationGroup" let REDIS_ENGINE_TYPE = "redis" let UNSUPPORTED_REDIS_ENGINE_VERSIONS_FOR_RBAC = [ /^2\./, /^3\./, /^4\./, /^5\./ ] let INPUT_DOCUMENT = this # # Assignments # let elasticache_replication_groups = Resources.*[ Type == %ELASTICACHE_REPLICATION_GROUP_TYPE ] # # Primary Rules # rule elasticache_repl_grp_rbac_auth_enabled_check when is_cfn_template(%INPUT_DOCUMENT) %elasticache_replication_groups not empty { check(%elasticache_replication_groups.Properties) << [CT.ELASTICACHE.PR.8]: Require an Amazon ElastiCache replication group of later Redis versions to have RBAC authentication activated [FIX]: Set the value of the UserGroupIds property to a list that contains at least one Amazon ElastiCache user group identifier. >> } rule elasticache_repl_grp_rbac_auth_enabled_check when is_cfn_hook(%INPUT_DOCUMENT, %ELASTICACHE_REPLICATION_GROUP_TYPE) { check(%INPUT_DOCUMENT.%ELASTICACHE_REPLICATION_GROUP_TYPE.resourceProperties) << [CT.ELASTICACHE.PR.8]: Require an Amazon ElastiCache replication group of later Redis versions to have RBAC authentication activated [FIX]: Set the value of the UserGroupIds property to a list that contains at least one Amazon ElastiCache user group identifier. >> } # # Parameterized Rules # rule check(elasticache_replication_group) { %elasticache_replication_group [ # Scenario 2 Engine exists Engine == %REDIS_ENGINE_TYPE # Scenario 3 EngineVersion not exists or EngineVersion not in %UNSUPPORTED_REDIS_ENGINE_VERSIONS_FOR_RBAC ] { # Scenarios 4, 5 and 6 UserGroupIds exists UserGroupIds is_list UserGroupIds not empty UserGroupIds[*] { check_is_string_and_not_empty(this) or check_local_references(%INPUT_DOCUMENT, this, "AWS::ElastiCache::UserGroup") } } } # # 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 } }

Exemples de modèles CT.ELASTICACHE.PR.8

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

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

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/16 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: test VpcId: Ref: VPC SecurityGroupIngress: - FromPort: 443 IpProtocol: tcp ToPort: 443 CidrIp: 0.0.0.0/0 SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Cache Subnet Group SubnetIds: - Ref: Subnet UserGroup: Type: AWS::ElastiCache::UserGroup Properties: Engine: redis UserGroupId: Fn::Sub: ${AWS::StackName}-example-group UserIds: - default ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Fn::Sub: ${AWS::StackName}-example CacheNodeType: cache.t3.micro SecurityGroupIds: - Ref: SecurityGroup CacheSubnetGroupName: Ref: SubnetGroup NumCacheClusters: 2 Engine: redis UserGroupIds: - Ref: UserGroup

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

Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.0.0/16 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: '' SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: test VpcId: Ref: VPC SecurityGroupIngress: - FromPort: 443 IpProtocol: tcp ToPort: 443 CidrIp: 0.0.0.0/0 SubnetGroup: Type: AWS::ElastiCache::SubnetGroup Properties: Description: Cache Subnet Group SubnetIds: - Ref: Subnet ReplicationGroup: Type: AWS::ElastiCache::ReplicationGroup Properties: ReplicationGroupDescription: Fn::Sub: ${AWS::StackName}-example CacheNodeType: cache.t3.micro SecurityGroupIds: - Ref: SecurityGroup CacheSubnetGroupName: Ref: SubnetGroup NumCacheClusters: 2 Engine: redis