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. 03检查 etcd 访问和证书权限
  4. 04评估备份加密及处理方式
  5. 05检查网络隔离和 CIS 控制项

适用场景

  1. 01在 Kubernetes 安全审查中审计 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 是分布式键值存储,作为 Kubernetes 所有集群数据的后端存储,包括 Secret、RBAC 策略、ConfigMap 和工作负载配置。如果未进行适当加固,etcd 会以明文形式暴露所有集群 Secret,使其成为获得控制平面访问权限的攻击者眼中价值最高的目标。全面的安全评估涵盖静态加密、传输层 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

验证 Secret 在 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.1已设置 etcd cert-file已配置 TLS 证书
2.2etcd client-cert-auth已启用客户端证书认证
2.3etcd auto-tls 已禁用auto-tls=false
2.4已设置 etcd peer cert-file已配置对等 TLS
2.5etcd peer client-cert-auth已启用对等认证
2.6etcd peer auto-tls 已禁用peer-auto-tls=false
2.7etcd 使用独立 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