On Fri, Aug 18, 2023 at 06:43:50PM +0100, Stuart Henderson wrote:
> On 2023/08/18 17:39, Tobias Heider wrote:
> > Hi,
> > 
> > I was looking at my authlog today and as expected on a server exposed on the
> > public internet it is filled with random scanners and brute force attacks.
> > One thing I noticed is that there is a lot of information we log multiple
> > times for a each failed connection.
> > 
> > Some examples below:
> > 
> > sshd[6216]: error: kex_exchange_identification: banner line contains 
> > invalid characters
> > sshd[6216]: banner exchange: Connection from xx.97.73.149 port 64744: 
> > invalid format 
> > sshd[68416]: error: kex_exchange_identification: banner line contains 
> > invalid characters
> > sshd[68416]: banner exchange: Connection from xx.97.73.149 port 63955: 
> > invalid format 
> > 
> > There are a few more parsing errors like this that result in a print of the 
> > exact
> > issue error followed by 'goto invalid' which causes the more general 
> > "invalid format"
> > message. I think "invalid format" is enough information in most cases.
> > 
> > sshd[50752]: error: kex_exchange_identification: Connection closed by 
> > remote host 
> > sshd[50752]: Connection closed by xx.94.81.243 port 61000
> > 
> > Same as above, the kex_exchange_identification doesn't really add anything.
> > 
> > sshd[51579]: Invalid user tom from xx.134.191.142 port 35480
> > sshd[51579]: Received disconnect from xx.134.191.142 port 35480:11: Bye Bye 
> > [preauth]
> > sshd[51579]: Disconnected from invalid user tom xx.134.191.142 port 35480 
> > [preauth]
> > sshd[94857]: Invalid user long from xx.97.173.1 port 51140
> > sshd[94857]: Received disconnect from xx.97.173.1 port 51140:11: Bye Bye 
> > [preauth]
> > sshd[94857]: Disconnected from invalid user long xx.97.173.1 port 51140 
> > [preauth]
> > 
> > Here the "Disconnected" line contains all the info from "Invalid user" line.
> > Those invalid user messages make up the largest part of my log file,
> > so deduplicating them makes a huge difference.
> > 
> > Below is a diff to make some of those log to debug if the same information
> > is also logged elsewhere.
> > Is there some general interest in diffs to clean this up a bit?
> 
> There are some messages which don't show up in the "Disconnected from"
> line which may possibly give some clues about the source of connections,
> so might be of interest. If someone does want to log them, going all
> the way to debug is going to result in a *lot* more useless lines being
> logged.
> 
> So if they are getting squelched I think they would better under verbose
> rather than debug.

Right, verbose is probably a better choice.

> 
> examples...
> 
> sshd[2722]: Connection from 20.168.51.56 port 54850 on 195.95.187.26 port 22 
> rdomain "0"
> sshd[2722]: error: Received disconnect from 20.168.51.56 port 54850:3: 
> com.jcraft.jsch.JSchException: Auth fail [preauth]
> sshd[2722]: Disconnected from authenticating user root 20.168.51.56 port 
> 54850 [preauth]
> 
> sshd[50247]: Connection from 218.92.0.22 port 36077 on 195.95.187.184 port 22 
> rdomain "0"
> sshd[50247]: Received disconnect from 218.92.0.22 port 36077:11:  [preauth]
> sshd[50247]: Disconnected from authenticating user root 218.92.0.22 port 
> 36077 [preauth]
> 
> sshd[12117]: Connection from 222.71.84.234 port 53262 on 195.95.187.26 port 
> 22 rdomain "0"
> sshd[12117]: Invalid user A@0599343813A@0599343813A@0599343813 from 
> 222.71.84.234 port 53262
> sshd[12117]: Received disconnect from 222.71.84.234 port 53262:11: Normal 
> Shutdown, Thank you for playing [preauth]
> sshd[12117]: Disconnected from invalid user 
> A@0599343813A@0599343813A@0599343813 222.71.84.234 port 53262 [preauth]
> 
> sshd[83269]: Connection from 143.244.50.173 port 46078 on 195.95.187.28 port 
> 22 rdomain "0"
> sshd[83269]: Invalid user admin from 143.244.50.173 port 46078
> sshd[83269]: Received disconnect from 143.244.50.173 port 46078:11: end 
> [preauth]
> sshd[83269]: Disconnected from invalid user admin 143.244.50.173 port 46078 
> [preauth]
> 
> and I have all sorts in "kex_exchange_identification: client sent
> invalid protocol identifier"

That one should already be included with my diff. That's one of those goto
invalid cases.

Updated diff with s/debug/verbose/ below.

Index: auth.c
===================================================================
RCS file: /cvs/src/usr.bin/ssh/auth.c,v
retrieving revision 1.160
diff -u -p -r1.160 auth.c
--- auth.c      5 Mar 2023 05:34:09 -0000       1.160
+++ auth.c      18 Aug 2023 18:01:49 -0000
@@ -431,7 +431,7 @@ getpwnamallow(struct ssh *ssh, const cha
 
        pw = getpwnam(user);
        if (pw == NULL) {
-               logit("Invalid user %.100s from %.100s port %d",
+               verbose("Invalid user %.100s from %.100s port %d",
                    user, ssh_remote_ipaddr(ssh), ssh_remote_port(ssh));
                return (NULL);
        }
Index: kex.c
===================================================================
RCS file: /cvs/src/usr.bin/ssh/kex.c,v
retrieving revision 1.179
diff -u -p -r1.179 kex.c
--- kex.c       18 Aug 2023 01:37:41 -0000      1.179
+++ kex.c       18 Aug 2023 18:01:50 -0000
@@ -1336,7 +1336,7 @@ kex_exchange_identification(struct ssh *
                        len = atomicio(read, ssh_packet_get_connection_in(ssh),
                            &c, 1);
                        if (len != 1 && errno == EPIPE) {
-                               error_f("Connection closed by remote host");
+                               verbose_f("Connection closed by remote host");
                                r = SSH_ERR_CONN_CLOSED;
                                goto out;
                        } else if (len != 1) {
@@ -1352,7 +1352,7 @@ kex_exchange_identification(struct ssh *
                        if (c == '\n')
                                break;
                        if (c == '\0' || expect_nl) {
-                               error_f("banner line contains invalid "
+                               verbose_f("banner line contains invalid "
                                    "characters");
                                goto invalid;
                        }
@@ -1362,7 +1362,7 @@ kex_exchange_identification(struct ssh *
                                goto out;
                        }
                        if (sshbuf_len(peer_version) > SSH_MAX_BANNER_LEN) {
-                               error_f("banner line too long");
+                               verbose_f("banner line too long");
                                goto invalid;
                        }
                }
@@ -1378,7 +1378,7 @@ kex_exchange_identification(struct ssh *
                }
                /* Do not accept lines before the SSH ident from a client */
                if (ssh->kex->server) {
-                       error_f("client sent invalid protocol identifier "
+                       verbose_f("client sent invalid protocol identifier "
                            "\"%.256s\"", cp);
                        free(cp);
                        goto invalid;

Reply via email to