运营平台安全检测方法简介及典型问题剖析
2020-09-22贺赛娜李洪波张湘东徐昊
[贺赛娜 李洪波 张湘东 徐昊]
1 引言
在信息化社会中,网络已深入到军事、政治、金融、商业、人们的生活和工作等方方面面,成为了社会不可缺少的一部分。拥有如此重要地位的网络若不能保障其安全性,这将给生产、经营、个人资产、个人隐私等带来严重损害,甚至会威胁到金融安全、国防安全以及国家安全。近年来公安部持续推出护网行动,以战养兵,推进关键信息基础设施的安全监测、应急响应等保障能力。“护网行动”是国家为了应对网络安全问题、为了在当今复杂的国际形势中具备能打硬仗的网络安全能力,所做的重要布局之一。为积极响应护网行动,做好安全防守工作,本文以某运营平台为例,记录了多种安全检测方法发现的重点问题。在实际开发过程中,通过解决安全问题,获得了一个安全性更强健的运营平台。
2 检测方法介绍
某运营平台部署了4台云主机,其中2台服务主机、1台主数据库机器和1台从数据库机器。该平台采用CentOS系统,涉及到的应用有Tomcat、MySql等。如图1所示,本文将主要描述4种安全检测方法:
图1 4种安全检测方法在某平台上的使用
(1)基线扫描:主要检测操作系统、应用程序、数据库的不合规配置问题,这些配置问题大致分类为:账号口令、认证授权、日志审计、协议安全等方面,均可通过修改配置进行解决、规避;
(2)源代码缺陷检测:顾名思义就是针对项目的源码做针对性检测,通过这种检测可以发现由于编写不规范、工程师编写时不细心等原因造成的隐形bug。从而实现提高代码的质量、优化代码的结构;
(3)渗透测试:主要用于验证在当前的安全防护措施下网络、系统抵抗黑客攻击的能力。利用各种主流的攻击技术对网络、系统做模拟攻击测试,以发现网络、系统中存在的安全漏洞和风险点;
(4)安全漏洞扫描:针对应用的版本漏洞、远程访问协议等进行检测,发现漏洞。
通常来说,在一个项目周期中安全检测主要集中在开发尾声、产品上线之前。产品上线之后也会根据实际需要进行定期的安全检测,确保发现隐蔽的问题、或保证产品符合新的安全规定。项目成员可以利用流行的网络安全工具进行检测扫描,也可以使用专业的网络安全公司提供的检测服务,减少项目组的工作量。本文主要基于第三方网络安全公司对某运营平台上线之前进行安全检测的结果,从上述4种安全检测中,抽取典型、常见问题进行描述,并提供常见解决方案。
3 基线扫描
3.1 账号口令安全
操作系统、应用程序和数据库级的账户信息一旦暴露,或者用户操作了不该具备权限的操作,很可能给系统造成不可想象的后果。因此要对账户的口令、操作权限等做严格限制,确保账户的安全。下面列出了具体的一些账户口令相关的安全限制:
(1)限制口令长度、口令过期天数;
(2)限制账户的口令不能为空;
(3)限制口令中大写字母、小写字母、数字、特殊字符的个数;
(4)删除与设备运行、维护工作等无关的账号;
(5)非wheel组内的用户不能su到root;
(6)检查是否按用户分配账号,避免账号共享;
(7)检查是否以普通账户安全运行应用程序,禁止超级用户、管理员账号启用、运行应用程序(eg:mysql、tomcat等)。
3.2 认证授权
为了实现规范化管理,有必要对用户的登录、访问文件目录做出限制,避免因跨权限访问造成系统文件、产品机密信息泄露:
(1)针对新建文件及目录,应设置默认的访问权限,防止因未设置访问权限,导致所有用户都可以访问;
(2)当账户登录服务器时,应限制用户的登录超时时间,超过该时间则会话结束;
(3)禁止root用户远程ssh登录;
(4)针对web应用程序,应禁用其manager功能。
3.3 日志审计
从安全的角度考虑,必要的日志能帮助用户了解掌握系统的安全运行状态。有助于识别恶意攻击以及来自内部的违规和信息泄露,能够为事后的问题分析和调查取证提供有力信息:
(1)启用必要的日志功能,例如Linux系统的syslog日志审计、cron行为日志功能
(2)限制日志文件非全局可写限制,限制other用户不可写日志文件;
(3)有条件的话,可以配置远程日志功能,防止本地日志文件丢失;
(4)对于应用程序,配置必要的日志,例如为Tomcat配置访问日志,为mysql配置通用日志、慢查询日志、错误日志、更新日志、二进制日志等。
3.4 协议安全
对于使用不同协议访问的用户,应做一些安全限制,确保用户以不同协议访问系统时不具备权限泄露信息、做出危险的操作,从而进一步保证系统的安全性。
(1)禁止匿名WU-FTP用户登录服务器;
(2)禁止匿名VSFTP用户登录服务器;
(3)禁止root登录VSFTP;
(4)禁止root登录WU-FTP;
(5)应配置ssh协议,并安全配置sshd;
(6)应禁用telnet协议;
(7)为Tomcat配置HTTPS加密协议。
4 源代码缺陷检测
4.1 跨站请求伪造
跨站点请求伪装漏洞是指攻击者伪造成用户,访问曾被用户浏览器认证过的网站并进行一些恶意操作,通常会在以下情况下发生:
(1)Web应用程序使用会话cookie。
(2)应用程序未验证请求是否经过用户同意便处理HTTP请求。
Nonce是随请求消息一起发送的加密随机值,可证明请求消息来源,达到防止跨站请求攻击的目的。如果请求消息没有包含这段nonce,则处理该请求的代码将无法证明其来源的真实性,无法判断该请求消息是不是跨站点请求伪装攻击。这意味着使用会话cookie的Web应用程序必须采取特殊的预防措施,确保攻击者无法诱骗用户提交伪请求。HTTP请求中包含用户特有的机密信息,是防止攻击者发出未经授权的请求的有效方法。这些信息可以是随机请求标识符、nonce,或者由当前会话的session id生成的唯一token,以达到验证、确定请求来源的真实性、筛除伪造请求的目的。
4.2 空指针引用
空指针引用,通常是由于程序员的疏忽,在引用之前没有对可能为空的函数返回值做判断,直接错误引用空指针、或者间接使用Null对象中的属性和方法。空指针引用的问题比较常见,且极易导致程序奔溃。代码逻辑比较复杂时,空指针引用的问题不容易被发现;有些空指针引用只在特定条件下才会触发问题,正常情况很难排查。
针对这类问题,则要求程序员在代码编写过程中足够细心仔细,或借助检测工具检索到空指针引用的情况,对于可能存在空指针引用的对象做好判断,避免因为一个疏忽造成后续的潜在隐患。
4.3 J2EE错误配置
(1)缺少统一错误处理页面
当攻击者浏览网站寻找漏洞时,站点提供信息越多,攻击者可以从这些信息中找到的漏洞越多,越容易攻击成功。应用程序应通过指定默认的错误页面,确保永远不会向攻击者泄漏错误消息。处理标准HTTP错误代码是一种简单、有效、安全的做法;完善的配置还会定义一个用于补救的错误处理程序,来捕获应用程序可能抛出的所有异常。
当产生403、404、500等错误时,可配置统一的自定义错误页面,并且不在错误页面中显示服务器版本信息、站点信息、异常错误信息详情、数据库连接信息、SQL语句或者敏感文件的路径等内容。
(2)过度会话超时
当会话处于活动状态时,攻击者可能会强力攻击用户的密码、破解用户的无线加密密钥或者通过打开的浏览器强占会话。而一个用户的访问会话持续时间越长,攻击者就会有更多时间危害用户帐户,用户帐户被攻破的概率就越大。如果创建大量的会话,较长的会话超时时间还会阻止系统释放内存,并最终导致denial of service。
可在web.xml文件中将会话超时间隔设置为30分钟或更少,可以保证用户在一段时间内与应用程序互动的前提下,又提供了一个限制窗口攻击的合理时间范围。
5 渗透测试
5.1 存储型XSS
跨站脚本攻击XSS(Cross Site Script)发生的原因恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,导致网站将用户输入的内容输出到页面上,从而达到恶意攻击的目的。
对于XSS跨站漏洞,需要严格检测所有用户输入的数据、对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行才能有效避免攻击。具体如下:
(1)输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。
(2)输出编码:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。
(3)明确指定输出的编码方式:不允许攻击者为你的用户选择编码方式。
(4)注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如尖括号<、>或类似"script"的关键字),很容易被XSS变种攻击绕过验证机制。
(5)警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。对客户端提交的数据进行过滤,一般建议过滤掉双引号(")、尖括号(<、>)等特殊字符,或者对其中包含的特殊字符进行实体转换,比如将双引号(")转换成其实体形式",<转换成<,<转换成>。
5.2 暴力破解
暴力破解登录密码是通过对已知的用户名,进行对其登录口令的大量尝试,或者对常见弱口令进行用户名的大量尝试。一旦黑客穷举出了一份用户名-密码对,则可伪装成该用户获取信息、进行违法违规操作。
防止暴力攻击的一些方法如下:
(1)账户锁定
账户锁定是很有效的方法,因为暴力破解程序在5-6次的探测中猜出密码的可能性很小。但是同时也拒绝了正常用户的使用。如果攻击者的探测是建立在用户名探测成功之后的行为,那么会造成严重的拒绝服务攻击。
(2)适当的延时
检查密码的时候适当的插入一些暂停,可以减缓攻击,但是可能对用户造成一定的影响。
(3)封锁多次登录的IP地址
这种方法也是有缺点的,因为攻击者可以定时更换自己的IP。
(4)验证码
验证码是阻止暴力攻击的好方法,但设计不好的验证码是可以绕过的,而且对于特定目标的手工探测来说验证码是没有作用的。
5.3 存在弱口令
弱口令指容易被猜测、被破解的口令,这样的口令不能确保用户的安全性。认证登录环节存在弱口令时,要在修改密码时通过限制口令的长度和复杂性解决,如下列出了几个常见的强口令标准:
(1)账号和口令严禁使用出厂默认、易被猜测的字符串;
(2)口令长度至少8位,系统最高权限通行字口令长度至少应为12位;
(3)口令应包含数字、大小写字母,特殊字符中至少三类;
(4)口令不应包含用户名的信息,例如口令不得包含账号完整字符,大小写变位或形似变换的字符串;
(5)口令设置应避免键盘排序密码。
5.4 明文传输
系统在处理用户的输入内容的时候,传输过程中需对用户密码等敏感信息进行加密,避免信息在传输过程中“裸奔”。建议按照网站的密级要求,在传输过程中对用户的敏感信息使用加密方式传输。
可以使用HTTPS加密的方式,但这种方式或许会影响用户体验。即使使用了HTTPS访问,也会有明文传输的问题。这是因为在敏感信息在客户端的应用层往传输层传送时未做加密,当客户端被攻破或者存在病毒时,用户名密码等敏感信息是可能被窃取到的。这时在网站前端做加密处理后再进行传输,就显得很有必要。
6 安全漏洞扫描
安全漏洞扫描主要侧重于因应用的版本漏洞、未限制远程访问协议等引起的安全问题,这些安全问题很可能为攻击者提供潜在攻击信息,间接助力攻击者进行攻击。下面列出了几条这种类型的问题及解决方法:
(1)安装的应用程序存在安全漏洞时,要及时升级补丁、升级版本;
(2)远程主机会回复ICMP_TIMESTAMP查询并返回它们系统的当前时间,这可能允许攻击者攻击一些基于时间认证的协议。建议在防火墙上过滤外来的ICMP timestamp报文以及外出的ICMP timestamp回复报文;
(3)攻击者可以利用Traceroute探测来获取扫描器与远程主机之间的路由信息,通过这些路由信息来了解目标网络的网络拓。建议在防火墙中禁用Time Exceeded类型的ICMP包;
(4)检测远端HTTP Server信息或通过HTTPS获取远端HTTP服务器信息,这可能使得攻击者了解远程系统类型以便进行下一步的攻击。建议改变HTTP服务器的缺省banner。
7 报告对比
在某运营平台上线之前,第三方网络安全公司分别就上文的四种检测方法进行了安全检测。我们对检测报告中出现的绝大部分问题进行了修改,仅因项目需要保留了极小部分低风险问题。表1所示为安全问题解决前后,4种检测方法的报告对比图。可以看出,经过安全整改后,系统的安全性达到了令人满意的提升。
表1 针对某运营平台整改前后的4种检测报告对比
8 小结
在某运营平台的开发过程中,采用几种常见的安全检测方法对其进行检测,对检测到的安全问题及隐患提前做出处理,大大减少了工作量、让部署交付及时完成。本文结合该平台修复安全问题的实践经历,收集检测过程中出现的典型安全问题,论述了常见的可行解决策略。希望在以后的开发过程中减少这些安全问题的出现,避免因安全问题造成人力物力的浪费、交付期限的推迟,响应护网行动,建设能打硬仗、网络安全的运营平台。