安全是一个贯穿企业业务全程的长期话题,它涉及到IT架构的可用性和可扩展性、网络安全、数据安全、账号安全、攻击防护、运维管理等等领域。青云QingCloud认为,安全不只是依靠某些安全产品即可高枕无忧的事情,而应该是IT服务提供商和企业长期共同努力的目标。本文旨在向云计算用户介绍在使用云资源搭建IT系统、部署和运维企业应用的过程中应该注重哪些安全问题,并系统介绍一些常见的安全防范方法。

1、网络安全

私有网络与隔离

首先介绍青云QingCloud提供的两种组网方式:基础网络和私有网络(VxNet)。前者是一个由系统维护的全局网络,后者是用户自行组建的网络。

基础网络是指云平台上所有用户都可以加入的全局网络,其安全保障依靠防火墙(Security Group)来实现。基础网络比较简单,用户也不需要进行任何配置与管理即可直接使用。但因为在基础网络中主机之间可二层连通,故存在安全隐患。

为实现用户之间真正的网络隔离,确保用户安全,QingCloud 还提供了私有网络(VxNet)功能。私有网络类似物理世界中的局域网,可保障在公有云多租户的场景下,用户之间100%的二层隔离。

我们认为,网络层面的真正隔离是最大程度保护用户安全的最基本举措,因此建议用户尽量将业务系统部署于私有网络之内。


图一:完整的网络环境包含:防火墙、路由器、交换机、主机、公网 IP

路由设置

端口转发

QingCloud 开创性地在云端实现软件定义的网络功能和组件(SDN,software defined network),支持用户将自己在物理网络环境中的经验平滑的移植到云端。为了帮助用户来管理私有网络,QingCloud提供了路由器组件。路由器支持 DHCP 服务、端口转发、VPN、GRE隧道和IPSec等服务,涵盖了常用的网络配置与管理工作。用户还可以创建自管的私有网络,自行配置和管理以实现更加复杂的功能。

过滤控制

缺省情况下,路由器所管理的私有网络之间是可以相互连通的,用户可以通过设置过滤规则来控制路由器内部私有网络之间的隔离。

加密隧道

隧道服务可以将多个不同地域的局域网连接在一起,形成兼顾公有私有的混合云计算环境,帮助用户有效管理多地域的数据中心。OpenVPN、PPTP 等 VPN 服务可以使得用户可以远程安全地拨入⻘云中的私有⺴络。

防火墙规则

QingCloud为每个用户提供了一个缺省防火墙。用户也可以自建更多的防火墙。自建防火墙在初始状态下,所有端口都是封闭的,用户需要建立规则以打开相应端口。采用“白名单”的策略可以更大程度地保障来自外网的访问安全。

2、数据安全

数据存储与安全

QingCloud的存储服务基于一个基本原则:企业用户的数据必须是安全的,绝对不能丢,这是重中之重。基于这个原则,QingCloud所有正式推出的存储服务都会提供存储于不同物理设备的多份副本,以保证在最严重的故障发生后数据可以迅速恢复。

数据备份与恢复

除了被动副本之外,我们建议用户使用数据备份功能以避免误操作等类似问题带来的数据丢失。QingCloud提供块设备级(block device level)的硬盘备份与恢复, 可以同时对多张硬盘做备份(包括系统盘和数据盘),也可以对正在运行的主机做在线备份。 一张硬盘可以有多个备份链,每条备份链包括一个全量备份点以及多个增量备份点,这样用户可以随时从任意一个备份点恢复数据。这里要特别说一下,常见的 Snapshot (快照)功能不能等同于块设备级的备份。因为快照只是在原有数据上打标签,这会破坏原有的结构。而QingCloud会将每次变化的数据取出来,离线存放,不影响原有数据,这样做更安全。

3、账号安全

SSH密钥

同普通的“用户名+密码”登陆方式相比,QingCloud推荐使用 SSH 密钥登录的方式。另外在创建 SSH 密钥时,支持用户输入公钥。

管理员账号

主账号和子账号

我们认为,在企业中针对不同的业务单元或项目分配IT系统的局部管理权限是更加安全的管理方法,因此推出了“子账户”功能。

