SSH日志需调优至VERBOSE级别并统一归集到/var/log/auth.log或/var/log/sshd.log,补充PAM脚本与auditd联动,定期验证与扫描异常登录。

SSH 访问日志的记录级别和输出位置直接关系到能否及时发现异常登录、定位入侵行为。默认配置下,日志可能太简略、分散或被覆盖,必须主动调优。
调整 SSH 日志级别:让关键事件不被淹没
OpenSSH 默认使用 INFO 级别,只记录基础连接与认证结果(如“Accepted password”“Failed password”),但缺少上下文细节。建议提升至 VERBOSE 或 DEBUG1(生产环境慎用 DEBUG2/3,会产生大量日志)。
- 编辑
/etc/ssh/sshd_config,添加或修改:LogLevel VERBOSE - 该级别会额外记录:客户端软件标识(如
ssh/9.8p1)、密钥指纹、认证方法切换过程、PAM 模块调用结果等 - 重启生效:
systemctl restart sshd
确认日志输出目标:统一归集,避免遗漏
OpenSSH 本身不写文件,而是将日志发给系统日志服务(rsyslog 或 journald)。必须确保它被正确路由到持久化存储,并且不被其他服务覆盖。
- 检查当前日志接收方:
运行grep -i "auth.*" /etc/rsyslog.conf /etc/rsyslog.d/*.conf 2>/dev/null,确认auth,authpriv.*被写入/var/log/auth.log(Debian/Ubuntu)或/var/log/secure(RHEL/CentOS) - 若使用 systemd-journald,可用
journalctl -u sshd -o json-pretty查看结构化日志;但需启用持久日志:mkdir -p /var/log/journal,再执行systemctl restart systemd-journald - 禁止日志轮转误删关键记录:检查
/etc/logrotate.d/rsyslog(或/etc/logrotate.d/syslog),确保rotate不小于 12,且含dateext和maxage 365
增强可追溯性:补充关键字段与独立归档
仅靠默认日志仍难快速定位问题。可通过 PAM 和自定义规则补全信息。
- 在
/etc/pam.d/sshd末尾添加:session optional pam_exec.so /usr/local/bin/log-ssh-session.sh
该脚本可记录登录时的$SSH_CLIENT、终端类型、用户 shell、是否为 sudo 会话等 - 为 SSH 日志单独建文件(推荐):
在/etc/rsyslog.d/10-sshd.conf中写:if $programname == 'sshd' then /var/log/sshd.log & stop
再touch /var/log/sshd.log && systemctl restart rsyslog - 启用审计子系统联动:
安装auditd后,在/etc/audit/rules.d/sshd.rules加:-a always,exit -F arch=b64 -S execve -F path=/usr/sbin/sshd -k sshd-exec
可捕获 SSH 进程启动全过程,包括参数和调用者
验证与日常盯控:不能只配不管
配置完必须验证是否生效,并建立常规检查机制。
- 手动触发一次登录(成功+失败各一次),立即执行:
tail -n 20 /var/log/auth.log | grep sshd,确认有VERBOSE字样及 IP、端口、方法等字段 - 用
lastb -i查失败登录,last -i查成功登录,比对 IP 是否一致;两者时间戳应与 auth.log 完全对应 - 每周用脚本扫描日志高频异常:
例如统计 1 小时内同一 IP 的失败次数:awk '/Failed password/ {ip[$11]++} END {for (i in ip) if (ip[i]>5) print i, ip[i]}' /var/log/auth.log


















