在CentOS安全体系中,osquery是一款由Facebook(现Meta)开源的系统状态查询与监控工具,它将操作系统的底层信息抽象为SQL表结构,你可以像查数据库一样查询进程、网络连接、文件完整性、用户登录记录、内核模块等关键安全信息。对于CentOS服务器管理员来说,安装和配置osquery是实现主机入侵检测、合规审计和实时监控的核心手段之一。下面直接给出完整的安装部署和使用方法。

osquery的核心价值在于它提供了一个统一的查询接口,不需要你记住几十条不同的Linux命令,一条SQL语句就能获取系统全貌。比如你想知道当前有哪些进程在监听网络端口,直接执行一条SELECT语句即可。对于安全运维来说,这意味着你可以快速发现异常进程、未授权的网络连接和可疑的文件变更。

CentOS上安装osquery的前置准备

在CentOS 7或CentOS 8上安装osquery之前,需要确认几件事。首先,系统需要有网络连接,因为osquery的安装包需要从官方仓库下载。其次,建议以root用户或者有sudo权限的用户操作。CentOS 7使用yum包管理器,CentOS 8及Stream版本使用dnf,两者的安装方式略有不同但原理一致。

先更新系统包,确保依赖环境没有问题:

yum update -y

或者在CentOS 8上:

dnf update -y

osquery依赖一些基础库,包括gflags、glog、boost等,这些通常会在安装过程中自动解决,但如果你的系统是最小化安装,可能需要手动安装一些开发工具:

yum groupinstall "Development Tools" -y
yum install -y wget curl
从官方仓库安装osquery

osquery官方提供了yum/dnf仓库配置,这是最推荐的安装方式,因为后续可以通过包管理器直接升级。首先添加osquery的官方仓库:

cat > /etc/yum.repos.d/osquery.repo << 'EOF'
[osquery]
name=osquery
baseurl=https://pkg.osquery.io/rpm/$basearch
enabled=1
gpgcheck=1
gpgkey=https://pkg.osquery.io/rpm/GPG
EOF

添加完仓库后,直接安装osquery主程序:

yum install -y osquery

如果是CentOS 8,把yum换成dnf即可。安装完成后,osquery的主二进制文件位于/usr/bin/osqueryd,配置文件位于/etc/osquery/osquery.conf。

osquery的两种运行模式详解

osquery有两种主要运行模式,理解它们的区别非常重要。第一种是交互式模式,直接在终端输入osqueryi命令进入一个SQL交互shell,适合临时查询和排查问题。第二种是守护进程模式(osqueryd),以后台服务方式持续运行,定期执行预定义的查询包(pack),并将结果写入日志或发送到远程服务器。

先体验交互式模式,直接输入:

osqueryi

进入后你会看到一个类似SQLite的提示符,可以直接写SQL查询。比如查询当前所有运行的进程:

SELECT pid, name, path FROM processes;

查询监听的网络端口:

SELECT pid, process.name, address.port, protocol FROM process_open_sockets JOIN processes USING (pid);

查询最近登录的用户:

SELECT * FROM logged_in_users;

查询系统中所有的用户账户:

SELECT * FROM users;

这些只是最基础的查询,osquery支持的表有几百张,涵盖文件系统、网络、硬件、内核、计划任务、浏览器扩展等方方面面。

配置osquery守护进程实现持续监控

对于生产环境,你需要让osquery以守护进程方式运行。编辑配置文件:

vim /etc/osquery/osquery.conf

在配置文件中,你需要关注几个关键参数。首先是pack_delimiter,默认是逗号分隔的查询包名称。其次是schedule部分,定义了哪些查询包以什么频率执行。一个典型的配置示例:

{
  "options": {
    "config_plugin": "filesystem",
    "logger_plugin": "filesystem",
    "host_identifier": "hostname",
    "schedule_splay_percent": 10
  },
  "schedule": {
    "system_info": {
      "query": "SELECT hostname, cpu_brand, physical_memory FROM system_info;",
      "interval": 3600
    },
    "processes": {
      "query": "SELECT pid, name, path, cmdline FROM processes;",
      "interval": 600
    },
    "listening_ports": {
      "query": "SELECT pid, process.name, address.port, protocol FROM process_open_sockets JOIN processes USING (pid);",
      "interval": 300
    },
    "ssh_users": {
      "query": "SELECT * FROM logged_in_users WHERE type = 'user';",
      "interval": 600
    }
  }
}

这个配置的意思是:系统信息每小时采集一次,进程列表每10分钟采集一次,监听端口每5分钟采集一次,登录用户每10分钟采集一次。schedule_splay_percent参数是为了避免大量服务器同时上报造成服务器压力,会在设定间隔基础上随机偏移10%的时间。

配置完成后,启动osquery守护进程服务:

systemctl start osqueryd
systemctl enable osqueryd

确认服务状态:

systemctl status osqueryd
osquery查询包(Pack)的使用方法

