随着国家对网络安全的重视,国内各个企业也开始在安全方面增加投入,我们公司也不例外。作为防守方,实时了解主机状态(主机文件是否被修改?是否有被入侵?等等)以及实时获取告警信息,是很重要的。及时反制入侵行为、及时修复系统,将入侵扼杀在摇篮阶段。于是引入了HIDS(主机入侵检测系统),网上关于HIDS的文章比较少、内容也不尽完善,下面是我自己在搭建HIDS时的记录。
常用的主机入侵检测系统
AIDE(Advanced Intrusion Detection Environment):高级入侵检测环境,CIS
OSSEC:开源的、跨平台的主机入侵检测系统,官网:https://www.ossec.net/
等等
OSSEC
功能
1、文件完整性检查即文件篡改检查(syscheck)
2、日志监控
3、rootkit检测
4、主动响应:主动反制,匹配到规则后主动采取措施,如:检测到sshd日志存在多次失败登录后,将登录的源地址加入黑名单。
5、告警:通过配置实现邮件等方式的告警
安装
1、local:本地安装,只在一台设备安装,检测本台设备
2、server-agent:服务+代理模式安装
server安装在一台设备,agent安装在其他设备,agent收集各个设备的信息,然后发送给server,server统一进行分析、告警、主动响应、统一管理各个agent。
# 在server和agent上安装依赖 及 yum 远程库
yum install zlib-devel pcre2-devel make gcc zlib-devel pcre2-devel sqlite-devel openssl-devel libevent-devel
yum install mysql-devel
wget -q -O - https://updates.atomicorp.com/installers/atomic | sudo bash
# Server
sudo yum install ossec-hids-server
# Agent
sudo yum install ossec-hids-agent
3、agentless:无代理
和server-agent的方式类似,但是只有server没有agent即不需要在设备上安装agent,server通过ssh去进行监控和扫描各个设备。
本次实践,使用server-agent方式
组件
1、server
# 各个进程
ossec-maild # 邮件告警
ossec-execd # 应该是执行主动响应及各种自定义的命令(猜的)
ossec-analysisd # 日志分析服务
ossec-logcollector # 日志收集
ossec-remoted # server和agent通信
ossec-syscheckd # 完整性检测包括rootkit
ossec-monitord # agent监控
2、agent
# 各个进程
ossec-logcollector # 日志收集器
ossec-syscheckd # 完整性检测包括rootkit
ossec-agentd # agent客户端
ossec-execd # 应该是执行主动响应及各种自定义的命令(猜的)
详解
配置
首先说一下配置,在使用过程中,可能发现配置文件好多,里面内容也很类似。
日志监控/分析
日志监控/分析由OSSEC中 logcollector和analysisd进程来完成的。首先,日志收集器手机日志,然后分析进程分析(解码、过滤、分离)事件。日志监控和分析时实时进行的。
重点:
1、实时监控
2、在server上进行日志分析
3、存储时间由用户配置
配置
在每个代理的ossec.conf或共享的agent.conf中配置。
如:
<localfile>
<log_format>syslog</log_format>
<location>/var/log/messages</location>
</localfile>
# 在<localfile>元素内部,可以使用下面的选项
<location> #指定读取的日志位置,strftime格式可用于日志文件名。例如,file.log-2011-01-22可以使用引用名为的日志文件file.log-%Y-%m-%d。通配符可以在非Windows系统上使用。使用通配符时,日志文件在ossec-logcollector启动时必须存在。它不会自动开始监视新的日志文件。strftime和通配符不能用于同一条目。
<log_format> #日志格式,默认是syslog。可选:snort-full、eventlog、mysql_log、apache、command等
日志监控之rules配置
rules 匹配顺序:先匹配0级的,如果0级 没有匹配到,将所有规则按照level 降序的顺序排列(level相同的,按照rules 加载顺序排列),开始从最高级往下匹配,知道匹配到。
如果我们需要在已匹配到的规则的基础上,继续匹配,则可以用:<if_sid><if_sid>
日志检测规则,测试程序:/var/ossec/bin/ossec-logtest
先输入要进行测试的日志内容
phase 1 、2 是解码器解码(将日志进行解释、进行处理)阶段,3是匹配rules阶段
syscheck-完整性检测
syscheck是OSSEC中完整性检查过程的名字。属于OSSEC的一部分。syscheck定期运行,来检查是否有文件被修改。
syscheck通过关键文件的 MD5/SHA1 校验值是否改变来判断是否完整。
agent每几个小时(用户自己配置)扫描一次系统并且将校验值发送给server。server存储校验值并且对比校验值,如果校验值发生改变则发出告警。
数据存储位置:/var/ossec/queue/syscheck
ossec-syscheckd 提供了几乎实时地检查文件完整性。linux 上需要安装 inotify-tools
配置
所有的配置都可以在agent的etc/ossec.conf中进行配置,除了auto_ignore和alert_new_file,它们适用于管理器和本地安装。ignore如果在管理器上指定,则适用于所有的agent。
<directories></directories> 监控目录,目录中的文件和子目录也将监控
# 默认
<directories check_all="yes">/etc,/usr/bin,/usr/sbin</directories>
# 属性
realtime=yes #这样启用在Linux(使用inotify系统调用)和windows上的实时/连续监控,实时监测只适用于目录
report_changes=yes # 报告文件更改的差异,仅限于文本文件,只适用于类unix系统
check_all=yes #除了显式指明为no的属性,其他 check_* 的属性都是yes
check_sum=yes #检查文件的md5 和 sha1 哈希值 等价于 check_sha1sum ="yes"和check_md5sum ="yes"
check_sha1sum=yes #仅检查sha1哈希值
check_md5sum=yes #仅检查md5哈希值
check_size=yes #检查文件的大小
check_owner=yes #检查文件所有者
check_group=yes #检查文件所属组
check_perm=yes #检查文件或目录的权限
restrict=string #限制检查文件或目录名包含该字符串的文件
no_recurse=no #不要递归到定义的目录
server和agent通信
默认server和agent之间以安全模式在端口 1514/udp上进行。还可以使用系统自带的syslog服务(514/udp)进行通信。
通信由 ossec-remoted实现
通信配置:
vim etc/ossec.conf
<ossec_config>
<remote>
<conection>secure</connection> # 指定连接类型:secure:1514端口通信,syslog:514端口通信
<allowed-ips>10.251.1.0/24</allowed-ips> # 设置允许连接server的ip。其他配置参考:https://www.ossec.net/docs/docs/syntax/head_ossec_config.remote.html
</remote>
</ossec_config>
集中管理agent配置
在server创建agent配置
vim etc/shared/agent.conf
server缓存了共享的agent.conf每几个小时会重新读取。所以修改了共享文件后,如果要立即生效,则需要重启server
如果agent同步了server共享的agent.conf,则会在Client version 字段中 表明配置文件的md5值
给特定agent进行特殊配置
<agent_config name="agent1">
<localfile>
<location>/var/log/my.log</location>
<log_format>syslog</log_format>
</localfile>
</agent_config>
# 可以通过指明agent name的方法对agent1进行独特的配置,此配置只在agent1 生效,当然还有其他办法,可以查看官方文档
告警配置
邮箱告警
默认情况下,ossec的邮箱配置是关闭的。邮件告警由 ossec-maild 这个进程实现的,只有配置了邮件告警,启动ossec-server时才会启动这个进程
vim etc/ossec.conf
邮件告警只需要在server端进行设置即可。
由于ossec-server设置邮件告警的smtp服务器时,没有提供设置用户名和密码的地方,所以使用的smtp必须是不需要认证的smtp服务器,一般直接使用centos自带的postfix即可
<ossec_config>
<global>
<email_notification>yes</email_notification> # 开启邮件告警
<smtp_server>localhost</smtp_server> # 设置smtp服务器,由于ossec未提供用户名和密码配置,所以只能使用没有认证的smtp,所以只能用自定义的smtp,一般使用主机自带的
<email_to>ossecm@localhost</email_to> # 设置收件人
<email_from>ossec-dev@supertramp.localdomain</email_from> #设置发件邮箱,没有实质用处,只是在收件人邮箱中展示发件人信息
</global>
<alerts>
<log_alert_level>1</log_alert_level> # 设置往alert.log 中记录的告警最低等级
<email_alert_level>1</email_alert_level> #设置邮件告警的最低告警级别
</alerts>
上面设置了将告警邮件发送到ossecm@localhost 这个本机的邮箱,如果我们想发送到外网邮箱:
vim /etc/aliases
ossecm: 1234567890@qq.com # 设置smtp 将发送到ossecm的邮件,转发到 1234567890@qq.com 需要重启smtp即postfix
当然还有其他很多告警方式,如:将告警数据存到数据库,为自定义的告警程序提供数据
将告警数据存到数据库
#安装依赖
yum install -y mysql-devel
#启用数据库
bin/ossec-control enable database