是否可以让 sshd (openssh) 记录失败的基于密钥的登录尝试的公钥?

是否可以让 sshd (openssh) 记录失败的基于密钥的登录尝试的公钥?

据我了解, sshd (在我的例子中是 openssh )通常会/可能会记录尝试通过密钥进行身份验证的传入连接的公钥的指纹/哈希。

我正在寻找的是传入连接的完整公钥,特别是失败的登录。那可能吗?

如果是这样,怎么办?

答案1

显然这不是 openssh 的当前功能。

为了我自己的缘故,我编写了该功能,可以在这里找到它:

https://github.com/catskul/openssh-portable/tree/print-public-key

diff --git a/auth2-pubkey.c b/auth2-pubkey.c
index 2fb5950..82cce57 100644
--- a/auth2-pubkey.c
+++ b/auth2-pubkey.c
@@ -122,6 +122,17 @@ userauth_pubkey(struct ssh *ssh)
                    "(received %d, expected %d)", __func__, key->type, pktype);
                goto done;
        }
+       if (log_level_get() >= SYSLOG_LEVEL_DEBUG1) {
+               if ((b = sshbuf_new()) == NULL)
+                       fatal("%s: sshbuf_new failed", __func__);
+               if ((r = sshkey_format_text(key, b)) != 0)
+                       fatal("%s: sshkey_format_text failed: %s", __func__,
+                               ssh_err(r));
+               debug("%s: public key of %s: %s", __func__, authctxt->user,
+                       sshbuf_ptr(b));
+               sshbuf_free(b);
+               b = NULL;
+       }
        if (sshkey_type_plain(key->type) == KEY_RSA &&
            (ssh->compat & SSH_BUG_RSASIGMD5) != 0) {
                logit("Refusing RSA key because client uses unsafe "

答案2

LogLevel DEBUG2OpenSSH 8.9(可能还有其他更低版本和更高版本)在使用in运行时将显示公钥/etc/ssh/sshd_config

但是:OpenSSH 将其日志行的长度默认限制为 500 个字符,因此在大多数情况下您需要对其进行修补才能获取完整密钥。

我在 Ubuntu 上安装时使用的补丁如下:

diff --git a/log.c b/log.c
index bdc4b6515..09474e23a 100644
--- a/log.c
+++ b/log.c
@@ -325,7 +325,7 @@ log_redirect_stderr_to(const char *logfile)
    log_stderr_fd = fd;
 }
 
-#define MSGBUFSIZ 1024
+#define MSGBUFSIZ 8192
 
 void
 set_log_handler(log_handler_fn *handler, void *ctx)
@@ -417,7 +417,7 @@ do_log(LogLevel level, int force, const char *suffix, const char *fmt,
        closelog_r(&sdata);
 #else
        openlog(progname, LOG_PID, log_facility);
-       syslog(pri, "%.500s", fmtbuf);
+       syslog(pri, "%.8192s", fmtbuf);
        closelog();
 #endif
    }
-- 

如果您看到完整的行,则赠品是日志行 - 以debug2: userauth_pubkey: valid user someusername querying public key(其中 someusername 是身份验证用户)开头是否以字符串 结尾[preauth]。 ECC-DSA 密钥可能足够短,可以容纳,但 RSA 密钥绝对不是。

相关内容