企业安全实践(基础建设)之HIDS(上)
前言
HIDS运行依赖这样一个原理:一个成功的入侵者一般而言都会留下他们入侵的痕迹。
背景
在主机系统这个层次的安全检查,其实我更加关注的是主机的重要变化情况,如它创建了哪些进程、添加哪些账户、启用了哪些服务、修改了哪些文件等,都是我关注的重点,相对于OSSEC的大量误报,我更加倾向于Osquery的精准。
Osquery
Osquery是一款由facebook开源的,面向OSX和Linux的操作系统检测框架,通过Osquery的SQL表可以提供诸如正在运行的进程,已加载的内核模块,已打开的网络连接,硬件事件等等信息。集成osquery可以实现快速监控发现系统的安全状况
项目主页: http://osquery.io/ 代码托管地址: https://github.com/facebook/osquery
下载
安装以Centos 6/7 为主,运行也较为稳定,下载也分为不同版本
Centos 6 可直接执行rpm包,不存在其他依赖: wget https://s3.amazonaws.com/osquery-packages/centos6/x86_64/osquery-2.4.6-1.linux.x86_64.rpm Centos 7 可直接执行rpm包,不存在其他依赖: wget https://s3.amazonaws.com/osquery-packages/centos7/x86_64/osquery-2.4.6-1.linux.x86_64.rpm
下载到的rpm可直接在内部做成rpm源,根据系统版本的不同安装不同的rpm。
安装
安装较为简单。如下
sudo rpm -ivh centos6_osquery-2.4.6-1.linux.x86_64.rpm 或 sudo rpm -ivh centos7_osquery-2.4.6-1.linux.x86_64.rpm
运行测试
判断安装成功与否,可以根据版本来判断
$ osqueryi -version #大规模部署时可根据此命令来判断是否安装成功 $ osqueryi #可通过此命令来手动使用osquery

$ osquery> select * from users; #例子命令,可通过此命令查询当前系统的用户情况
$ osquery> select * from users where uid=0; #例子命令,可通过此命令查询当前系统UID为0的用户信息


配置
要配置自动化监控,就要接触它的配置项,osquery配置选项还是比较简单的。
osquery 默认加载配置文件/etc/osquery/osquery.conf,也可通过参数osqueryd –config_path来指定启动时使用的配置文件。
创建osquery配置文件,也可直接使用我开源项目中的测试规则。
vim /etc/osquery/osquery.conf

解析配置文件
osqueryd.conf是osqueryd的配置文件,json格式。可以看到上述配置文件包含了options,schedule,decorators,packs几个部分。下面分别来进行介绍。
Options
options里主要包含的是osquery daemon的一些配置。这里主要介绍几个:
logger_path 日志路径,产生结果的路径
worker_threads worker的线程数(并不是越大越好,根据自己任务的多少设定)
host_identifier 在产生result时候的主机标识
Decorators
decorators主要用于在记录result的时候,添加额外的信息到decorations中。decorator分为三种,load,always,interval。
decorator的查询结果最多只能有一行(可以为空)。
load: 在配置加载的时候,执行一次,并记录结果,之后在每次decorations添加的是加载时的执行结果
always: 每次记录result的时候执行,并在decorations中添加执行结果
interval: 配置是一个字典。只有当匹配中对应的key时,才进行执行,并添加执行结果
Schedule
定时执行的任务。该任务会定时去执行SQL查询,并生成result和snapshot记录。其配置样例如下:
{
"schedule": {
"system_info": {
"query": "SELECT hostname, cpu_brand, physical_memory FROM system_info;",
"interval": 60,
"removed": false,
#"snapshot":true
}
}
}
schedule是一个字典。key就是每个schedule的name,value是每个schedule的配置。比如这个system_info即是schedule的name。
在schedule的配置里
query: 查询的SQL语句
interval: 查询间隔,单位时间为秒
removed: 是否生成减少的记录
snapshot: 是否是snapshot类型(默认为result)
Packs
packs可以看做是一系列schedule的集合。osquery提供了一些常用的查询。在配置文件里,可以做如下配置:
{
"packs": {
"process-monitor": "/etc/osquery/process-monitor.conf"
}
}
在process-monitor.conf 可加载配置如下:
{
"discovery": [
"select pid from processes where name = 'zooker';",
"select count(*) from users where username like 'www%';"
],
"queries": {
"pack_proc_num":{
"query": "select count(*) as num_proc from processes;",
"interval": 60,
"removed": false
}
}
}
discovery是用于判定是否在该host上执行queries。discovery是一个列表,包含多个SQL查询。多个查询结果直接是or关系。
如上例,如果该host上存在一个zooker的进程或者存在以www开头的用户名,则执行queries。这个discovery的判断只在配置加载时做一次判断。
queries是一个字典。其格式和内容与schedule一致,用于执行定时任务。
日志结果
osqueryd 可以以日志的方式,记录下其工作和执行结果。日志默认保存在/var/log/osquery中。/var/log/osquery中主要有两种日志:运行日志和结果日志。
运行日志
osqueryd.INFO 和 osqueryd.WARNING:主要记录了osqueryd运行时的一些日志。
结果日志
osqueryd.results.log 和 osqueryd.snapshots.log:主要记录了osqueryd定期执行的查询的结果。
osqueryd.results.log 代表差异记录,如增加、减少。如果没有改变,则不生成。
osqueryd.snapshots.log 代表对每次查询结果的记录。
结果都以json形式保存,如图:


