説明
EKS は、すべてのクラスターで etcd データを保存するディスクを暗号化します。Kubernetes 1.28 以降では、AWS 所有のキーによるエンベロープ暗号化も、すべての Kubernetes API データに既定で適用されます。EncryptionConfig がないだけで、クラスターのデータが平文で保存されるとは判断できません。
キーのポリシーとライフサイクルを自分で管理する必要がある場合は、カスタマーマネージド KMS キーを設定します。ノードや EBS ボリューム内のデータの暗号化は別の設定です。
想定される影響
カスタマーマネージドキーが必要な環境では、既定のキーだけでは組織のキー管理要件を満たせない場合があります。一方、使用中のキーを削除したり必要な権限を取り消したりすると、クラスターの稼働とデータへのアクセスが停止するおそれがあります。暗号化は Kubernetes のアクセス制御の代わりにはなりません。
対処方法
クラスターのバージョンと実際の暗号化状態を確認してください。カスタマーマネージドキーが必要な場合は、同じリージョンの適切な対称 KMS キーと権限を用意し、EncryptionConfig に Provider.KeyArn と Resources: [secrets] を指定してください。Kubernetes 1.28 以降では、このリソース一覧にかかわらずすべての API データがエンベロープ暗号化されます。既存クラスターでは対応する更新手順と変更セットを確認し、キーの無効化・削除を制限してください。
例
現在サポートされている Kubernetes バージョン、クラスターロール、セキュリティグループ、異なるアベイラビリティーゾーンのサブネットを指定します。最初の例も Kubernetes 1.28 以降では既定のエンベロープ暗号化を使用します。二つ目は、組織の要件に応じてカスタマーマネージドキーを指定する例です。
AWS 所有のキーを使用
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
KubernetesVersion:
Type: String
ClusterRoleArn:
Type: String
ClusterSecurityGroups:
Type: List<AWS::EC2::SecurityGroup::Id>
ClusterSubnets:
Type: List<AWS::EC2::Subnet::Id>
Resources:
MyEKSClusterA:
Type: AWS::EKS::Cluster
Properties:
Name: dev
Version: !Ref KubernetesVersion
RoleArn: !Ref ClusterRoleArn
ResourcesVpcConfig:
SecurityGroupIds: !Ref ClusterSecurityGroups
SubnetIds: !Ref ClusterSubnets
カスタマーマネージドキーを指定
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
EncryptionKeyArn:
Type: String
KubernetesVersion:
Type: String
ClusterRoleArn:
Type: String
ClusterSecurityGroups:
Type: List<AWS::EC2::SecurityGroup::Id>
ClusterSubnets:
Type: List<AWS::EC2::Subnet::Id>
Resources:
MyEKSClusterA:
Type: AWS::EKS::Cluster
Properties:
Name: dev
Version: !Ref KubernetesVersion
RoleArn: !Ref ClusterRoleArn
ResourcesVpcConfig:
SecurityGroupIds: !Ref ClusterSecurityGroups
SubnetIds: !Ref ClusterSubnets
EncryptionConfig:
- Provider:
KeyArn: !Ref EncryptionKeyArn
Resources:
- secrets