前言
大型网站核心要素之前我们介绍了4个,今天讲讲这最后一个:安全性,从互联网诞生开始,安全威胁就一直伴随着网站的发展,各种web攻击和信息泄露也从未停止,那么我们今天就从下面这几点谈谈网站架构的安全性:网站应用与防御、信息加密及秘钥安全管理、信息过滤与反垃圾。
网站应用与防御
-
XSS攻击:站点脚本攻击,指黑客通过篡改网页,注入恶意HTML脚本,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式;常见的XSS攻击类型主要有2种:反射型和持久型XSS攻击。
反射型:攻击者诱使用户点击一个嵌入恶意脚本的链接,达到攻击的目的
持久型XSS攻击:黑客提交含有恶意脚本的请求,保存在被攻击的web站点的数据库中,用户浏览网页时,恶意脚本被包含在正常页面中,达到攻击的目的,如下图所示:
XSS防攻击主要手段如下:
消毒:XSS攻击一般都是通过在请求中嵌入恶意脚本达到攻击的目的,这些脚本是一般用户输入中不使用的,如果进行过滤和消毒处理,即对某些HTML危险字符转义,如“>”转义为“>”、"<"转义成“<”等,就可以防止大部分攻击,为了避免对不必要的内容错误转义如“3<5”中的<需要进行文本匹配后再转义。事实上,消毒几乎是所有网站最必备的XSS防攻击手段;
HttpOnly:浏览器禁止页面js访问带有HttpOnly属性的cookie,HttpOnly并不是直接对抗XSS攻击而是防止XSS攻击者窃取cookie,对于存放敏感信息的cookie,可以通过对cookie添加HttpOnly属性,避免被攻击者脚本窃取;
-
注入攻击:注入攻击主要有2种形式,SQL注入和OS注入
SQL注入:攻击者在HTTP请求中注入恶意SQL命令,服务器用请求参数构造数据库SQL命令,恶意SQL被一起构造,并在数据库中执行,如下图:
SQL注入攻击需要攻击者对数据库结构有所了解才能进行,攻击者获取数据库表结构信息的手段有下面几种:
开源:如果网站采用一些开源软件搭建,那么网站数据库结构就是公开的,攻击者可以直接获得;
错误回显:如果网站开启错误回显,即服务器内部500错误会显示在浏览器上,攻击者就可以通过故意构造非法参数,使服务端异常信息输出到浏览器端,为攻击者猜测数据库表结构提供了便利;
盲注:网站关闭错误回显,攻击者根据页面变化情况判断SQL语句的执行情况,据此猜测数据库表结构,此种方式攻击难度较大;
消毒:和防XSS攻击一样,请求参数消毒是一种简单暴力的有效手段,通过正则匹配:过滤请求数据中可能注入的SQL;
参数绑定:使用预编译手段,绑定参数是最好的防SQL注入方法,攻击者的恶意SQL会被当成SQL的参数,而不是SQL命令;
OS注入:利用程序漏洞,注入OS命令,编程语言代码等达到攻击目的。
-
CSRF攻击:跨站点请求伪造,攻击者通过跨站请求,以合法的用户身份进行非法操作,CSRF的主要手法是利用跨站请求,在用户不知情的情况下,以用户身份伪造请求,其核心是利用了浏览器cookie或者服务器session策略,盗取用户身份:
CSRF的防御手段主要是识别请求者身份,主要有下面几种方法:
表单token:CSRF是一个伪造用户请求的操作,所以需要构造用户请求的所有参数才可以,表单token通过在请求参数中增加随机数的办法阻止攻击者获得所有请求参数:在页面表单中增加一个随机数作为token,每次响应页面的token都不相同,从正常页面提交的请求会包含该token值,而伪造的请求无法获得该值,服务器检查请求参数中token的值是否存在并且正确以确定请求提交者是否合法;
验证码:相对来说,验证码则更加简单有效,即用户请求提交的时候,需要用户输入验证码,以避免在用户不知情的情况下被攻击者伪造请求,但是输入验证码是一种很不友好的用户体验,所以还是得考虑再决定使用;
Referer check:HTTP请求头的referer域中记录着请求来源,可通过检查请求来源,验证其是否合法,很多网站使用这个功能来实现图片防盗链(如果图片访问的页面来源不是来自自己网站的网页就拒绝)。
-
其他攻击和漏洞
error code:错误回显,许多网站web服务器默认是打开异常信息输出的,即服务器未处理的异常堆栈信息会直接输出到客户端浏览器,这种方式虽然对程序调试和错误报告有好处,但是同时也给黑客造成可趁之机。故意制造非法输入,使系统运行时出错,获取异常信息,从而寻找系统漏洞进行攻击,防御的手段就是,配置500页面,当服务器出现运行时异常,直接跳转到异常页面,避免将错误信息显示出来;
HTML注释:为了开发方便或者不适当的原因,会在HTML上写大量注释,这些注释会显示在客户端浏览器上,给黑客造成攻击便利,程序最终发布前需要进行代码review或自动扫描,避免html注释漏洞;
文件上传:一般网站都会有文件上传功能,如果上传的是可执行程序,并通过该程序获得服务器端命令执行能力,那么攻击者几乎可以在服务器上为所欲为,并以此为跳板攻击集群环境下的其他机器。最有效的防御手段就是设置上传文件白名单,只允许可靠的文件类型,此外还可以修改文件名,使用专门的存储等手段;
路径遍历:攻击者请求的URL中使用相对路径,遍历系统未开放的目录和文件,防御手段是将js、css等资源文件部署在独立的服务器,使用独立域名,其他文件不使用静态URL访问,动态参数不包含文件路径信息。
-
应用防火墙:ModSecurity是一个开源的web应用防火墙,探测攻击并保护web应用程序,既可以嵌入到web应用服务器中,也可以作为一个独立的应用程序启动;
ModSecurity采用处理逻辑与攻击规则集合分离的架构模式,处理逻辑(执行引擎)负责请求和响应的拦截过滤,规则加载执行等功能,而攻击者规则集合则负责描述对具体攻击的规则定义、模式识别、防御策略等功能。处理逻辑比较稳定,规则集合需要不断针对漏洞进行升级,这是一种可扩展的架构设计,如下图:
-
安全漏洞扫描:网站安全漏洞扫描工具是根据内置规则,构造具有攻击性的URL请求,模拟黑客攻击行为,用以发现网站安全漏洞的工具。
信息加密及秘钥安全管理
通常为了保护敏感数据,应用需要对这些信息进行加密处理,信息加密技术科分为下面三类:
-
单向散列加密:通过对不同输入长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,即不能对固定长度的输出进行计算从而获得输入信息,如下图:
利用单向散列加密特性,可以进行密码加密保存,即用户注册时输入的密码不直接保存到数据库,而是对密码进行单向散列加密,将密文存入数据库,用户登录时进行密码验证,同样计算得到输入密码的密文,并和数据库中的密文比较,如果一致,则密码验证成功,这样保存在数据库的是用户的密码密文,而且不可逆地计算的得到密码的明文,因此即使数据库被拖哭,也不会泄露用户的密码信息;
虽然不能通过算法将单向密文反算得到明文,但是由于人们设置密码具有一定的模式,因此通过彩虹表(密码和对应密文关系表)等手段可以进行猜测式破解;
为了加强单向散列计算的安全性,还会给散列加盐(salt),salt相当于加密的密钥,增加破解的难度;
常用的单向散列算法有MD5,SHA等,单向散列还有一个特点就是输入的任何微小变化都会导致输出完全不同;
-
对称加密:加密和解密使用的密钥是同一个密钥,对称加密通常用在信息需要安全交换或存储的场合,如cookie加密、通信加密等,如下图:
对称加密的优点:算法简单,加密解密效率高,系统开销小,适合对大量数据加密。缺点:加密解密都使用同一个密钥,远程通信的情况下如何安全的交换密钥是个难题,如果密钥丢失,那么所有的加密信息就没有秘密可言;
常用的对称加密算法有:DES算法、3DES算法、RC算法等,对称加密是一种传统加密手段,也是最常用的。
-
非对称加密:非对称加密和解密使用的密钥不是同一个密钥,其中一个对外界公开,被称作公钥,另一个只有所有者知道,被称为私钥。用公钥加密的信息必须用私钥才能解开,反之,用私钥加密的信息,只有用公钥才能解开,如下图所示:理论上说不可能通过公钥计算获得私钥
非对称加密通常用在信息安全传输,数字签名等场合;
信息安全传输:信息发送者A通过公开渠道获得信息接收者B的公钥,对提交信息进行加密,然后通过非安全传输通道将密文信息发送给B,B得到密文信息后,用自己的私钥对信息进行解密,获得原始的明文信息,即使密文信息在传输过程中遭到窃取,窃取者没有解密密钥也无法还原明文;
数字签名:数字签名过程则相反,签名者用自己的私钥对信息进行加密,然后发送给对方,接收方用签名者的公钥对信息进行解密,获得原始明文信息,由于私钥只有签名者拥有,因此该信息是不可抵赖的,具有签名的性质
非对称加密算法有RSA算法等,HTTPS传输中浏览器使用的数字证书实质上就是经过权威机构认证的非对称加密公钥。
-
密钥安全管理:能够达到安全保密效果的一个重要前提是密钥的安全,实践中改善密钥安全性的手段有2种:
方案1:把密钥和算法放在一个独立的服务器上,甚至做成一个专用的硬件设施对外提供加密和解密服务,应用系统通过调用这个服务,实现数据的加解密。由于密钥和算法独立部署,由专人维护,使得密钥泄露的概率大大降低,但是这种方案成本较高,而且有可能会成为应用的瓶颈,每次加密,解密都需要进行一次远程服务调用,系统开销也较大;
方案2:将加密算法放在应用系统中,密钥则放在独立服务器中,为了提高密钥的安全性,实际存储时,密钥被切分成数片,加密后分别保存在不同存储介质中兼顾密钥安全性的同时又改善了性能,如下图所示:
加密服务接口通过密钥服务器密钥服务取得加密解密密钥,并缓存在本地,定时更新,而密钥服务器中的密钥则来自多个密钥存储服务器,一个密钥分片后存储在多个存储服务器中,每个服务器都有专人负责管理,没有人能查看完整的密钥信息。
信息过滤与反垃圾
常用的信息过滤与反垃圾手段有下面几种:
-
文本匹配:主要解决敏感词过滤问题,通常网站维护一份敏感词列表,如何用户发送的消息含有列表中的敏感词,则进行消毒处理或拒绝发布;
-
分类算法:比较简单的分类算法有贝叶斯分类算法,这是一种利用概率统计方法进行分类的算法;分类算法除了用于反垃圾,还可以用作于信息自动分类;
-
黑名单:过滤垃圾信息、信息去重等等作用,黑名单可以通过Hash表实现,该方法实现简单,时间复杂度小,满足一般场景使用,但是当黑名单列表非常大时,hash表需要占据极大的内存空间,随着列表的不断增大,一般服务器将不可承受这样的内存需求,而且列表越大,hash冲突越多,检索速度越慢;
在对过滤要求不完全精确的场景下,可用布隆过滤器代替hash表,布隆过滤器是通过一个二进制列表和一组随机数映射函数实现;