主账户可以创建多个子账户,并将多个独立的项目放置于不同的子账户下进行管理。主账户可以查看不同子账户的资源和消费情况,并可以切换到不同的子账户进行资源操作。主账户还可以通过禁用/恢复功能来禁止和恢复子账户的操作权限。

每个账户之间的资源是隔离的,子账户只拥有操作自己资源的权限。每个子账户都拥有唯一的登陆ID,可以独立登陆控制台进行资源操作。

账户锁

每个账户都拥有自己的账户锁,可以通过二级密码对账户进行额外的保护。当账户被锁定时,只能进行只读操作。同时,你也可以单独对控制台或者API的操作进行锁定。

API签名

QingCloud向用户开放所有资源操作相关的API,我们的API是通过 HTTPS GET 方式来进行调用的。在调用我们的API之前,用户需要先在控制台申请 API密钥 , 包括 API密钥ID ( access_key_id ) 和 API密钥的私钥 ( secret_access_key )。 API密钥 ID 将作为参数包含在每一个请求中发送;而 API密钥的私钥负责生成请求串的签名,API密钥的私钥需要被妥善保管以保护系统安全。

4、构建高可用的系统架构

保证业务的连续、准确和不中断是IT系统架构设计和运维的关键,也是基本的业务安全保障。在云计算的环境中除了可以应用传统IT经验构建健壮、高冗余、避免单点故障的架构外,还有一些管理工具可以辅助提升系统可用性。

监控告警

QingCloud提供监控告警功能,帮助用户通过对 CPU 利用率 / 内存使用 / 磁盘容量 / 网络流量 / 数据库状态等重要资源的运行状态进行监控,及时了解资源使用情况和系统健康情况,处理突发事件。用户通过创建告警策略,指定资源类型、检查周期、告警条件、通知列表等信息,之后便可将其与资源关联,开始监控。满足告警条件即会触发短信和邮件通知。

负载均衡

负载均衡器可以将来自多个公网地址的访问流量分发到多台主机上, 并支持自动检测并隔离不可用的主机,从而提高业务的服务能力和可用性。 QingCloud 负载均衡器支持HTTP / HTTPS / TCP 三种监听模式,并支持透明代理,可以让后端主机不做任何更改,直接获取客户端真实IP。 另外,负载均衡器还支持灵活配置多种转发策略,实现高级的自定义转发控制功能。

可扩展

一个具有扩展性的IT系统既是业务日常平稳运行的保障,也是除了屏蔽请求以外另一个有效应对拒绝服务攻击的手段。作为云服务商,必须保证用户可以快速创建和调整资源,同时提供自动伸缩服务。

资源的秒级创建和修改

在QingCloud,所有资源都可以在秒级响应,这意味着用户随时可以根据业务规模调整资源数量,实现实时的横向伸缩(Scale out/in)和纵向伸缩(Scale up/down)。独有的按秒计费,让用户在实现资源弹性伸缩的同时真正可以按需使用,按量付费。

资源的可动态扩展

自动伸缩(AutoScaling)功能可以帮助用户基于监控数据动态地调节资源配置或集群规模,及时应对突增的系统压力,充分利用云计算的弹性特点调节系统的处理能力,且有效降低维护成本。整个过程自动调节,无需人工介入。

定时器(Scheduler)功能可用来定期执行一系列任务。可在指定的周期重复执行,也可仅执行一次,且每个任务支持指定多个资源批量操作。目前通过QingCloud的定时器功能,用户可以定期执行开关主机、调整公网 IP 带宽上限、为主机或硬盘创建备份等任务。

5、应用安全及攻击防范

SSH登陆破解

这是最常见却最容易被忽视的安全问题,常见于 SSH 开启了允许密码登录的情况。 攻击者用一个常用密码字典,编写脚本不断提交 SSH 登录请求进行试错,亦或直接 遍历密码组合,实施暴力破解。一旦登录成功,会给目标主机安装木马病毒或窃取 重要数据。防范方法如下:

a)禁用密码登录,改成使用密钥登录,并定期更换新密钥。SSH 密钥登录主机 的方法可参看文档 https://docs.qingcloud.com/faq/index.html#ssh-linux

