公司采购了一套商业BI系统,交付的是Docker镜像+License文件,连Dockerfile都不给。运维小张照着文档跑起来就上线了——结果两周后,镜像里一个没打补丁的Log4j版本被扫出来,攻击者借机拉走了测试库里的脱敏用户数据。
闭源不是免死金牌
很多人觉得:‘代码不公开,别人就挖不到漏洞’。错。闭源只意味着你没法自己审计,但漏洞不会因此消失。更麻烦的是,你连镜像里装了啥、启了啥端口、用了啥基础镜像都得靠供应商一张嘴。某次更新后,镜像突然多开了22端口,SSH服务默认启用,密码还是硬编码在entrypoint脚本里——这种事真发生过。
守住三道门
第一道:镜像来源可信
别直接 docker pull registry.example.com/bi-pro:v3.2.1。先确认是否启用内容信任(Notary)或Cosign签名:
cosign verify --key public.key registry.example.com/bi-pro:v3.2.1没签名?暂停上线,找供应商要带签名的镜像。第二道:运行时最小权限
哪怕镜像是黑盒,也能限制它能干啥。Kubernetes里用SecurityContext强制降权:
securityContext:
runAsNonRoot: true
runAsUser: 1001
capabilities:
drop: ["ALL"]
seccompProfile:
type: RuntimeDefault宿主机上用userns-remap隔离UID,避免容器内root映射到宿主机root。第三道:流量与行为兜底 在Ingress或Service Mesh层加一层策略。比如用Open Policy Agent(OPA)拦截非常规HTTP方法请求:
再配合Falco监控异常进程调用,比如检测到/proc/self/exe被替换或execve调用非白名单路径,立刻告警并kill容器。package k8s.admission
deny[msg] {
input.request.kind.kind == "Pod"
input.request.object.spec.containers[_].ports[_].containerPort == 22
msg := "禁止容器暴露SSH端口"
}
安全不是等漏洞爆了才想起来的事。闭源容器就像租来的精装房——你没法拆墙重布线,但可以换锁、装监控、设门禁。每一步动作,都得落在实处,而不是写在SLA里。