当前位置:首页 > 问答 > 正文

在 Kubernetes 里搞零信任安全,感觉没那么简单但又不得不做的那些事儿

(引用来源:多位一线工程师的实践总结与社区讨论)

这事儿之所以感觉“不简单”,核心在于Kubernetes本身就是一个极其动态、复杂的环境,传统安全那套“筑高墙”的思路在这里基本失灵,你想想,容器像蝗虫一样随时生随时灭,IP地址都是临时的,服务今天在这台机器上明天可能就飘到另一台去了,你根本没法像以前那样,靠固定IP地址来制定防火墙规则,说什么“这个IP段是安全的,可以访问数据库”,这种动态性,是零信任“永不信任,始终验证”原则不得不被提上日程的根本原因,也是第一个让人头疼的地方。

(引用来源:对Kubernetes网络模型和安全挑战的普遍认知)

第一件不得不做但又挺麻烦的事儿,就是给每个Pod(也就是运行服务的那个小单元)加上一个牢靠的“身份证”,这通常是通过叫“服务账户”(ServiceAccount)的东西和与之绑定的令牌来实现的,理想很丰满,让每个服务都用自己独特的身份去访问其他服务,这样审计和权限控制都能精确到个体,但现实是,配置和管理这些身份很琐碎,你得创建一堆服务账户,确保每个Deployment或StatefulSet都正确引用了它,还要担心令牌会不会被不当泄露,更头疼的是,很多遗留应用或者直接从虚拟机迁移过来的应用,根本不懂怎么主动携带这个Kubernetes身份去认证,改造起来又是一堆工作量,感觉就像要给几万个随时在移动的物体发身份证,还得教它们出门主动出示,想想就头大。

(引用来源:Istio、Linkerd等服务网格项目的安全文档及用户反馈)

第二件更复杂的事,是制定和执行网络访问规则,光有身份还不行,你得明确规定“谁”在“什么条件下”可以访问“哪个”服务,Kubernetes原生的NetworkPolicy能做一些简单的基于标签的规则,带标签app=frontend的Pod可以访问带标签app=backend的Pod的80端口”,但稍微复杂点的需求,只能通过POST方法访问API的/v1/user路径”,原生能力就抓瞎了,所以大家不得不去寻求更高级的工具,比如服务网格(Service Mesh),像Istio里的AuthorizationPolicy,这东西功能是强大了,但学习成本和配置复杂度也指数级上升,YAML文件写得人头晕眼花,策略一多,自己都理不清到底允许了啥拒绝了啥,有时候一条策略没写好,可能就把某个关键服务给断掉了,排查起来如同大海捞针,这种精细化的控制是零信任的核心,但维护它真的需要极大的细心和耐心。

(引用来源:安全扫描工具Trivy、Falco等的应用场景描述)

第三,镜像安全是个躲不开的坑,零信任要求对工作负载本身也不能信任,你用的基础镜像是不是来自可信的仓库?里面有没有包含已知的漏洞?容器运行时有没有异常行为?一个本来只应该读数据的容器,突然尝试执行了shell命令,这很可能就是被入侵的迹象,你不得不搭建一整套流水线,在镜像构建时用Trivy这类工具扫漏洞,在部署时用准入控制器(Admission Controller)检查镜像签名,确保不是随便什么人都能往集群里塞个镜像,运行时还得部署Falco这样的工具来监控异常行为,每一步都是额外的环节,都需要工具链的支持和规则的调优,漏洞数据库天天更新,你得不断跟进,决定哪些漏洞必须马上修,哪些可以暂时风险接受,这个过程非常耗费精力。

(引用来源:SPIFFE/SPIRE项目背景及Secret管理工具如Vault的实践)

第四,秘密管理(Secrets Management)是另一个痛点,应用总需要连接数据库、调用第三方API,这些都需要密码、密钥之类的敏感信息,零信任环境下,你不能把这些秘密明文写在配置文件里,甚至Kubernetes自带的Secret资源(只是base64编码)也觉得不够安全,你不得不引入外部的专业秘密管理工具,比如HashiCorp Vault,这意味着集群里又要部署一套复杂的Vault组件,或者让应用学会动态地从Vault去申请和轮转秘密,应用代码要做相应的改造,还要处理好Vault本身的高可用和认证问题,本来简单的配置,现在变得迂回曲折,一切都是为了那个“不信任”的前提。

(引用来源:对零信任架构“纵深防御”理念的解读)

所有这些事情叠加起来,带来的是一种“体系性”的复杂,零信任不是单一工具能解决的,它是一套组合拳,涉及身份、网络、工作负载、数据等多个层面,你需要集成多种工具,这些工具之间可能还需要协作,服务网格的身份可能需要和秘密管理工具打通,整个系统的可观测性变得至关重要,因为安全策略阻断了访问,你必须有清晰的日志告诉你“谁”在“什么时候”因为“什么规则”被拒绝了,否则出了问题根本无法排查,这要求运维、开发、安全团队紧密协作,改变传统的工作流程,这个组织和文化上的转变,往往比技术实施本身更难。

在Kubernetes里搞零信任,感觉就是“自找麻烦”,但你又不得不找这个麻烦,因为不这么做,在那个高度动态和复杂的环境里,安全防线简直形同虚设,每一次Pod的创建,每一次服务间的调用,都可能成为攻击的入口,尽管过程充满挑战,充满了各种“不简单”的事儿,但为了守住底线,再麻烦也得硬着头皮做下去,这大概就是云原生时代安全的宿命。

在 Kubernetes 里搞零信任安全,感觉没那么简单但又不得不做的那些事儿