`
chenkangxian
  • 浏览: 87172 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

浅析http平台的安全稳定性架构

    博客分类:
  • web
阅读更多

--转载自《程序员》2013年第2期

前言:随着移动互联网的兴起以及restfulweb service的大规模使用,http协议因其使用方便以及跨平台的特性,在web开发以及SOA领域得到了广泛使用。但其所涵盖的信息,大都是未经加密的明文,信息获取门槛的降低,也为应用架构的安全性及稳定性带来了挑战。

 

对于常规的web攻击手段,如xsscrsfsql注入等等,防范措施相对来说也比较容易,比如xss的防范需要转义掉输入的尖括号,防止crsf需要将cookie设置为httponly以及增加session相关的hash token码, sql注入的防范需要将分号转义等等,做起来虽然简单,但却容易被忽视,更多的是需要从开发流程上来予以保障,以免因人为的疏忽而造成损失。

 

本篇更多的是从平台架构的安全性及稳定性方面着笔,希望能通过些许文字的分析和介绍,来窥探http平台搭建所涉及的一些技术细节,给读者以启发。

 

协议的安全性

http协议其所涵盖的信息都是未经加密的明文,包括请求参数,返回值,cookiehead等等,因此,外界通过对通信的监听,轻而易举便可模拟出请求和响应双方的格式,伪造请求与响应,修改和窃取各种信息。相对于tcp协议层面的socket传输方式,针对http协议攻击门槛更低。因此,基于http协议的webSOA架构,在应用的安全性方面,需要更加的重视。

 

1.摘要签名

对于普通的非敏感数据,我们更多的关注其真实性和准确性,因此,如何在通信过程中保证数据不被篡改,便成为首当其冲需要考虑的问题。鉴于使用https性能上的成本以及需要额外申请CA证书,这种情况下,一般采用参数摘要的方式即能够满足需求。每次请求和响应生成对应的sign,以此来保障请求及响应不被第三方篡改。

请求的参数经过排序,将参数名称和值经过一定的策略组织起来,加上一个密钥secret,然后通过摘要算法生成sign。常见的摘要算法包括MD5SHA等等,由于摘要算法的不可逆性,以及请求参数值的多变性,能够在一定程度上保证通信的安全性。

1 签名的构造

 

服务端接收到请求后,以同样的顺序将参数排序,加上相同的secret,以相同的摘要算法生成签名,然后与请求传过来的sign进行比较,如果参数在中途被篡改,传过来的sign与服务端生成的sign则存在差异,以此来判断请求的合法性。

2 签名的校验

服务端校验完成后,生成响应,同样的,响应的内容也需要以类似的方式进行签名,客户端收到响应后,根据接收到的sign来验证签名的正确性。

举例来说,某个请求的url可能是这样,www.xxx.com/api.do?userid=12345678&page=1&pagesize=10&signtype=MD5&charset=gbk&method=com.chenkangxian.getname&sign=aef503e0ae7c27b04c2fe1cc95ce1duseridpagepagesize是常规参数,signtype表示加密类型,charset表示编码,method表示接口名称,sign为生成的签名串,为了互联网传输方便,一般对其进行16进制或者base64编码,服务端将接收到的参数拼接成字符串userid=12345678&page=1&pagesize=10&signtype=MD5&charset=gbk&method=com.chenkangxian.getname,采用MD5算法生成sign,与传递过来的sign(当然,需16进制或者base64解码)比较,如果一致,表示参数未被篡改。

 

 

2.公私钥签名

上述方法能较好的解决数据合法性校验问题,但是secret相对固定,如果多客户端调用,容易导致secret泄露。

因此,可以给每个客户端分配一对公私钥,请求时,客户端将参数按与前面类似的方式排好序,拼成一个字符串,md5后,通过私钥加密,生成sign

图3 客户端用私钥生成sign

服务端采用同样的方式将参数编排,拼成字符串,md5,通过客户端公钥解密sign,与其md5生成的值进行比较,便可得出数据是否合法。

 

图4  服务端用公钥校验sign

 

当然,客户端也可以采用相同的方法,使用服务端的公钥,对服务端进行校验,这里就不一一枚举了。

 

3.https

上面的两种方法能较好解决数据合法性问题,但对于一些较为敏感的信息,如隐私数据,用户名密码等等,这些信息如以明文的形式传递,会带来较大风险,服务端secret或者公私钥相对固定,一旦密钥泄露,也会有很大的安全风险,并且,通信过程中,客户端与服务端的身份,特别是服务端的身份难以得到保障,第三方可以通过域名劫持的方式来伪造身份,欺骗客户端向伪造的服务端发送数据,这样一来,损失将不可估量。因此,有必要采用更加严格的加密手段来保障信息的安全。

依托SSL(Secure Socket Layer)协议,https能够确保整个通信过程加密,密钥随机产生,并且能够通过数字证书验证通信双方的身份,以此来保障信息安全。

5 服务端单向身份认证https通信过程

SSL协议握手的过程是这样的,客户端向服务端发送SSL协议的版本号,支持的加密算法类型,产生的随机数以及其他客户端与服务端通信所需要的信息,服务端收到这些信息后,会将它自己的SSL协议版本,支持的加密算法类型,以及产生的随机数等等内容,加上它的数字证书,一起回复给客户端。

证书以证书链的形式组织,客户端会逐级校验证书的合法性,包括服务器域名是否与证书所声明的域名一致,证书是否过期,证书颁发机构是否是可信赖的等等。这个过程对于用户来说一般是透明的,操作系统会内置一些知名的CA机构的根证书,免去用户的安装步骤,开发者或机构只需要向相关的CA机构以付费的方式申请证书即可。当然,也有个别例外的奇葩,如12306,直接将根证书挂在主页上供用户下载。

校验完证书过后,客户端将产生一个预主密码,并用服务端的公钥加密传送给服务端,服务端会根据预主密码来生成通信密码,与此同时,客户端也通过相同的方式生成通信密码,这样,一次通信握手基本完成。

通过SSL协议能够完成对服务端的认证,加密数据,防止在传输过程中信息的泄露和篡改,能够在相当的程度上保障通信的安全性。

 

4.应用授权

以上的场景其实是在通信双方相对信任的基础下完成的,客户端直接访问服务端完成数据交互。还有一种场景是平台商将数据有限开放给第三方软件厂商(ISV),第三方软件厂商再利用这些数据来给用户提供服务,当然,前提是用户必须对ISV授权。对于平台厂商来说,用户形形色色的需求,很难以一己之力来予以充分满足,因此,将数据以接口的形式下放给众多的第三方开发者,便成了必然的趋势,也正是由此引发了近几年的“开放平台热”。这样,如何保障对用户数据的访问均是经过授权的,且不会对第三方泄露用户的用户名密码,便成了首当其冲的问题。

OAuth协议为用户资源的授权提供了一个安全、开放的标准,与以往的授权方式不同,OAuth不需触及到用户账户信息(用户名密码),即可完成第三方对用户信息访问的授权。

6 开放应用平台授权

OAuth协议的出现,使得用户在不泄露自己用户名密码的情况下,能够完成对第三方应用的授权,第三方应用得到用户授权后,便可以在一定时间内访问到用户授权的数据。

7 Oauth协议的授权过程

 

一次OAuth协议的授权过程如上图所示,用户先对ISV发起请求,ISV向平台商请求request token,带上其申请的app id,平台返回request token,其后ISV应用将用户引导到平台的授权页面,带上自己的app idrequest token以及回调地址,用户在平台的页面上完成授权(这样便不会将用户名密码泄露给第三方),然后平台通过ISV提供的回调链接,返回给ISV应用access tokenISV应用通过access token取到用户授权的数据,进行加工后返回给用户,授权完成。

为了确保通信安全,一般会让ISV使用其私钥对参数进行签名,平台使用ISV的公钥进行签名验证,来校验ISV的资质,具体过程前面详细介绍过,此处不再赘述。

OAuth协议得到了国内外互联网公司的广泛认可,包括FacebookGoogleWindow Live,以及国内的腾讯、新浪、淘宝、人人等,都对其提供了良好的支持。不同的厂商有不同的OAuth版本,但不论是OAuth1还是OAuth2,其核心思想都是将资源做权限分级和隔离,ISV引导用户在平台端登陆,完成授权,获得授权后ISV可以在一定时间段内访问用户的私有数据,用户完全把控这一过程,且授权可取消。这样,第三方ISV能够利用平台商所拥有的一些数据,来服务用户,为用户创造价值,形成了一个生态系统的闭环。

OAuth授权其实是一个相对较复杂的体系,涵盖系统的方方面面,包括之前所说的通信加解密,以及权限划分,token生成和校验,公私钥的管理,还有后面将要提到的分布式session机制等等。相对于前几年来说,由于开源社区的发展,为其的实现降低了不少门槛,目前已有很多开源的解决方案,详情请参照OAuth网站(http://oauth.net)

 

session的安全性

对于互联网应用来说,为了应对高并发访问的压力,支撑其业务的往往不止是单台服务器,而是一个分布式集群,http请求在不同的服务器间跳转,这样集群间session的同步便成了不得不考虑的问题。

对于一般web应用来说,采用cookie能解决一部分问题,但随着应用规模的不断扩大,cookie会不断的膨胀,而浏览器对于每个域名下的cookie的个数以及每个cookie的长度会有所限制,不能满足持续性增长的需要,并且,客户端的cookie数据会存在一定的安全性隐患。对于服务端调用来说,请求不经过浏览器,cookie显然无法满足需求,随着移动互联网的发展,基于httpSOA架构还将兼容无线客户端的请求,因此,基于cookiesession同步方案已无法满足需求。

8 基于cache的分布式session结构

如上图,基于cache的分布式的session同步机制,能较好的解决上述问题。客户端通过login登陆,如果客户端为浏览器,则通过cookie回写的方式,设置sessionid,如果是在移动端或者服务端调用,则直接返回sessionid,这样,不管用户如何跳转,不同的客户端和应用都可以通过sessionidcache集群中取到session,避免了session丢失。

而使用一致性hash算法,能够确保当某台cache server宕机后,不至于整个的key都重新hash一遍,导致所有的用户都需要重新登录,这样不仅提升了用户体验,也降低了对于login的压力,不会有大量的用户像雪崩一样同时发来大量的登录请求(这对于像淘宝双1112这样大流量的活动来说,十分重要)。使用cache来存储session会话,即表示会话是可以丢失的,对于系统设计者来说,对这一点须有清楚的认识。

分布式session也会跟普通单机session一样,存在session失效以及cookie防盗用等等问题。

为提高cache的利用率以及提高session的安全性,须针对cache设置一定时长的失效时间,避免在用户在离开位置后session被其他人盗用,但是,对于用户连续性的操作,又必须对session的到期时间进行不断更新,否则,可能会影响到用户的体验。

对于sessionid来说,最好是将其设置为httponly,避免跨站脚本对cookie进行盗用,当然,采用分布式session后,任何人都已经很难从cookie本身提取到有价值的攻击信息,但是,如果通过窃取sessionid来伪造用户登陆,则不得不防,尤其是交易相关的业务,可能会造成相当大的危害,因此,需将session的状态与客户端的ip地址或者mac地址挂钩。如果用户从ip1登陆,通过ip2来访问用户信息,即便ip2访问的时候带上了sessionid,也需要重新进行登陆,这样的话,则相当程度避免了会话劫持的发生。

 

 

平台的稳定性

对于生产环境的应用集群来说,故障是很难完全避免的,建立完善的监控预警机制,能够提高遇到问题时的响应速度,帮助快速发现问题,及时通知相关技术人员对故障进行修复,有效的避免或者降低损失。与此同时,也必须做好流量控制,防止突发的大流量将服务器压垮。

 

1.集群监控

生产环境的情况往往复杂多变,用户的行为不可预测,有效的监控措施不仅能够提高遇到问题时的响应速度,也为应用的扩容,性能的优化提供了参考依据,对我们及时了解应用的水位,评估和设置警戒线提供了十分重要的帮助。

常规的监控可以包括如下方面,机器的loadcpu使用率,内存使用率,网络trafficpv以及uv信息,IO繁忙程度,磁盘使用率,异常catch等等,如果是java应用,应该包括堆栈的使用情况,fullgc的频率等等,如果是mysql DB,需要包括select/psupdate/psthread running等等,这些指标信息能够基本反映机器运行的健康状态。一旦某个指标出现异常,比如受攻击导致流量激增,可以发短信或者邮件通知相关应用负责人,进行及时的处理。

对于采用http协议的应用来说,能做的不仅仅只有这些,还可以采取包括接口数据校验,部分线上回归测试,页面状态检测等等措施,更加全面的对应用进行健康检查和监控。

举例来说,对于异步返回jsonjsonpxml格式数据的接口来说,可以事先造好一部分固定数据,覆盖接口代码的各个分支路径,然后通过shell脚本定时执行(crontab部署定时任务)的方式,验证返回的数据是否完整是否正确,以此完成接口的扫描与检查。

 

$CURL_BIN -s -m 100  "${HOSTNAME}${URL}" > $TMP_FILE
if [ "$CHECK_TXT" != "" ]; then
    check_result=`fgrep $CHECK_TXT $TMP_FILE`
    if [[ "$check_result" = "" ]]; then
       CHECK_STATUS="1"
       echo -e "check failure!\t${URL}\n"
    fi
fi

 

code1 接口检查shell片段

脚本通过curl来请求相关接口url,将返回值与check_txt(预定义文本)通过fgrep比对,如果与预计的不符,则输出check failure,程序检测到该输出,则发送短信报警。

对于页面来说,返回的数据量大,整体校验相对来说代价较大,可以针对一些核心流程,比如接口的调用,后端数据的返回,定义一些状态码,塞到httpheader请求头中返回,这样,通过监控header中对应的状态值,来完成页面的监控。

 

$CURL_BIN -s -I -m 100  "${HOSTNAME}${URL}" > $TMP_FILE
status=` awk -F ":" '{if($1 == "Server_Status"){print $2}}' $TMP_FILE `
status=${status//}
if [ "$status" = "ok" ]; then
CHECK_STATUS="0"
else
CHECK_STATUS="1"
echo  -e  "check failure!\t$URL\n"
fi

 

code2  一段页面监控的shell片段

脚本通过curl来访问相关页面,通过awk过滤出header中的Server_Status(该值在应用端事先约定好),判断其是否为ok状态,如果ok,则忽略,否则,输出check failure,程序检测到该状态,则发送报警短信。

 

 

2.并发与流量控制

任何应用都有一个设计指标和能承载的峰值,当它的压力超过了它设计的峰值以后,就好比一座为行人设计的独木桥,即使它再坚固,也无法让一辆坦克行驶通过,在这个时候,为了让机器能够正常运行,不至于完全瘫痪,需要对应用进行流量控制。

控制的策略有多种,可以直接丢弃掉那部分超出峰值的用户请求,这样虽然比较粗暴,但也是最简单最有效的方法,还有一种便是削峰填谷,将一部分暂时来不及处理的请求放入等待队列中,待资源空闲时再逐步消化,具体使用哪种策略,与应用的场景相关。

当然,要进行流控,首先得有一个进行流控阀值,这可不是拍拍脑袋或者仅凭经验就能够得出来的,不同的应用,不同种类的接口,不同的机器配置,其所面临的情况也不尽相同,阀值必定是有差异的,必须经过几轮的压力测试下来,才能够得到一个比较靠谱的值。

流控可以从多个维度来进行,比如针对qps(每秒查询数),并发线程数,黑白名单,服务加权分级等等,最典型最直观的,便是通过对qps或者是并发线程数的控制,来达到限流的目的。

从具体实施的角度来说,可以在应用的负载均衡端(nginx)完成,这一层可以进行整体的比较粗粒度的控制,比如客户端的并发请求数,请求的频率等等,这样可以过滤掉大部分攻击请求,提高ddos的组织难度,当然,更加复杂的策略,如验证码防刷,黑名单,ip封锁等等,可以通过编写nginx模块来进行定制。

Nginx0.7版开始提供2个限制用户连接的模块HttpLimitZone ModuleHttpLimitReq Module,可以用来限制用户请求的频率和并发连接数:

limit_zone  zone_session_state  $binary_remote_addr  10m;
limit_req_zone  $binary_remote_addr  zone=req_session_state:10m  rate=1r/s;
location /
{
      limit_conn  zone_session_state 1;
      limit_req  zone=req_session_state  burst=5 nodelay;
      …   …
}

 

code3  nginx配置限流

负载均衡端作为应用总的流量入口,采取的限流措施可以挡掉大部分的恶意流量,但缺乏灵活性,难以响应后端的变化,并且受调度策略的影响,并不能保证落到每一台服务器的流量都是均衡的,因此,一般的策略是将入口阀值适当调高,然后结合应用端协同来进行流控。

应用端流控的好处便是能够更细粒度的划分流控的单位(能精确到接口层面),更加方便的调节流控阀值,动态的修改服务权重、调用的黑白名单,以及进行服务分级,优先保障核心流程的稳定,这在应对大流量高并发的压力 (如淘宝双11,双12)时,显得尤为重要。

关于应用端流控的实施,涉及众多细节,限于篇幅,笔者将在个人博客做详细介绍,此处便不再赘述。

 

 

小结

本文从协议的安全性,session的安全性以及平台的稳定性三个方面,介绍了http平台搭建过程中所面临的一些问题以及解决办法。http协议因其明文传输的特性,使得在系统设计阶段,不得不对安全性作充分考量。而对于生产环的境应用来说,完善的监控预警措施,能确保在第一时间发现问题,及时采取恰当的措施,避免损失;合适的流控机制,能保障在流量突增的情况下,机器能顶住压力,不至于宕机。

 

  • 大小: 118.5 KB
  • 大小: 59.4 KB
  • 大小: 59.8 KB
  • 大小: 37.1 KB
  • 大小: 38.8 KB
  • 大小: 41.3 KB
  • 大小: 47 KB
  • 大小: 38.7 KB
分享到:
评论
1 楼 wangguanghua 2016-05-18  
不错。。。

相关推荐

    浅析网络安全风险和信息系统安全监测响应平台的设计.pdf

    "浅析网络安全风险和信息系统安全监测响应平台的设计" 网络安全风险已成为网络稳定可靠运行的重要威胁。为了确保信息网络系统的安全,我们需要有效的安全风险防范措施,建立具备识别和响应联动、规范与措施统一的安全...

    Android嵌入式系统架构及内核浅析.pptx

    Android内核是基于Linux内核开发的,它在继承了Linux内核稳定性和可靠性的同时,增加了一些定制化的功能和优化。Android内核具有以下特点:安全性、可靠性、可扩展性和高性能等。Android内核采用了强制访问控制的...

    大型分布式网站架构设计与实践.带目录书签.完整版.rar

    曾在程序员上发表过《漫谈基于http协议的SOA架构》《浅析HTTP平台的安全稳定性架构》两篇文章,对基于HTTP协议的SOA架构有深入研究,在排查解决线上问题和故障方面有丰富的实践经验,擅于利用数据分析解决实际问题,...

    浅析网络信息安全现状及确保信息安全对策.pdf

    大量的网络服务器因病毒侵袭导致瘫痪,数据丢失,严重影响信息系统的稳定性和安全性。现有的防病毒措施往往无法跟上病毒的演变速度,尤其是服务器防护能力的不足,给病毒制造者提供了可乘之机。 为了应对这些挑战,...

    电力监控系统网络安全监测平台浅析.pdf

    通过实时监控、分析和响应,该平台能有效地预防、检测和应对网络攻击,提高电力系统的安全性和稳定性。随着网络攻击技术的不断演进,持续研究和优化这样的监测技术对于电力行业的网络安全至关重要。

    数据中心安全风险分析浅析

    同时,由于虚拟层的存在,安全管理人员可能无法直接检测到硬件层面的风险,服务器的稳定性受到影响。 网络架构的改变也是安全隐患的一大来源。虚拟化技术打破了原有的网络隔离,一台虚拟机的问题可能迅速蔓延到其他...

    浅析基于JAVA平台的人事代理信息系统.pdf

    该框架的优点是可以提高开发效率、简化开发难度、提高系统的稳定性和安全性等。 系统的设计和实现主要包括以下几个方面: 1. 档案管理:系统可以实现人事代理业务的自动化和信息化,包括档案的录入、修改、删除和...

    浅析web集群架构解决方案.docx

    随着互联网的飞速发展,网络用户数量和数据流量呈指数级增长,这对网络服务器的稳定性和可扩展性提出了严峻挑战。尽管硬件性能不断提升,但面对大规模的网络访问压力,单一服务器往往力有未逮。为了解决这个问题,高...

    网购到火车票_浅析淘宝和12306网站架构

    异步通信机制如Notify,确保了高并发时的稳定性和响应速度。非结构化数据存储系统TFS和NOSQL解决了大规模非结构化数据的存储问题。监控和预警系统则为系统的稳定运行提供了保障,配置统一管理简化了运维工作。 ...

    浅析构建信息安全运维体系 (2).pdf

    通过这些功能,信息安全运维体系可以提升对网络安全的监控和响应能力,确保重要信息系统的稳定运行,降低安全风险,保障企业或组织的业务连续性和数据安全性。同时,通过审计和评估,持续优化运维流程,积累经验,以...

    浅析计算机的网络安全技术问题.pdf

    《浅析计算机的网络安全技术问题》 计算机网络安全技术是当前信息技术领域的重要课题,随着网络信息技术的广泛应用,网络安全问题日益凸显。本文主要探讨了计算机网络安全的概念、存在的不安全因素及相应的解决对策...

    浅析超融合基础架构在医院数据中心的应用PPT课件.ppt

    它以简单的部署、高稳定性、快速交付等优点受到青睐,特别是对于医疗机构如南京市口腔医院这样的用户来说,能够更好地满足业务需求和规划。超融合架构的核心在于计算和存储在一个层次上的紧密集成,通常由软件定义,...

    浅析保障计算机网络安全的方法措施.pdf

    选用技术先进、稳定可靠的设备,确保网络架构的安全性,对于防止网络瘫痪和避免重大损失至关重要。同时,网络设施的安全防护应与网络建设同步进行,以提供全面的保障。 其次,网络系统安全是网络稳定运行的核心。这...

    云计算安全防护体系构建浅析4100字.pdf

    构建云计算安全防护体系的目标在于提供端到端的安全可信环境,保护用户数据安全和隐私,确保应用的完整性和可用性,并通过全过程管理保障云平台的稳定运行。该体系应该包括以下几个层面: 1. **基础架构安全**:...

    高并发重负载网站架构浅析.pdf

    总的来说,设计高并发重负载网站架构需要综合考虑多个层面,包括内容处理、数据存储、性能优化和系统稳定性。通过静态内容分离、应用拆分、存储拆分和缓存机制,可以有效地提升网站的处理能力和响应速度,同时保证...

    浅析Linux系统的安全机制及防护策略.pdf

    "浅析Linux系统的安全机制及防护策略" 本文对Linux操作系统的安全机制进行...管理员需要详细分析Linux系统的安全机制,找出系统存在的安全隐患,并采取有效的安全策略和保护措施来提高Linux操作系统的安全性和稳定性。

    浅析电力系统的安全运行与调度管理 (1).pdf

    中国的电网虽然起步相对较晚,网络架构仍有待完善,但随着技术的发展和管理策略的优化,正在逐步提升电力系统的整体安全性和稳定性。在未来的电力系统发展中,深入研究和应用智能电网、新能源技术以及更先进的调度...

    浅析网站开发CSS架构[文].pdf

    综上所述,本篇文章全面地涵盖了CSS架构的各种方面,从分离和合并样式到构建模块化的样式库,强调了良好的CSS架构对于高效网站开发的重要性。理解并应用这些原则,开发者可以构建出更稳定、可扩展且易于维护的网站。

    油田网络安全管理和防护建设浅析.pdf

    由于缺乏足够的安全意识,企业的软硬件设施更新和维护不足,导致部分硬件系统无法正常运行,影响了网络系统的稳定性。 2. 网络整体运营情况分析滞后:目前,油田企业对网络运营状况的监测仍然停留在简单的终端系统...

    浅析计算机网络安全防范措施 (19).pdf

    除了技术手段和管理策略,还需关注网络的稳定性和安全性,确保所有参与者都具备一定的自我防范意识。管理者应制定并执行有效的网络管理政策,建立完善的安全规则,以防止潜在的安全隐患。 随着科技的进步,计算机...

Global site tag (gtag.js) - Google Analytics