CentOS系统正在逐步退出历史舞台,但生产环境中依然有大量CentOS 7甚至CentOS 8的存量服务器在持续运行。这些服务器一旦被攻破,后果不堪设想。在主机安全层面,光靠iptables或firewalld做网络层隔离远远不够,你需要一套能实时分析日志、校验文件完整性、并在发现异常时第一时间告警的系统。OSSEC就是这样一款开源的主机入侵检测系统,它部署灵活,几乎不挑环境,尤其适合在CentOS这类稳定版Linux上长期运行。下面直接进入安装和配置的核心环节,不绕弯子。

环境准备与依赖处理

在CentOS上安装OSSEC,最稳妥的方式是从源码编译,因为官方仓库里的二进制包版本往往滞后,且无法自定义功能模块。首先确保系统是最新状态,并安装编译所需的工具链。执行以下命令更新系统并安装依赖包:

yum update -y
yum groupinstall -y "Development Tools"
yum install -y wget inotify-tools zlib-devel pcre2-devel openssl-devel sqlite-devel

这里特别说明一下,inotify-tools并非OSSEC强制依赖,但如果你打算启用实时文件监控功能,这个包必须提前装好。zlib和pcre2用于日志解析,openssl用于通信加密,sqlite用于存储告警数据。缺任何一个,编译过程都会报错,所以一次性装全可以省去后续排查的麻烦。

下载并验证源码包

OSSEC的官方源码托管在GitHub上,直接下载最新稳定版的压缩包。截至本文写作时,3.7.0是推荐版本。进入/usr/src目录操作,保持文件结构清晰:

cd /usr/src
wget https://github.com/ossec/ossec-hids/archive/3.7.0.tar.gz

下载完成后,建议校验SHA256哈希值,确保文件未被篡改。官方发布页会提供对应的校验文件,这一步虽然简单,但在生产环境中绝不能省略。校验通过后解压并进入源码目录:

tar -zxvf 3.7.0.tar.gz
cd ossec-hids-3.7.0
执行安装脚本并选择安装类型

OSSEC提供了交互式安装脚本,运行./install.sh即可启动。这个脚本会引导你选择安装类型,对于CentOS主机,通常有三种选择:server(管理端)、agent(代理端)、local(单机自监控)。如果你只有一台服务器需要保护,选local最直接;如果有多台,选server装在一台中心节点上,其他机器装agent。这里以单机自监控为例:

./install.sh

安装过程中会询问一系列问题。语言选en,安装类型选local,安装目录保持默认/var/ossec即可。关键步骤在于邮件告警配置,脚本会提示你输入SMTP服务器地址和接收告警的邮箱。如果你的CentOS本机已经配好了Postfix或Sendmail,直接回车使用本地邮件服务;如果需要走外部SMTP,就填入对应服务器地址。后续所有安全事件都会通过这个邮箱推送,务必保证配置正确。

核心配置文件的深度定制

安装完成后,OSSEC的主配置文件位于/var/ossec/etc/ossec.conf。这个文件采用XML格式,结构清晰,但默认配置偏保守,需要根据实际场景调整。用vim打开文件:

vim /var/ossec/etc/ossec.conf

首先是全局设置中的邮件通知频率。找到<global>段,确认<email_notification>为yes,并设置<email_to>为你自己的邮箱地址。<email_maxperhour>建议设为12,避免短时间内收到大量重复告警导致邮箱被淹没。<global>段内还有一个容易被忽略的参数<logall>,设为yes后OSSEC会记录所有事件,便于事后溯源。

接下来是文件完整性检查模块的配置。在<syscheck>段内,默认监控/etc、/usr/bin、/usr/sbin、/bin、/sbin这几个目录。对于CentOS服务器,建议增加/root、/home以及Web应用部署目录。例如:

<directories check_all="yes">/etc,/usr/bin,/usr/sbin</directories>
<directories check_all="yes">/bin,/sbin,/root</directories>
<directories check_all="yes">/var/www/html</directories>

check_all="yes"表示同时监控文件的权限、所有者、大小、修改时间和哈希值变化。对于数据库数据目录或日志目录这类频繁变动的路径,应使用check_all="no"配合report_changes="no"来排除,否则会产生海量无意义告警。<frequency>参数控制检查周期,默认79200秒即22小时,对于安全敏感的环境建议调整为43200秒即12小时。

自定义规则与解码器

OSSEC的强大之处在于其规则引擎。默认规则集已经能覆盖SSH暴力破解、权限提升、可疑内核模块加载等常见攻击行为,但CentOS上运行的具体业务往往需要定制规则。规则文件位于/var/ossec/rules/目录,自定义规则统一写在local_rules.xml中,这样升级OSSEC时不会被覆盖。

举个例子,如果你的CentOS服务器上运行着Nginx,默认规则不会解析Nginx的错误日志。你需要在/var/ossec/etc/ossec.conf的<localfile>段添加Nginx日志路径:

<localfile>
  <log_format>syslog</log_format>
  <location>/var/log/nginx/error.log</location>
</localfile>

然后在local_rules.xml中编写匹配规则。比如监控Nginx返回500错误的频率,短时间内超过阈值就告警:

<group name="nginx,">
  <rule id="100001" level="7">
    <decoded_as>syslog</decoded_as>
    <match>500 Internal Server Error</match>
    <description>Nginx 500 error detected</description>
  </rule>
