On Sat, Jan 08, 2022 at 12:00:45PM +1100, raf wrote:
> When reading the documentation on smtp_tls_security_level, I thought
> dane-falling-back-to-encrypt seemed to be a missing option. But I
> thought it would never be used as a default, and for any non-default
> specific remote server, you're likely to know whether they do DANE or
> not, so you could always pick "dane" or "encrypt" for those.
>
> But it would be nice not to have to know whether a
> known peer has DANE or just TLS. After all, they might
> change their mind, start with just TLS, and then
> implement DANE later on.
>
> A security level that automatically upgraded from
> "encrypt" to "dane" when DANE becomes available seems
> like a good idea.
Perhaps the right insight is that DANE isn't a (local policy) TLS
security level like the others, rather DANE, when enabled *overrides*
the local security policy level with "more authoritative" information
about the TLS capabilities of the nexthop domain.
I can then refactor DANE, not as a security-level, but rather as a
feature you can enable or disable either globally or per-destination.
main.cf:
smtp_tls_dane_enable = yes
tls_policy:
example.org encrypt dane-enable=yes
example.com secure match=.example.com dane-enable=no
The "dane-only" level remains a true local policy partly supplemented
with remote detail, but the "dane" security level becomes a legacy
setting.
The question is then what to do about backwards compatibility for all
the users who have "smtp_tls_security_level = dane"? We would likely
need a second parameter to indicate the real security level when this is
the case. Something like:
main.cf:
smtp_tls_local_security_level = may | encrypt | ...
tls-policy:
example.org dane local_level=secure match=.example.org
which would then make for two ways to configure the same result, and so
perhaps, to keep things simpler, accept the fact that the interface is
not without a history, however imperfect, and pretend that "dane" is a
fully-fledged security level, but under the covers use
"smtp_tls_local_security_level" as the true underlying policy.
Either way, it becomes possible to honour RFC 8461 and prefer DANE to
MTA-STS when both are available, if the dynamic MTA-STS policy add-on
table returns "dane" and a local MTA-STS policy in case DANE is absent.
Turning "dane" into a non-level is cleaner in principle, but it may be
too late to completely change the design.
--
Viktor.