Group config parameters

This commit is contained in:
Gonne 2025-03-02 11:57:05 +01:00
parent 654922c40a
commit 9c26820b8f

View file

@ -101,7 +101,7 @@ in {
# Reevaluate after DKIM and DMARC deployment # Reevaluate after DKIM and DMARC deployment
spam.header.is-spam = "Dummyheader"; # disable moving to spam which would conflict with forwarding spam.header.is-spam = "Dummyheader"; # disable moving to spam which would conflict with forwarding
auth = { auth = {
# TODO check if HRZ conforms to these standards and we can validate them strictly # TODO check if HRZ and our own VMs conform to these standards and we can validate them strictly
dkim.verify = "relaxed"; dkim.verify = "relaxed";
arc.verify = "relaxed"; arc.verify = "relaxed";
dmarc.verify = "relaxed"; dmarc.verify = "relaxed";
@ -140,20 +140,38 @@ in {
starttls = "optional"; # e.g. Lobon does not offer starttls starttls = "optional"; # e.g. Lobon does not offer starttls
}; };
}; };
remote."hrz" = { remote = {
"hrz" = {
address = "mailout.hrz.tu-darmstadt.de"; address = "mailout.hrz.tu-darmstadt.de";
port = 25; port = 25;
protocol = "smtp"; protocol = "smtp";
tls.implicit = false; # Don't assume TLS on this port but use STARTTLS tls.implicit = false; # Don't assume TLS on this port but use STARTTLS
}; };
remote."mailman" = { "mailman" = {
address = "lobon.mathebau.de"; # must be created in DNS as a MX record because this field does not accept ip addresses. address = "lobon.mathebau.de"; # must be created in DNS as a MX record because this field does not accept ip addresses.
port = 25; port = 25;
protocol = "smtp"; protocol = "smtp";
tls.implicit = false; # Don't assume TLS on this port but use STARTTLS tls.implicit = false; # Don't assume TLS on this port but use STARTTLS
}; };
};
session.rcpt = { session = {
ehlo.require = [
{
"if" = "starts_with(remote_ip, '192.168.0.')"; #TODO setup vms properly
"then" = false;
}
{"else" = true;}
];
ehlo.reject-non-fqdn = [
{
"if" = "starts_with(remote_ip, '192.168.0.')"; #TODO setup vms properly
"then" = false;
}
{"else" = true;}
];
rcpt = {
# In order to accept mail that we only forward # In order to accept mail that we only forward
# without having to generate an account. # without having to generate an account.
# Invalid addresses are filtered by DFN beforehand. # Invalid addresses are filtered by DFN beforehand.
@ -167,25 +185,12 @@ in {
{"else" = false;} {"else" = false;}
]; ];
}; };
data.script = "'redirects'";
session.ehlo.require = [ };
{
"if" = "starts_with(remote_ip, '192.168.0.')"; #TODO setup vms properly
"then" = false;
}
{"else" = true;}
];
session.ehlo.reject-non-fqdn = [
{
"if" = "starts_with(remote_ip, '192.168.0.')"; #TODO setup vms properly
"then" = false;
}
{"else" = true;}
];
# Stalwart gets its configuration from two places: A TOML configuration file that we control in this module # Stalwart gets its configuration from two places: A TOML configuration file that we control in this module
# and from a database that can be configured from web management interface or via Rest API. # and from a database that can be configured from web management interface or via Rest API.
# We here define what comes from the TOML-file and especially add "sieve.trusted.scripts.*" to the default ones # We here define what comes from the TOML-file and especially add "sieve.trusted.*" to the default ones
# because only TOML-based keys may use macros to load files from disk. # because only TOML-based keys may use macros to load files from disk.
# We want this to be able to load our sieve-script for mail forwarding. # We want this to be able to load our sieve-script for mail forwarding.
# See https://stalw.art/docs/configuration/overview/#local-and-database-settings for more details. # See https://stalw.art/docs/configuration/overview/#local-and-database-settings for more details.
@ -207,24 +212,24 @@ in {
"certificate.*" "certificate.*"
] # the default ones ] # the default ones
++ ["sieve.trusted.*"]; #for macros to be able to include our redirection script ++ ["sieve.trusted.*"]; #for macros to be able to include our redirection script
sieve.trusted.scripts.redirects.contents = "%{file:/tmp/virt_aliases}%"; # generated redirect script sieve.trusted = {
sieve.trusted.from-addr = "sender"; # set the from-address to the original sender as specified in the MAIL FROM. scripts.redirects.contents = "%{file:/tmp/virt_aliases}%"; # generated redirect script
sieve.trusted.from-name = "sender"; trusted.from-addr = "sender"; # set the from-address to the original sender as specified in the MAIL FROM.
sieve.trusted.return-path = "sender"; from-name = "sender";
return-path = "sender";
# If we are the sender, we sign the message with DKIM. Else we leave it alone. # If we are the sender, we sign the message with DKIM. Else we leave it alone.
sieve.trusted.sign = [ sign = [
{ {
"if" = "is_local_domain('', sender_domain) || sender_domain == 'lists.mathebau.de'"; "if" = "is_local_domain('', sender_domain) || sender_domain == 'lists.mathebau.de'";
"then" = "['rsa-' + sender_domain, 'ed25519-' + sender_domain]"; "then" = "['rsa-' + sender_domain, 'ed25519-' + sender_domain]";
} }
{"else" = false;} {"else" = false;}
]; ];
sieve.trusted.limits = { limits = {
redirects = 50; redirects = 50;
out-messages = 50; out-messages = 50;
}; };
session.data.script = "'redirects'"; };
# See https://stalw.art/docs/smtp/authentication/dkim/sign # See https://stalw.art/docs/smtp/authentication/dkim/sign
# We need two blocks per domain because the domain setting in the blocks does not accept variables like `sender_domain`. # We need two blocks per domain because the domain setting in the blocks does not accept variables like `sender_domain`.
signature = let signature = let
@ -249,15 +254,6 @@ in {
in in
map signatureTemplate (["lists.mathebau.de"] ++ (map ({domain, ...}: domain) cfg.domains)); map signatureTemplate (["lists.mathebau.de"] ++ (map ({domain, ...}: domain) cfg.domains));
# Sign *our* outgoing mails with the configured signatures.
auth.dkim.sign = [
{
"if" = "is_local_domain('', sender_domain) || sender_domain == 'lists.mathebau.de'";
"then" = "['rsa-' + sender_domain, 'ed25519-' + sender_domain]";
}
{"else" = false;}
];
authentication.fallback-admin = { authentication.fallback-admin = {
user = "admin"; user = "admin";
# see passwd on azathoth for plaintext or machine secret in encoded format for HTTP Basic AUTH # see passwd on azathoth for plaintext or machine secret in encoded format for HTTP Basic AUTH