一、背景说明
当前在服务上线前,安全部门都会对服务基线配置进行把关,整个流程可以分为扫描、生成报告、修复三步。
在执行这一流程时当前普遍的做法是半自动化的,扫描和生成报告是自动化的,执行扫描、执行生成报告和修复都是手动的。
这里我们要讲的,一是扫描脚本和生成报告脚本实现,二是执行扫描、执行生成报告和修复自动化实现。
二、项目说明
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.html404.htm500.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 总体设计思路
分扫描、生成报告、生成修复脚本、修复脚本四个部分。
扫描直接使用shell脚本做,因为如果使用python等语言,一是要确保目标机装有python二是即使用python最终很多还是使用os模块执行shell命令。
扫描只获取大致结果,不做具体合规分析,因为shell判断合规比较复杂。
生成报告使用python,其读取扫描返回的结果,进行合规分析并生成html报告
生成修复脚本使用python,其解析上步生成的html报告,针对不合规项生成修复脚本。
修复脚本使用shell,修复脚本还会生成简单日志,供修复出问题时排查使用。
为了简化修复脚本完全根据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.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用户名密码,传文件还要我手动输用户名密码是智障吧而且找了半天找不到解决办法)
四、操作演示
演示机器----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
报告部分截图如下:
二次扫描结果如下:
五、源代码
github:https://github.com/PrettyUp/Security-Baseline
参考: