前言
本系列文章将对HIDS做个简介,互联网团队自研一个HIDS系统,需要研发、策略、运营。研发和运营将不做介绍,本系列就对HIDS的核心(安全策略)做个简单的研究。基本上是根据自己的整理的思维导图做个梳理(暂时只研究linux的策略):
介绍
主机入侵检测系统(HIDS)是基于主机的入侵检测系统,部署在需要防护的主机服务器上的代理程序,用于监控和报告系统配置和应用程序活动。一些常见的功能包括日志分析,完整性测试、策略实施和rootkit检测。自研的HIDS可以针对特定用例进行定制,使得安全研究中可以及时方便的构建自定义规则。目前开源的入侵检测系统有大名鼎鼎的ossec、国内开源的yulong以及facebook的osquery。HIDS检测的核心数据包含命令、网络、文件三大类型,文件产生进程、进程产生网络。HIDS的各种安全策略都是通过这3种类型进行安全分析而得出的规则。
架构
目前大部分的HIDS平台建设主要分三大部分:终端Agent监控组件,Dashboard控制面板和与SIEM、运维数据等其他平台对接的接口集合。
终端Agent组件:主要作用包括监控文件变更、监控服务器状态、下发一些操作指令等。
DashBoard:用来执行一些策略推送、资源管理方面的操作
MQ && Servers:用来做负载均衡并吞吐数据到数据库
Database:数据库
SIEM APIs:用来将HIDS的数据和SIEM做整合
功能
- 基础信息收集:系统版本号、系统用户、web组件、数据库、三方组件包等信息,主要用于CVE漏洞检测以及应急响应。
- 日志监控:主要是登录相关的日志、bash日志以及webserver产生的日志,主用用做异常登录监控、危险命令监控以及基础DOS检测。
- 文件监控:新增文件、敏感权限文件、核心文件变动监控、crontab文件监控,主要用于rookit检测、webshell监控等。
- 进程监控:主要用于木马、反弹shell、rookit等检测。
- 流量监控:主要用于木马,反弹shell等发生网络行为的一些异常监控。
- 系统命令监控:主要用于入侵后命令执行的检测。
信息搜集
系统基本信息
系统版本:根据操作系统解析相应
/etc/readhat-release
、/etc/redhat-release
、/etc/gentoo-release
文件系统版本信息搜集。keneral信息:解析
/proc/cmdline
和/proc/version
用户信息:通过
/etc/passwd
文件搜集用户信息,剔除nologin的用户进程信息:通过遍历/proc目录下获取所有的进程信息,取信息参考[/proc目录结构](https://common.cnblogs.com/editor/tiny_mce/plugins/preview/ http://man7.org/linux/man-pages/man5/proc.5.html )
环境变量信息:切换到各个用户,运行以下[命令](https://common.cnblogs.com/editor/tiny_mce/plugins/preview/ https://www.jianshu.com/p/fec33aed017b)。
- set命令显示当前shell的变量,包括当前用户的变量;
- env命令显示当前用户的变量;
- export命令显示当前导出成用户变量的shell变量。
已登录用户信息:已登录用户保存在
/var/run/utmp
(对应linuxwho
命令),c函数getutxent
可直接解析此文件获取信息历史登录用户信息:已登录用户保存在
/var/run/utmp
/(对用linuxlast
命令),c函数getutxent
可直接解析此文件获取信息WEB Server进程信息:通过监控到的所有的进程信息,筛选出命令行运行了
nginx|httpd|apache|tomcat|weblogic|jboss|jetty
等webserver的信息。通过/proc/[pid]/cmdline
获取到服务运行的命令行,一般是用于搜集webserver的版本号以及webserver的web代码路径。不同的webserver要通过不同的方法的命令和方法获得,例如nginx可以通过找到nginx的路径运行nginx –v
获得版本信息,通过读取/proc/[pid]/cmdline
命令行信息匹配-c的内容或者/proc/[pid]/cwd
运行目录获取到web文件的路径。数据库信息进程信息:数据库配置路径和版本的获取方法和web路径获取方法类似。
三方组件信息:三方组件包最常见的就是java的三方组件,获取方法是遍历webservers三方路径下的jar文件。如果是war文件部署,还需要把war包解压,然后再重复上述步骤遍历.jar文件获取到三方组件的名字和版本号。另一种更优雅获取组件的方式可能是解析web应用的pom.xml文件(并非所有java web应用程序都有),文件里的标签 ``管理着三方组件的信息。
其他组件的搜集(例如ThinkPHP等框架),主要也就是匹配框架指纹(可能根据robots.txt文件,可能根据一个文件里的特定内容等)这个就需要大家去网上或者自己搭建搜集指纹,可以优先常用cms的识别方法,后期可慢慢优化添加其他框架。
crontab信息:
/etc/crontab
文件保存系统计划任务,/var/spool/cron/
文件夹保存用户计划任务1
"/etc/cron.d/", // system all
2
"/var/at/tabs/", // user mac:lion
3
"/var/spool/cron/", // user linux:centos
4
"/var/spool/cron/crontabs/", // user linux:debian
上面的路径是开源HIDS里定义的
authorized信息:遍历所有加目录下的
".ssh/authorized_keys",".ssh/authorized_keys2"
文件konw_host文件:遍历所有用户家目录下的
.ssh/known_hosts
文件sudoers信息:解析
/etc/sudoers
和/etc/sudoers.d/
目录下的文件iptables信息:解析
/proc/net/ip_tables_names
文件系统控制文件:解析系统控制配置文件
系统文件路径:
/etc/sysct.conf
系统控制文件可能存在路径
1
"/run/sysctl.d/%.conf",
2
"/etc/sysctl.d/%.conf",
3
"/usr/local/lib/sysctl.d/%.conf",
4
"/usr/lib/sysctl.d/%.conf",
5
"/lib/sysctl.d/%.conf",
其他信息(非完整):
- memory_map:解析
/proc/iomem
- mounts:解析
/proc/mounts
- modules:解析
/proc/modules
- memory_info:解析
/proc/meminfo
- shared_memory:通过
shmctl
函数遍历merory id从1遍历到最大 - uptime:通过
sysctl
函数获取boottime
- memory_map:解析
重要文件监控
这项功能实现很简单,就是定时计算整个目录下文件或者单个的Hash值并存储起来。但是哪些文件属于重要文件就需要安全人员去研究定义,这个过程可能不是一蹴而就,一方面可能新的漏洞层出不穷,一方面是受限于个人的知识点有限,无法梳理出所有通用的漏洞策略。以下是一些我的不完全整理:
/bin/ps
、/bin/netstat
、/usr/sbin/lsof
、/usr/bin/top
等命令:rookit时候hacker可能会替换这些系统命令libc.so文件:ubuntu平台
/usr/lib/x86_64-linux-gnu/libc.so
,centos平台/lib64/libc.so.6
。查看某个平台具体的libc.so文件路径,可以运行ldd ls | grep libc.so
。开机启动文件:
/etc/init.d是 /etc/rc.d/init.d 的软链接,测试新装的linux系统必须开启的服务
ssd、rsyslog、network、crond
[/etc/rc.local](https://common.cnblogs.com/editor/tiny_mce/plugins/preview/ https://www.landui.com/help/nshow-8196.html )
基于白名单过滤,查找异常的执行命令
基于已知的特征做数量统计或异常行为分析。
/etc/profile文件:本文件可设置全局的系统变量。
内核模块:
ls -alt /sys/module
预加载文件:
/etc/ld.so.preload
suid文件监控:全局搜索是不太现实,一般服务器负载都比较高,全局搜索耗时和对系统负担大。
1
"/bin",
2
"/sbin",
3
"/usr/bin",
4
"/usr/sbin",
5
"/usr/local/bin",
6
"/usr/local/sbin",
7
"/tmp",
搜索上述几个路径的文件,判断权限是suid和guid
日志搜集
- /var/log/secure:Linux系统的安全日志,记录用户和工作组变化情况、用户登陆认证情况。一般入侵告警ssh被尝试爆破就是通过这个文件来进行规则制定的。
- /var/log/wtmp:该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,这个文件是二进制文件,cat查看不了,可以使用last命令查看。此文件可用于异常用户登录检测,通过检测异常的IP和登录地进行告警。
- history日志:监控用户输入的历史命令,后续会讲到具体做法。
- webserver日志:主要用于应急响应或者做些cc攻击的防御,是否集成到HIDS里有待商榷。定位到日志的具体路径是难点,做简单的cc攻击防御的话,最简单可以通过ip时间段内访问频率来设置防御策略。
参考:
https://www.freebuf.com/articles/es/197337.html
https://www.freebuf.com/articles/es/194510.html