云原生|容器和应用安全运营实践思考-程序员宅基地

技术标签: kubernetes  java  网络  分布式  docker  

文| 腾讯“洋葱”入侵对抗团队

bghost

前言

随着云计算的蓬勃发展,云原生概念被提出并快速发展,公司内部也在推进使用云原生技术进行架构优化,研发模式和基础设施都发生了很大的变化,新的k8s和容器技术正逐步取代传统的物理机和虚拟机。

我们发现,在云原生架构的演变过程中也带来了一些新的风险和挑战,腾讯蓝军《红蓝对抗中的云原生漏洞挖掘及利用实录》一文中从攻击者视角详细介绍了云原生架构下的风险点,包括容器网络安全、容器逃逸、容器/K8S配置安全、容器镜像安全、Serverless安全、DevOps安全等多个方面,对以上详细细节感兴趣的可以在附录查看原文章。

为保障业务上云安全,安全建设也要顺应云原生的发展,一方面是安全系统的研发部署要用拥抱云原生,此前腾讯自研的HIDS/EDR“洋葱”也有分享一些经验(见附录),另一方面是安全运营要分析解决新的安全风险。

本文从安全攻击面出发,以防御视角分享我们在云原生安全运营上的一些实践和思考,欢迎大家交流探讨。

云原生安全

先简单说明下云原生的概念,云原生概念最早是在2013年由 Pivotal 公司的 Matt Stine 提出的,2015年Google主导成立CNCF(云原生计算基金会)也定义了云原生。对于云原生,不同组织有不同的理解,不同时间定义不同,时至今日比较主流的还是Pivotal 和 CNCF。

Pivotal提出的云原生的4个要点:DevOps、持续交付、微服务、容器;CNCF(云原生计算基金会)提出云原生的关键技术: 容器、服务网络、微服务、不可变基础设施和声明式API。

云原生安全建设工作也是围绕这些核心元素展开,可以简单的分为基础安全、K8S/容器安全、云原生应用安全和DevSecOps。

其中基础安全主要还是底层设备/云环境的一些传统的基础安全防护,包括虚拟化安全、DDoS防护、主机安全、网络安全等,DevSecOps此前已发过一些文章(附录),本文重点介绍在k8s、容器、应用层云原生安全方向的一些安全运营建设思考。

云原生应用安全

云原生应用层涉及面广,在安全建设中结合攻击矩阵和内部业务面临的一些实际风险(基于内部蓝军演练)梳理出一些高风险点优先建设,主要聚焦在微服务安全、Serverless安全和API网关安全。

3.1微服务安全

利用高危服务入侵是网络攻击中最简单常见的一种方法,尤其是在内网隔离措施和安全意识没有外网严格的地方更容易被攻击。

云原生架构的基础是K8S和容器,业务以微服务形式部署,服务安全相较于传统环境更加重要。我们通过服务扫描、服务隔离、服务清理、服务认证鉴权来做容器环境的服务治理。

微服务架构示意图:

 3.1.1 服务扫描 

和传统IDC网络一样,在内外网分别部署扫描节点,通过对端口进行连接和探测发现高危服务,这里主要通过腾讯自研的漏洞检测系统“洞犀”来实现,和传统扫描的区别是需要对K8S overlay网络环境做一些改造适配。K8S pod网络简单可以分为两类:

1)pod网络和底层网络可以直接通信,pod占一个独立内网ip,和底层节点在同一个网络平面;

2)pod网络在overlay,pod使用私有ip,默认只能在集群内互相通信。k8s开放支持了CNI网络接口以实现不同的overlay网络通信方案,目前流行的CNI插件有Flannel、Calico、Weave和Canal等。

对于pod在overlay的这种场景传统扫描器无法触达,改造方案计划是在不同TKE集群内设置扫描节点来解决,高危服务的扫描会发送安全工单,业务收到安全工单及时修复即可。

 3.1.2 服务隔离 