开源项目
项目地址
https://github.com/grayddq/HIDS
项目介绍
本项目由两部分组成:一部分osquery、另一部分监控脚本来补充osquery规则的不足; 本文是第一部分osquery规则部分,实现绝大部分主机信息监控。
作者
咚咚呛,如有其他建议,可联系微信280495355
满足安全需求
1、支持大部分Centos6-7、winodws系统等。 2、可记录主机的信息变更情况,如账户、进程、网络连接等等; 3、变更结果记录到日志中;
技术细节
1、监控主机信息如下: 1)对公网访问的网络连接增加情况 2)进程增加情况 3)对外端口侦听增加情况 4)arp缓存变化情况 5)authorized_keys公钥差异变化 6)crontab定时任务差异变化 7)DNS映射表差异变化 8)etc_hosts信息差异变化 9)etc_services 差异变化 10)groups 本地系统组差异变化 11)iptables 防火墙差异变化 12)系统登录和登出差异变化 13)主机系统的主动路由表差异变化 14)应用程序和二进制文件设置为用户/登录启动项,差异变化 15)通过sudo作为其他用户运行命令的规则差异变化 16)主动插入主机系统的USB设备差异变化 17)本地系统用户组关系差异变化 18)系统用户差异变化 2、监控任务都是周期定时执行的,网络连接和进程是每5分钟执行一次,其他监控都是1小时执行一次,监控时间可自行修改;
测试环境
centos 7、6
部署
1)根据系统同版本,下载osquery $ wget https://s3.amazonaws.com/osquery-packages/centos7/x86_64/osquery-2.4.6-1.linux.x86_64.rpm $ wget https://s3.amazonaws.com/osquery-packages/centos6/x86_64/osquery-2.4.6-1.linux.x86_64.rpm 2)根据系统版本,安装osquery $ sudo rpm -ivh centos6_osquery-2.4.6-1.linux.x86_64.rpm $ sudo rpm -ivh centos7_osquery-2.4.6-1.linux.x86_64.rpm 3)拷贝 osquery.conf 和 secrity.conf 到 /etc/osquery/目录下 4)启动osquery服务 $ sudo /etc/init.d/osqueryd restart
配置
安全监控规则在文件secrity.conf中,可自行修改,其中包含主要几项,query、interval、removed。
query: 查询的SQL语句
interval: 查询间隔,单位时间为秒
removed: 是否生成减少的记录
如:
"users": {
"query" : "select * from users;",
"interval" : 3600,
"removed": false
}
日志结果
osquery的监控结果以日志形式表现,默认保存在/var/log/osquery/中,可通过日志服务器同步/var/log/osquery/osqueryd.INFO文件进行告警。
Via: freebuf

