Linux主机安全检查与应急响应

我们在做主机安全检查或安全事件处置时,避免不了要去检查系统的安全情况。在进行Linux安全检查时,需要使用相关的脚本对系统的安全情况进行全面分析,一方面需要尽可能的收集系统的相关信息,另一方面在数量较多的时候尽可能的提高效率。

Linux

由于在多次的安全检查中遇到检查时都是几十台服务器要做一个全面检查的情况,如果人工手写脚本的话,一方面效率较低另一方面需要安全检查者熟悉所需要检查的项。

在这种情况下,本人写了一个Linux安全检查的脚本,该脚本主要在以下场景使用:

Linux主机安全检查时; Linux主机发生安全事件需要全面分析时。

该脚本完成有一段时间,最近在应急响应群里讨论,发现这块的安全检查是大家的一个强需求,因此把该检查脚本共享给大家,共享的目的主要以两个:一是提高大家在Linux安全检查时的效率,释放大家的精力;另一方面希望大家在使用的过程中可以不断地发现问题,不断的总结缺少的安全检查项,协助完善该检查脚本。所以大家在使用过程中有任何问题或建议欢迎及时同步给我。

一、检查内容

1. 整体框架

关于Linux安全检查,这里面我总结主要需要检查以下内容:

(1) 系统安全检查(进程、开放端口、连接、日志等)

这一块是目前个人该脚本所实现的功能;

(2) Rootkit

建议使用rootkit专杀工具来检查,如rkhunter;

(3) Webshell

这一块查杀技术难度相对较高,不是本脚本所需要实现的功能,针对这一块的检查可以使用D盾来检查 (Linux下可以将web目录挂载到Windows下进行检查);

(4) Web日志

(5) 流量

这一块主要侧重主机的长期的流量分析,目前个人使用tshark实现了基础的流量分析,后期会进行相应的完善。流量这一块可以提取流量五元组、DNS流量、HTTP流量再结合威胁情报的数据进行深度分析。这个后期个人会进行相关的尝试,可能的话会进行相应内容的分享。

2. 系统安全检查框架

image.png

image.png

二、功能实现

1. 功能设计

V1.0 主要功能用来采集信息 V1.1 主要功能将原始数据进行分析,并找出存在可疑或危险项 V1.2 增加基线检查的功能 V1.3 可以进行相关危险项或可疑项的自动处理

目前到V1.2版本,后期完善V1.3相关的功能。

另外,操作上可以实现一键进行安全检查,并将检查后的结果保存到本机。只需要在hosts文本中输入相应的IP、账号、密码。操作上人工参与最小化。

2. 各脚本功能说明

下载后相关整个脚本的目录结构如下所示:

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高危端口的判断逻辑,主要还是根据木马默认使用的端口号,这里面判断的逻辑相对简单,可能会存在误报的情况,所以后续需要人工介入分析。

image.png

(2) buying_linuxcheck.sh

核心的功能收集与判断逻辑,比较简单的判断逻辑可以放在这里面进行判断。

image.png

三、使用

使用比较简单,将本脚本拷贝到自己一台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密码。

image.png

这里面被检查的服务器允许root直接登录,因此直接写root账号和密码。

(2) 运行安全检查脚本:sh login.sh

安全检查脚本就在后台运行了,稍等…….

image.png

(3) 看到删除远程服务器上的检查脚本与检查结果,就说明检查结束了。

image.png

(4) 检查结束后,会将远程服务器上的结果保存到本地主机上:

image.png

四、检查结果说明

检查结束后,将相应的结果解压后目录结构如下所示:

image.png

1. Check_file

保存的是检查的最终结果,长这个样子……

image.png

2. Log

目录中保存的是Linux系统日志,web日志这块目前脚本没有实现自动打包的功能,原因就是web日志经常太大,并且保存的日志可能从运行到现在的所有日志,很多日志并不需要进行检查与分析,因此在检查时相关人员可以根据具体情况进行打包相应的日志。

image.png

3. danger_file.txt

保存的是在安全检查过程中发现的问题:

image.png

4. sysfile_md5.txt

保存的是系统关键文件或系统文件的MD5值,之所以将这些关键文件的MD5记录下来主要有两个功能:一是周期性的检查时,可以与***次的结果进行对比,若有变动会提示;另一个是可以将这些关键文件的MD5值跑一下威胁情报库或virustotal以发现可能存在的系统文件被替换的情况。

image.png

五、代码下载

相关代码已上传到github,有需要可自行下载,有问题也可以直接联系:

https://github.com/T0xst/linux