使用 Rsyslog 将 SSH 日志转换为 JSON 格式

日志管理变得越来越重要。对于 SSH 日志来说,将其转换为结构化的 JSON 格式可以极大地简化日志的处理和分析过程。

安装 Rsyslog

[root@Dev-RockyLinux9-Area2-Shanghai ~]# dnf install rsyslog -y

配置 Rsyslog

创建自定义 JSON 模板 创建一个新的配置文件 /etc/rsyslog.d/sshd.conf,并在其中定义 JSON 模板

[root@Dev-RockyLinux9-Area2-Shanghai ~]# cat > /etc/rsyslog.d/sshd.conf <<EOF
template(name="JsonFormat" type="list") {
    constant(value="{")
    constant(value="\"timestamp\":\"")      property(name="timereported" dateFormat="rfc3339")
    constant(value="\",\"hostname\":\"")    property(name="hostname")
    constant(value="\",\"app-name\":\"")    property(name="app-name")
    constant(value="\",\"procid\":\"")      property(name="procid")
    constant(value="\",\"message\":\"")     property(name="msg" format="json")
    constant(value="\"}\n")
}

# 过滤日志并使用自定义 JSON 格式
if $programname == 'sshd' or $programname == 'systemd-logind' then {
    action(type="omfile" file="/var/log/sshd_json.log" template="JsonFormat")
}
EOF

确保配置文件被加载 确保 /etc/rsyslog.conf 中包含以下行,以确保新配置文件被加载

include(file="/etc/rsyslog.d/*.conf" mode="optional")

重启 Rsyslog 服务 重启 Rsyslog 服务以应用新的配置

[root@Dev-RockyLinux9-Area2 -Shanghai ~]# systemctl restart rsyslog.service

查看日志

[root@Dev-RockyLinux9-Area2-Shanghai ~]# less  /var/log/secure
{"timestamp":"2024-08-19T16:20:00.603866+08:00","hostname":"Dev-RockyLinux9-Area2-Shanghai","app-name":"sshd","procid":"187666","message":"Accepted publickey for root from x.x.x.x port 2094 ssh2: ED25519 SHA256:3...c"}
{"timestamp":"2024-08-19T16:20:00.618604+08:00","hostname":"Dev-RockyLinux9-Area2-Shanghai","app-name":"systemd-logind","procid":"617","message":"New session 21 of user root."}
{"timestamp":"2024-08-19T16:20:00.623191+08:00","hostname":"Dev-RockyLinux9-Area2-Shanghai","app-name":"sshd","procid":"187666","message":"pam_unix(sshd:session): session opened for user root(uid=0) by root(uid=0)"}

验证 JSON 格式日志 使用 jq 工具验证 /var/log/sshd_json.log 中的日志是否已被正确转换为 JSON 格式


[root@Dev-RockyLinux9-Area2-Shanghai ~]# cat /var/log/sshd_json.log | jq . # 使用 jq 来读取解析数据
{
  "timestamp": "2024-08-19T16:20:00.603866+08:00",
  "hostname": "Dev-RockyLinux9-Area2-Shanghai",
  "app-name": "sshd",
  "procid": "187666",
  "message": "Accepted publickey for root from x.x.x.x port 2094 ssh2: ED25519 SHA256:3...c"
}
{
  "timestamp": "2024-08-19T16:20:00.618604+08:00",
  "hostname": "Dev-RockyLinux9-Area2-Shanghai",
  "app-name": "systemd-logind",
  "procid": "617",
  "message": "New session 21 of user root."
}
{
  "timestamp": "2024-08-19T16:20:00.623191+08:00",
  "hostname": "Dev-RockyLinux9-Area2-Shanghai",
  "app-name": "sshd",
  "procid": "187666",
  "message": "pam_unix(sshd:session): session opened for user root(uid=0) by root(uid=0)"
}
...

通过上述步骤,成功地将 SSH 日志转换为了结构化的 JSON 格式,这不仅有助于提高日志管理的效率,也为后续的日志分析提供了便利。此外,这种方法还可以扩展到其他类型的日志,进一步提升系统的可观测性。

上一篇
下一篇