securing-kubernetes-on-cloud
本技能涵盖通过实施 Pod 安全标准(Pod Security Standards)、网络策略、工作负载身份、RBAC 权限控制、镜像准入控制和运行时安全监控,对 EKS、AKS 和 GKE 上的托管 Kubernetes 集群进行加固。涉及云平台特定安全功能,包括 EKS 的 IRSA、GKE 的工作负载身份(Workload Identity)以及 AKS 的托管身份(Managed Identity)。
Best use case
securing-kubernetes-on-cloud is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
本技能涵盖通过实施 Pod 安全标准(Pod Security Standards)、网络策略、工作负载身份、RBAC 权限控制、镜像准入控制和运行时安全监控,对 EKS、AKS 和 GKE 上的托管 Kubernetes 集群进行加固。涉及云平台特定安全功能,包括 EKS 的 IRSA、GKE 的工作负载身份(Workload Identity)以及 AKS 的托管身份(Managed Identity)。
Teams using securing-kubernetes-on-cloud should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/securing-kubernetes-on-cloud/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How securing-kubernetes-on-cloud Compares
| Feature / Agent | securing-kubernetes-on-cloud | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
本技能涵盖通过实施 Pod 安全标准(Pod Security Standards)、网络策略、工作负载身份、RBAC 权限控制、镜像准入控制和运行时安全监控,对 EKS、AKS 和 GKE 上的托管 Kubernetes 集群进行加固。涉及云平台特定安全功能,包括 EKS 的 IRSA、GKE 的工作负载身份(Workload Identity)以及 AKS 的托管身份(Managed Identity)。
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# 云上 Kubernetes 安全加固
## 适用场景
- 在生产环境部署新的托管 Kubernetes 集群并有安全要求时
- 在安全审计或渗透测试发现后,对现有 EKS、AKS 或 GKE 集群进行加固时
- 实施工作负载身份(Workload Identity)以消除 Pod 中静态云凭证时
- 跨命名空间强制执行 Pod 安全策略以防止容器逃逸时
- 集成运行时安全监控以检测容器级威胁时
**不适用于**:非 Kubernetes 容器部署(如 ECS Fargate 或 Azure Container Instances)、容器内的应用层安全(参见 securing-serverless-functions),或 CI/CD 流水线安全(参见 implementing-cloud-devsecops)。
## 前置条件
- 已在 EKS、AKS 或 GKE 上预配托管 Kubernetes 集群并具备管理员访问权限
- kubectl 已配置集群管理员凭据
- 熟悉 Kubernetes RBAC、命名空间和安全上下文
- 支持网络策略的容器网络接口插件(Calico、Cilium)
## 工作流程
### 步骤 1:强制执行 Pod 安全标准(Pod Security Standards)
在命名空间级别应用 Pod 安全准入(Pod Security Admission)标签,在生产命名空间中强制执行 Restricted 配置文件。Pod 安全策略(Pod Security Policies)已在 Kubernetes v1.25 中移除,由 Pod 安全准入取代。
```yaml
# 生产命名空间,应用 Restricted Pod 安全标准
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/enforce-version: latest
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
---
# 预演命名空间,应用 Baseline 强制执行
apiVersion: v1
kind: Namespace
metadata:
name: staging
labels:
pod-security.kubernetes.io/enforce: baseline
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
```
```yaml
# 符合 Restricted 配置文件的 Pod 规范
apiVersion: v1
kind: Pod
metadata:
name: secure-app
namespace: production
spec:
automountServiceAccountToken: false
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: company/app:v2.1@sha256:abc123...
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
resources:
limits:
cpu: "500m"
memory: "256Mi"
requests:
cpu: "100m"
memory: "128Mi"
```
### 步骤 2:配置云原生工作负载身份
通过将 Kubernetes 服务账户绑定到云 IAM 角色,消除 Pod 中的静态云凭证。
```bash
# EKS:IAM Roles for Service Accounts (IRSA)
eksctl create iamserviceaccount \
--cluster production-cluster \
--namespace production \
--name web-app-sa \
--attach-policy-arn arn:aws:iam::123456789012:policy/WebAppS3ReadOnly \
--approve
# GKE:工作负载身份(Workload Identity)
gcloud iam service-accounts create web-app-sa \
--project=my-gcp-project
gcloud iam service-accounts add-iam-policy-binding \
web-app-sa@my-gcp-project.iam.gserviceaccount.com \
--role roles/storage.objectViewer \
--member "serviceAccount:my-gcp-project.svc.id.goog[production/web-app-sa]"
kubectl annotate serviceaccount web-app-sa \
--namespace production \
iam.gke.io/gcp-service-account=web-app-sa@my-gcp-project.iam.gserviceaccount.com
# AKS:Azure AD 工作负载身份
az identity create --name web-app-identity --resource-group production-rg
az identity federated-credential create \
--name web-app-federation \
--identity-name web-app-identity \
--resource-group production-rg \
--issuer "$(az aks show -n production-cluster -g production-rg --query oidcIssuerProfile.issuerUrl -o tsv)" \
--subject system:serviceaccount:production:web-app-sa
```
### 步骤 3:实施网络策略(Network Policy)
部署网络策略,遵循最小权限原则限制 Pod 间通信。默认情况下,Kubernetes 允许所有 Pod 相互通信。
```yaml
# 生产命名空间中默认拒绝所有入站和出站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
---
# 仅允许 web-app 接收来自 ingress controller 的流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-ingress-to-web
namespace: production
spec:
podSelector:
matchLabels:
app: web-app
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: ingress-nginx
ports:
- protocol: TCP
port: 8080
---
# 仅允许 web-app 连接到数据库
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-web-to-db
namespace: production
spec:
podSelector:
matchLabels:
app: web-app
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
app: postgres
ports:
- protocol: TCP
port: 5432
- to:
- namespaceSelector: {}
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
```
### 步骤 4:按最小权限配置 RBAC
将 Kubernetes RBAC 角色限定在特定命名空间和资源范围内。非管理员用户应避免使用 ClusterRoleBindings。
```yaml
# 开发者角色,限定在特定命名空间范围内
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: developer-role
namespace: staging
rules:
- apiGroups: [""]
resources: ["pods", "pods/log", "services", "configmaps"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch", "update", "patch"]
# 明确拒绝对 Secrets 的访问
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer-binding
namespace: staging
subjects:
- kind: Group
name: developers
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: developer-role
apiGroup: rbac.authorization.k8s.io
```
### 步骤 5:部署镜像准入控制
使用准入控制器(Admission Controller)强制只允许部署来自受信任仓库的已签名镜像。使用 OPA/Gatekeeper 或 Kyverno 进行策略执行。
```yaml
# Kyverno 策略:要求镜像来自已批准的仓库
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: restrict-image-registries
spec:
validationFailureAction: Enforce
rules:
- name: validate-registries
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: "镜像必须来自已批准的仓库"
pattern:
spec:
containers:
- image: "123456789012.dkr.ecr.us-east-1.amazonaws.com/* | gcr.io/my-gcp-project/*"
---
# Kyverno 策略:要求使用镜像摘要(禁止使用可变标签)
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-image-digest
spec:
validationFailureAction: Enforce
rules:
- name: require-digest
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: "镜像必须使用摘要引用,而非标签"
pattern:
spec:
containers:
- image: "*@sha256:*"
```
### 步骤 6:启用运行时安全监控
部署运行时安全工具,检测容器内的异常行为,包括进程执行、文件系统修改和网络连接。
```bash
# 部署 Falco 进行运行时威胁检测
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm install falco falcosecurity/falco \
--namespace falco-system --create-namespace \
--set falcosidekick.enabled=true \
--set falcosidekick.config.slack.webhookurl="https://hooks.slack.com/services/xxx"
# 运行 kube-bench 进行 CIS Kubernetes 基准评估
kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job-eks.yaml
kubectl logs -l app=kube-bench
```
## 核心概念
| 术语 | 定义 |
|------|------|
| Pod 安全标准(Pod Security Standards) | 三种配置文件(Privileged、Baseline、Restricted),通过 Pod 安全准入强制执行,控制 Pod 安全上下文能力 |
| 工作负载身份(Workload Identity) | 将 Kubernetes 服务账户绑定到云 IAM 角色的云原生机制,实现无凭证的云 API 访问(IRSA、GKE WI、AKS MI) |
| 网络策略(Network Policy) | 定义 Pod 间允许的入站和出站流量的 Kubernetes 资源,由 CNI 插件强制执行 |
| 准入控制器(Admission Controller) | 在持久化前拦截 API 请求的 Kubernetes 插件,根据安全策略验证或变更资源 |
| RBAC(基于角色的访问控制) | Kubernetes 中定义哪些身份可以在哪些命名空间中对哪些资源执行哪些操作(动词)的访问控制机制 |
| Seccomp 配置文件(Seccomp Profile) | Linux 内核特性,限制容器进程可以进行的系统调用,减少内核攻击面 |
| 服务网格(Service Mesh) | 为服务间通信提供双向 TLS、流量策略和可观测性的基础设施层(Istio、Linkerd) |
## 工具与系统
- **Falco**:使用内核级系统调用监控检测容器内异常行为的开源运行时安全引擎
- **Kyverno**:用于准入控制、资源变更和生成的 Kubernetes 原生策略引擎,基于安全策略运行
- **kube-bench**:CIS Kubernetes 基准评估工具,对照安全最佳实践检查集群配置
- **Trivy**:支持 SBOM 生成的容器镜像、文件系统和 Kubernetes 资源漏洞扫描工具
- **Calico/Cilium**:提供网络策略执行和高级网络安全功能(包括基于 eBPF 的监控)的 CNI 插件
## 常见场景
### 场景:通过被攻陷的容器镜像部署加密矿工
**场景背景**:GuardDuty 扩展威胁检测(Extended Threat Detection)生成 AttackSequence:EKS/CompromisedCluster 发现。一名开发者拉取了包含嵌入式 XMRig 加密矿工的公共 Docker 镜像,该矿工在容器启动时执行。
**方法**:
1. 通过针对受影响 Pod 标签应用全拒绝网络策略,隔离该 Pod
2. 捕获容器镜像摘要,使用 Trivy 扫描识别嵌入的二进制文件
3. 审查 Kubernetes 审计日志,确定谁在何时部署了被攻陷的镜像
4. 部署 Kyverno ClusterPolicy,仅允许来自已批准私有仓库的镜像
5. 启用镜像摘要固定,防止标签变更攻击
6. 部署 Falco,配置检测加密挖矿进程特征(/usr/bin/xmrig、stratum+tcp 连接)的规则
**常见陷阱**:在捕获镜像摘要和审计日志之前删除 Pod 会销毁取证证据。仅封锁特定镜像标签会让攻击者使用不同标签重新推送。
## 输出格式
```
Kubernetes 安全评估报告
=======================================
集群: production-cluster (EKS 1.29)
云提供商: AWS (us-east-1)
评估日期: 2025-02-23
工具: kube-bench v0.8.0 + 手动审查
CIS KUBERNETES 基准结果:
总控制项: 124
通过: 98 (79%)
失败: 18 (15%)
警告: 8 (6%)
严重发现:
[K8S-001] 3 个命名空间缺少 Pod 安全标准强制执行
命名空间: monitoring, logging, default
修复建议: 应用 Restricted PSA 标签
[K8S-002] 12 个 Deployment 的默认服务账户令牌自动挂载
风险: 容器被攻陷时存在凭证窃取风险
修复建议: 设置 automountServiceAccountToken: false
[K8S-003] 生产命名空间中无网络策略
风险: 所有 Pod 之间不受限制的横向移动
修复建议: 部署默认拒绝策略并添加明确的允许规则
高危发现:
[K8S-004] 5 个 Pod 以 root 身份运行,并具有特权安全上下文
[K8S-005] 8 个 Deployment 中的镜像使用可变标签(:latest)
[K8S-006] RBAC ClusterRoleBinding 向开发者组授予了 cluster-admin 权限
```Related Skills
securing-serverless-functions
本技能涵盖 AWS Lambda、Azure Functions 和 Google Cloud Functions 等无服务器计算平台的安全加固,涉及最小权限 IAM 角色、依赖漏洞扫描、密钥管理集成、输入验证、函数 URL 认证以及运行时监控,以防范注入攻击、凭证窃取和供应链攻击。
securing-remote-access-to-ot-environment
本技能涵盖为操作员、工程师和供应商实施OT/ICS环境的安全远程访问,同时防止可能危害工业运营的未授权访问。涉及跳板服务器架构、多因素认证、会话记录、特权访问管理、供应商远程访问控制,以及符合IEC 62443和NERC CIP-005远程访问要求。
securing-historian-server-in-ot-environment
本技能涵盖在OT环境中加固和保护过程历史数据服务器(OSIsoft PI、Honeywell PHD、GE Proficy、AVEVA Historian)。涉及跨Purdue模型各层级的网络部署、历史数据服务器接口的访问控制、通过数据二极管或PI-to-PI连接器在DMZ中进行数据复制、历史数据查询中的SQL注入防护,以及用于安全分析、法规报告和过程优化的过程数据完整性保护。
securing-helm-chart-deployments
通过验证 Chart 完整性、扫描模板中的错误配置并在 Kubernetes 发布中强制执行安全上下文,保护 Helm Chart 部署安全。
securing-github-actions-workflows
本技能涵盖加固 GitHub Actions 工作流以防范供应链攻击、凭据盗窃和权限提升。 内容包括将 action 固定到 SHA 摘要、最小化 GITHUB_TOKEN 权限、防止机密泄露、 防止工作流表达式中的脚本注入,以及为工作流变更实施必要的审阅者机制。
securing-container-registry-with-harbor
Harbor 是一个开源容器镜像仓库,提供安全功能包括漏洞扫描(集成 Trivy)、镜像签名(Notary/Cosign)、RBAC、内容信任策略(Content Trust)、复制和审计日志。配置这些功能以强制执行镜像来源验证、防止有漏洞镜像部署并维护仓库访问控制。
securing-container-registry-images
通过使用 Trivy 和 Grype 实施漏洞扫描、使用 Cosign 和 Sigstore 强制执行镜像签名、配置镜像仓库访问控制,以及构建阻止部署未扫描或未签名镜像的 CI/CD 流水线,来保护容器仓库(Container Registry)中的镜像安全。
securing-aws-iam-permissions
本技能引导从业者加固 AWS 身份和访问管理(Identity and Access Management)配置,在云账户中强制执行最小权限(Least Privilege)访问。涵盖 IAM 策略范围界定、权限边界(Permission Boundary)、Access Analyzer 集成和凭据轮换策略,以降低受损身份的影响范围。
securing-api-gateway-with-aws-waf
通过配置 OWASP Top 10 防护托管规则组(Managed Rule Group)、创建自定义速率限制规则、实施机器人(Bot)控制、设置 IP 信誉过滤以及监控 WAF 指标,使用 AWS WAF 保护 API Gateway 端点。
scanning-kubernetes-manifests-with-kubesec
使用 Kubesec 对 Kubernetes 资源清单执行安全风险分析,识别错误配置、权限提升风险以及与安全最佳实践的偏差。
performing-kubernetes-penetration-testing
Kubernetes 渗透测试(Penetration Testing)通过对 API server、kubelet、etcd、Pod、RBAC、网络策略和密钥模拟攻击者技术,系统性评估集群安全性。使用 kube-hunter、Kubescape、peirates 等工具识别可能导致集群被攻陷的错误配置。
performing-kubernetes-etcd-security-assessment
通过评估静态加密、TLS 配置、访问控制、备份加密和网络隔离,评估 Kubernetes etcd 集群的安全态势。