每当我登录到我的 Centos 7.x 服务器时,我总是在audit.log 中看到明显的失败。这使得我尝试为失败的登录创建每日脚本变得非常困难,因为我们无法确定什么是真正的失败。这是摘录自aureport -au -ts today
1669. 06/02/17 08:40:03 handsm@internal 10.1.0.24 ssh /usr/sbin/sshd no 1428242
1670. 06/02/17 08:40:03 handsm@internal 10.1.0.24 ssh /usr/sbin/sshd no 1428243
1671. 06/02/17 08:40:06 handsm@internal server01 ssh /usr/sbin/sshd yes 1428244
1672. 06/02/17 08:40:06 handsm@internal 10.1.0.24 ssh /usr/sbin/sshd yes 1428246
1673. 06/02/17 08:40:13 [email protected] ? /dev/pts/3 /usr/bin/sudo yes 1428284
您可以看到前两行失败,然后我立即成功。有谁知道为什么会发生这种情况?
编辑_1: 包含详细的 SSH 日志文件:
Feb 6 09:59:42 wb-prod-ctl sshd[50489]: Connection from 10.1.0.24 port 58847 on 192.168.61.5 port 22 Feb 6 09:59:45 wb-prod-ctl sshd[50489]: Failed publickey for handsm@internal from 10.1.0.24 port 58847 ssh2: RSA c4:a3:e9:ad:2f:5c:fa:b4:de:49:6a:7d:83:fa:11:d5 Feb 6 09:59:45 wb-prod-ctl sshd[50489]: Postponed gssapi-with-mic for handsm@internal from 10.1.0.24 port 58847 ssh2 [preauth] Feb 6 09:59:46 wb-prod-ctl sshd[50489]: Failed gssapi-with-mic for handsm@internal from 10.1.0.24 port 58847 ssh2 Feb 6 09:59:48 wb-prod-ctl sshd[50489]: pam_sss(sshd:auth): authentication success; logname= uid=0 euid=0 tty=ssh ruser= rhost=server01.internal.office user=handsm@internal Feb 6 09:59:48 wb-prod-ctl sshd[50489]: Accepted password for handsm@regsec from 10.1.0.24 port 58847 ssh2 Feb 6 09:59:48 wb-prod-ctl sshd[50489]: pam_unix(sshd:session): session opened for user handsm@internal by (uid=0) Feb 6 09:59:48 wb-prod-ctl sshd[50489]: User child is on pid 50492 Feb 6 09:59:48 wb-prod-ctl sshd[50492]: Starting session: shell on pts/3 for [email protected] from 10.1.0.24 port 58847
看起来 gssapi-with-mic 失败了?
编辑_2:
我现在已经禁用了 GSSAPIAuthentication,没有任何不良影响,并且我的 SSH 日志中的错误gssapi-with-mic
已经消失......但是(!),我留下了错误Failed publickey
。
所以我的服务器允许 AD 登录(uid + 密码)和无密码登录(公钥/私钥)。我认为我的问题就是这个事实,我可能无法解决它,即 SSH 需要使用任一方法,如果不使用其中一种方法,则另一种方法会向日志写入错误。
还有其他人有这方面的经验吗?
编辑_3: 问题已解决 - 感谢利奇日日帕。
因此,Putty 的默认设置似乎是“尝试使用 Pageant 进行身份验证”(见下图)。当我创建到相关服务器的新 Putty 会话并禁用此设置时,我不再看到该Failed publickey
错误。
答案1
默认情况下,如果您之前创建了密钥,OpenSSH 客户端将尝试公钥身份验证。我的猜测是,如果你这样做,ls ${HOME}/.ssh/
你会看到一个密钥对 -id_rsa
和id_rsa.pub
。当您的客户端连接到服务器时,它会尝试使用此密钥对登录。由于id_rsa.pub
不在${HOME}/.ssh/authorized_keys
您的服务器上,或者该文件具有不正确的权限,sshd
因此服务器会将该登录尝试正确标记为失败。请尝试以下操作:
ssh -o PubkeyAuthentication=no
设置该选项将阻止 SSH 客户端在${HOME}/.ssh/
尝试向服务器进行身份验证时使用密钥。如果这不能阻止日志消息显示,请添加-vv
到 ssh 客户端选项,以便我们可以准确地看到它的用途。
答案2
很抱歉复活旧线程,但我在搜索类似问题时发现了它。
Linux 系统上存在多个误报 SSH 错误消息的第二个潜在原因,该系统具有多个用户身份验证源(例如 LDAP 和本地用户)。默认配置通常是首先使用“pam_unix.so”模块检查本地用户。如果该用户不作为本地用户存在,则即使在其他身份验证源中对用户的检查成功,也始终会生成失败日志消息。
如果(通常是这种情况)LDAP 用户是常见情况,则可以通过首先检查 LDAP 然后尝试本地身份验证来解决 LDAP 用户的问题。例如,对于 Debian 10,我更改了以下两行/etc/pam.d/common-auth
:
# here are the per-package modules (the "Primary" block)
auth [success=2 default=ignore] pam_unix.so nullok_secure
auth [success=1 default=ignore] pam_ldap.so minimum_uid=1000 use_first_pass
# here's the fallback if no module succeeds
auth requisite pam_deny.so
到
# here are the per-package modules (the "Primary" block)
auth [success=2 default=ignore] pam_ldap.so minimum_uid=1000
auth [success=1 default=ignore] pam_unix.so nullok_secure use_first_pass
# here's the fallback if no module succeeds
auth requisite pam_deny.so
=> 带有“success=”的两行被交换,数字被更改以匹配新位置(“success=”在从模块成功返回时跳过那么多行),并且“use_first_pass”标志被移动以保留它在第二行
这不是一个完整的解决方案,因为它意味着检查 LDAP 是否有本地用户(这可能并不理想)
有一个 Redhat 解决方案记录了一种不同的方法来解决 Redhat(如 Linux 发行版)的问题,我相信它没有这个缺点(pam_localuser.so 在尝试进行身份验证之前检查用户是否作为本地用户存在):
https://access.redhat.com/solutions/881103
应该可以为类似 Debian 的系统实现相同的解决方案,但我还没有这样做。