前言
什么是云计算?
云计算就是一种新兴的计算资源利用方式,云计算的服务商通过对硬件资源的虚拟化,将基础IT资源变成了可以自由调度的资源池,从而实现IT资源的按需分配,向客户提供按使用付费的云计算服务。用户可以根据业务的需求动态调整所需的资源,而云服务商也可以提高自己的资源使用效率,降低服务成本,通过多种不同类型的服务方式为用户提供计算、存储和数据业务的支持。
云计算的部署模式
1.公有云(Public Cloud)——出租给公众的大型的基础设施的云
由云服务提供商拥有和管理,通过互联网向企业或个人提供计算资源,就类似城市的水电,居民共享,每家每户各取所需,按量统计付费。
2.私有云(Private Cloud)——企业利用自有或租用的基础设施资源自建的云
单个组织专用的云服务,而无需与其他组织共享资源,私有云可以在内部管理,也可以由第三方云服务提供商托管,而公有云和私有云的区别,就好比自家的洗衣机(私有)和干洗店(对公)的区别。
3.混合云(Hybrid Cloud)——由两种或两种以上部署模式组成的云
同时使用公有云和私有云,从而允许公司将敏感数据保留私有云中(安全性),同时使用公有云来运行应用程序(低成本),就类似于我们现实打点中遇到的企业官网等业务放在云上,核心业务部署在内网。
4.社区云/行业云(Community Cloud) ——为特定社区或行业所构建的共享基础设施的云
特定组织或行业共享使用的云计算服务方案,行业云是由几个具有类似关注点(例如安全性、隐私性、和合规性)的多个组织共享,像政务云、金融机构、医疗等特殊客户群体,需要满足其一定的行业规范和数据安全标准。
云计算的服务模式
1.云基础设置即服务(IaaS)——出租处理能力、存储空间、网络容量等基本计算资源
IaaS就是由云服务提供商,提供底层设施基础资源(CPU、内存、硬盘、带宽等),用户需要自己部署和执行操作系统或应用程序等各种软件,就比如我们平时在阿里云、腾讯云等云厂商哪里购买的VPS服务器就属于IaaS服务模式。
2.云平台即服务(PaaS)——为客户开发的应用程序提供可部署的云环境
PaaS可提供各种开发和分发应用的解决方案,如虚拟服务器、操作系统等。如我们常见的docker、k8s等。
3.云软件即服务(SaaS)——在网络上提供可直接使用的应用程序
在PaaS之上,用户不需要管理和控制任何云计算基础设施,包括网络、服务器、操作系统、存储等,普通用户所接触到的互联网服务,几乎都是SaaS
云安全
什么是云安全?
云计算彻底改变了数据存储的世界,它使企业可以远程存储数据和管理业务,并随时随地从任何位置访问业务,存和取变得简单,同时也使得云上数据极易造成泄露或被篡改,如云服务器一般都会由专业的运维工程师去运维,但是在大多数开发小公司,是没有运维工程师的,这个时候一般都是开发人员自己去维护,这个时候就会缺乏基本的安全常识,如身份验证控制不当、配置错误、数据库设置等等,这些操作都会使得服务器遭到攻击。
一方面,传统环境下的安全问题在云环境下仍然存在,比如SQL注入、弱口令、文件上传、网站备份泄露等,另一方面,除了常规的WEB漏洞之外云环境下又不断涌现出一堆新的安全问题例如:Access Key泄露利用、配置不当利用等。
云安全攻击分类
云安全分为两类,一类为云服务,一类为云原生
云服务
云服务,顾名思义就是云上的服务,简单的来说就是在云厂商(阿里云、腾讯云)那里购买的服务。目前国内代表厂商有阿里云、腾讯云、华为云等,国外代表厂商有亚马逊、微软云、google云等。各个云厂商对云服务的叫法都不统一,这里以阿里云为例主要讲述一下常用的云服务与其作用。
以上图阿里云的产品服务为例:
- 对象存储OSS(Object Storage Service):简单来说就是一个类似网盘的东西,当然跟网盘是有一定区别的,用来存储用户上传文件等功能。
- 弹性计算服务ECS(Elastic Compute Service):简单来说就是云上的一台虚拟机。
- 云数据库(Relational Database Service):简单来说就是云上的一个数据库。
- 身份和访问管理(Identity and Access Management):简单来说就是云控制台上的一套身份管理服务,可以用来管理每个子账号的权限。
云服务攻击知识面
对象存储
- Bucket权限配置错误-公开访问
在创建Bucket桶时,默认是private(私有)的权限,如果在错误的配置下,给了listobject(列表对象)权限,就会导致可遍历存储桶。
- Bucket桶爆破
当不知道Bucket名称的时候,可以通过爆破获得Bucket名称,有些类似于目录爆破。
- 特定的Bucket策略配置
有些Bucket会将策略配置成只允许某些特定条件才允许访问,当我们知道这个策略后,就可以访问该Bucket的相关对象了。
- Bucket Object遍历
如果策略中允许了Object的List操作,则在目标资源范围下,会将所有的Bucket Object显示出来,通过拼接可获取相对应的文件
- 任意文件上传与覆盖
由于Bucket不支持重复命名,所以当匿名用户拥有写入权限时,可通过任意文件上传对原有文件进行覆盖,通过PUT请求可上传和覆盖任意文件。
- AccessKeyID、SecretAccessKey泄露
在开发过程中可能操作失误会导致SecretID/SecretKey泄露,获得SecretID/SecretKey相当于拥有了对应用户的权限,从而操纵Bucket。
- Bucket接管
由于Bucket接管是由于管理人员未删除指向该服务的DNS记录,攻击者创建同名Bucket进而让受害域名解析所造成的。
- 修改策略导致网站瘫痪
当策略可写时,将原来可以访问的资源权限设置为不可访问,这样就会导致网站瘫痪。
弹性计算服务
- 凭证泄露
-
• 云场景下的凭证泄露可以分为以下几种:
-
- • 控制台密码泄露
- • AccessKeyID、SecretAccessKey泄露
- • 临时凭证泄露
- • 实例登录凭证泄露
-
• 对于这类凭证信息的收集,一般可以通过以下几种方法进行收集:
-
- • Github敏感信息搜索
- • 反编译目标APK、小程序
- • 目标网站源代码泄露
- 元数据
元数据服务是一种提供查询运行中的实例内元数据的服务,通过元数据,攻击者除了可以获得当前ECS上的一些属性信息之外,也可获得与其实例绑定角色的临时凭证,并通过该临时凭证获得云服务的控制台权限。
- 恶意的镜像
获取控制台权限后,可导入存在后门的镜像,下次目标用户在选用镜像创建实例的时候,就会触发我们在镜像中植入的恶意代码。
云数据库
- 访问凭证泄露
如上面两个云服务一样,云数据库在配置不当的情况下也有可能会出现访问凭证、临时凭证等泄露
- 备份文件
在获得相应权限后,可尝试下载数据库
- 弱口令
最大的0day,弱口令,如果数据库存在弱口令,则可通过密码爆破,猜解出RDS的账号密码。
云原生
云原生是基于分布式存储和统一运管的分布式云,云原生的代表技术包括容器、容器编排、微服务、不可变基础设施和声明式API
Kubernetes
kubernetes简称K8s,是Google于2014年开源的容器编排调度管理平台。相比与Swarm、Mesos等平台简化了容器调度与管理,是目前最流行的容器编排平台。
如上图所示,我们可以看到,Kubernetes集群主要分为Master和Node两部分,也是典型的分布式架构。首先,外部应用程序通过Api-Server提供的HTTP接口与Master进行交互,而在与APIs进行交互前,需要经过一步认证的阶段。而Node由多个pod组成,pod中运行着的便是大家比较熟悉的容器(Docker),我们将运行在一组Pods上的应用服务公开为网络服务的抽象方法称为服务(Service),服务上一般配置了能够被公开访问的IP地址、端口映射关系等,通过服务我们就能够访问到相应的Pods。
Docker
Docker是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的容器,从而提高交付软件的速度。Docker容器与虚拟机类似,但二者在原理上不同,容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。下图是Docker官方给出的架构图,里面包括了Docker客户端、Docker容器所在的宿主机和Docker镜像仓库三个部分。
Docker可以让开发者基于选定镜像(image),打包目标应用以及依赖包到一个轻量级、可移植的容器(Container)中,并通过客户端的docker命令实现对Docker主机内容器的操控;当前容器也可创建成新的镜像,而所有的镜像放到仓库(Registry)中,类似github一样分为共有仓库和私有仓库。
云原生攻击知识点
随着云计算技术的发展,目前很多企业都将业务部署到了云上,并开始广泛使用docker、Kubernetes等云原生技术,但随之而来也有一些新的风险和挑战,如docker逃逸、docker/K8s配置安全、容器镜像安全、DevOps安全等。
K8s安全问题
配置不当引发的组件接口安全问题
- Api Server未授权访问
如上图k8s的结构图所示,外部应用程序是通过Api-Server所提供的HTTP接口与Master进行交互的,
- Kubelet 未授权访问
与API Server类似,Kubelet也运行着API服务,如果Kubelet存在未授权访问,就可以控制所在节点的权限。
- Dashboard 未授权访问
Dashboard可以给用户提供一个可视化的web界面来查看当前集群的各种信息,用户可以用Kubernetes Dashboard部署容器化的应用、监控应用的状态、执行故障排查任务以及管理Kubernetes各种资源。在Dashboard中默认是存在鉴权机制的,用户可以通过kubeconfig或token两种方式登录,当用户开启了enable-skip-login时可以在登录界面点击skip跳过登录进入Dashboard。
- K8s Config文件泄露
如果攻击者通过webshell、Github等特定方式拿到了该K8s配置的Config文件,就可以通过该文件操作集群,从而接管所有容器。
- Etcd未授权访问
etcd默认监听2379、2380端口,前者用于客户端连接,后者用于多个etcd实例之间的通信。如果2379端口暴露在公网,可能会造成敏感信息泄露。
集群风险存在的风险
- Kubectl proxy命令未安全使用
攻击者可通过kube-proxy代理来未授权访问本地kube-apiserver组件,创建恶意pod或控制已有pod,后续可尝试逃逸至宿主机
- 未开启RBAC控制
基于角色(Role)的访问控制(RBAC)是一种基于组织中用户的角色来调节控制对计算机或网络资源访问的方法,如果运维在环境中没有设置RBAC或者Kubernetes版本低于1.16版本,则默认是不会开启RBAC访问控制策略。
Docker安全问题
-
容器镜像存在的风险
-
- • 如果开发者为了开发、调试方便,可能会将数据库账号密码、云服务密钥之类的敏感数据打包到镜像里,那别人获取到这个镜像后,就容易导致安全风险。
- • 在公共镜像仓库比如docker Hub里,会存在一些有漏洞的镜像或者恶意镜像,如果使用了这些镜像那就存在了安全风险。
- • 例如开发者在代码中引用了存在漏洞版本的log4j组件,然后将其打包成了业务镜像,这样即使代码没有漏洞,但因为引入了不安全的第三方组件也变得有了安全风险。
-
- • 不安全的第三方组件
- • 不安全的镜像
- • 敏感信息泄露
-
\2. 活动中的容器存在的风险
-
- • 如果为容器设定了不完全的配置,会导致容器本身的隔离机制失效,如–privileged:使容器内的root权限和宿主机上的root权限一致,权限隔离被打破。
- • 容器运行在宿主机中,容器必须要使用宿主机的各种CPU、内存等资源,如果没有对容器进行资源使用限制,那么就存在宿主机资源耗尽的风险。
- • 在使用容器时,往往需要将端口映射出来,如果一个web服务端口被映射出来,同时这个web服务存在漏洞,那么也同样是存在风险的。
-
- • 不安全的容器应用
- • 不受限制的资源共享
- • 不安全的配置与挂载
-
容器管理程序接口的风险
Docker 守护进程主要监听UNIX socket和Tcp socket,默认情况下,Docker只会监听UNIX socket。
-
• UNIX Socket
-
- • UNIX socket的风险主要在于Docker守护进程默认以宿主机的root权限运行,因此就可以借助这点进行提权或者容器逃逸。
-
软件自身的漏洞
- • 不受限制的资源共享
- • 不安全的配置与挂载
-
容器管理程序接口的风险
Docker 守护进程主要监听UNIX socket和Tcp socket,默认情况下,Docker只会监听UNIX socket。
-
• UNIX Socket
-
- • UNIX socket的风险主要在于Docker守护进程默认以宿主机的root权限运行,因此就可以借助这点进行提权或者容器逃逸。
- 软件自身的漏洞
- • Docker自身存在的漏洞,比如CVE-2019-14271、CVE-2021-22555等都可以导致容器逃逸,也是风险点