</group>

规则ID从100000开始往上递增,避免与官方规则冲突。level代表告警级别,7表示中等严重程度,会触发邮件通知。编写规则时务必加上<description>标签,这样告警信息才具备可读性,不至于收到邮件后一头雾水。

主动响应与阻断策略

仅检测不阻断,等于看着攻击发生却无动于衷。OSSEC支持主动响应,可以在检测到特定攻击时自动执行防火墙规则封禁IP。在ossec.conf中找到<active-response>段,默认的host-deny脚本会将攻击IP写入/etc/hosts.deny文件,实现TCP Wrapper层面的阻断。但对于CentOS 7及以上版本,系统更多依赖firewalld,建议改用firewall-drop脚本。

配置主动响应需要两步。第一步,在<command>段定义执行脚本:

<command>
  <name>firewall-drop</name>
  <executable>firewall-drop.sh</executable>
  <expect>srcip</expect>
  <timeout_allowed>yes</timeout_allowed>
</command>

第二步,在<active-response>段绑定规则:

<active-response>
  <command>firewall-drop</command>
  <location>local</location>
  <rules_id>5712,5720,100001</rules_id>
  <timeout>600</timeout>
</active-response>

这里rules_id指定了触发主动响应的规则编号,5712是SSH暴力破解规则,5720是多次认证失败规则,100001是我们刚才自定义的Nginx 500错误规则。timeout设为600秒,即封禁10分钟后自动解封。生产环境中建议先观察一段时间,确认无误报后再逐步扩大封禁规则范围。

启动服务与运行状态验证

所有配置修改完成后,启动OSSEC管理服务:

/var/ossec/bin/ossec-control start

执行后应看到ossec-monitord、ossec-logcollector、ossec-syscheckd、ossec-analysisd等组件逐一启动的提示。用以下命令检查运行状态:

/var/ossec/bin/ossec-control status

如果某个组件显示未运行,立即查看/var/ossec/logs/ossec.log日志文件定位问题。最常见的启动失败原因是配置文件XML格式错误,比如标签未闭合或参数拼写错误。可以用xmllint工具校验:

xmllint --noout /var/ossec/etc/ossec.conf

确认所有组件正常运行后,OSSEC就开始实时监控系统了。你可以故意用错误密码SSH登录几次,然后检查/var/ossec/logs/alerts/alerts.log,应该能看到对应告警记录。同时检查邮箱是否收到了告警邮件,如果没收到,回头检查SMTP配置和防火墙是否放行了25端口。

客户端Agent的大规模部署

前面讲的是单机自监控模式,如果你有数十台CentOS服务器需要统一管理,就要用到Server-Agent架构。在管理端安装时选择server类型,安装完成后需要为每台Agent生成密钥。在管理端执行:

/var/ossec/bin/manage_agents

交互式菜单中选A添加Agent,输入Agent的IP地址和主机名,系统会生成一串密钥。在Agent端安装OSSEC时选agent类型,填入管理端IP和这串密钥,两端就能建立加密通信。Agent端的ossec.conf只需配置管理端地址和本地日志路径,规则判断全部由管理端集中处理。这种架构下,管理端的/var/ossec/etc/ossec.conf中<remote>段必须开启,监听1514端口接收Agent数据。

性能优化与误报调优

OSSEC在CentOS上运行时,syscheck模块的磁盘I/O开销最大。如果你的服务器磁盘性能一般,可以适当增大<frequency>检查间隔,并对大目录使用<ignore>标签排除。例如排除node_modules目录:

<ignore>/var/www/html/node_modules</ignore>

误报处理是日常运维的重点。查看alerts.log时,如果发现某条规则频繁误报,不要直接删除规则,而是在local_rules.xml中用overwrite属性覆盖其level。比如将某条规则的告警级别从7降到0(即忽略):

<rule id="5712" level="0" overwrite="yes">
  <description>SSH brute force rule disabled</description>
</rule>

这样做的好处是保留原始规则文件不变,升级OSSEC时自定义覆盖仍然生效。定期分析告警趋势,持续优化规则阈值,OSSEC的检测效果会越来越好。

日志轮转与存储维护

OSSEC默认将日志存放在/var/ossec/logs/下,随着时间推移会占用大量磁盘空间。CentOS系统自带的logrotate可以管理这些日志。创建/etc/logrotate.d/ossec文件:

/var/ossec/logs/alerts/alerts.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
    sharedscripts
    postrotate
        /var/ossec/bin/ossec-control restart > /dev/null 2>&1 || true
    endscript
}

这样每天轮转一次,保留30天,旧日志自动压缩。postrotate中的重启命令确保日志轮转后OSSEC能继续写入新文件。数据库文件/var/ossec/queue/db/global.db也需要定期清理,OSSEC自带清理脚本,可以加入crontab每月执行一次:

0 2 1 * * /var/ossec/bin/ossec-makelists > /dev/null 2>&1

至此,一套完整的OSSEC主机入侵检测系统就在CentOS上落地运行了。从编译安装到规则定制,从主动响应到长期维护,每一步都直接关系到服务器的安全水位。安全防护没有一劳永逸,持续关注告警、迭代规则,才是让这套系统发挥最大价值的正确姿势。