前言

        在前几期,我们构建了从容器化到微服务、数据库治理的完整云原生栈。然而,随着架构演进,安全合规成为企业上云的最后一道红线。云原生环境带来了动态、短暂、分布式的特性,传统防火墙和静态扫描已无法满足需求。本文将系统讲解云原生安全体系,涵盖镜像安全(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准入验证:结合ConnaisseurPolicy 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内置准入控制器包括MutatingAdmissionWebhookValidatingAdmissionWebhook。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"]

十、生产环境最佳实践

  1. 最小化基础镜像:使用distrolessscratch,彻底消除shell和包管理。

  2. 只读根文件系统readOnlyRootFilesystem: true

  3. 禁止特权提升allowPrivilegeEscalation: false

  4. 设置securityContext

    yaml

    securityContext:
      runAsNonRoot: true
      runAsUser: 1000
      capabilities:
        drop: ["ALL"]

  5. 使用Pod Security Standards(PSS)

    yaml

    # 命名空间标签
    kubectl label ns default pod-security.kubernetes.io/enforce=restricted

  6. 网络策略:默认拒绝所有入站,只开放必要端口。

  7. RBAC最小权限:使用kubectl auth can-i --list验证权限。

  8. 开启Seccomp:限制系统调用(使用RuntimeDefault或自定义profile)。

  9. 启用AppArmor/SELinux:增加强制访问控制。

  10. 定期更新组件: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、限制资源)开始,逐步完善。

学习建议

  1. 在自己的测试集群中安装Gatekeeper或Kyverno,编写3~5个常用策略。

  2. 使用kube-bench和Kubescape扫描集群,修复高风险项。

  3. 搭建Falco,模拟一次容器逃逸攻击,观察告警。

  4. 阅读K8s官方安全文档(Security Checklist)和CIS Benchmark。

本系列后续预告:GitOps与Argo CD持续交付深度实战。
如果本文对你有帮助,欢迎点赞、收藏、转发

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