云原生安全与合规:OPA Gatekeeper + Kyverno + Trivy 实战指南(建议收藏)
前言
在前几期,我们构建了从容器化到微服务、数据库治理的完整云原生栈。然而,随着架构演进,安全与合规成为企业上云的最后一道红线。云原生环境带来了动态、短暂、分布式的特性,传统防火墙和静态扫描已无法满足需求。本文将系统讲解云原生安全体系,涵盖镜像安全(Trivy、Clair)、运行时安全(Falco)、K8s安全配置(CIS基准)、策略即代码(OPA Gatekeeper、Kyverno)、准入控制器、审计与合规(Kubescape、kube-bench),并提供大量实战YAML和命令,助你构建从CI/CD到运行时的纵深防御体系。
一、云原生安全面临的挑战
-
镜像供应链:基础镜像漏洞、依赖库投毒、恶意代码植入。
-
配置错误:特权容器、敏感信息暴露、RBAC过度授权。
-
运行时攻击:容器逃逸、加密货币挖矿、API滥用。
-
合规压力:等保2.0、GDPR、PCI-DSS对容器和K8s提出明确要求。
-
多集群/多云:策略一致性和审计日志分散。
安全原则:左移(尽早发现)+ 持续监控 + 最小权限 + 策略即代码。
二、镜像安全:漏洞扫描与签名
1. 静态扫描:Trivy(推荐)
Trivy 由 Aqua Security 开源,支持容器镜像、文件系统、Git仓库的漏洞扫描。
安装:
# 二进制安装
wget https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.deb
sudo dpkg -i trivy_0.50.1_Linux-64bit.deb
# Docker方式
alias trivy='docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy'
扫描镜像:
trivy image --severity CRITICAL,HIGH myapp:latest
trivy image --format json --output result.json myapp:latest
集成到CI(GitLab CI示例):
yaml
container_scanning:
stage: test
script:
- trivy image --exit-code 1 --severity CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
allow_failure: false
2. 基础镜像选择
-
优先使用官方镜像或distroless(无包管理器、无shell)。
-
使用slim版本减少攻击面。
-
定期更新基础镜像(建议每周重建)。
3. 镜像签名与验证(Cosign)
Sigstore 的 Cosign 可以签名镜像并验证来源。
签名:
cosign generate-key-pair # 生成密钥对
cosign sign --key cosign.key myregistry/myapp:latest
验证:
cosign verify --key cosign.pub myregistry/myapp:latest
K8s准入验证:结合Connaisseur或Policy Controller在部署时强制验证签名。
三、K8s安全配置与CIS基准
CIS(Center for Internet Security)发布了Kubernetes基准,包含100+检查项。
1. kube-bench(节点级检测)
# 在Master节点运行
docker run --pid=host -v /etc:/etc:ro -v /var:/var:ro -t aquasec/kube-bench:latest master
# 在Worker节点运行
docker run --pid=host -v /etc:/etc:ro -v /var:/var:ro -t aquasec/kube-bench:latest node
常见高风险项:
-
禁止
--allow-privileged(API Server) -
设置
--profiling=false -
确保
kubelet匿名认证关闭(--anonymous-auth=false)
2. Kubescape(集群级扫描)
Kubescape 由ARMO开源,可扫描集群、YAML文件或Helm Chart。
# 安装
curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
# 扫描集群
kubescape scan --enable-host-scan --submit --account-id <account>
# 扫描本地YAML
kubescape scan --file deployment.yaml
输出:给出FAILED项和修复建议,支持导出PDF/HTML。
四、策略即代码:OPA Gatekeeper
Open Policy Agent (OPA) 的Gatekeeper是K8s准入控制器,通过约束模板和约束强制执行策略。
1. 安装Gatekeeper
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/release-3.14/deploy/gatekeeper.yaml
2. 禁止特权容器
约束模板:
yaml
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8sprivilegedcontainers
spec:
crd:
spec:
names:
kind: K8sPrivilegedContainers
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8sprivilegedcontainers
violation[{"msg": msg}] {
c := input_containers[_]
c.securityContext.privileged == true
msg := sprintf("容器 %v 禁止使用特权模式", [c.name])
}
input_containers[c] { c := input.review.object.spec.containers[_] }
应用约束:
yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPrivilegedContainers
metadata:
name: no-privileged
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
namespaces: ["default"]
parameters: {}
3. 限制镜像仓库来源
rego
package trusted_registry
violation[{"msg": msg}] {
container := input.review.object.spec.containers[_]
not startswith(container.image, "myregistry.com/")
msg := sprintf("镜像 %v 必须来自 myregistry.com", [container.image])
}
4. 审计模式(dry-run)
# 修改约束,设置 enforcementAction: dryrun
kubectl patch constraint no-privileged -p '{"spec":{"enforcementAction":"dryrun"}}'
五、策略即代码:Kyverno(更易用的替代)
Kyverno 专为K8s设计,无需学习Rego,使用原生YAML和JMESPath。
1. 安装Kyverno
helm repo add kyverno https://kyverno.github.io/kyverno/
helm install kyverno kyverno/kyverno -n kyverno --create-namespace
2. 禁止Latest标签
yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-latest-tag
spec:
validationFailureAction: Enforce
rules:
- name: require-image-tag
match:
any:
- resources:
kinds:
- Pod
validate:
message: "镜像标签禁止使用 'latest'"
pattern:
spec:
containers:
- image: "*:*" # 必须有tag
- image: "!*:latest"
3. 自动注入Sidecar(变异策略)
yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: inject-istio-sidecar
spec:
rules:
- name: inject-sidecar
match:
any:
- resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
spec:
containers:
- name: istio-proxy
image: "istio/proxyv2:1.20.0"
args: ["proxy", "sidecar"]
4. 生成默认NetworkPolicy
yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: default-deny-network
spec:
rules:
- name: generate-networkpolicy
match:
any:
- resources:
kinds:
- Namespace
generate:
kind: NetworkPolicy
name: default-deny
namespace: "{{request.object.metadata.name}}"
data:
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
六、运行时安全:Falco
Falco 是CNCF开源项目,通过内核模块或eBPF监控系统调用和K8s审计日志。
1. 安装Falco(Helm)
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm install falco falcosecurity/falco --set ebpf.enabled=true
2. 默认规则(示例)
-
启动交互式shell(
spawned process with bash in container) -
读取敏感文件(
Read sensitive file) -
出站网络连接(
Unexpected outbound connection) -
挂载敏感路径(
Mounting docker socket)
3. 自定义规则
/etc/falco/falco_rules.local.yaml:
yaml
- rule: Whitelist specific image
desc: Allow only myapp image
condition: container.image.repository != "myregistry.com/myapp"
output: "不安全的镜像 (%container.image)"
priority: WARNING
4. 与Alertmanager集成
Falco支持将告警发送到Slack、HTTP Webhook、Kafka等。配置falco.yaml:
yaml
json_output: true
http_output:
enabled: true
url: "http://alertmanager:9093/api/v1/alerts"
七、准入控制器与动态审计
K8s内置准入控制器包括MutatingAdmissionWebhook和ValidatingAdmissionWebhook。Gatekeeper和Kyverno底层都基于此。
1. 审计日志开启
API Server配置:
text
--audit-log-path=/var/log/audit/k8s-audit.log --audit-log-maxsize=100 --audit-log-maxbackup=10 --audit-policy-file=/etc/kubernetes/audit-policy.yaml
审计策略示例(记录所有请求的元数据):
yaml
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets"]
- level: RequestResponse
verbs: ["create", "update", "delete"]
- level: None
users: ["system:kube-proxy"]
2. 使用Audit2rbac分析权限
# 从审计日志生成RBAC建议
audit2rbac -f /var/log/audit/k8s-audit.log
八、供应链安全与SBOM
1. 生成SBOM(软件物料清单)
使用Syft:
syft myapp:latest -o spdx-json > sbom.json
2. 漏洞数据库
-
Trivy DB:整合NVD、GitHub Security Advisory等。
-
Grype:与Syft配合,扫描SBOM中的漏洞。
3. CI/CD中强制SBOM生成
yaml
- name: Generate SBOM
run: syft $IMAGE -o cyclonedx-json > sbom.json
- name: Upload SBOM
uses: actions/upload-artifact@v3
with:
name: sbom
path: sbom.json
九、合规性自动化(针对等保2.0/PCI)
1. Kube-bench + 自定义配置
编写自定义CIS测试:
kube-bench --config-dir /path/to/custom-cfg
2. 使用OPA生成合规报告
编写Rego规则检查是否符合等保要求(如禁止匿名登录、必须配置资源限制等),然后定期运行opa eval并输出CSV。
3. 定期合规扫描(CronJob)
yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: compliance-scan
spec:
schedule: "0 1 * * 0" # 每周日凌晨1点
jobTemplate:
spec:
template:
spec:
serviceAccountName: scanner
containers:
- name: kubescape
image: kubescape
args: ["scan", "--submit", "--account-id", "xxxx"]
十、生产环境最佳实践
-
最小化基础镜像:使用
distroless或scratch,彻底消除shell和包管理。 -
只读根文件系统:
readOnlyRootFilesystem: true。 -
禁止特权提升:
allowPrivilegeEscalation: false。 -
设置securityContext:
yaml
securityContext: runAsNonRoot: true runAsUser: 1000 capabilities: drop: ["ALL"] -
使用Pod Security Standards(PSS):
yaml
# 命名空间标签 kubectl label ns default pod-security.kubernetes.io/enforce=restricted -
网络策略:默认拒绝所有入站,只开放必要端口。
-
RBAC最小权限:使用
kubectl auth can-i --list验证权限。 -
开启Seccomp:限制系统调用(使用RuntimeDefault或自定义profile)。
-
启用AppArmor/SELinux:增加强制访问控制。
-
定期更新组件:K8s、容器运行时、操作系统内核。
十一、故障排查与常见问题
1. Gatekeeper拒绝创建Pod
# 查看约束状态
kubectl get constraints
# 查看拒绝详情
kubectl describe constraint no-privileged
2. Kyverno策略未生效
-
检查
validationFailureAction是否为Enforce。 -
查看Kyverno Pod日志:
kubectl logs -n kyverno deployment/kyverno
3. Falco发出大量误报
-
调整规则阈值或添加例外(
falco_rules.local.yaml)。 -
使用
--disable-rules禁用特定规则。
4. 镜像扫描发现漏洞但业务必须使用
-
评估漏洞可利用性(CVSS评分、是否有公开POC)。
-
如果无法升级,增加运行时防护(限制网络、Capabilities)。
十二、未来趋势
-
eBPF统一观测与安全:Cilium、Tetragon等实现内核级安全策略。
-
零信任架构(ZTA):SPIFFE/SPIRE为工作负载提供身份,结合Istio做细粒度认证。
-
AI辅助安全:使用LLM分析审计日志,自动生成策略。
-
安全左移到IDE:如Kubescape VSCode插件,编码时即检测。
结语
云原生安全不是单一产品,而是贯穿开发、部署、运行的体系化工程。通过镜像扫描、策略即代码、运行时监控和合规扫描,可以显著降低风险。建议从最关键的几个策略(禁止特权、禁止latest、限制资源)开始,逐步完善。
学习建议:
-
在自己的测试集群中安装Gatekeeper或Kyverno,编写3~5个常用策略。
-
使用kube-bench和Kubescape扫描集群,修复高风险项。
-
搭建Falco,模拟一次容器逃逸攻击,观察告警。
-
阅读K8s官方安全文档(Security Checklist)和CIS Benchmark。
本系列后续预告:GitOps与Argo CD持续交付深度实战。
如果本文对你有帮助,欢迎点赞、收藏、转发!
更多推荐

所有评论(0)