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(및 기타 하위 및 상위 버전)는 에서 실행될 때 공개 키를 표시합니다 /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
    }
-- 

(someusername이 인증 사용자인)로 시작하는 전체 라인이 debug2: userauth_pubkey: valid user someusername querying public key문자열로 끝나거나 문자열로 끝나는 경우 로그 라인이 제공됩니다 [preauth]. ECC-DSA 키는 수용할 수 있을 만큼 짧을 수 있지만 RSA 키는 그렇지 않습니다.

관련 정보