日志管理变得越来越重要。对于 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 格式,这不仅有助于提高日志管理的效率,也为后续的日志分析提供了便利。此外,这种方法还可以扩展到其他类型的日志,进一步提升系统的可观测性。