mcpField
P
performing-kubernetes-etcd-security-assessment

performing-kubernetes-etcd-security-assessment

github.com/mukul975セキュリティ35.2k59 回インストール8 週間前に更新
リポジトリ

performing-kubernetes-etcd-security-assessment について

Kubernetes管理者や監査担当者向けに、etcdの設定を確認するセキュリティ評価スキルです。保存時の暗号化、TLS、アクセス制御、バックアップ、ネットワーク分離を調べ、CIS Kubernetes Benchmarkを参照します。

主な機能

  1. 01保存データの暗号化を確認
  2. 02クライアント間・ピア間のTLS設定を検証
  3. 03etcdアクセスと証明書権限を確認
  4. 04バックアップの暗号化と取り扱いを評価
  5. 05ネットワーク分離とCIS項目を確認

活用シーン

  1. 01Kubernetesのセキュリティ監査でetcdを評価
  2. 02保存されたSecretの保護を検証
  3. 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 と一緒にインストールされる参考資料やスクリプト。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.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-fileCA 証明書のパスクライアント証明書の検証
--peer-cert-fileピア証明書のパスピア間の TLS
--peer-key-fileピア鍵のパスピア間の TLS
--peer-trusted-ca-fileピア CA のパスピア証明書の検証
--client-cert-authtrueクライアント証明書を必須にする
--peer-client-cert-authtrueピア証明書を必須にする
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.1etcd の cert-file が設定されているTLS 証明書が設定済み
2.2etcd の client-cert-authクライアント証明書認証が有効
2.3etcd の auto-tls が無効auto-tls=false
2.4etcd の peer cert-file が設定されているピア TLS が設定済み
2.5etcd の peer client-cert-authピア認証が有効
2.6etcd の peer auto-tls が無効peer-auto-tls=false
2.7etcd 専用の CAetcd 用に別個の 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

参考資料

コメント