On Mon, Aug 22, 2016 at 11:10:28PM +0300, Pavel Korovin wrote:
> Dear all,
>
> I have local patch which implements IP/hostname logging for all SMTP
> operations.
> It simplifies log processing for me since I don't have to keep reference
> between session ids and IPs/hostnames and check it every time I need to check
> who's originating given SMTP transaction.
> Does it make sense for anybody else?
>
Yes, I'll take care of this during the general hackathon next week, thanks ;-)
> Index: usr.sbin/smtpd/mta.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/mta.c,v
> retrieving revision 1.201
> diff -u -p -r1.201 mta.c
> --- usr.sbin/smtpd/mta.c 22 May 2016 16:31:21 -0000 1.201
> +++ usr.sbin/smtpd/mta.c 22 Aug 2016 19:33:08 -0000
> @@ -1610,8 +1610,8 @@ mta_log(const struct mta_envelope *evp,
> const char *relay, const char *status)
> {
> log_info("%016"PRIx64" mta event=delivery evpid=%016"PRIx64" "
> - "from=<%s> to=<%s> rcpt=<%s> source=%s "
> - "relay=%s delay=%s result=%s stat=%s",
> + "from=<%s> to=<%s> rcpt=<%s> source=\"%s\" "
> + "relay=\"%s\" delay=%s result=\"%s\" stat=\"%s\"",
> evp->session,
> evp->id,
> evp->task->sender,
> Index: usr.sbin/smtpd/smtp_session.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/smtp_session.c,v
> retrieving revision 1.285
> diff -u -p -r1.285 smtp_session.c
> --- usr.sbin/smtpd/smtp_session.c 29 Jul 2016 08:53:07 -0000 1.285
> +++ usr.sbin/smtpd/smtp_session.c 22 Aug 2016 19:33:08 -0000
> @@ -903,9 +903,10 @@ smtp_session_imsg(struct mproc *p, struc
> s->tx->msgid);
>
> TAILQ_FOREACH(rcpt, &s->tx->rcpts, entry) {
> - log_info("%016"PRIx64" smtp event=message msgid=%08x "
> - "from=<%s%s%s> to=<%s%s%s> size=%zu ndest=%zu
> proto=%s",
> + log_info("%016"PRIx64" smtp event=message address=%s
> host=%s "
> + "msgid=%08x from=<%s%s%s> to=<%s%s%s> size=%zu
> ndest=%zu proto=%s",
> s->id,
> + ss_to_text(&s->ss), s->hostname,
> s->tx->msgid,
> s->tx->evp.sender.user,
> s->tx->evp.sender.user[0] == '\0' ? "" : "@",
> @@ -969,8 +970,9 @@ smtp_session_imsg(struct mproc *p, struc
> s = tree_xpop(&wait_ssl_init, resp_ca_cert->reqid);
>
> if (resp_ca_cert->status == CA_FAIL) {
> - log_info("%016"PRIx64" smtp event=closed
> reason=ca-failure",
> - s->id);
> + log_info("%016"PRIx64" smtp event=closed address=%s
> host=%s "
> + "reason=ca-failure",
> + s->id, ss_to_text(&s->ss), s->hostname);
> smtp_free(s, "CA failure");
> return;
> }
> @@ -996,8 +998,8 @@ smtp_session_imsg(struct mproc *p, struc
> s->flags |= SF_VERIFIED;
> else if (s->listener->flags & F_TLS_VERIFY) {
> log_info("%016"PRIx64" smtp "
> - "event=closed reason=cert-check-failed",
> - s->id);
> + "event=closed address=%s host=%s
> reason=cert-check-failed",
> + s->id, ss_to_text(&s->ss), s->hostname);
> smtp_free(s, "SSL certificate check failed");
> return;
> }
> @@ -1034,8 +1036,8 @@ smtp_filter_response(uint64_t id, int qu
> case QUERY_CONNECT:
> if (status != FILTER_OK) {
> log_info("%016"PRIx64" smtp "
> - "event=closed reason=filter-reject",
> - s->id);
> + "event=closed address=%s host=%s
> reason=filter-reject",
> + s->id, ss_to_text(&s->ss), s->hostname);
> smtp_free(s, "rejected by filter");
> return;
> }
> @@ -1255,8 +1257,8 @@ smtp_io(struct io *io, int evt)
> switch (evt) {
>
> case IO_TLSREADY:
> - log_info("%016"PRIx64" smtp event=starttls ciphers=\"%s\"",
> - s->id, ssl_to_text(s->io.ssl));
> + log_info("%016"PRIx64" smtp event=starttls address=%s host=%s
> ciphers=\"%s\"",
> + s->id, ss_to_text(&s->ss), s->hostname,
> ssl_to_text(s->io.ssl));
>
> s->flags |= SF_SECURE;
> s->phase = PHASE_INIT;
> @@ -1268,8 +1270,8 @@ smtp_io(struct io *io, int evt)
>
> if (s->listener->flags & F_TLS_VERIFY) {
> log_info("%016"PRIx64" smtp "
> - "event=closed reason=no-client-cert",
> - s->id);
> + "event=closed address=%s host=%s
> reason=no-client-cert",
> + s->id, ss_to_text(&s->ss), s->hostname);
> smtp_free(s, "client did not present certificate");
> return;
> }
> @@ -1280,8 +1282,8 @@ smtp_io(struct io *io, int evt)
> x = SSL_get_peer_certificate(s->io.ssl);
> if (x) {
> log_info("%016"PRIx64" smtp "
> - "event=client-cert-check result=\"%s\"",
> - s->id,
> + "event=client-cert-check address=%s host=%s
> result=\"%s\"",
> + s->id, ss_to_text(&s->ss), s->hostname,
> (s->flags & SF_VERIFIED) ? "success" : "failure");
> X509_free(x);
> }
> @@ -1357,8 +1359,9 @@ smtp_io(struct io *io, int evt)
>
> case IO_LOWAT:
> if (s->state == STATE_QUIT) {
> - log_info("%016"PRIx64" smtp event=closed reason=quit",
> - s->id);
> + log_info("%016"PRIx64" smtp event=closed address=%s
> host=%s "
> + "reason=quit",
> + s->id, ss_to_text(&s->ss), s->hostname);
> smtp_free(s, "done");
> break;
> }
> @@ -1387,20 +1390,23 @@ smtp_io(struct io *io, int evt)
> break;
>
> case IO_TIMEOUT:
> - log_info("%016"PRIx64" smtp event=closed reason=timeout",
> - s->id);
> + log_info("%016"PRIx64" smtp event=closed address=%s host=%s "
> + "reason=timeout",
> + s->id, ss_to_text(&s->ss), s->hostname);
> smtp_free(s, "timeout");
> break;
>
> case IO_DISCONNECTED:
> - log_info("%016"PRIx64" smtp event=closed reason=disconnect",
> - s->id);
> + log_info("%016"PRIx64" smtp event=closed address=%s host=%s "
> + "reason=disconnect",
> + s->id, ss_to_text(&s->ss), s->hostname);
> smtp_free(s, "disconnected");
> break;
>
> case IO_ERROR:
> - log_info("%016"PRIx64" smtp event=closed reason=\"io-error:
> %s\"",
> - s->id, io->error);
> + log_info("%016"PRIx64" smtp event=closed address=%s host=%s "
> + "reason=\"io-error: %s\"",
> + s->id, ss_to_text(&s->ss), s->hostname, io->error);
> smtp_free(s, "IO error");
> break;
>
> @@ -2224,26 +2230,33 @@ smtp_reply(struct smtp_session *s, char
> case '4':
> if (s->flags & SF_BADINPUT) {
> log_info("%016"PRIx64" smtp "
> - "event=bad-input result=\"%.*s\"",
> - s->id, n, buf);
> + "event=bad-input address=%s host=%s
> result=\"%.*s\"",
> + s->id, ss_to_text(&s->ss), s->hostname, n, buf);
> }
> else if (s->state == STATE_AUTH_INIT) {
> - log_info("smtp-in: Failed command on session %016"PRIx64
> - ": \"AUTH PLAIN (...)\" => %.*s", s->id, n, buf);
> + log_info("%016"PRIx64" smtp "
> + "event=failed-command address=%s host=%s "
> + "command=\"AUTH PLAIN (...)\" result=\"%.*s\"",
> + s->id, ss_to_text(&s->ss), s->hostname, n, buf);
> }
> else if (s->state == STATE_AUTH_USERNAME) {
> - log_info("smtp-in: Failed command on session %016"PRIx64
> - ": \"AUTH LOGIN (username)\" => %.*s", s->id, n,
> buf);
> + log_info("%016"PRIx64" smtp "
> + "event=failed-command address=%s host=%s "
> + "command=\"AUTH LOGIN (username)\" result=\"%.*s\"",
> + s->id, ss_to_text(&s->ss), s->hostname, n, buf);
> }
> else if (s->state == STATE_AUTH_PASSWORD) {
> - log_info("smtp-in: Failed command on session %016"PRIx64
> - ": \"AUTH LOGIN (password)\" => %.*s", s->id, n,
> buf);
> + log_info("%016"PRIx64" smtp "
> + "event=failed-command address=%s host=%s "
> + "command=\"AUTH LOGIN (password)\" result=\"%.*s\"",
> + s->id, ss_to_text(&s->ss), s->hostname, n, buf);
> }
> else {
> strnvis(tmp, s->cmd, sizeof tmp, VIS_SAFE | VIS_CSTYLE);
> log_info("%016"PRIx64" smtp "
> - "event=failed-command command=\"%s\"
> result=\"%.*s\"",
> - s->id, tmp, n, buf);
> + "event=failed-command address=%s host=%s
> command=\"%s\" "
> + "result=\"%.*s\"",
> + s->id, ss_to_text(&s->ss), s->hostname, tmp, n,
> buf);
> }
> break;
> }
--
Gilles Chehade
https://www.poolp.org @poolpOrg