Contrôles Amazon Elastic Kubernetes Service (EKS) - AWS Control Tower

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Contrôles Amazon Elastic Kubernetes Service (EKS)

[CT.EKS.PR.1] Exiger qu'un cluster Amazon EKS soit configuré avec l'accès public désactivé au point de terminaison du serveur d'API Kubernetes du cluster

Ce contrôle vérifie si un point de terminaison de cluster Amazon Elastic Kubernetes Service (EKS) interdit l'accès public au point de terminaison du serveur d'API Kubernetes du cluster.

  • 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::EKS::Cluster

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

Détails et exemples

Explication

Lorsque vous créez un nouveau cluster, Amazon Elastic Kubernetes Service (EKS) crée un point de terminaison pour le serveur d'API Kubernetes géré, que vous pouvez utiliser pour communiquer avec votre cluster à l'aide d'outils de gestion Kubernetes, tels que. kubectl Par défaut, ce point de terminaison du serveur d'API est public sur Internet, et l'accès au serveur d'API est sécurisé à l'aide d'une combinaison d'AWS Identity and Access Management (IAM) et du contrôle d'accès basé sur les rôles (RBAC) natif de Kubernetes. L'activation de l'accès privé au serveur d'API Kubernetes garantit que toutes les communications entre vos nœuds et le serveur d'API restent au sein de votre VPC. Vous pouvez limiter les adresses IP qui ont accès à votre serveur d'API depuis Internet, ou vous pouvez complètement interdire l'accès Internet au serveur d'API.

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

Définissez la valeur du EndpointPublicAccess paramètre sur false et la valeur du EndpointPrivateAccess paramètre sur true.

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

Cluster Amazon EKS - Exemple

Un cluster Amazon EKS configuré avec l'accès public désactivé au point de terminaison du serveur d'API Kubernetes du cluster. L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EKSCluster": { "Type": "AWS::EKS::Cluster", "Properties": { "RoleArn": { "Fn::GetAtt": "EKSClusterRole.Arn" }, "ResourcesVpcConfig": { "SubnetIds": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "EndpointPublicAccess": false, "EndpointPrivateAccess": true } } } }

Exemple YAML

EKSCluster: Type: AWS::EKS::Cluster Properties: RoleArn: !GetAtt 'EKSClusterRole.Arn' ResourcesVpcConfig: SubnetIds: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' EndpointPublicAccess: false EndpointPrivateAccess: true

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # eks_endpoint_no_public_access_check # # Description: # This control checks whether an Amazon Elastic Kubernetes Service (EKS) cluster endpoint disallows public access to the cluster Kubernetes API server endpoint. # # Reports on: # AWS::EKS::Cluster # # 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 EKS 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 Amazon EKS cluster resource # And: 'EndpointPublicAccess' in 'ResourcesVpcConfig' has not been provided # And: 'EndpointPrivateAccess' in 'ResourcesVpcConfig' has not been provided # Then: FAIL # Scenario: 3 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EKS cluster resource # And: 'EndpointPrivateAccess' in 'ResourcesVpcConfig' has not been provided # And: 'EndpointPublicAccess' in 'ResourcesVpcConfig' has not been provided or has been provided and set to a # value other than 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 Amazon EKS cluster resource # And: 'EndpointPublicAccess' in 'ResourcesVpcConfig' has not been provided or has been provided and set to a # value other than bool(false) # And: 'EndpointPrivateAccess' in 'ResourcesVpcConfig' has been provided and set 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 Amazon EKS cluster resource # And: 'EndpointPublicAccess' in 'ResourcesVpcConfig' has been provided and set to bool(false) # And: 'EndpointPrivateAccess' in 'ResourcesVpcConfig' has been provided and set to bool(true) # Then: PASS # # Constants # let EKS_CLUSTER_TYPE = "AWS::EKS::Cluster" let INPUT_DOCUMENT = this # # Assignments # let eks_clusters = Resources.*[ Type == %EKS_CLUSTER_TYPE ] # # Primary Rules # rule eks_endpoint_no_public_access_check when is_cfn_template(%INPUT_DOCUMENT) %eks_clusters not empty { check(%eks_clusters.Properties) << [CT.EKS.PR.1]: Require an Amazon EKS cluster to be configured with public access disabled to the cluster Kubernetes API server endpoint. [FIX]: Set the value of the 'EndpointPublicAccess' parameter to false and the value of the 'EndpointPrivateAccess' parameter to true. >> } rule eks_endpoint_no_public_access_check when is_cfn_hook(%INPUT_DOCUMENT, %EKS_CLUSTER_TYPE) { check(%INPUT_DOCUMENT.%EKS_CLUSTER_TYPE.resourceProperties) << [CT.EKS.PR.1]: Require an Amazon EKS cluster to be configured with public access disabled to the cluster Kubernetes API server endpoint. [FIX]: Set the value of the 'EndpointPublicAccess' parameter to false and the value of the 'EndpointPrivateAccess' parameter to true. >> } # # Parameterized Rules # rule check(eks_cluster) { %eks_cluster { ResourcesVpcConfig exists ResourcesVpcConfig is_struct ResourcesVpcConfig { # Scenarios 2, 3, 4 and 5 EndpointPublicAccess exists EndpointPublicAccess == false EndpointPrivateAccess exists EndpointPrivateAccess == 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.EKS.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 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: '' EKSClusterRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: eks.amazonaws.com Action: sts:AssumeRole Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonEKSClusterPolicy EKSCluster: Type: AWS::EKS::Cluster Properties: RoleArn: Fn::GetAtt: EKSClusterRole.Arn ResourcesVpcConfig: SubnetIds: - Ref: SubnetOne - Ref: SubnetTwo EndpointPublicAccess: false EndpointPrivateAccess: 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: '' EKSClusterRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: eks.amazonaws.com Action: sts:AssumeRole Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonEKSClusterPolicy EKSCluster: Type: AWS::EKS::Cluster Properties: RoleArn: Fn::GetAtt: EKSClusterRole.Arn ResourcesVpcConfig: SubnetIds: - Ref: SubnetOne - Ref: SubnetTwo EndpointPublicAccess: true EndpointPrivateAccess: false

