在传统的研发中,我们经常关注的安全有数据安全、代码安全、机器(运行环境)安全、网络运维安全,而云原生时代的到来,如果还是按几个维度切分的话,显然容易忽略很多云原生环境引入的新的挑战,我们需要基于网络安全最佳实践——纵深防御原则,来逐步剖析云原生的安全,并且对不同层次的防御手段有一定的了解,最重要的是建立自己云原生安全的理念,真正搭建一个内核安全的云原生系统。

注:纵深防御指在计算机系统中的多个层面使用多种网络安全技术,从而减少攻击者利用关键业务资源或信息泄露到系统外部的总体可能性。在消息传递和协作环境中,纵深防御体系可以确保恶意攻击活动被阻止在基础结构内的多个检查点,降低了威胁进入内部网络的可能性。
对于这里安全模型的每一层,都是单向依赖于外层的。也就是说,外层的云、集群、容器安全如果做得好,代码层的安全就可以受益,而反过来,我们是无法通过提高代码层的安全性来弥补外层中存在的安全漏洞或问题。
基于上述这一点原理,我们的纵深防御策略是「自外而内」地进行“设防”。
一、云/数据中心/网络层安全
这一层也可以称之为基础设施安全,不管从何角度,公有或私有云或企业数据中心以及对应的网络安全,是K8s集群最根本的安全基础,如果这一层存在安全漏洞或者过于脆弱,则整个系统都不能在此基础上保证组件的安全。我们除了需要防御传统的攻击,如ARP伪装、DDOS、网络层各类报文等攻击,还应该针对Kubernetes集群采取以下保护措施:
- 不允许在 Internet 上公开对 Kubernetes 管理平台(Control Plane)的所有访问,同时仅开放部分可信 IP 可以访问 Kubernetes 管理 API;
- 根据 Rule-BAC(基于规则访问控制),只暴露指定的端口,包括对管理平台的内部端口和来自 NodePort 和 LoadBalancer 类型的 Kubernetes 服务的连接,并且不暴露到 Internet;
- 所有计算节点施行网络分层规则,通过云提供商或机房的网络层安全组(例如 AWS 的 Security Group)对管理平台以及节点授予最小权限控制,能够在最大程度上,减少黑客产生的危害,也就保护了数据的安全性。

- 对 etcd(Kubernetes的基础存储)的访问进行严格控制(仅允许来自集群管理平台的访问),应强制所有连接都使用TLS,并确保所有信息都是在持久化层被加密的(Encryption at rest);
- 审计报警系统针对每个平台的访问信息进行实时过滤分析,如发现非授权访问,第一时间通知安全管理人员,并跟踪处理。例如:当黑客进入内网后,往往会进行数据“挖掘“,这些非常规操作区别于常规员工操作。
- 堡垒机针对 Linux 服务器访问控制,并开启密码策略,同时收集并分析访问、事件、进程等日志,使用堡垒机进行访问控制。
- 办公网络接入和机房网络接入仅需要增加身份认证。如 Wi-Fi 接入,VPN 接入绑定 OIDC 认证。
二、集群层
保护 Kubernetes 集群有两个主体需要关注:
- 集群与组件
- 运行的服务或应用
针对这两个主体的保护,应该实现最小权限管理原则,并由专门安全工程师进行权限管理。我们的保护可以分为 4 大块:管理API的访问控制、Kubelet 的访问控制、Runtime(运行时)工作负载或用户功能的访问控制、集群组件的安全漏洞防护,如下图所示。

- 管理 API 的访问控制
a. 强制 TLS 保护传输层
b. 强制 API 认证
c. 强制API授权机制(RBAC)
d. 限制API访问源(PBAC) - Kubelet 的访问控制
a. 生产环境启用身份验证
b. 身份授权(RBAC)
c. 强制 TLS 保护传输层 - Runtime(运行时)工作负载或用户功能的访问控制
a. 限制使用特权容器
b. 合理限制资源负载
c. 防止加载非必要内核模块
d. 限制 Pod 越权访问其他节点
e. 基础数据凭证的访问控制 - 集群组件的安全漏洞防护
a. 禁止未授权访问 etcd
b. 启用审核日志记录
c. 定期轮换基础架构凭证
d. 定期升级修复漏洞
三、容器层
到了这一层,由于跟 Kubernetes 特性不是强相关,我们能提供一些通用的安全措施和建议:

四、代码层
程序代码层是最容易受攻击,但也是最可控的部分之一。虽然一般负责这块安全的人员不一定是运维开发(DevOps),可能是专门的安全工程师(Sec Eng),但有一些基本共性理念和建议是可以互相借鉴的。

小结
总的来说,安全的本质是数据被合理使用。云原生时代的这四层架构:云/数据中心/网络层、集群层、容器层、代码层,与传统架构比起来更加细化和更易受攻击,自外而内地践行每一层的安全最佳实践,我们的纵深防御才能算是成功的,每个在云原生技术上想长期获益的团队需要对此有共识。安全体系的建立可以参考主流安全框架如 ISO27001 或国家等级保护三级等,所有的安全措施都不能保证100%安全,但是1%的安全故障会造成100%的危害。所以安全体系建立是一个长期的过程,持续更新改进的过程,需要公司从上至下的进行管理和推动。这里给大家在搭建安全体系的意见是:先快再好。最先选择最容易部署和实施的安全模块,如WAF、防火墙、身份认证等安全工具,再继续深入、逐步完善。