EKS クラスターで暗号化された Kubernetes シークレットを利用する手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、EKS クラスターでKubernetesシークレットの暗号化を有効にする重要性と具体的な設定方法について解説します。

ポリシーの説明
Amazon EKS クラスターで、KubernetesのSecretオブジェクトがAWS KMSを利用してエンベロープ暗号化されるように設定する必要があります。Kubernetes 1.28以降では自動的に有効化されますが、それ以前のバージョンでは手動設定が必要です。
Kubernetesシークレットには、以下のような重要な機密情報が保存されています:
- データベース接続文字列とパスワード
- APIキーとアクセストークン
- TLS証明書と秘密鍵
- サービスアカウントトークン
- Docker レジストリ認証情報
- OAuth トークンとクライアントシークレット
これらの情報は、デフォルトではetcdデータストアにBase64エンコーディングのみで保存され、実質的に平文と同等の状態です。
リスク
Kubernetesシークレットの暗号化が無効な場合、以下の重大なセキュリティリスクが発生します:
1. etcdデータストアの脆弱性
- 平文保存の危険性: Base64エンコーディングは暗号化ではなく、
echo <base64> | base64 -d
で簡単にデコード可能 - バックアップ漏洩: etcdのスナップショットやバックアップファイルが流出した場合、全てのシークレットが即座に利用可能
- 物理アクセス: ディスクへの物理アクセスやボリュームスナップショットから機密情報を抽出可能
- メモリダンプ: etcdプロセスのメモリダンプから平文のシークレットを取得可能
2. 大規模なデータ侵害のリスク
- 全クラスターへの影響: 一つのetcdノードの侵害で、クラスター全体の機密情報が漏洩
- マルチテナント環境: 複数のネームスペースやアプリケーションのシークレットが一括で流出
- 継続的な被害: 過去のバックアップからも機密情報を取得可能で、被害が長期化
- 実例: 2023年の調査では、Kubernetesクラスターの侵害事例の43%でシークレットの不適切な管理が原因
修復方法
コンソールでの修復手順
AWS管理コンソールを使用してEKSクラスターのシークレット暗号化を有効化する詳細な手順:
ステップ1: EKSクラスターの現状確認
- AWS管理コンソールにサインイン
- EKSサービスに移動
- リージョンが正しいことを確認
- 対象クラスターの選択
- クラスター一覧から対象のEKSクラスターをクリック
- 「概要」タブでKubernetesバージョンを確認(1.13以降であること)
- 現在の暗号化状態の確認
- 「設定」タブをクリック
- 「暗号化」セクションを確認
- ステータスが「無効」の場合は設定が
ステップ2: KMSキーの準備
- KMSキーの作成(新規作成の場合)
- 「新しいキーを作成」リンクをクリック
- KMSコンソールで以下を設定:
- キータイプ: 対称
- キーの使用: 暗号化と復号化
- エイリアス:
alias/eks-secrets-<cluster-name>
- 説明:
EKS cluster ${cluster-name} secrets encryption
- キーポリシーの設定
- EKSサービスがキーを使用できるように以下のポリシーを追加:
{ "Sid": "Allow EKS to use the key", "Effect": "Allow", "Principal": { "Service": "eks.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:CreateGrant" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "eks.${AWS::Region}.amazonaws.com" } } }
ステップ3: 暗号化の有効化
- 暗号化設定の開始
- EKSクラスターの「設定」タブに戻る
- 「暗号化」セクションで「暗号化を管理」をクリック
- 暗号化オプションの設定
- 「シークレットの暗号化を有効化」にチェック
- KMSキー: 作成したキーまたは既存のキーを選択
- 暗号化プロバイダー: 「AWS Key Management Service (KMS)」
- 設定の確認と適用
- 設定内容を確認
- 「変更を保存」をクリック
- 更新の進行状況を監視(通常5-10分)

ステップ4: 検証
- 暗号化状態の確認
- クラスターのステータスが「Active」に戻ることを確認
- 「暗号化」セクションで「有効」と表示されることを確認
- 既存シークレットの再暗号化
- CloudShellまたはローカル環境で以下を実行:
# すべてのネームスペースのシークレットを取得して再作成 kubectl get secrets --all-namespaces -o json | kubectl replace -f -
Terraformでの修復手順
Infrastructure as Codeを使用してEKSクラスターのシークレット暗号化を管理する設定するTerraformコードのサンプルです。
encryption_config
にて、KMSキーを指定した上で、resourcesを指定すれば適用されます。
# ========================================
# EKSクラスター
# ========================================
resource "aws_eks_cluster" "main" {
>>>>>> Skip
# シークレット暗号化の設定(条件付き)
encryption_config {
content {
provider {
key_arn = aws_kms_key.eks_secrets[0].arn
}
resources = ["secrets"]
}
}
}
最後に
この記事では、EKS クラスターでKubernetesシークレットの暗号化を有効にする重要性と具体的な設定方法について包括的に解説しました。
重要なポイントのまとめ:
- Kubernetesシークレットのデフォルト状態(Base64のみ)は極めて危険
- AWS KMSによるエンベロープ暗号化で、etcd内のデータを確実に保護
- 一度有効化した暗号化は無効化できない(設計による安全性確保)
- コンプライアンス要件(PCI-DSS、HIPAA、GDPR等)の充足に必須
- 月額$5-20程度のコストで、数百万ドル規模のセキュリティインシデントを防止可能
Kubernetesクラスターのセキュリティは、単一の対策では不十分です。シークレットの暗号化は、多層防御戦略の重要な一層として、他のセキュリティ対策(RBAC、ネットワークポリシー、Pod Security Standards等)と組み合わせて実装する必要があります。
この問題の検出は弊社が提供するSecurifyのCSPM機能で自動的に検出・管理することが可能です。
運用負荷を大幅に軽減しながら、セキュリティレベルを向上させる製品となっていますので、ぜひ興味がある方はお問い合わせください。
最後までお読みいただきありがとうございました。この記事が皆さんのEKSセキュリティ強化の一助となれば幸いです。