[CT.EKS.PR.2] Exiger qu'un cluster Amazon EKS soit configuré avec un chiffrement secret à l'aide de clés (KMS) AWS Key Management Service

Ce contrôle vérifie si les clusters Amazon Elastic Kubernetes Service (Amazon EKS) sont configurés pour utiliser les secrets Kubernetes chiffrés avec des clés (KMS). AWS Key Management Service

  • 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::EKS::Cluster

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

Détails et exemples

Explication

Les secrets Kubernetes stockent des informations sensibles, telles que les certificats utilisateur, les mots de passe ou les clés d'API. Le chiffrement des secrets Kubernetes au repos renforce la sécurité de vos clusters EKS.

Considérations d'utilisation
  • Pour un cluster qui utilise le chiffrement d'enveloppe KMS, kms:CreateGrant des autorisations sont requises. La condition n'kms:GrantIsForAWSResourceest pas prise en charge pour l' CreateCluster action, et cette condition ne doit pas être spécifiée dans les politiques KMS afin de contrôler kms:CreateGrant les autorisations accordées aux utilisateurs effectuant CreateCluster des opérations.

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

Fournissez une EncryptionConfig configuration avec une liste de Resources ce qui contient secrets et une Provider configuration contenant unKeyArn.

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

Cluster Amazon EKS - Exemple

Le cluster Amazon EKS est configuré pour que les secrets Kubernetes soient chiffrés à l'aide des clés Amazon Elastic Kubernetes Service (KMS). L'exemple est présenté en JSON et en YAML.

Exemple JSON

{ "EKSCluster": { "Type": "AWS::EKS::Cluster", "Properties": { "RoleArn": { "Fn::GetAtt": [ "EKSClusterRole", "Arn" ] }, "ResourcesVpcConfig": { "SubnetIds": [ { "Ref": "SubnetOne" }, { "Ref": "SubnetTwo" } ], "EndpointPublicAccess": false, "EndpointPrivateAccess": true }, "Logging": { "ClusterLogging": { "EnabledTypes": [ { "Type": "api" }, { "Type": "audit" }, { "Type": "authenticator" }, { "Type": "controllerManager" }, { "Type": "scheduler" } ] } }, "EncryptionConfig": [ { "Resources": [ "secrets" ], "Provider": { "KeyArn": { "Fn::GetAtt": [ "KMSKey", "Arn" ] } } } ] } } }

Exemple YAML

EKSCluster: Type: AWS::EKS::Cluster Properties: RoleArn: !GetAtt 'EKSClusterRole.Arn' ResourcesVpcConfig: SubnetIds: - !Ref 'SubnetOne' - !Ref 'SubnetTwo' EndpointPublicAccess: false EndpointPrivateAccess: true Logging: ClusterLogging: EnabledTypes: - Type: api - Type: audit - Type: authenticator - Type: controllerManager - Type: scheduler EncryptionConfig: - Resources: - secrets Provider: KeyArn: !GetAtt 'KMSKey.Arn'

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

