第 12 章 · 安全运维基线
本章目标:为 demo-mall 建立 可审计、可准入 的安全运维基线——RBAC 最小权限、Secret 管理、镜像扫描、NetworkPolicy 与 Pod 安全上下文;全部可在小紫云计算界面配合 YAML 落地。
学时建议:2~2.5 小时(含 1.5 小时跟练)
前置:ops-deploy ch02 Secret 与多环境;ch03 镜像构建;xiaozi-cloud ch06 集群管理。
12.1 场景说明
| 项目 | 内容 |
|---|---|
| 背景 | demo-mall 准备 prod 上线,安全评审列出 7 条「必须修复」:Jenkins 用了 cluster-admin、镜像未扫描、Pod 以 root 运行、Namespace 之间网络全通 |
| 痛点 | 研发图快给 CI 最高权限;运维怕改 NetworkPolicy 把业务拦死 |
| 你的角色 | 运维 / 平台,输出 安全基线清单 并在 staging 验证后再推 prod |
| 本章任务 | 为 Jenkins 建最小 SA;为 demo-api 加 NetworkPolicy;跑镜像漏洞扫描 |
| 约束 | 本章在 staging-app / staging-middleware 跟练;prod 变更需变更单(ch05) |
为什么现在做:等保、甲方审计、Registry 准入都会问同一套问题——早建在 staging 试错,比 prod 事故后补课便宜一个数量级。
12.2 学完你能
| 能力 | 验收标准 |
|---|---|
| 安全基线清单 | 能列出 7 大项并说明 demo-mall 达标方式 |
| RBAC 最小权限 | 为 CI 创建仅 staging 部署权限的 ServiceAccount |
| Pod 安全 | 配置 runAsNonRoot、drop capabilities |
| 网络隔离 | 编写 NetworkPolicy 限制 ingress/egress |
| 镜像供应链 | 解释 Trivy 扫描级别与阻断策略 |
| 密钥轮换 | 说出 DB / JWT / TLS 轮换节奏 |
| 界面操作 | 在小紫云计算 工作负载 YAML 应用安全补丁 |
12.3 安全运维基线清单
| # | 项 | 要求 | demo-mall 落地 |
|---|---|---|---|
| 1 | RBAC | 最小权限,禁止 cluster-admin 日常 CI | Jenkins SA 仅 staging-app |
| 2 | Secret | 不进 Git;定期轮换 | ch02 External Secret / Sealed |
| 3 | 镜像 | 私有 Registry;HIGH 阻断 prod | Trivy in CI(ch03) |
| 4 | 网络 | NetworkPolicy 默认拒绝 | demo-api 仅允许 Ingress + DB |
| 5 | Pod | 非 root;只读根文件系统(尽量) | securityContext |
| 6 | 审计 | apiserver audit log | 平台侧开启 |
| 7 | 入口 | HTTPS + WAF(如有) | Ingress TLS |
12.4 逐步跟练 · RBAC(约 35 分钟)
目标:Jenkins 部署账号 只能 更新 staging-app 的 Deployment,不能读 prod Secret。
步骤:
- 在小紫云计算连接 staging 集群
- 运维 → 工作负载 → 右上角或 YAML 入口,准备应用以下 manifest(可保存为
jenkins-rbac-staging.yaml本地编辑后粘贴)
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-deploy
namespace: devops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: deploy-staging
namespace: staging-app
rules:
- apiGroups: [apps]
resources: [deployments]
verbs: [get, list, watch, update, patch]
- apiGroups: [apps]
resources: [deployments/rollback]
verbs: [create]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: jenkins-deploy-staging
namespace: staging-app
subjects:
- kind: ServiceAccount
name: jenkins-deploy
namespace: devops
roleRef:
kind: Role
name: deploy-staging
apiGroup: rbac.authorization.k8s.io
- 应用后,在 Jenkins 使用该 SA 的 kubeconfig(或 token)试部署 demo-api
你应该看到什么
- staging 部署 成功
- 若用同一凭证操作
prod-app→ Forbidden - 禁止:Jenkins 使用集群管理员 kubeconfig 部署 prod
12.5 逐步跟练 · Pod 安全上下文(约 25 分钟)
在 应用部署 → demo-api → 工作负载 YAML 或 Helm values 中加入:
securityContext:
runAsNonRoot: true
runAsUser: 1000
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
| 例外 | 处理 |
|---|---|
| 必须写 /tmp | 增加 emptyDir 挂载 /tmp |
| 需特权 | 安全评审 + 独立节点池 |
跟练:部署到 staging → 运维 → Pod 调试 确认 Pod Running → 终端 内 id 应非 root。
你应该看到什么:Pod 状态 Running;应用健康检查通过;若崩溃查看 日志管理 是否缺写目录。