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;