osquery的强大之处在于查询包机制。你可以把一组相关的SQL查询打包成一个pack,然后在配置中引用。osquery自带了很多官方pack,存放在/usr/share/osquery/packs/目录下。你可以查看已有的pack:

ls /usr/share/osquery/packs/

常见的官方pack包括:osquery-monitoring.conf、incident-response.conf、it-compliance.conf等。比如it-compliance.conf这个pack专门用于合规审计,会检查文件权限、密码策略、SSH配置等安全项。

如果你想自定义一个pack,创建一个新的配置文件:

vim /etc/osquery/packs/my_security.conf

写入内容:

{
  "queries": {
    "check_rootkit": {
      "query": "SELECT * FROM file WHERE path LIKE '/tmp/%' AND filename LIKE '%.sh';",
      "interval": 1800,
      "platform": "linux"
    },
    "audit_cron": {
      "query": "SELECT * FROM crontab;",
      "interval": 3600,
      "platform": "linux"
    },
    "check_suid": {
      "query": "SELECT * FROM file WHERE (mode LIKE '%4000' OR mode LIKE '%2000') AND path NOT LIKE '/usr/bin%';",
      "interval": 7200,
      "platform": "linux"
    }
  }
}

这个自定义pack做了三件事:检查/tmp下的可疑脚本文件、审计定时任务、查找非标准路径的SUID文件。这些都是入侵检测的关键指标。

将osquery数据接入远程日志平台

单机查询虽然有用,但在多服务器环境下,你需要把数据集中到一个地方分析。osquery支持多种日志输出方式,包括filesystem(写本地文件)、tls(加密传输)、kafka、aws等。对于中小规模部署,最简单的方式是配置tls日志输出到远程服务器。

在osquery.conf中添加:

{
  "options": {
    "logger_plugin": "tls",
    "logger_tls_endpoint": "/api/v1/log",
    "logger_tls_period": 10,
    "host_identifier": "hostname"
  }
}

然后在远程服务器上部署一个接收端,比如使用Fluentd、Logstash或者专门的osquery接收服务如Fleet。Fleet是osquery官方推荐的管理平台,提供Web界面查看所有服务器的查询结果、实时监控告警和查询下发功能。

如果你不想搭建复杂平台,也可以把结果写入本地文件然后用rsync同步到日志服务器:

{
  "options": {
    "logger_plugin": "filesystem",
    "logger_path": "/var/log/osquery/osqueryd.results.log"
  }
}
osquery在CentOS安全中的实际应用场景

说完安装和配置,讲几个osquery在实际安全运维中的硬核用法。第一,入侵检测。当你发现服务器被入侵后,第一时间用osquery查询当前进程树、网络连接和最近修改的文件,快速定位攻击者留下的后门和横向移动痕迹。比如查询某个异常进程的完整命令行:

SELECT pid, name, cmdline, parent FROM processes WHERE name = '可疑进程名';

第二,基线对比。你可以在服务器正常状态下导出一份osquery快照,之后定期对比,发现任何偏离基线的变化。比如定期查询/etc/passwd和/etc/shadow的变化:

SELECT * FROM file WHERE path = '/etc/passwd';

第三,合规检查。很多等保和安全审计要求检查密码策略、SSH配置、文件权限等。osquery的it-compliance pack可以一键完成这些检查,生成报告。

第四,实时告警。配合Fleet或自建告警系统,当osquery检测到异常(比如出现新的监听端口、新增的root用户、异常的计划任务),可以立即触发告警通知运维人员。

osquery的性能优化与注意事项

osquery对系统资源有一定消耗,尤其是查询频率设置过高时。建议在生产环境中合理设置interval,不要所有查询都设成几秒一次。一般来说,进程和网络相关的查询设5-10分钟一次,文件完整性相关的设1小时以上一次即可。

另外,osquery的查询结果日志会随时间增长,需要配置日志轮转。在/etc/logrotate.d/下添加:

/var/log/osquery/*.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
}

还有一点,osquery在CentOS 7上运行良好,但在CentOS 8 Stream上可能遇到一些兼容性问题,建议使用较新版本的osquery(5.x以上)。如果遇到安装失败,可以尝试从GitHub编译源码安装,或者使用官方提供的静态二进制包。

最后提醒,osquery本身不是防火墙也不是杀毒软件,它是一个信息采集和查询工具。它能帮你看见系统里发生了什么,但不能自动阻止攻击。真正的安全体系需要osquery配合入侵防御系统、日志分析平台、自动化响应脚本一起使用,才能形成完整的闭环。

总结

在CentOS服务器上部署osquery,本质上是给你的系统装了一双"眼睛"。从安装仓库配置、守护进程启动、查询包定制到远程日志接入,整个流程并不复杂,但需要根据实际业务场景做精细化配置。掌握osquery的SQL查询语法和表结构,你就能在几分钟内完成过去需要几十条命令才能获取的安全信息采集。对于任何管理CentOS服务器的安全人员来说,osquery都是必须掌握的基础工具之一。