安全基线自动化扫描、生成报告、加固的实现(以Tomcat为例)

1、背景说明

当前在服务上线前,安所有门都会对服务基线配置进行把关,整个流程能够分为扫描、生成报告、修复三步。html

在执行这一流程时当前广泛的作法是半自动化的,扫描和生成报告是自动化的,执行扫描、执行生成报告和修复都是手动的。python

这里咱们要讲的,一是扫描脚本和生成报告脚本实现,二是执行扫描、执行生成报告和修复自动化实现。git

 

2、项目说明

2.1 检测项

1. 删除示例文档
删除webapps/docs、examples、manager、ROOT、host-manager
禁用tomcat默认账号
以下所示,将conf/tomcat-user.xml中的全部用户的注释掉(tomcat默认已不启用帐号,若是启用请修改用户名及密码)
<!--
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
-->

2. 禁止列目录
编缉conf/web.xml,确认serlet标签内是否已存在如下内容
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>

3. 自定义错误页面
编缉conf/web.xml在倒数第1行以前加
<error-page>
<error-code>401</error-code>
<location>/401.htm</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.htm</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.htm</location>
</error-page>
而后在webapps目录中建立相应的401.html\404.htm\500.htm文件;固然也能够修改为其余任意自定义错误文件。

4. 开启访问日志
修改conf/server.xml,取消注释
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
启用access_log后,重启tomcat,在tomcat_home/logs中能够看到访问日志。
隐藏版本号
使用winrar等工具打开lib/catalina.jar,编缉其中的org/apache/catalina/util/ServerInfo.properties,将server.info和server.number两项的版本号都去掉,改为以下形式而后保存
server.info=Apache Tomcat
server.number=

5. 修改默认监听端口 编缉conf
/server.xml把8080改为其余端口 6. 不以root/admin用户运行程序 如非必要不要以root/admin帐号运行tomcat。另外注意非root用户默认不能使用1024如下端口。

 

2.2 整体设计思路

分扫描、生成报告、生成修复脚本、修复脚本四个部分。github

扫描直接使用shell脚本作,由于若是使用python等语言,一是要确保目标机装有python二是即便用python最终不少仍是使用os模块执行shell命令。web

扫描只获取大体结果,不作具体合规分析,由于shell判断合规比较复杂。shell

生成报告使用python,其读取扫描返回的结果,进行合规分析并生成html报告apache

生成修复脚本使用python,其解析上步生成的html报告,针对不合规项生成修复脚本。ubuntu

修复脚本使用shell,修复脚本还会生成简单日志,供修复出问题时排查使用。tomcat

为了简化修复脚本彻底根据html报告生成,而不本身再去判断当前是否合规须要修复(否则python部分就没什么意义了)安全

任务 语言 说明 输出
扫描 shell shell只获取大致信息并不进行判断是否合规  $IP_tomcat_info.xml
生成报告 python 解析$IP_tomcat_info.xml生成html报告  $IP_tomcat_report.html
生成修复脚本 python 根据$IP_tomcat_report.html对不合规项生成修复脚本  $IP_tomcat_fix.sh
修复 shell 对不合规项进行修复 $IP_tomcat_fix.log

 

 

 

 

 

 

 

 

3、具体实现

目录结构以下图

 

3.1 手动执行过程

第一步,将1_scanner/tomcat_baseline_scanner.sh上传到要扫描的主机上执行(修改其中CATALINA_HOME为要扫描的tomcat的主目录)

第二步,将1_scanner/tomcat_baseline_scanner.sh在生成的/tmp/$IP_tomcat_info.xml取回放到2_info目录下

第三步,执行3_parse/tomcat_baseline_parse.py其会自动解析2_info目录下的全部$IP_tomcat_info.xml并在4_report目录下生成各自对应的$IP_tomcat_report.html

第四步,点开4_parse便可看到各$IP_tomcat_info.xml对应的$IP_tomcat_report.html

第五步,执行5_parse/tomcat_baseline_fix.py其会根据4_report/$IP_tomcat_report.html在6_fix目录下生成修复脚本$IP_tomcat_fix.sh

第六步,将$IP_tomcat_fix.sh上传到对应主机执行,并将生成的/tmp/$IP_tomcat_fix.log取回放到7_log

 

3.2 全自动化

咱们前面说的是全自动化,但上面明显有不少手动操做。

其实整个流程的自动化能够分为两类,一类是扫描、生成报告、修复自己的自动化,二是扫描、生成报告、修复串联的自动化。

咱们2.1已将扫描、生成报告、修复自己实现自动化,串联本质是一串shell命令其自动化咱们使用ansible实现。

(不少人都说ansible好用但要我以为很复杂,好比下面使用用户名密码方式我都指定了ssh用户名密码,传文件还要我手动输用户名密码是智障吧并且找了半天找不到解决办法)

 

4、操做演示

演示机器----192.168.220.136(ansible、操做系统Kali)、192.168.220.143(目标机、操做系统Ubuntu16.04)

如下操做都是在ansible机器上操做,目标机的工做就只是保证在待扫描目录(如今是/opt/apache-tomcat-8.5.35)下装有tomcat。

 

4.1 上传程序及安装miniconda

咱们这里上传到/opt/sec。

另外因为报告解析和修复脚本生成是python写的,因此须要安装python。

默认ubuntu安装有python,在实验中发现使用apt直接装的python一直运行报错,使用miniconda装的才成功运行(并且python命令必定要使用绝对路径),缘由不清楚。

miniconda我装到了/opt/miniconda3,下载地址:https://conda.io/en/latest/miniconda.html

额外须要安装库:pip install lxml requests-file requests-html

 

4.2 ansible及相关配置

第一步,安装sshpass。ansible本质仍是经过ssh登陆的,通常的作法是配置免密登陆但这比较危险咱们这里使用sshpass经过密码登陆。

apt-get install sshpass -y

第二步,安装配置ansible。

apt-get install ansible -y

编缉/etc/ansible/hosts在其末尾追加如下内容

[sec_control]
192.168.220.136 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=toor
[sec_control:vars]
xml_parse_path=/opt/sec/tomcat/3_parse
html_parse_path=/opt/sec/tomcat/5_parse

[sec_target]
# ip后若是有变量则这些变量是该ip的私有变量
192.168.220.143 ip=192.168.220.143 ansible_ssh_user=ls ansible_ssh_port=22 ansible_ssh_pass=toor
# 如下是本节全部机器的共用变量  
[sec_target:vars]
# 脚本上传的目录  
tmp_path=/tmp/ansible
# 扫描脚本在本地的目录  
scanner_path=/opt/sec/tomcat/1_scanner
# 扫描报告下载到的目录  
info_path=/opt/sec/tomcat/2_info
# 修复脚本在本地的目录  
fix_path=/opt/sec/tomcat/6_fix
# 日志文件下载到的目录  
log_path=/opt/sec/tomcat/7_log

编缉/etc/ansible/ansible.cfg,将如下项前的#号去掉

host_key_checking = False

 

4.3 执行扫描并修复

进入ansible目录,执行命令直接完成扫描、生成报告和加固:

ansible-playbook sec.yml 

报告部分截图以下:

 二次扫描结果以下:

 

5、源代码

github:https://github.com/PrettyUp/Security-Baseline

 

参考:

http://blog.51cto.com/wujianwei/2082880

相关文章
相关标签/搜索