在CentOS系统上部署ossec-hids,核心目的不是堆砌功能,而是建立一套真正能即时阻断威胁的感知系统。很多管理员装完就以为安全了,结果要么告警被淹没,要么规则太松漏过攻击。问题的关键在于安装后的定制化调优,尤其是解码器与规则的联动。下面直接进入实操,从依赖处理到主动响应配置,每一步都针对生产环境常见痛点。

环境准备与依赖处理

CentOS 7/8的默认仓库里没有ossec-hids,需要手动添加Atomicorp仓库或从源码编译。源码编译虽然步骤多,但能获得最新稳定版且方便自定义安装路径。先安装编译工具链:

yum install -y gcc make mysql-devel postgresql-devel pcre2-devel zlib-devel libevent-devel openssl-devel

这里特意把数据库开发包都装上,因为后续要把告警入库做分析,避免二次补装导致的编译失败。如果系统是最小化安装,还需要补充wget和bzip2。下载源码包时注意校验SHA256值,这是很多教程忽略的安全细节。

编译安装与客户端/服务器模式选择

解压后进入源码目录,执行install.sh脚本时会询问安装类型。生产环境建议选"server"模式,即使只有一台机器,也按分布式架构部署,方便以后扩展agent。关键一步是勾选"enable-syscheck"和"enable-rootcheck",这两项是检测文件篡改和rootkit的核心模块。编译参数可以优化:

./install.sh
# 交互过程中选择server
# 当提示是否启用email通知时,输入smtp服务器地址
# 安装完成后不要急着启动,先修改ossec.conf

安装脚本会自动创建ossec用户和组,所有进程以此身份运行,这是最小权限原则的体现。二进制文件默认在/var/ossec/bin,配置文件在/var/ossec/etc。

核心配置文件调优

打开ossec.conf,先定位到<global>部分,把email_notification设为yes,并配置有效的smtp_server。但邮件告警容易延迟,更推荐在<syslog_output>里指定一台日志集中管理服务器,让告警实时流出。接着调整<alerts>标签下的日志级别,默认的3级会记录所有事件,改为5级以上能减少60%的冗余日志。重点修改频率控制:

<alerts>
  <log_alert_level>5</log_alert_level>
  <email_alert_level>10</email_alert_level>
</alerts>

syscheck模块的扫描频率要平衡性能与安全。生产环境建议实时监控/etc和/usr/bin,其他目录每日扫描一次。排除日志目录和数据库文件,避免I/O风暴:

<syscheck>
  <directories check_all="yes" realtime="yes">/etc,/usr/bin,/usr/sbin</directories>
  <directories check_all="yes">/bin,/sbin,/boot</directories>
  <ignore>/etc/mtab</ignore>
  <ignore>/var/log</ignore>
</syscheck>
自定义解码器与规则实战

默认规则集对SSH暴力破解的检测阈值偏高,攻击者在尝试5次后才触发告警。在/var/ossec/etc/rules/local_rules.xml里添加一条低阈值规则,能更早发现扫描行为。先写解码器抓取sshd的失败日志:

<decoder name="sshd-fail">
  <program_name>sshd</program_name>
  <regex>Failed password for (\S+) from (\S+) port \d+ ssh2</regex>
  <order>user,srcip</order>
</decoder>

然后编写规则,2次失败就触发告警并主动封锁IP:

<rule id="100001" level="7">
  <decoded_as>sshd-fail</decoded_as>
  <description>SSH brute force in progress</description>
  <same_source_ip />
  <frequency>2</frequency>
  <timeframe>60</timeframe>
</rule>

这里的frequency和timeframe组合表示60秒内同一源IP触发2次就告警,比默认的8次灵敏得多。规则ID必须大于100000避免与官方冲突。

主动响应配置:自动封锁恶意IP

告警只是第一步,ossec-hids的强大在于主动响应。在ossec.conf里启用host-deny和firewall-drop两个脚本,它们位于/var/ossec/active-response/bin。配置响应命令:

<active-response>
  <command>host-deny</command>
  <location>local</location>
  <level>7</level>
  <timeout>600</timeout>
</active-response>

这表示当告警级别大于等于7时,自动将攻击IP加入/etc/hosts.deny,封锁600秒。如果要调用iptables,则改用firewall-drop脚本,并在规则里指定执行参数。注意检查/var/ossec/etc/client.keys文件,确保主机已正确注册,否则active-response不会生效。

集成自定义脚本扩展检测能力

官方模块无法覆盖业务特有的安全需求,比如检测特定Web接口的异常调用。在/var/ossec/etc/ossec.conf里添加command监控,定时执行自定义脚本:

<localfile>
  <log_format>full_command</log_format>
  <command>/var/ossec/scripts/check_api_abuse.sh</command>
  <frequency>120</frequency>
</localfile>

脚本输出到标准输出的内容会被ossec当作日志分析。结合前面写的解码器和规则,就能对业务异常做出告警。这种扩展方式比修改源代码更安全,升级时不会丢失自定义逻辑。

性能优化与误报处理

ossec-logcollector进程读取日志文件时,默认每2秒检查一次更新。如果监控的文件数量超过200个,建议增大检查间隔到5秒,减少CPU消耗。在internal_options.conf里修改:

logcollector.sleep_after_read=5

分析引擎ossec-analysisd占用内存较多,可通过调整内存队列大小来优化。对于误报,不要直接删除规则,而是在local_rules.xml里用overwrite属性降级处理:

<rule id="100002" level="0" overwrite="yes">
  <if_sid>5715</if_sid>
  <description>Ignore known backup agent noise</description>
</rule>

把误报规则的level设为0,就彻底静默了。这种方式保留了原始规则结构,审计时能追溯。

告警数据持久化与分析

默认情况下告警只存在本地文件和syslog输出,排查历史问题时效率低下。将ossec配置为输出到MySQL或PostgreSQL,结合Grafana展示攻击趋势。先导入数据库schema:

mysql -u root -p < /var/ossec/extensions/database/mysql.schema

然后在ossec.conf里添加数据库输出:

<database_output>
  <hostname>127.0.0.1</hostname>
  <username>ossec</username>
  <password>your_password</password>
  <database>ossec</database>
  <type>mysql</type>
</database_output>

重启服务后,所有告警都会写入数据库。通过查询可以快速统计出攻击源IP排行、被攻击最多的服务等关键指标,为加固系统提供数据支撑。

日常运维与规则更新

ossec-hids的规则库需要定期更新,官方通过邮件列表发布更新通知。执行/var/ossec/bin/update_rules.py可以拉取最新社区规则,但更新前务必备份自定义文件。建议每月做一次规则review,关闭不再需要的规则,调整阈值以适应业务变化。监控/var/ossec/logs/ossec.log文件大小,设置logrotate防止磁盘写满。最后,将ossec进程加入systemd管理,实现开机自启和异常退出自动恢复:

systemctl enable ossec
systemctl start ossec

至此,一套具备实时检测、主动封锁、数据持久化的主机入侵检测系统就部署完成了。关键不在于装了多少组件,而在于每一条规则都经过实际攻击场景的验证,每一次告警都能转化为有效的响应动作。