之前对一个B/S架构的系统进行了一轮基本的安全测试。项目结束,顺便做一下总结。
文章目录
前言
从传统意义上来讲,BS架构的产品,基本上包含了浏览器端可见的UI相关的service,后台的web服务框架,数据库这几个方面。 因此,一个基本的安全测试方案也应该包含对这几个方面的测试;除此之外还应该包含对代码、服务运行环境(操作系统)的测试。接下来就分别对这几个方面进行简单的描述和分析。
1. WEB应用安全
这一块主要是检查,从用户层面通过浏览器访问系统的时候,是否会对系统造成有意或者无意的损害。这里主要是防止不怀好意的人员从浏览器层面突破系统,比如通过浏览器加载执行恶意脚本等。
对于WEB应用安全的测试原理,说起来并不复杂。业界工具也大同小异,主要是通过类似爬虫的方式,逐层扫描WEB页面,检查分析页面控件的属性设置是否趋向于安全;如果页面中存在超链接,则会进入超链接对应的页面继续扫描分析。
对于这一方面的测试,业界做的比较好的工具是IBM出品的AppScan,这是一个收费的商业软件,并且可以进行集中式的license管理。能够设置扫描的深度,用到的中间件或者技术等等;通过这些设置,能够极大的缩短扫描时间,提高扫描的效率和准确度。最终输出测试报告,从两个维度对问题进行归类;一个维度是把问题根据严重程度分类,另一个维度是把问题根据类型分类。
下面两个图简单展示了IBM AppScan扫描报告的一些信息。有兴趣的可以参照我的另一篇博客。
2. WEB服务器安全
目前主流的WEB服务器有Apache、Nginx、IIS,有经验的攻击者可以通过这些WEB服务器以及其相关的特性扩展的已知脆弱性进行定向攻击和渗透踩点。
2.1 WEB服务器状态信息
举个例子,已知某个web服务器的A版本有个漏洞,攻击者可以很容易地通过这个漏洞绕到服务后台。如果攻击者通过WEB服务器状态信息发现,某个系统刚刚好用的就是这个WEB服务器的A版本,可想而知,这个系统会被瞬间攻破。对于一些有经验的开发或者运维人员,一般情况下都会修改WEB服务器真实的banner信息,或者设置banner信息不可得到。这样,攻击者要么得不到WEB服务器banner信息,要么得到一个假的banner信息。 在测试的时候,这里可以通过httprint工具来验证一下,通常渗透者也是用这个工具进行渗透测试踩点工作的。
下图就是通过httprint获取的信息,能够很容易的看出来这是不熟在CentOS上的Apache 2.2.15版本。
对于不同的WEB服务器有不同的修改方法。 比如Apache,可以修改httpd.conf文件,例如” ServerSignature On” 修改成 “ServerSignature Off”。
2.2 WEB服务器SSL版本控制
目前有些版本的SSL被证明是不安全的,系统开发过程中要避免使用这些不安全的SSL版本。对应Apache来说,也是在httpd.conf配置文件中来设置支持的SSL版本信息,这样一来,对于跟列表中版本不一致的SSL请求,全部拒绝。
正常情况下,这里的一般配置格式是 SSLProtocol -ALL +TLSvxx +TLSvxx ,可以理解为先拒绝所有版本,再添加指定版本。
2.3 WEB服务器目录列表
这里主要是检查,是否能够随随便便就得到WEB服务器的目录列表,这是很危险的,渗透者不仅仅能够获得WEB服务器的目录结构,还可能从中很容易的获取一些重要敏感配置信息。这里推荐一个目录扫描神器——DirBuster。具体的使用和配置不在本文讨论范围之内,这里仅仅从哲学层面提供思想和方法(听起来挺牛逼的哈)。也可以用其它类似的工具,例如wwwscan、cansina等。
3. 数据库安全
不同的数据库有不同的安全检查与配置项。这里以MySQL为例进行简单阐述。
3.1 mysqld管理员用户检查
检查my.cnf配置文件,查看mysqld的管理员用户配置。这里最好设置为一个独立的普通用户,最好不要使用root用户。
3.2 数据库用户检查
缺省情况下,mysql数据库安装好以后,可能会存在匿名用户、空密码的localhost或者root用户等。另外,如果系统需要某个数据库用户远程访问数据库,那需要设置该用户远程接入数据库的地址白名单。
如下图,这个数据库的设置显然是不够安全的,除了最后一个用户之外,其他都是空密码的用户,需要删除。
3.3 Log与历史命令
当用户操作数据库的时候,可能会有一些敏感信息保存在log文件或者history文件中,这也是不安全的。这里应该重点关注“.bash_history” 和 “.mysql_history”这两个文件,最好删除掉,并且避免数据库继续生成这两个文件。接下来我们看看为什么要这样子。
这是在测试服务器上列出来的两个文件。
接下来我们看看文件里面记录了啥内容。先来看看.bash_history文件中的内容,妥妥的,所有命令记录啊。
再来看看.mysql_history文件,底裤都没穿啊。
修改方法也很简单,删除对应文件,并link到空设备。
# rm .bash_history .mysql_history
# ln -s /dev/null .bash_history
# ln -s /dev/null .mysql_history
3.4 mysql_secure_installation
事实上,当安装mysql的时候,会有一个名为mysql_secure_installation的工具被自动安装,通过这个工具可以自动进行一些安全相关的设置。
```powershell
# cd /usr/bin/
# ./mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):enter
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n]Y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n]Y
... Success!
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] Y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n]Y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!```
4. 端口检查
这一块没有太多要讲的,主要是通过端口扫描工具(例如NMAP)列出所有已经打开的端口,然后根据业务需要,关闭不需要的端口,修改链接的默认端口。
5. 操作系统扫描与加固
操作系统本身也会有漏洞,一般社区或者厂商也会定期发布系统补丁,这一步是定期执行的工作,主要是扫描查看操作系统当前是否含有漏洞以及没有安装的补丁。现在业界也有不少自动扫描并执行加固的套件可以选择。Nessus 就是一款比较好的操作系统漏洞扫描工具。
6. 代码扫描
最后,从多层防护立体防御的角度来讲,开发的源代码也是需要进行安全扫描的。这里主要检查是否采用了不安全的算法,不安全的函数定义,不安全的随机数等等。
7. 写在最后
其实网络安全领域,攻与防是一个相辅相成的状态,新的攻击手段会促进新的防御手段;反过来,新的防御技术也会影响攻击手段的多样化。在各种技术日新月异的当今,网络安全测试与评估也越来越复杂化,多样化。 这里仅仅列举了一点最基本的思路,仅仅想靠这些完成一个系统的网络安全评估是远远不够的。需要网络安全从业人员不断的学习和研究新的攻防技术。