无状态的服务在pod重启后IP会动态变化,基于IP的ACL策略不再有效,K8S自身提供了network policy机制来实现网络隔离,可以支持按namespace或pod纬度来制定三层/四层的不同级别的隔离策略,网络策略配置可参考:

https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/

目前业界也有一些容器安全产品中加入了pod隔离功能简化业务配置,有个小问题就是并不是所有的K8S CNI网络插件都支持network policy策略(支持的插件列表:

https://kubernetes.io/docs/concepts/cluster-administration/addons/#networking-and-network-policy

服务隔离最大的难点是在运营落地,实施隔离需要卷入业务参与避免影响到业务稳定性,这会增加业务的运维和管理成本,业务的意愿性不强,在实际运营中需要对业务做分类分级,按业务特性、分类和安全等级分别执行不同的安全标准和运营策略。

 3.1.3 服务最小化 

按照微服务的理念在一个pod中只运行单一的服务,这种理念符合安全中的最小化原则,但在实际生产中有些业务的部署模式并不是很云原生。

把容器当虚拟机用,在制作构建业务镜像时有时候会打入一些非业务服务,引入了不必要的安全风险,需要清理掉不需要的服务和组件,至少要删除掉高危服务。

比如删除掉SSH服务就彻底杜绝了SSH密码爆破或密码泄露的安全风险,高危服务我们梳理了一个清单并加入到安全规范,并在基础镜像、业务镜像构建阶段建设检测和管控措施推动风险的收敛。

 3.1.4 认证授权 

微服务架构下内网服务之间的通讯十分复杂,也增加了安全建设的成本,服务网格技术很好的解决了该问题,服务网格将应用程序的网络通信部分剥离出来作为一个sidecar独立运行,所有应用程序的通信都经过sidecar代理,由服务网格做路由控制和网络管理。

基于服务网格可以把服务间的通信统一的管控起来,以istio为例,下图是服务网格 istio的安全架构,实现了统一的身份认证和访问控制,istio的身份认证是CNCF项目中spiffe安全框架的的一个实现,spiffe(Secure Production Identity Framework For Everyone)是一套安全标准,在官方文档中除了istio还有Consul、Kuma也实现了这个安全标准,istio的访问控制通过配置rbac策略实现。

由于目前服务网格技术还没有形成类似k8s大一统的局面,各个云都有推出自己的Mesh,业务侧也有一些自研的Mesh方案,服务网格技术目前还处在发展中,基于服务网格做安全认证授权的落地方案还需要持续摸索。

3.2 Serverless安全

Serverless作为云原生的一个重要技术,安全自然也是非常重要,腾讯云也有提供Serverless平台服务——SCF。对于用户运行和部署代码无需服务器,按需付费,Serverless模式下的安全问题分为两类:平台安全和应用自身的安全。

 3.2.1 平台安全 

平台上租户购买Serverless服务跑恶意代码或尝试攻击的行为非常常见,平台存在漏洞可能会导致跨租户攻击或资源消耗类问题,安全上主要通过租户资源隔离、环境重置和主机安全检测等机制来解决。由于这里的攻击/作恶成本很低,需要联合云平台做治理和打击方案。

 3.2.2 应用安全

Serverless应用也存在安全漏洞的问题。由于Serverless应用的生命周期很短,安全扫描和检测机制存在一定延时,可能还没触发安全扫描应用所在的环境已经被销毁重制了。

基于这个特性运行时应用自我保护(RASP,Runtime Application Self-Protection)是一个比较合适的解决方案,RASP随应用程序启动而启动,且具备应用层实时安全检测和安全阻断的能力,运营难点在于不是通用方案,需要对不同语言和不同版本开发维护多个安全组件,由于侵入性强,配置上也需要能够支持定制化场景满足不同类型的业务需求。

3.3 API网关安全

API网关接管了南北向流量,方便前端调用管理复杂的后端服务。在安全上API网关产品一般都会自带提供认证加密、访问控制的安全能力,安全团队主要是解决安全防护的问题,其中基础安全中比较重要的就是WAF。腾讯自研的WAF“门神”已经在开始支持API的安全防护。

为了方便业务接入WAF,安全运营上需要有一些便捷的方式,目前我们是有两个实践:

1)APIGW + 负载均衡(腾讯内部是CLB/TGW)架构,我们在负载均衡产品上统一实现WAF接入