b)对于 Linux 系统,修改 SSH 服务配置 /etc/ssh/sshd_config,禁止 root 账号直接 登录。今后如果需要 root 权限操作,可以先用其它账号登录,然后执行 su 命 令切换到 root 账号。

c)使用青云路由器构建私有网络,并开启 VPN 服务,将主机置于私有网络中, 每次登录前先连接 VPN,然后使用内网地址登录主机。

d)将 SSH 登录端口换成不常用的端口号。

常用软件账号破解

用户安装的常用软件如 WordPress / AMH / Tomcat / MySQL / Jenkins / Sendmail / Squid 等,通常会有默认账号和密码,且配置了外网可访问。攻击者通过脚本扫描 可用地址和端口,可以轻易获得操作权限,并且有些软件和服务支持上传并执行文 件,造成更大的安全隐患。防范方法如下:

a)谨慎配置常用软件和服务,修改默认账号和密码,并且只监听特定的 IP 地 址。

b)尽量不要使用一键安装的应用软件,暴露的服务密码一定不能过于简单甚至 为空。

c)配置青云防火墙,应用到主机、路由器、负载均衡器等设备,只开启必要的 访问端口。

d)尽量避免在 root 权限下安装和启动程序,理论上需要使用系统权限运行的程 序很少,如果不是监听 1024 以下端口或读写系统文件,则可以用普通账号运 行程序。

漏洞利用

很多旧版本或不稳定版本的程序和组件存在漏洞,黑客经常利用这些漏洞实施入 侵。例如 OpenSSL 的 Heartbleed 漏洞是近年来最严重的安全漏洞之一,OpenSSL 被 广泛应用于互联网服务器,该漏洞可能造成大量用户隐私内容泄漏。虽然后来软件 维护者通过升级程序修复了漏洞,但尚有大量服务器仍在使用带有漏洞的旧版本。 防范方法如下:

a)生产环境下尽量安装稳定版的应用程序。

b)及时对旧版本软件和组件进行升级。

c)关注安全社区,尽早了解最新的漏洞及修复手段。

Web安全

XSS跨站脚本攻击

指黑客提交一段包含恶意 js 脚本的表单内容,当访问者加载该页面内容时,即会触 发执行该恶意脚本。防范方法如下:

a)检查用户的输入内容,尤其是评论、博客、邮件等可能包含富文本的输入, 检查数据中是否包含特殊字符,如 < > ‘ “ 等,将这些字符过滤或者编码。

b)匹配 XSS 特征,比如检查数据中是否包含 <script> javascript 等敏感字符。

c)对输出文本进行编码或转义,比如 & 转换为 & “ 转换为 &quot 等,不同编程 语言都有相应的转义方法。

SQL 注入攻击

指黑客提交的请求参数中包含 sql 语句片段,该参数在服务端被拼接成一个完整 sql 语句发送给数据库,导致恶意 sql 语句被执行。防范方法如下:

a)和 XSS 跨站脚本攻击一样,要检查用户提交的输入,过滤其中的敏感字符。

b)在构造查询语句时,可以使用预编译语句,在 sql 语句中变量用 ? 表示,攻击者无法改变 SQL 语句的结构。

c)除此还要检查输入数据的数据类型,例如限制了数据类型只能为 integer,这种情况是无法成功注入的。

d)另外要避免 Web 应用使用 root / admin 等高权限账户连接数据库,为应用分配单独账户,并不应该赋予自定义函数、增删数据库等操作权限。

CSRF跨站请求伪造

黑客构造一个页面,加载该页面时会向一个特定地址发送请求,之后诱导用户访问这个页面时,该用户便会以自己的身份请求了该特定地址。试想一下,如果该地址是一个银行转账的请求链接,则用户在不知情的情况下,以自己的身份进行了银行转账。防范方法如下:

a)首先将所有写操作的请求,例如银行转账,发送邮件等,由 GET 请求改为 POST 请求。

b)服务端生成表单页面时,在表单中增加一个随机 token 值,同时在 Session / Cookie 中存储该值,当用户提交表单后,将该 token 从表单中取出和 Session / Cookie 中存储的值进行比较,一致则验证通过。此方法在常用的 Web 框架提供了开源实现,你也可以自己实现。

