在哪里查找 Linux 上的 SSH (sshd) 日志以及如何导出它们

在哪里查找 Linux 上的 SSH (sshd) 日志以及如何导出它们

SOC Prime Team
SOC Prime Team linkedin icon 关注

在 Debian 和 Ubuntu 上,sshd 将日志写入 /var/log/auth.log。在 RHEL、Rocky、Alma 和 CentOS Stream 上,它写入 /var/log/secure。如果这两个文件都不存在,系统日志仅记录在 systemd 日志中。然后,你需要的命令是在基于 Debian 的系统上使用 journalctl -u ssh,或者在 Red Hat 系列、Fedora 和 Arch 上使用 journalctl -u sshd。

SSH 是几乎每个 Linux 服务器的门面,这就是为什么它的日志在几乎每次 Linux 调查中都会出现的原因。Prime Core 有 11,632 条适用于 Linux 认证日志正则规则,与 643 项 MITRE ATT&CK 技术相映射。其中包括:暴力破解攻击 (T1110),使用被盗凭证登录 (T1078) 和 SSH 横向移动 (T1021.004)。下面讲述如何找到你的 sshd 日志,导出、清理并在 LogTotal 中免费分析它们。

免费开始

简要总结

发行版家族日志文件日志命令
Debian, Ubuntu/var/log/auth.logjournalctl -u ssh
RHEL, Rocky, Alma, CentOS Stream/var/log/securejournalctl -u sshd
Fedora, Arch,未安装 rsyslog 的简化安装默认无journalctl -u sshd

在开始之前:你能实际读取它们吗?

认证日志是被故意锁定的,所以普通账户通常无法查看任何内容。

  • /var/log/auth.log 在 Debian 和 Ubuntu 上只有 root 和 adm 组的成员可以读取。
  • /var/log/secure 在 Red Hat 系列上仅 root 可以读取。
  • 系统日志对 root 和系统日记组、adm 和 wheel 的成员开放。其他人只能看到自己的用户日志。如果作为普通用户运行 journalctl -u ssh,你会得到空结果以及提示说你没有看到其他用户的消息。这是权限问题,不是服务器静默。

简单的解决方法是使用 sudo。如果你是为了日志收集专门设置一个帐户,请将其添加到 adm 或 systemd-journal,而不是给予 root 权限。我们的[Linux 日志权限指南]提供了详细信息。

在你从服务器上复制任何内容之前,请注意:认证日志包含用户名、源 IP 和主机名。LogTotal 自带清理功能,但是请先查看你的数据处理政策。

步骤 1:文件、日志还是两者皆有?

上表显示了默认设置,云镜像和加固脚本也正是喜欢更改这些默认设置。花十秒检查一下:

ls -l /var/log/auth.log /var/log/secure 2>/dev/null
systemctl is-active rsyslog

如果显示了文件且 rsyslog 处于活动状态,那么两者你都有:rsyslog 会将日志从 journal 复制到普通文本文件。任何一个来源都可以使用,但文件更容易复制。

如果没有文件,则 rsyslog 可能未安装。这现已成为常态:自 Debian 12 以来,rsyslog 不再是默认安装的一部分,因此新安装的 Debian 系统根本没有 auth.log。Fedora 和 Arch 这样的方式已经存在多年。请继续到步骤 2b。

在这里时,请检查日志是否能在重启后保存:

ls -d /var/log/journal

如果该目录不存在,journal 会在内存中的 /run/log/journal 下保存日志,并且重启会清除它们。在你正在调查的机器上,在任何人决定“只需重启一下”之前知道这一点是值得的。

还有一点关于事件响应工作:如果你的系统可能被入侵,当地的日志也可能受到影响。清除或编辑 auth.log 是经典的后清理步骤。如果服务器将日志转发到 SIEM,请从那里导出并进行对比。我们的[Splunk 导出指南]展示了如何做到这一点。

步骤 2a:从 auth.log 或 secure 导出

当前文件仅包含最近几天的日志。较旧的条目位于它旁边的轮换文件中。在 Debian 和 Ubuntu 上,它们看起来像 auth.log.1、auth.log.2.gz 等。在 Red Hat 系列上,它们带有日期,例如 secure-20261012。如果事件从上周开始,也需要那些文件。

