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?
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 14:22:55 -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",
+ debug("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 14:22:55 -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");
+ debug_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 "
+ debug_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");
+ debug_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 "
+ debug_f("client sent invalid protocol identifier "
"\"%.256s\"", cp);
free(cp);
goto invalid;