恶意爬虫

这里主要指恶意抓取页面内容的脚本程序,而不是正常的搜索引擎爬虫。爬虫带来的主要危害有两方面:

a)一是增大服务端的访问压力。经常见到有爬虫把网站爬死的情况,应对方法 主要是要提高服务端的访问性能和扩展能力,并将常用页面和内容进行缓 存,下面应对 CC 攻击中会有更详细的介绍。

b)二是网站内容被他人窃取并用于其他商业目的。可以编写脚本定期检查 Web 服务器访问日志,过滤出异常的 HTTP Referer / User-Agent 记录,和短时间内 源自同一 IP 的频繁请求,做封 IP 处理。

文件上传漏洞

很多网站拥有上传文件的功能,黑客可能上传一个可执行的恶意脚本文件,并通过url 请求触发了恶意脚本执行,该方法简单有效,很容易实施攻击。防范方法如下:

a)Web 应用程序尽量不要以 root / admin 等高权限账号启动运行,这样即使恶意脚本被执行也由于账号权限的限制,造成不了太大的破坏。

b)检查上传文件的文件格式,不仅要检查文件后缀名,为了防止黑客给文件命名一个无害的后缀名作为伪装,还需要判断上传文件的文件头来验证文件类型。

c)采用白名单策略,只允许指定类型的文件可以上传,其它一概禁止上传。

d)将上传文件和存放上传文件的目录设置为不可执行,并不要配置成外网可直接访问。

DDos拒绝服务攻击

ChallengeCollapsar攻击

CC 攻击是最常见的拒绝服务攻击形式,攻击者通过代理服务器或者肉鸡向目标主机不停地发送大量服务请求,造成目标服务器资源耗尽,无法服务于正常用户。防范 CC 攻击主要从两方面入手,一是识别攻击来源的特征,屏蔽其请求。二是提高自己服务端的处理能力。我们下面分别来说:

识别攻击特征

a)CC 攻击通常模仿正常用户的请求行为,所以难以被分辨,但由于是程序编写的,和正常用户还是存在一些差别:

b)攻击者虽然可通过代理服务器伪装自己的真实源 IP ,但代理服务器毕竟是有限的,我们依然可以观察单 IP 在短时间内的请求频率,超过一定频率可以视为攻击。

c)攻击者通常会集中请求某几个最消耗资源的页面,但和浏览器的正常行为不同的是,不会请求该页面所包含的一系列 css / js / img 文件,这也是识别是否为攻击的重要特征。

d)还应该检查是否有合法的 HTTP 头信息,尤其检查 Referer / User-Agent 等重要字段。 可以结合业务特点进行分析,比如在未登录状态下,正常用户通常不会频繁请求搜索页面。通常越贴近业务,攻击者的特征暴露越明显。

了解了 CC 攻击的常见特征,就需要采取措施进行处理:

a)服务端需要打印尽可能详细的 Web 服务器日志和应用程序日志。

b)通过编写日志分析脚本,找出上述特征,屏蔽攻击者的请求。可以配置定时任务,定期执行该脚本。

c)当发现了异常的请求,还可以返回一个验证码输入框,要求用户在进行下一步操作前必须正确填写,从而来区别攻击者和正常用户。

提高服务性能

防范 CC 攻击的另一方面就是要提高自身服务端的处理能力,构建高性能的 Web 站点本身是一个很大的课题,针对提高 Web 处理性能来防范 CC 攻击,这里提供一些经验:

a)提高应用架构的可横向扩展能力,通过青云提供的负载均衡器,将请求的压力分摊到后端多台 Web 服务器。 优化数据存储,在多个层次构建缓存,常见的可以是针对数据对象的缓存和 针对页面的缓存。

b)在业务上给访问用户分类,大类上分为登录 / 未登录用户,对于未登录用户直 接返回静态或缓存内容(这也是应对爬虫的有效手段)。对于登录用户,也 可以按是否通过邮箱 / 手机验证来区分,对未验证用户限制请求次数。

