关于 performing-kubernetes-etcd-security-assessment
面向 Kubernetes 管理员和审计人员的 etcd 安全评估技能,提供配置检查方法。检查范围包括静态数据加密、TLS、访问控制、备份和网络隔离,并参考 CIS Kubernetes Benchmark。
主要功能
- 01检查存储数据是否加密
- 02验证客户端与节点间 TLS 设置
- 03检查 etcd 访问和证书权限
- 04评估备份加密及处理方式
- 05检查网络隔离和 CIS 控制项
适用场景
- 01在 Kubernetes 安全审查中审计 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 是分布式键值存储,作为 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-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