2)APIGW + SCF架构,这种架构目前主要是内网业务在用,内网业务会经过公司的办公网关,我们将WAF前置到APIGW之前,和办公网关联动实现了统一接入。在内网接入上需要注意的防护的误杀,建议是先接入流量旁路观察并提供一些配置接口给到业务自定义。

容器安全

云原生架构下基础运行环境从物理机/虚拟机变成了容器,容器安全建设有一些新的领域,也有一些领域是可以基于传统安全系统更新迭代解决的,外界有一些说法是传统安全产品完全不适用容器,笔者认为是有点夸大了,以下是我们在容器安全建设中遇到的一些问题和实践思考。

4.1 容器资产管理

在传统架构下通过CMDB做资产管理,云原生架构下最小管理单元不再是物理机和CVM,变成pod和容器,安全扫描、安全修复和安全应急都依赖资产信息(节点IP、容器名、容器id、负责人等),资产信息不全可能会导致安全事件无法排查原因和修复。

为了区分不同的资源类型(物理机、CVM和容器),我们在公司内发布了“虚拟资源管理注册规范”,从而保证资产信息的准确录入,对于容器资产如果支持录入CMDB的会要求容器平台直接录入,不能支持的会要求容器平台同步到安全服务中心(腾讯内部的SOC),SOC提供统一的接口便于各个安全系统查询使用。

4.2 集群安全配置

腾讯内部业务主要是部署在TKEx平台上,TKEx的底层是k8S, k8s安全配置业界有一些安全标准,比较公认的是CIS(互联网安全中心)发布的安全基准: 

https://www.cisecurity.org/benchmark/kubernetes/

前段时间NSA(美国国家安全局)也发布了一个k8s加固指南:

英文版:"Kubernetes Hardening Guidance"

https://media.defense.gov/2021/Aug/03/2002820425/-1/-1/1/CTR_KUBERNETES%20HARDENING%20GUIDANCE.PDF

中文版:《Kubernetes 加固指南》中文版

https://jimmysong.io/kubernetes-hardening-guidance/

由于这些指南内容较长且有一定的学习成本,为方便公司业务快速发现和收敛高风险问题,结合腾讯蓝军的攻防实践经验和腾讯安全应急响应中心(TSRC)处置过的真实安全案例,总结了四类高风险场景优先推动修复,具体包括:

1)会导致信息泄漏或权限控制的k8s/docker端口服务

2)会导致逃逸提权的配置不当

3)会导致getshell或信息泄漏的高危漏洞

4)节点未安装HIDS“洋葱”

接下来就是推动风险收敛,在运营上我们把安全作为云原生成熟度的一个子指标,和资源利用、研发效能工作一同推进;

同时需要控制增量风险的收敛——开启PSP策略,PodSecurityPolicy(简称PSP)可以配置定义一些安全参数来限制pod启动,只有pod满足配置安全参数才会被启动,PSP支持的配置项包括 特权容器、目录映射等

详见:

https://kubernetes.io/docs/concepts/policy/pod-security-policy/?spm=a2c4g.11186623.2.14.703c8b7fMCIbrz 

通过开启PSP策略可以解决多项配置不当风险。需要注意的是PodSecurityPolicy 在Kubernetes v1.21版本中被弃用,将在v1.25中删除,需要关注下k8s后续的替代方案。

4.3 容器镜像安全

公司在传统物理机和CVM上OS都是统一管控的TLinux,安全性较高。而容器是基于镜像构建的,公网上有很多公共镜像,这些从公网下载的镜像如果被植入了恶意代码或者是包含了不安全的组件会直接影响到现网业务,由于镜像的复用性甚至会产生规模性的影响。

在保障容器镜像安全上可以在镜像仓库和发布两个方面做安全加固:

