华为云 CCE 容器集群生产环境安全加固实战指南

举报
yd_243668775 发表于 2026/11/14 08:14:30 2026/11/14
【摘要】 一、为什么需要对 CCE 集群做安全加固华为云 CCE(云容器引擎)开箱即用,默认配置优先保证易用性。但在生产环境中,默认配置往往存在安全隐患:Pod 间网络无隔离、容器以 root 运行、镜像来源未校验、RBAC 权限过大等。本文基于一次真实生产环境加固经历,总结出六个关键加固项,覆盖网络、容器、镜像、权限、审计五个层面,供大家参考。二、加固项一:Pod 间网络隔离(NetworkPoli...

一、为什么需要对 CCE 集群做安全加固

华为云 CCE(云容器引擎)开箱即用,默认配置优先保证易用性。但在生产环境中,默认配置往往存在安全隐患:Pod 间网络无隔离、容器以 root 运行、镜像来源未校验、RBAC 权限过大等。

本文基于一次真实生产环境加固经历,总结出六个关键加固项,覆盖网络、容器、镜像、权限、审计五个层面,供大家参考。


二、加固项一:Pod 间网络隔离(NetworkPolicy)

默认情况下,CCE 集群内所有 Pod 可以互相访问。生产环境中,前端服务不应该直接访问数据库 Pod。

操作方式: 启用 NetworkPolicy 插件后,通过声明式策略限制访问。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-isolate
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: backend
      ports:
        - protocol: TCP
          port: 5432

这段策略的含义:仅允许 app=backend 的 Pod 访问 app=postgres 的 5432 端口,其他所有入站流量被拒绝。

注意事项: NetworkPolicy 是默认拒绝模型——一旦对某个 Pod 创建了策略,没有显式允许的流量全部被阻断。建议先在测试命名空间验证,再推到生产。


三、加固项二:禁止容器以 root 用户运行

很多基础镜像默认以 root 启动容器进程。如果容器被攻破,攻击者直接获得 root 权限,可能逃逸到宿主机。

操作方式: 在 Deployment 中设置 securityContext。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
        - name: backend
          image: my-registry/backend:v2.1.0
          securityContext:
            runAsNonRoot: true
            runAsUser: 1000
            readOnlyRootFilesystem: true
            allowPrivilegeEscalation: false
          ports:
            - containerPort: 8080

四个字段的含义:

  • runAsNonRoot: true — 强制以非 root 用户运行,如果镜像指定了 USER 0 会直接启动失败
  • runAsUser: 1000 — 指定 UID 为 1000
  • readOnlyRootFilesystem: true — 根文件系统只读,防止恶意写入
  • allowPrivilegeEscalation: false — 禁止子进程提权

踩坑提醒: readOnlyRootFilesystem: true 开启后,应用如果往 /tmp 写临时文件会报错。解决方式是挂载一个 emptyDir 到 /tmp:

          volumeMounts:
            - name: tmp
              mountPath: /tmp
      volumes:
        - name: tmp
          emptyDir: {}

四、加固项三:镜像来源管控与漏洞扫描

生产环境绝不应该直接拉取公网未知镜像。建议搭建私有镜像仓库,所有镜像经过扫描后才允许部署。

华为云 SWR(容器镜像服务) 提供了镜像漏洞扫描能力。加固流程如下:

  1. 开发人员推送镜像到 SWR 私有组织
  2. CI 流水线触发 SWR 漏洞扫描
  3. 扫描结果中存在高危漏洞则阻断部署
  4. 通过准入检查的镜像打上 verified 标签
  5. 集群中通过准入控制器(Admission Controller)拒绝未带 verified 标签的镜像

准入控制器示例策略(用 OPA Gatekeeper):

apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: require-verified-image
spec:
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package requireverifiedimage
        violation[{"msg": msg}] {
          container := input.review.object.spec.containers[_]
          not contains(container.image, ":verified")
          msg := sprintf("镜像 %v 未通过安全扫描,禁止部署", [container.image])
        }

五、加固项四:收紧 RBAC 权限

CCE 默认会给集群管理员绑定 cluster-admin 角色,这在生产环境中过于宽泛。加固原则:最小权限 + 按命名空间隔离。

为开发团队创建受限 Role:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer-role
  namespace: production
rules:
  - apiGroups: [""]
    resources: ["pods", "pods/log", "services", "configmaps"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["apps"]
    resources: ["deployments"]
    verbs: ["get", "list", "watch", "update", "patch"]

这个 Role 只允许在 production 命名空间内查看 Pod 日志、更新 Deployment,不能删除资源、不能操作其他命名空间、不能管理集群级资源。

绑定到开发组:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: developer-binding
  namespace: production
subjects:
  - kind: Group
    name: dev-team
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer-role
  apiGroup: rbac.authorization.k8s.io

六、加固项五:启用审计日志

审计日志记录"谁在什么时间对什么资源做了什么操作",是事后追责和安全合规的基础。

在 CCE 控制台启用审计日志:

进入 CCE 集群详情页,在「集群配置 → 参数配置」中开启 audit-log 参数,日志会输出到集群节点的 /var/log/host/audit/ 目录。

建议配合华为云 AOM(应用运维管理)将审计日志采集到 LTS(日志服务),设置告警规则,对以下高危操作实时告警:

  • delete 命名空间
  • create privileged Pod
  • escalate 或 bind RBAC 权限
  • 修改 kube-system 命名空间下的资源

七、加固项六:节点安全组收敛

CCE 创建集群时会自动生成安全组,默认规则有时过于宽松。加固建议:


方向 端口 来源 用途
入站 30000-32767 仅 VPC 内网 NodePort 范围
入站 10250 仅集群节点内网 kubelet
入站 443 仅 ELB 后端地址 Ingress 流量
出站 全部 全部 容器拉镜像等

关键原则:入站规则尽量收敛到内网,不要对公网开放节点端口。 外部流量统一走 ELB → Ingress 的路径。


八、加固效果验证

加固完成后,建议做一轮验证:

  1. 网络隔离验证: 在一个非 backend Pod 中尝试 curl postgres:5432,应被拒绝
  2. 非 root 验证: kubectl exec 进入容器执行 id,应显示 uid=1000
  3. RBAC 验证: 用开发组账号尝试 kubectl delete pod,应返回 Forbidden
  4. 审计日志验证: 执行一次部署操作,在 LTS 中能查到对应审计记录

九、总结

CCE 集群安全加固不是一次性工作,而是贯穿集群全生命周期的持续过程。本文涉及的六个加固项可以作为一个 checklist:

  1. ✅ Pod 间网络隔离
  2. ✅ 禁止 root 运行 + 只读根文件系统
  3. ✅ 镜像来源管控与漏洞扫描
  4. ✅ RBAC 最小权限
  5. ✅ 审计日志开启
  6. ✅ 节点安全组收敛

实际生产中还可以进一步考虑:Pod 安全标准(Pod Security Standards)、密钥管理用华为云 DEW 替代明文 Secret、节点定期漏洞修复等。安全没有终点,持续改进才是正道。

希望这篇实战指南对大家有帮助,欢迎在评论区交流你们的加固经验。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。