这将从当前和轮转文件中提取 sshd 行,按时间顺序排列为一个文件:

# Debian / Ubuntu
sudo zgrep -h ‘sshd’ $(ls -tr /var/log/auth.log*) > web-03_sshd.log

# RHEL / Rocky / Alma
sudo zgrep -h ‘sshd’ $(ls -tr /var/log/secure*) > web-03_sshd.log

zgrep 可以同时读取普通和压缩文件,所以你不需要解压任何东西。ls -tr 按修改时间排序,因此最旧的文件首先出现,输出保持大致按时间顺序排列。sshd 模式也匹配 sshd-session,这在较新的系统上很重要(见步骤 2b)。

为什么要过滤? 除了减少噪音,auth.log 还记录 sudo 命令,而 sudo 行包括完整的命令行。有时人们可能会将密码输入到这些行中。过滤到 sshd 可以避免这种情况。例外情况是你在调查攻击者在 登录后 所做的事情。然后你也需要 sudo 行:提取整个文件,让 LogTotal 的清理步骤发挥作用。

上传前快速检查:

wc -l web-03_sshd.log
head -3 web-03_sshd.log; tail -3 web-03_sshd.log

查看时间戳。根据 rsyslog 的配置,它们可能是经典的 syslog 格式(Oct 19 10:15:01,没有年份,没有时区)或完整的 ISO 8601 格式。如果是经典格式,记下服务器的时区(timedatectl)。当你试图将这些事件与其他事件对齐时,这将是必要的。

步骤 2b:从 systemd 日志导出

在仅有日志的系统上,这就是全部工作:

sudo journalctl -u ssh -u sshd
–since “2026-10-19 00:00” –until “2026-10-20 00:00”
–no-pager -o short-iso > web-03_sshd.log

其中有一些选择是有意为之的。

包括服务名称。 在 Debian 和 Ubuntu 上,服务称为 ssh,而在几乎所有其他地方称为 sshd。journalctl 会将重复的 -u 标志通过 OR 结合在一起,因此相同的命令可以在这两种系列上工作。

按单元而不是标签过滤。 许多较旧的指南使用 journalctl -t sshd。自 OpenSSH 9.8 以来,服务器被拆分为两个二进制文件,并且每个连接的消息,包括登录,被标记为 sshd-session 而不是 sshd。按标签过滤会丢失你实际需要的行。当 9.8 在 2024 年推出时,这打破了很多 fail2ban 和 sshguard 设置。RHEL 10 和其他当前版本都配备了 OpenSSH 9.8 或更新版本。按单元过滤可以捕获属于服务的每个进程,无论它叫什么。

-o short-iso。 它为你提供了带有完整 ISO 8601 时间戳的 syslog 样式行,包含年份和时区,因此你不必猜测。如果你愿意保留每个日志字段(进程 ID、启动 ID、主机名等),可以使用 -o json,它会每行写一个 JSON 对象。文件会变大,但什么都不会丢失。

时间过滤器也接受相对值:–since “2 hours ago” 或 –since 昨天。对于保存的日志,-b -1 将输出限制为前一次启动,这在事件发生后重启了服务器时很有帮助。

不要从 /var/log/journal 复制二进制 .journal 文件并上传。LogTotal 读取文本和 JSON 文件,而日志文件两者都不是。

获得文件后查找什么

大多数 sshd 行符合以下几种模式:

行开头为含义
Failed password for <user> from <ip>账号存在但密码错误
Invalid user <user> from <ip>用户名不存在;通常用于扫描仪循环尝试 admin、test、oracle
Accepted password for / Accepted publickey for成功登录;公钥行还包含密钥的 SHA256 指纹
Disconnecting authenticating user … Too many authentication failures客户端达到 MaxAuthTries
Connection closed by <ip> … [preauth]在认证前被中断,通常是扫描仪和横幅抓取器
pam_unix(sshd:session): session opened for user会话实际上已经启动