1)搭建内部安全的镜像仓库,控制和管理基础镜像,各个镜像仓库维护一批可信的基础镜像,仅允许在这批镜像上构建业务镜像,并对仓库的镜像做持续安全扫描,主要扫描项有:安全漏洞、恶意文件、敏感信息和安全基线配置。

2)流水线安全扫描:在业务发布镜像的过程中做安全扫描和管控,安全扫描插件和镜像构建插件集成到一起,减少业务接入成本并实现默认安全。

4.4 容器运行时安全

入侵检测是容器运行时安全的重要安全手段。在传统架构下,我们通过HIDS“洋葱”来解决服务器的入侵检测问题。

在容器环境下需要采集容器内的数据做安全分析,架构上我们还是基于HIDS实现容器的数据采集,支持容器环境的webshell、反弹shell和异常进程检测等多种安全功能,用一套HIDS的好处是可以减少业务团队的成本,业务无需做任何改造或安装其他系统。

在容器镜像上支持传统的tlinux/centos/ubuntu镜像,也支持alpine这类轻量容器。

4.5 容器登录管理

安全上建议“去console运维”不登录容器,实际情况还是会存在业务有登录的需求,需要有安全方案,先看一下几种容器登录通道:

1)容器内部署sshd服务,业务把容器当作虚拟机用通过SSH登录容器做运维,这种模式不符合云原生架构的理念,且sshd服务通过密码登录存在非常大的安全风险(密码被爆破或口令泄漏),此类登录方式安全上不推荐,建议删除容器的sshd服务。

2)先登录到容器node节点再docker exec进入容器,由于一个节点上会运行多个容器,同一个节点上的容器可能并不属于同一个负责人,这种模式会存在权限分配过大的问题。

3)通过k8s的webconsole或kubectl客户端登录。这种模式也存在权限管理的问题,有些业务是按照业务粒度做授权,会导致权限分配过大的问题。

基于这些权限管理问题我们研发了服务器权限管理系统“铁将军”,集中管理公司服务器/容器资产的账号和权限,按资产粒度细粒度授权,实现权限最小化分配,并支持操作审计能力。

4.6 容器网络安全

流量检测是解决网络安全问题的常用方案,可以通过IDS做安全检测和防护,在云原生架构下IDS的一个难点是抓取容器东西向的流量通信,我们通过“洋葱”在node节点采集容器的东西向四层通信流量做了一些安全检测,主机检测的难点是需要控制资源消耗避免影响业务,在数据采集的丰富度和IDS还是有一些差距。

除此之外服务网格也带来了一些新的内网流量采集方式,以istio服务网格为例详细说明下。下图是istio提供了一个bookinfo示例,productpage 、reviews、ratings、details是不同的微服务。

我们把productpage访问reviews的东西向流量镜像一份到测试容器Nginx,这里需要配置一个VirtualService,VirtualService在istio中负责流量路由转发,在VirtualService配置中加以下几行代码实现流量镜像。

镜像到的数据如下:

跟原始数据相比,除了HTTP协议头中的host和x-forwarded-for值不同,其他都一样,host字段在原数据上加了一个“-shadow”后缀。不过在istio的官方文档中,VirturalService当前支持对 http,tls,tcp 三种类型的流量进行路由配置,仅http流量有mirror流量镜像的配置选项。

写在最后

云原生技术处在一个快速发展的阶段,云原生安全建设也没有标准答案,还需要在发展中不断实践和摸索。最后欢迎大家关注腾讯安全应急响应中心公众号,我们定期分享安全技术文章,涵盖DDoS防护、云原生安全、DevSecOps、流量安全、前沿研究、红蓝对抗等多个方面。

——「附录」——

红蓝对抗中的云原生漏洞挖掘及利用实录

腾讯自研HIDS「洋葱」后台上云架构演进实践

“安全需要每个工程师的参与”-DevSecOps理念及思考

安全左移理念,腾讯DevSecOps如何实践?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Tencent_SRC/article/details/120170604

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签