performing-kubernetes-etcd-security-assessment について
Kubernetes管理者や監査担当者向けに、etcdの設定を確認するセキュリティ評価スキルです。保存時の暗号化、TLS、アクセス制御、バックアップ、ネットワーク分離を調べ、CIS Kubernetes Benchmarkを参照します。
主な機能
- 01保存データの暗号化を確認
- 02クライアント間・ピア間のTLS設定を検証
- 03etcdアクセスと証明書権限を確認
- 04バックアップの暗号化と取り扱いを評価
- 05ネットワーク分離とCIS項目を確認
活用シーン
- 01Kubernetesのセキュリティ監査でetcdを評価
- 02保存されたSecretの保護を検証
- 03ワーカーノードからのetcd到達性を確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill performing-kubernetes-etcd-security-assessmentインストール後、Claude Code で/performing-kubernetes-etcd-security-assessmentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
Kubernetes etcd セキュリティ評価の実施
概要
etcd は、Secrets、RBAC ポリシー、ConfigMaps、ワークロード設定など、クラスターのすべてのデータを保存する Kubernetes の分散型キーバリューストアです。適切に強化されていない場合、etcd からクラスターのすべてのシークレットが平文で露出するため、コントロールプレーンへのアクセスを得た攻撃者にとって最も価値の高い標的になります。包括的なセキュリティ評価では、保存データの暗号化、通信の TLS、アクセス制御、バックアップのセキュリティ、ネットワーク分離を確認します。
使用する場面
- Kubernetes etcd のセキュリティ評価を実施するセキュリティ評価を行う場合
- 関連するセキュリティインシデントに対するインシデント対応手順に従う場合
- 定期的なセキュリティテストや監査を実施する場合
- 実地テストを通じてセキュリティ制御を検証する場合
前提条件
- Kubernetes コントロールプレーンノードへのアクセス
- etcd クラスターノードへの SSH アクセス(または設定済みの etcdctl)
- CIS Kubernetes Benchmark の参考文書
- TLS 証明書管理と EncryptionConfiguration に関する知識
評価項目
1. 保存データの暗号化
Kubernetes が etcd に保存された Secret データを暗号化していることを確認します。
# Check if EncryptionConfiguration is configured on API server
ps aux | grep kube-apiserver | grep encryption-provider-config
# View the encryption configuration
cat /etc/kubernetes/enc/encryption-config.yaml
安全な設定の例:
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
- configmaps
providers:
- aescbc:
keys:
- name: key1
secret: <base64-encoded-32-byte-key>
- identity: {} # Fallback for reading unencrypted data
etcd 内のシークレットが実際に暗号化されていることを確認します。
# Read a secret directly from etcd
ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
get /registry/secrets/default/my-secret | hexdump -C | head -20
# If encrypted, output starts with "k8s:enc:aescbc:v1:key1"
# If NOT encrypted, you'll see plaintext key-value pairs
2. TLS 通信セキュリティ
# Verify etcd uses TLS for client connections
ETCDCTL_API=3 etcdctl endpoint health \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
# Check peer TLS configuration
ps aux | grep etcd | tr ' ' '\n' | grep -E "peer-cert|peer-key|peer-trusted-ca"
# Verify certificate expiration
openssl x509 -in /etc/kubernetes/pki/etcd/server.crt -noout -enddate
openssl x509 -in /etc/kubernetes/pki/etcd/peer.crt -noout -enddate
想定されるフラグ:
| フラグ | 必須値 | 目的 |
|---|---|---|
--cert-file | サーバー証明書のパス | クライアントとサーバー間の TLS |
--key-file | サーバー鍵のパス | クライアントとサーバー間の TLS |
--trusted-ca-file | CA 証明書のパス | クライアント証明書の検証 |
--peer-cert-file | ピア証明書のパス | ピア間の TLS |
--peer-key-file | ピア鍵のパス | ピア間の TLS |
--peer-trusted-ca-file | ピア CA のパス | ピア証明書の検証 |
--client-cert-auth | true | クライアント証明書を必須にする |
--peer-client-cert-auth | true | ピア証明書を必須にする |
3. アクセス制御
# Verify etcd is not exposed on all interfaces
ps aux | grep etcd | tr ' ' '\n' | grep listen-client-urls
# Should be: https://127.0.0.1:2379 (not 0.0.0.0)
# Check who can access etcd certificates
ls -la /etc/kubernetes/pki/etcd/
# Should be readable only by root/etcd user
# Verify API server is the only etcd client
ss -tlnp | grep 2379
# Only kube-apiserver should have connections
4. バックアップのセキュリティ
# Create an encrypted etcd backup
ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
# Encrypt the backup file
gpg --symmetric --cipher-algo AES256 /backup/etcd-snapshot.db
# Verify backup integrity
ETCDCTL_API=3 etcdctl snapshot status /backup/etcd-snapshot.db --write-out=table
5. ネットワーク分離
# Verify etcd ports are firewalled
iptables -L -n | grep -E "2379|2380"
# Check if etcd is accessible from worker nodes (should NOT be)
# Run from a worker node:
curl -k https://<control-plane-ip>:2379/health
# Should be rejected/timeout
CIS Benchmark の確認項目
| CIS コントロール | 確認項目 | 期待される結果 |
|---|---|---|
| 2.1 | etcd の cert-file が設定されている | TLS 証明書が設定済み |
| 2.2 | etcd の client-cert-auth | クライアント証明書認証が有効 |
| 2.3 | etcd の auto-tls が無効 | auto-tls=false |
| 2.4 | etcd の peer cert-file が設定されている | ピア TLS が設定済み |
| 2.5 | etcd の peer client-cert-auth | ピア認証が有効 |
| 2.6 | etcd の peer auto-tls が無効 | peer-auto-tls=false |
| 2.7 | etcd 専用の CA | etcd 用に別個の CA を使用(クラスターと共有しない) |
鍵のローテーション手順
# 1. Generate new encryption key
NEW_KEY=$(head -c 32 /dev/urandom | base64)
# 2. Update EncryptionConfiguration with new key first
cat > /etc/kubernetes/enc/encryption-config.yaml <<EOF
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key2
secret: ${NEW_KEY}
- name: key1
secret: <old-key>
- identity: {}
EOF
# 3. Restart API server to pick up new config
# 4. Re-encrypt all secrets with new key
kubectl get secrets --all-namespaces -o json | \
kubectl replace -f -
# 5. Remove old key from EncryptionConfiguration
# 6. Restart API server again
参考資料
コメント
Markdown 対応