opendmarc+opendkim+amavisd-milter
https://dmarc.org/ jest systemem łączącym SPF (wraz ze sprawdzaniem nagłówka From) oraz DKIM. Poniżej konfiguracja tego combo dla postfixa z działającym uprzednio amavisem. Założenie jest takie: poczta przychodząca od autoryzowanych użykowników ma być przyjmowana do kolejki a następnie skanowana amavisem. Reszta poczty ma być skanowana opendkim+opendmarc+amavis zanim trafi do kolejki, komunikat o odrzuceniu emaila ma być prezentowany serwerowi nadawcy jeszcze w sesji SMTP. W tym celu użyjemy mechanizmów miltrów.
instalujemy paczki:
apt install opendkim opendmarc amavisd-milter
Powyższe to są trzy daemony, które mogą nasłuchiwać albo na socketach albo na interfejsie sieciowym. Ja wybrałem konfigurację po interfejsie sieciowym. Zatem:
/etc/default/opendmarc
SOCKET="inet:10027@localhost"
/etc/default/opendkim
SOCKET="inet:10028@localhost"
/etc/default/amavisd-milter
MILTERSOCKET=inet:10029@127.0.0.1
EXTRAPARAMS="-m 4" # ten parametr musi być równy $max_servers z konfiguracji amavisa oraz kolumnie maxproc w master.cf dla transportu smtp-amavis
/etc/opendkim.conf
AuthservID HOSTNAME
Mode v
/etc/opendmarc.conf
AuthservID HOSTNAME
HistoryFile /var/run/opendmarc/opendmarc.dat
SPFIgnoreResults true
SPFSelfValidate trueIgnoreAuthenticatedClients true
Ważna uwaga: parametry AuthservID w konfiguracjach opendmarc i opendkim muszą być identyczne
/etc/postfix/main.cf
# kolejność: opendkim, opendmarc, amavisd-milter
smtpd_milters = inet:localhost:10028, inet:localhost:10027, inet:localhost:10029
# nie ustawiamy amavisa jako content-filtra
smtpd_proxy_filter=
content_filter=
/etc/postfix/master.cf
smtp inet n - y - 20 smtpd
submission inet n - y - - smtpd
-o syslog_name=submission
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes
-o milter_macro_daemon_name=ORIGINATING
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=reject_sender_login_mismatch,permit
-o receive_override_options=no_address_mappings,no_milters
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
-o smtpd_proxy_filter=
-o content_filter=smtp-amavis:[127.0.0.1]:10024
smtps inet n - y - - smtpd
-o syslog_name=smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=reject_sender_login_mismatch,permit
-o receive_override_options=no_address_mappings,no_milters
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
-o smtpd_proxy_filter=
-o content_filter=smtp-amavis:[127.0.0.1]:10024
smtp-amavis unix - - n - 4 smtp
-o smtp_data_done_timeout=1200
-o disable_dns_lookups=no
-o smtp_send_xforward_command=yes
127.0.0.1:10025 inet n - n - - smtpd
-o smtpd_proxy_filter=
-o content_filter=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o mynetworks_style=host
-o strict_rfc821_envelopes=no
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks,no_milters
-o smtpd_client_connection_limit_exceptions=127.0.0.0/8
-o smtpd_client_connection_count_limit=200
-o smtpd_client_connection_rate_limit=200
-o smtpd_client_recipient_rate_limit=1000
-o smtpd_client_message_rate_limit=1000
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
-o smtpd_authorized_xclient_hosts=127.0.0.0/8
Czyli tak: na porcie 25 postfix odpali po kolei trzy miltry i ich wynik przekaże do serwera nadawcy jeszcze w sesji.
na portach 587 i 465 postfix nie odpali żadnego miltra, za to przyjmie emaila do kolejki i przekaże go do amavisa nasłuchującego na 10024
z amavisa email powróci do postfixa nasłuchującego na porcie 10025
Amavisa używam zarówno do skanowania poczty przy/prze/wy-chodzącej jak i do podpisywania DKIM wiadomości wychodzących z lokalnych domen.
Najpierw trzeba utworzyć klucze:
cd /etc/amavis
amavisd-new genrsa dkim.pem
/etc/amavis/conf.d/50-user
$enable_dkim_verification = 0;
$enable_dkim_signing = 1;
dkim_key('lemat.priv.pl', 'mail', '/etc/amavis/dkim.pem');
@dkim_signature_options_bysender_maps = (
{ '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } );
@mynetworks = qw(127.0.0.0/8 192.168.0.0/16); # list your internal networks
$interface_policy{'SOCK'} = 'DKIM_CHECK';
$policy_bank{'DKIM_CHECK'} = {
protocol => 'AM.PDP', # select Amavis policy delegation protocol
originating => 1,
};
$interface_policy{'10024'} = 'DKIM_SIGN';
$policy_bank{'DKIM_SIGN'} = {
originating => 1,
};
I dodać je do DNSów:
amavisd-new showkeys
pokaże nam klucze, które mamy dodać do dnsów. Razem z SPF i DMARC wygląda to tak:
IN TXT "v=spf1 mx -all"
mail._domainkey 3600 TXT (
"v=DKIM1; p="
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPBko3RtAXGVsEaybrFXhZNJN0"
"E36faN0+/FClXYVyhvDnGIlKi+NlMwQ+S4F5m5+xD0BkAPIg6lT2WkdbxbsUQKxb"
"eRB3gHDVdiRJzbZL1UaICkBYN90qJVQ/PogrqimT+AWkIw6yBGosjl2S5dzc2oaA"
"eqSDrUCnjteldWPzXwIDAQAB")
_adsp._domainkey IN TXT "dkim=all"
_dmarc IN TXT "v=DMARC1; p=reject; sp=reject; aspf=s; adkim=r; rua=mailto:postmaster@domena; fo=1; pct=100; ri=86400;"
Krótkie wyjaśnienie tego ostatniego:
p= polityka co odbiorca powinien zrobić z emailem, może być erject, może być quarantine
sp= polityka dla subdomen
aspf= polityka SPF, może być Relaxed, może być Strict
adkim= polityka DKIM, może być Relaxed, może być Strict
rua= adres email, na któwy będą wpływać raporty
fo= polityka generowania raportów
pct= procent emaili podlegających regułom
ri= report interval czyli odstęp miedzy raportami
Na stronie https://mxtoolbox.com/ możemy przetestować ustawienia DMARC, strona też objaśni użyte oznaczenia.
Najlepiej to też testować wysyłając emaila z/na @gmail.com
W nagłówkach emaila przychodzacego z domeny podpisujęcej emaile DKIMem i zabezpieczonej SPFem - do serwera z powyższą konfiguracją powinniśmy zobaczyć:
Authentication-Results: mail; dmarc=pass header.from=lemat.priv.pl Authentication-Results: mail; dkim=pass reason="1024-bit key; unprotected key" header.d=lemat.priv.pl header.i=@lemat.priv.pl header.b=plUiyQ24; dkim-adsp=pass; dkim-atps=neutral
W nagłówku Authentication-Results: pierwszym wpisem jest HOSTNAME - sprawdźcie w testowych emailach czy na pewno jest to identyczne w obu nagłówkach.
Bug: IgnoreAuthenticatedClients true powinno ignorować klientów, którzy są zalogowani. Ale to nie działa w 1.3.0.
Komentarze:
Widzę, że teraz odszedłeś od tej metody. Możesz napisać dlaczego? Czy podana wyżej konfiguracja lepiej się sprawdza i nie ma potrzeby rozdzielania obu przypadków?
Jeśli tak faktycznie jest, czy powyższe to pełna konfiguracja postfix + amavis? Czy wymaga to jeszcze uzupełnienia o coś?
Setup fajny, bardzo uproszczony szczególnie w przypadku eliminacji dodatkowych portów zarówno po stronie mastera jak i amavisa.