# ################################### ## Rule Specification ## ##################################### # # Rule Identifier: # eks_secrets_encrypted_check # # Description: # This control checks whether Amazon Elastic Kubernetes Service (Amazon EKS) clusters are configured to use Kubernetes secrets encrypted with AWS Key Management Service (KMS) keys. # # Reports on: # AWS::EKS::Cluster # # 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 EKS 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 Amazon EKS cluster resource # And: 'EncryptionConfig' has not been provided or provided as 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 Amazon EKS cluster resource # And: 'EncryptionConfig' has been provided as a non-empty list # And: There are no entries in 'EncryptionConfig' where 'Resources' has been provided # as a non-empty list with at least one value equal to 'secrets' # And: For the same entry in 'EncryptionConfig', where 'KeyArn' in 'Provider' has been # provided as a non-empty string or valid local reference to a KMS key or key alias # Then: FAIL # Scenario: 4 # Given: The input document is an AWS CloudFormation or AWS CloudFormation hook document # And: The input document contains an Amazon EKS cluster resource # And: 'EncryptionConfig' has been provided as a non-empty list # And: For at least one entry in 'EncryptionConfig', 'Resources' has been provided as a # non-empty list with at least one value equal to 'secrets' # And: For the same entry in 'EncryptionConfig', 'KeyArn' in 'Provider' has been provided # as a non-empty string or valid local reference to a KMS key or key alias # Then: PASS # # Constants # let EKS_CLUSTER_TYPE = "AWS::EKS::Cluster" let INPUT_DOCUMENT = this # # Assignments # let eks_clusters = Resources.*[ Type == %EKS_CLUSTER_TYPE ] # # Primary Rules # rule eks_secrets_encrypted_check when is_cfn_template(%INPUT_DOCUMENT) %eks_clusters not empty { check(%eks_clusters.Properties) << [CT.EKS.PR.2]: Require an Amazon EKS cluster to be configured with secret encryption using AWS Key Management Service (KMS) keys [FIX]: Provide an 'EncryptionConfig' configuration with a list of 'Resources' that contains 'secrets' and a 'Provider' configuration containing a 'KeyArn'. >> } rule eks_secrets_encrypted_check when is_cfn_hook(%INPUT_DOCUMENT, %EKS_CLUSTER_TYPE) { check(%INPUT_DOCUMENT.%EKS_CLUSTER_TYPE.resourceProperties) << [CT.EKS.PR.2]: Require an Amazon EKS cluster to be configured with secret encryption using AWS Key Management Service (KMS) keys [FIX]: Provide an 'EncryptionConfig' configuration with a list of 'Resources' that contains 'secrets' and a 'Provider' configuration containing a 'KeyArn'. >> } # # Parameterized Rules # rule check(eks_cluster) { %eks_cluster { # Scenario 2 EncryptionConfig exists EncryptionConfig is_list EncryptionConfig not empty # Scenario 3 and 4 some EncryptionConfig[*] { Resources exists Resources is_list Resources not empty some Resources[*] == "secrets" Provider exists Provider is_struct Provider { KeyArn exists check_is_string_and_not_empty(KeyArn) or check_local_references(%INPUT_DOCUMENT, KeyArn, "AWS::KMS::Key") or check_local_references(%INPUT_DOCUMENT, KeyArn, "AWS::KMS::Alias") } } } } # # 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.EKS.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: 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: '' EKSClusterRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: eks.amazonaws.com Action: sts:AssumeRole Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonEKSClusterPolicy KMSKey: Type: AWS::KMS::Key Properties: PendingWindowInDays: 7 KeyPolicy: Version: 2012-10-17 Id: example-key-policy Statement: - Sid: Enable IAM User Permissions Effect: Allow Principal: AWS: Fn::Sub: arn:${AWS::Partition}:iam::${AWS::AccountId}:root Action: kms:* Resource: '*' KeySpec: SYMMETRIC_DEFAULT EKSCluster: Type: AWS::EKS::Cluster Properties: RoleArn: Fn::GetAtt: - EKSClusterRole - Arn ResourcesVpcConfig: SubnetIds: - Ref: SubnetOne - Ref: SubnetTwo EndpointPublicAccess: false EndpointPrivateAccess: true Logging: ClusterLogging: EnabledTypes: - Type: api - Type: audit - Type: authenticator - Type: controllerManager - Type: scheduler EncryptionConfig: - Resources: - secrets Provider: KeyArn: Fn::GetAtt: [KMSKey, Arn]

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: '' EKSClusterRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: eks.amazonaws.com Action: sts:AssumeRole Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonEKSClusterPolicy EKSCluster: Type: AWS::EKS::Cluster Properties: RoleArn: Fn::GetAtt: - EKSClusterRole - Arn ResourcesVpcConfig: SubnetIds: - Ref: SubnetOne - Ref: SubnetTwo EndpointPublicAccess: false EndpointPrivateAccess: true Logging: ClusterLogging: EnabledTypes: - Type: api - Type: audit - Type: authenticator - Type: controllerManager - Type: scheduler