容器必须降权运行、禁挂敏感路径、启用镜像签名、实施默认拒绝网络策略。具体包括:Dockerfile设USER 1001,K8s配runAsNonRoot;禁止挂载/proc、/sys等;开启DOCKER_CONTENT_TRUST;NetworkPolicy显式定义ingress/egress并覆盖全Pod。
容器运行时权限必须降为非 root
绝大多数容器默认以
身份启动,一旦镜像或应用存在漏洞,攻击者能直接获得宿主机级权限。这不是理论风险——
进去就能验证权限是否真被限制。
实操建议:
在
中显式声明
(非 0 的 UID),并确保该用户对所需目录有读写权限
Kubernetes 场景下,必须设置
和
避免用
或
覆盖配置,某些基础镜像(如
)默认没创建非 root 用户,得自己
注意:Java 应用若绑定
端口,不能靠降权解决——改用
,别在容器里开
禁止挂载敏感宿主机路径
、
、
这类路径一旦挂进容器,等于把宿主机控制权交出去。常见错误是调试时随手加
,结果 CI 容器能拉取并运行任意镜像。
实操建议:
检查所有
命令和
,删除任何指向
、
、
的挂载
确需访问宿主机信息(如获取节点 IP),优先用 downward API 或
,而非挂载
Kubernetes 中启用
(旧版)或
(1.25+),限制
类型为
且路径白名单化
注意:
挂载也要谨慎——
可能被误读为块设备,
除外
镜像必须启用内容信任与签名验证
不验签的镜像等于盲装二进制包。Docker Hub 上大量流行镜像(如
)虽官方维护,但中间传输链路未加密,MITM 攻击可替换层数据。错误现象是:
成功,但实际拉下的镜像哈希与官网文档不符。
CentOS Linux 7.9.2009
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
下载
实操建议:
启用 Docker 内容信任:
,此后所有
、
强制校验签名
私有 Registry(如 Harbor)必须开启
或集成 Cosign,推送前用
签名,拉取时用
CI 流水线中禁止使用
,改用带 digest 的固定版本:
注意:
不影响镜像签名有效性,但
进来的镜像默认无签名,需重新 sign
网络策略必须默认拒绝,按需放行
默认允许所有容器间通信是最大误区。一个被攻破的
容器能直接扫描同 namespace 下的
端口,只因没设网络隔离。错误日志里常看到
是好事,
才危险——说明连接发出去了但没回包,可能已被防火墙丢弃或目标端口开放。
实操建议:
Kubernetes 中禁用
的 NetworkPolicy 无效,必须显式创建一条匹配全部 Pod 的
+
规则
用
或
部署策略时,确认
包含
,否则只生效入向
避免用
放行整个
,应精确到服务 ClusterIP 或 endpoint IP;出向 DNS 必须显式允许
,否则
会卡住
注意:
的 Pod 完全绕过 NetworkPolicy,这类 Pod 必须单独加固或隔离到专用节点
真正难的不是配几条规则,而是持续发现隐性依赖——比如某业务突然连不上数据库,查半天发现是新上线的 NetworkPolicy 拦了健康检查探针的源端口范围。自动化策略生成工具容易漏掉这种动态端口,得靠 eBPF 工具(如 Cilium CLI)实时抓包验证。
rootdocker exec -u 0DockerfileUSER 1001securityContext.runAsNonRoot: truesecurityContext.runAsUser: 1001user: "root"user: "0"alpine:latestadduser808080setcap 'cap_net_bind_service=+ep' /usr/bin/java/proc/sys/var/run/docker.sock-v /var/run/docker.sock:/var/run/docker.sockdocker runvolumeMounts/proc/sys/fs/cgroup/etc/shadowhostNetwork: true/proc/sys/netPodSecurityPolicyPodSecurity AdmissionhostPathreadOnly/dev/dev/sda/dev/nullnode:18docker pull nginx:alpineexport DOCKER_CONTENT_TRUST=1pullpushnotarycosign signcosign verifyFROM ubuntu:latestFROM ubuntu@sha256:abc123...docker build --no-cachedocker loadredisetcdConnection refusedtimeoutdefault-denyegress: []ingress: []calicoctlkubectl apply -fpolicyTypes["Ingress", "Egress"]ipBlock10.0.0.0/8port: 53curl google.comhostNetwork: true