我们在做主机安全检查或安全事件处置时,避免不了要去检查系统的安全情况。在进行 Linux 安全检查时,需要使用相关的脚本对系统的安全情况进行全面分析,一方面需要尽可能的收集系统的相关信息,另一方面在数量较多的时候尽可能的提高效率。由于在多次的安全检查中遇到检查时都是几十台服务器要做一个全面检查的情况,如果人工手写脚本的话,一方面效率较低另一方面需要安全检查者熟悉所需要检查的项。在这种情况下,本人写了一个 Linux 安全检查的脚本,该脚本主要在以下场景使用:
- Linux 主机安全检查时
- Linux 主机发生安全事件需要全面分析时
该脚本完成有一段时间,最近在应急响应群里讨论,发现这块的安全检查是大家的一个强需求,因此把该检查脚本共享给大家,共享的目的主要以两个:一是提高大家在 Linux 安全检查时的效率,释放大家的精力;另一方面希望大家在使用的过程中可以不断地发现问题,不断的总结缺少的安全检查项,协助完善该检查脚本。所以大家在使用过程中有任何问题或建议欢迎及时同步给我。
检查内容
1. 整体框架
关于 Linux 安全检查,这里面我总结主要需要检查以下内容:
- 系统安全检查(进程、开放端口、连接、日志等):这一块是目前个人该脚本所实现的功能
- Rootkit:建议使用 rootkit 专杀工具来检查,如 rkhunter
- Webshell:这一块查杀技术难度相对较高,不是本脚本所需要实现的功能,针对这一块的检查可以使用 D 盾来检查 (Linux 下可以将 web 目录挂载到 Windows 下进行检查)
- Web 日志:
- 流量:这一块主要侧重主机的长期的流量分析,目前个人使用 tshark 实现了基础的流量分析,后期会进行相应的完善。流量这一块可以提取流量五元组、DNS 流量、HTTP 流量再结合威胁情报的数据进行深度分析。这个后期个人会进行相关的尝试,可能的话会进行相应内容的分享。
2. 系统安全检查框架
3. 功能实现
功能设计:
- V1.0 主要功能用来采集信息
- V1.1 主要功能将原始数据进行分析,并找出存在可疑或危险项
- V1.2 增加基线检查的功能
- V1.3 可以进行相关危险项或可疑项的自动处理
目前到 V1.2 版本,后期完善 V1.3 相关的功能。
另外,操作上可以实现一键进行安全检查,并将检查后的结果保存到本机。只需要在hosts文本中输入相应的IP、账号、密码。操作上人工参与最小化。
4. 各脚本功能说明
下载后相关整个脚本的目录结构如下所示:
- checkrulues:部分判断逻辑,这里面目前仅有端口的判断逻辑,后期可以将进程、应用程序是否有漏洞等逻辑放在这里面进行安全检查,比较简单的判断逻辑直接在 buying_linuxcheck.sh 中可以实现
- buying_linuxcheck.sh:核心检查逻辑
- del.exp:删除远程服务器上的脚本与检查结果
- get.exp:获取远程服务器上安全检查的结果
- hosts.txt:需要被检查的服务器列表
- login.sh:一键进行登录检查,安全检查时只需要运行该脚本即可
- put.exp:将安全检查脚本上传到远程服务器上
- readme.txt:使用相关说明文档
- sh.exp:在远程服务器上执行安全检查脚本
下面针对其中部分脚本进行介绍
(1) Checkrules
判断逻辑主要放在两个文件中:一个是 checkrules 中,格式为 dat,这里面建议将比较复杂的判断逻辑放在这里,如下面的 TCP 危险端口这块,因为比较多,如果放在 buying_linuxcheck.sh 中则代码有些冗长,下面是 TCP 高危端口的判断逻辑,主要还是根据木马默认使用的端口号,这里面判断的逻辑相对简单,可能会存在误报的情况,所以后续需要人工介入分析。
(2) buying_linuxcheck.sh
核心的功能收集与判断逻辑,比较简单的判断逻辑可以放在这里面进行判断。
5. 使用
使用比较简单,将本脚本拷贝到自己一台 Linux 主机上,可以使用虚拟机,将需要被检查的服务器的 IP、账号、密码放到 hosts.txt 目录中,直接运行即可实现一键安全检查。
相关操作如下:
(1) 将需要被检查的服务器 IP、账号、密码写入到 hosts.txt 文件中,格式为
- IP:port:user:userpassword:rootpassword
其中 user 为普通用户的账号,port 为 ssh 登录端口, uesrpassword 为普通账号的密码, rootpassword 为 root 的密码, 只所以加个普通用户是因为有的系统做了安全策略,不允许 root 直接登录,如果被检查的服务器允许 root 直接登录,可以直接把 user 和 userpassword 写成 root 以及 root 密码
这里面被检查的服务器允许 root 直接登录,因此直接写 root 账号和密码
(2) 运行安全检查脚本,
- sh login.sh
安全检查脚本就在后台运行了,稍等…….
(3) 看到删除远程服务器上的检查脚本与检查结果,就说明检查结束了
(4) 检查结束后,会将远程服务器上的结果保存到本地主机上
6. 检查结果说明
检查结束后,将相应的结果解压后目录结构如下所示:
(1) Check_file
保存的是检查的最终结果,长这个样子……
(2) Log
目录中保存的是 Linux 系统日志,web 日志这块目前脚本没有实现自动打包的功能,原因就是 web 日志经常太大,并且保存的日志可能从运行到现在的所有日志,很多日志并不需要进行检查与分析,因此在检查时相关人员可以根据具体情况进行打包相应的日志
(3) danger_file.txt
保存的是在安全检查过程中发现的问题
(4) sysfile_md5.txt
保存的是系统关键文件或系统文件的 MD5 值,之所以将这些关键文件的 MD5 记录下来主要有两个功能:一是周期性的检查时,可以与之前的结果进行对比,若有变动会提示;另一个是可以将这些关键文件的 MD5 值跑一下威胁情报库或 virustotal 以发现可能存在的系统文件被替换的情况。
7. 代码下载
相关代码已上传到 github,有需要可自行下载,有问题也可以直接联系:
https://github.com/T0xst/linux