SYNFlood

攻击者伪造大量 IP 地址向服务器发送 TCP SYN 报文,服务器返回 ACK 给来源 IP 时,由于 IP 是伪造的也就不会有任何响应。服务器会维持一个庞大的等待列表,不停地重试发送 SYN + ACK 报文,同时占用着大量的资源无法释放。当数据包占满了等待队列,服务器将不再接收新的请求,包括正常用户的请求。

这种类型的攻击是利用了 TCP 三次握手的设计缺陷,通过修改内核参数可以有效缓解:

net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_synack_retries = 2

这几个参数所代表的含义,用户可以查找相关资料。

慢速攻击

攻击者缓慢的向服务端发送 HTTP 头部信息,但始终不发送结尾标识,导致服务端认为 HTTP 头部没有接收完成而一直等待。如果攻击者使用大量客户端同时发送,Web 服务端很快被攻击者占满了 TCP 连接而不再接受新的请求。

防范这种攻击,可以使用反向代理服务器挡在最前面接收客户端的请求,并设置服务器的 HTTP 超时时间为一个较短的时间,当代理服务器接收到完整的 HTTP 请求以后,才会转发给后端的 Web 服务器处理,这样有效的保护了后端 Web 服务器。

流量攻击

攻击者会发送大规模的数据包流量,目的是占满被攻击者的总入口带宽,使正常流量无法进入。

这类攻击通常是由上层网络提供者发现和处理,云服务的终端用户无法直接干预。在这方面青云和数据中心合作,当发现某一来源 IP 流量超过正常值,青云会广播 IP 路由到上层交换设备,将该 IP 的流量牵引到黑洞清洗设备进行清洗。

6、关于安全,你还要了解的云平台自动化运维

自动化资源调度与自动运维

我们认为系统的健康持续运行就是IT系统最大的安全,因此大型云平台的资源调度与运维能力显得无比重要。正因为其重要,就要在整个过程中尽量减少人工干预,因为人会出错。

QingCloud虚拟资源的调度管理完全由具备人工智能的软件机器人社区(P2P Robots Community)进行掌控。机器智能(Machine Intelligence)是 QingCloud 云计算系统资源调度与管理的核心技术之一,其基本理念是通过软件实现智能的资源调度与管理,将基础的运营维护工作交由代码管理,将人力资源从繁琐的基础设施维护中解放出来,专注于代码层面工作,从而最大程度提升系统效率,避免人为失误,降低运维投入。机器智能的理念同时存在于虚拟化与运维两个层面,具体体现在:

资源的安置策略

资源安置(Resource Placement)是云计算领域最基础和核心的问题之一,其解决的是大量工作负载如何最合理、有效地分配到分布式集群中的不同物理设备中。同大多数云服务商不同的是,QingCloud的资源安置策略(Resource Placement Policy)除了参考物理设备实时的工作负载情况之外,还将设备的历史状态、信用值(Credit)作为重要参考指标,对三大指标分配不同权重,经过科学计算完成最佳的资源安置。

运行监控系统

运行监控工作主要是通过P2P软件机器人社区来承担,整个过程都是完全自动的,无需人类的干涉和参与。监控内容主要包括:故障、性能、安全和配置。

通过运行监控系统,用户可以很方便的了解系统运行情况以及分析和定位问题。监控信息分不同的粒度,从一分钟到一年的历史数据都有,另外还有10秒种级别的实时数据。

故障预测

如果说资源安置更多是根据静态的数据进行分析和分配,故障的预测除了要考虑大量历史数据之外还要更多地基于实时的数据流(Real-time Data Stream)进行超快速的实时分析。在多大程度上能够对可能出现的风险和故障进行准确的预测,对大型云平台的稳定运行至关重要,可以最大程度避免故障的发生以及降低可能出现的故障后果。

故障处置

好的云平台一定基于 “Design for failure” 的设计原则,没有单点故障。在QingCloud,无论计算、存储还是网络,所有功能不依赖于任意特定的服务器、硬盘、交换或路由设备,整个系统都是通过机器人社区进行控制,故障设备可以快速被取代,负载实时转移到其他设备上,以保证故障无害。