值得注意的序列:来自一个 IP 的一连串 Failed 或 Invalid user 行,然后从同一个 IP 出现一个 Accepted。这是一次成功的暴力破解。紧随其后:在没有人识别的地址和没人工作的时间,为一个服务账户接受的请求。

在 OpenSSH 9.8 及更新版本中,你可能还会看到关于惩罚的消息:sshd 现在临时拒绝那些不断遇到身份验证失败的地址。将它们视为一个症状。它们告诉你有人一直敲击端口,而不是有人进去。

在 LogTotal 中上传、清理和检查

用眼睛阅读几百行没问题。阅读 40,000 行则不然。LogTotal 是 SOC Prime 的免费服务,用于在不设置任何东西的情况下在日志文件上运行检测逻辑。它会清理你上传的内容,并且不保留你的文件。

  1. 上传。 打开 logtotal.com 并拖入 web-03_sshd.log。
  2. 清理。 在继续之前查看结果。你知道哪些名称在你的环境中是敏感的。
  3. 检查。

出错时

症状可能的原因Fix
auth.log 显示 No such file or directoryrsyslog 未安装(自 Debian 12 以来的默认设置)使用 journalctl,步骤 2b
日志文件显示 Permission deniedauth.log 仅对 adm 开放,secure 仅对 root 开放使用 sudo,或将帐户添加到 adm
journalctl -u ssh 返回 nothing,并提示其他用户你不在 systemd-journal、adm 或 wheel 中使用 sudo,或将帐户添加到 systemd-journal
journalctl -u ssh 以 root 身份返回 nothing该发行版使用错误的单元名称使用 -u ssh -u sshd
仅有注销记录,而无 Accepted 行在 OpenSSH 9.8+ 上按标签(-t sshd)过滤改为按单元过滤
没有早于上次重启的记录非持久日志;没有 /var/log/journal旧日志消失;检查你的 SIEM 或日志转发器
文件只覆盖了几天未包含轮转文件使用带有 auth.log* 或 secure* 的 zgrep 命令
时间戳与其他来源不匹配经典 syslog 时间戳不带时区注意服务器的时区,或用 -o short-iso 导出

FAQ

Ubuntu 上的 SSH 日志在哪里?

在标准 Ubuntu 安装中,位于 /var/log/auth.log,以及 journal (journalctl -u ssh)。简化云镜像有时会省略 rsyslog。如果文件不存在,请使用 journal。

如何仅查看失败的 SSH 登录?

在 journal 系统上,使用 sudo journalctl -u ssh -u sshd | grep -E ‘Failed|Invalid user’,或者在有日志文件时使用 sudo zgrep -hE ‘Failed|Invalid user’ /var/log/auth.log*。对于超出快速查看的情况,请上传完整的 sshd 日志。失败仅在成功旁边才有意义。

last 和 lastb 怎么样?

它们读取二进制登录记录文件 /var/log/wtmp 和 /var/log/btmp。它们是快速查看谁登录过的好工具,但它们提供的细节远不如 sshd 自己的日志详细,并且对于入侵者来说也有可能被篡改。

如何从多台服务器采集 sshd 日志?

对于一次性的操作,可以使用循环:for h in web-01 web-02 web-03; do ssh “$h” “sudo journalctl -u ssh -u sshd –since yesterday -o short-iso –no-pager” > “${h}_sshd.log” done 这需要 sudo 能在远程端工作而不会提示密码。否则,加上 -t 到 ssh 并每次输入。如果你每季多次执行此操作,请将日志发送到 SIEM。

上传 sshd 日志到在线工具安全吗?

LogTotal 在分析之前会清理上传并不会保留文件;我们的[清理指南]显示了什么会被屏蔽。你组织的数据处理规则仍然优先。

下一步

得到文件? 上传到 LogTotal 看看这 11,632 条正则规则会怎么样。如果你希望在所有 Linux 服务器上使用相同的检测逻辑,而不是一次上传一个文件。

参考

加入 SOC Prime 的 Detection as Code 平台 以提高对与您的业务最相关的威胁的可见性。为了帮助您开始并带来即时价值,现在与 SOC Prime 专家预约会议。