Postfix je malý, bezpečný, flexibilní a rychlý SMTP server. Sám jeho autor uvádí, že se snaží být konkurencí programu qmail. Dále se snaží do maximální možné míry zůstat kompatibilní s programem sendmail. Hlavní výhodou Postfixu je jeho jednoduchá konfigurace a modularita. Díky uvedeným vlastnostem je Postfix MTA vhodný v produkčních nasazeních.
Dovecot je svobodný IMAP/POP3 server pro Linux a další unixové systémy, vytvářený primárně s ohledem na bezpečnost. Vyvíjí ho Timo Sirainen. Hlavním cílem programu Dovecot je lehkotonážní, rychle a snadno zprovoznitelný server pro správu uživatelských schránek ve formátech Mbox a Maildir.
Server by měl mít správně nastavený a přes NTP synchronizovaný systémový čas. Také by měl mít nastavenou svoji ip adresu v souboru /etc/hosts.
Aby mailserver mohl vůbec přijímat a odesilít poštu je potřebné mu nastavit DNS záznamy. Nejdůležitějím záznamem je MX záznam. Záznam může obsahovat více mailserverů, pokud jim přiřadíme priority. Na záznamy s číselně nejnižší prioritou se pošta posílá jako první. Dále by měl mit A, AAAA a PTR záznam.
Krom MX existují také další typy záznamů, které už jsou většinou typu TXT, a šlouží například pro SPF, DKIM, DMARC a další.
dig mail.example.com A +short # should return your server's IPv4 address
dig mail.example.com AAAA +short # should return your server's IPv6 address, if configured
dig -x
Mail-serverové služby těchto aplikací Postfix a Dovecot běží na těchto portech:

U mailserveru se často mluví o 3 komponentach:
Pro šifrované maily pomocí OpenPGP, se pro propageni otisků klíčů mimo jiné používají veřejné key-servery: https://pgp.mit.edu/
Pro operace s maily a mailovou frontou se hodí znát tyto příkazy:
mailq Zobrazení fronty
postqueue -p Zobrazení fronty
mailq | tail -n 1 Zjištění počtu zpráv ve frontě
mailq | grep -c "^$" Zjištění počtu zpráv ve frontě
postqueue -f Řekne Postfixu, vyřídiď mailovou frontu
postcat -vq <ID> Vypsání mailu ve frontě
postcat -vq <ID> > file.txt Uložení mailu ve frontě do souboru
postsuper -d ALL Odebrání všech mailů z fronty
postsuper -d ALL deferred Odebrání všech mailů z deferred fronty
postsuper -d <ID> Odstranění specifického emailu
Odstranění emailu směřujících na specifickou adresu (regexp):
postqueue -p | tail -n +2 | awk 'BEGIN { RS = "" } /.*@.*\.com/ { print $1 }' | tr -d '*!' | postsuper -d -
Docela pěkný webový toolbox pro analýzu mailserver, mailů atp.: mxtoolbox.com
V první řadě zjistíme jestli se nenachazíme na listině blokovaných adres: http://www.spamhaus.org/lookup/
dovecot -n
postconf -n
Občas se hodí manuálně otestovat jestli funguje imap(port 143):
telnet mail.nic.cz 143
openssl s_client -connect mail.nic.cz:993 -crlf
. login zdenek.sobotka@mail.nic.cz *********
. capability # co vsechno imap umi?
. getacl inbox # ukazani jake acl jsou na inboxu
. list "" "*" # vypsani vsech listu
. status inbox (messages) # pocet zprav
. status inbox (recent)
. status inbox (unseen) # nevidenych
. select inbox # vstup do inboxu
. SELECT "INBOX" #lognut do inboxu
. SEARCH ALL # prohledani
* SEARCH 1 2 3 4 5 6 7 8
. FETCH 8 BODY.PEEK[] # natahnuti 8-mailu
. logout
Občas se to hodí také pro SMTPs:
telnet mail.nic.cz 25
openssl s_client -connect mail.nic.cz:465 -crlf -ign_eof
openssl s_client -connect mail.nic.cz:25 -starttls smtp
220 mail.nic.cz ESMTP
EHLO nic.cz
250-mail.nic.cz
250-PIPELINING
250-SIZE 62914560
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
AUTH LOGIN
334 VXNlcm5hbWU6
emRlbmVrLnNvYm90a2FAbmljLmN6 # echo -n "zdenek.sobotka@nic.cz" | base64
334 MARyc6rbcnR6
Wm..........Rs=
235 2.7.0 Authentication successful
MAIL FROM: zdenek.sobotka@nic.cz
250 2.1.0 Ok
RCPT TO: zden2k@gmail.com
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
DATA
Subject: Test Email - Authenticated as michael@example.com
From: zdenek.sobotka@nic.cz
To: zden2k@gmail.com
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
molestie, fringilla turpis id, ultrices tortor,
ac consectetur massa imperdiet ac. Fusce ac porta orci.
.
Posílaní mailů z linuxové konzole(mail. mutt):
mutt -s "testovaci mail" -a /tmp/file.tar.gz jmeno@yyy.cz < /tmp/zprava.txt # poslani mailu z konzole
mail --debug-level=7 -a "From: xxx@mail.cz" -s "Subject" jmeno@yyy.cz -A ~/priloha.txt < mail.txt
Nastavení Return-path (pro mutt, nastavení envelope_from=yes):
vim ~/.muttrc
set envelope_from=yes
set edit_headers = yes
my_hdr Return-Path: <test@test.tld>
my_hdr From: Test <test@test.tld>
echo Test message | mutt -s "Mail test" zdenek.sobotka@nic.cz
Rozepsaní struktury smtp restrictions, na které je pěkně vidět v jaké fázi spojení se restrictions uplatňují:
telnet 192.168.0.2 25 # Comments
Trying 192.168.0.2...
Connected to 192.168.0.2 (192.168.0.2).
Escape character is '^]'.
220 mail.example.com ESMTP Postfix # <-smtp_client_restrictions
HELO mail.example.com # <-smtp_helo_restrictions
250 mail.example.com #
MAIL FROM:<ned@example.com> # <-smtp_sender_restrictions
250 2.1.0 Ok #
RCPT TO:<ned@example.com> # <-smtp_recipient_restrictions
250 2.1.5 Ok #
DATA # <-smtp_data_restrictions
354 End data with <CR><LF>.<CR><LF> #
To:<ned@example.com> # <-header_checks
From:<ned@example.com> #
Subject:SMTP Test #
This is a test message # <-body_checks
. #
250 2.0.0 Ok: queued as 301AE20034
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
smtpd_delay_reject zajistí, že v případě nevyhovění některému z pravidel nedojde k okamžitému odmítnutí, ale vyčká se s odmítnutím až na fázi po zadání RCPT TO:. To má jednak výhodu v kompatibilitě s některými špatně napsanými klienty, ale mnohem podstatnější je skutečnost, že díky tomu bude moci server v případě odmítnutí zaznamenat odesílatele i příjemce zprávy (což se pak lze dozvedět z logu).
smtpd_helo_required určuje zda je příkaz HELO (či EHLO) vyžadován.
smtpd_helo_restrictions určují omezení vztažené k HELO/HELO příkazu.
permit_mynetworks propustí klienta z rozsahu definovaného v proměnné mynetworks, aniž by musel vyhovět kterémukoliv dalšímu pravidlu.
reject_non_fqdn_helo_hostname požaduje, aby klient uvedl jako hostname plně kvalifikované doménové jméno, jak požaduje RFC.
reject_invalid_helo_hostname odmítne klienta, pokud je použitá syntaxe hostname příkazu HELO/EHLO neplatná.
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks,
reject_non_fqdn_helo_hostname,
reject_invalid_helo_hostname
Tato omezení se vztahují k příkazu MAIL FROM: v rámci SMTP relace.
check_sender_access Toto pravidlo vyžaduje jako parametr soubor s dodatečnými pravidly (v příkladu výše /etc/postfix/sender_access). viz.:
hodny_odesilatel.tld OK
spammer.tld REJECT
zly.spammer.tld REJECT You have been blacklisted -> Cháchaáá
zly@spammer.tld REJECT
zloun@ REJECT
spammer@ REJECTreject_non_fqdn_sender odmítne odesílatele, který nemá plně kvalifikované doménové jméno, jak je požadováno v RFC
reject_unknown_sender_domain odmítne klienta, který v doménové části e-mailu použije doménu, která nemá definovaný A ani MX záznam. V případě dočasné chyby DNS vrací chybový kód 450 (čímž instruuje klienta, aby zkusil doručit mail později).
smtpd_sender_restrictions = permit_mynetworks,
check_sender_access hash:/etc/postfix/sender_access,
reject_non_fqdn_sender,
reject_unknown_sender_domain
Tato omezení se vztahují k příkazu RCPT TO: v rámci SMTP relace. Jako jediné ze všech omezení je povinné.
Na správné místo je třeba přidat permit_sasl_authenticated, obvykle za permit_mynetworks. Toto pravidlo povoluje SASL autentifikaci klientů.
check_recipient_access slouží k omezování na úrovni příjemců (v řetězci „RCPT TO:“). Více o syntaxi viz. RESTRICTION_CLASS_README.
Pravidlo reject_unauth_pipelining odmítne klienta, který používá techniku zvanou pipelining, umožňující urychlit doručování většího množství e-mailů použitím více SMTP příkazů najednou. Tato technika vyžaduje, aby si klienti nejprve ověřili, je-li podporována. Spammeři často rovnou posílají řadu příkazů bez toho, aby prováděli ověření. A právě takového klienta Postfix v tomto případě odmítne.
reject_non_fqdn_hostname zablokuje příjemce v případě, že jeho HELO„ není v plném doménovém tvaru. (napr. jenom host namísto host.example.com)
reject_non_fqdn_sender zablokuje přístup v případě, že mailová adresa odesílatele v „MAIL FROM“ není v plném doménovém tvaru.
reject_non_fqdn_recipient odmítne příjemce, který nepoužívá plně kvalifikované doménové jméno
reject_unknown_sender_domain zakáže přípojení v případě, že doména uvedená v „MAIL FROM“ nemá v DNS záznam typu „A“ nebo „MX“.
reject_unknown_recipient_domain zakáže přípojení v případě, že doména uvedená v „RCPT TO“ nemá v DNS záznam typu „A“ nebo „MX“.
check_policy_service unix:private/policy-spf zde kontroluje spf záznam pro příjímané emaily.
smtpd_data_restrictions = reject_unauth_pipelining
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
check_recipient_access hash:/etc/postfix/recipient_whitelist,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
check_policy_service unix:private/policy-spf
Před Postfixem 2.10 se zamezovalo nastavení jako relay tím, že se v smtpd_recepisent_restriction dávalo reject_unauth_destination. Od vyšší verze fungují smtpd_relay_restrictions. Nastavujeme tak aby lokální klienti a authetifikovaní uživatelé mohli odesílat libovolně.
Klíčové je pravidlo reject_unauth_destination nebo defer_unauth_destination, které odmítá poštu pro všechny příjemce s výjimkou těch, pro které poštovní server představuje konečnou. Toto pravidlo tedy zajišťuje, aby server nesloužil jako open relay!. SMTPD_ACCESS_README
append_dot_mydomain určuje, zda se připojuje vlastní doména (převod user@host na user@mydomain). V případě „no“ se to nachavá na MUA.
biff = no zapíná nebo vypína lokální notifikace uživatelům. Z důvodu kompatibility býva tato služba defaultně zapnutá.
compatibility_level Compatibility_level rozhoduje o tom, jaké defaultní nastavení bude pro Postfix platit. Defaultní nastavení se s verzemi čas od času mění. See.: http://www.postfix.org/COMPATIBILITY_README.html, default to 2 on fresh installs.
readme_directory Určuje cestu k lokální dokumentaci Postfixu
message_size_limit = 0 maximální velikost zpracovávaného emailu v bajtech mailbox_size_limit = 0 maximální velikost poštovní schránky se kterou bude Postfix pracovat
disable_vrfy_command zakazuje SMTP příkaz VRFY (tím si může spammer zjišťovat existenci schránek, aniž by se do nich pokusil doručit).
policy-spf_time_limit Timout pro zpracovávání spf.
append_dot_mydomain = no
biff = no
compatibility_level = 2
readme_directory = no
mailbox_size_limit = 0
message_size_limit = 0
disable_vrfy_command = yes
policy-spf_time_limit = 3600
Transport_maps určuje kam se bude pošta předávat. Používáme například při posílání pošty do Mailmana nebo na jiný smtp server. Například:
Tento příklad bude směrovat všechnu poštu pro doménu „example2.com“ na další poštovní server s adresou „10.0.0.1“ (hranaté závorky zabraňují zjišťování MX záznamů a musí být použity, když uvedete IP adresu). A všechny poštovní zprávy pro doménu a subdoménu “.example3.com„ na další poštovní server s adresou „192.168.0.1“. Uvedené domény musí být zahrnuty v relay_domains a současně nesmějí být v mydestination - pokud tam budou, bude je zachytávat Postfix a snažit se je doručovat lokálně.
/etc/postfix/main.cf:
mydestination = nic.cz
relay_domains = example2.com, example3.com
/etc/postfix/transport:
example2.com smtp:[10.0.0.1]
.example3.com smtp:[192.168.0.1]
postmap /etc/postfix/transport
postfix reload
sender_canonical_maps a recepient_canonical_maps Slouží k přepisovaní emailových adres, nebo adres domén. Na každém řádku souboru sender_canonical / recepient_canonical je původní adresa a hned za ní adresa, kterou se má nahradit. Lze použít tvaru s doménami. Úpravy provedené v souboru sender_canonical / recepient_canonical po změnách převedeme do binární podoby pomocí postmap.
fetchmail@neco.cz postmaster@nic.cz
@mandragora.cz @nic.cz
Nastavení SSL/TLS v Postfixu. Existuje také mozilla stránka, která s tímto může pomoct:
### SMTPD
smtpd_tls_loglevel = 1
smtpd_tls_auth_only = yes
smtpd_tls_eecdh_grade = ultra
smtpd_tls_received_header = no
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_CApath = /etc/ssl/certs
#smtpd_tls_cert_file = /etc/ssl/nic-certs/mail.yono.cz/mail.yono.cz.crt
#smtpd_tls_key_file = /etc/ssl/nic-certs/mail.yono.cz/mail.yono.cz.key
smtpd_tls_cert_file = /etc/ssl/nic-certs/mail.nic.cz/mail.nic.cz.crt
smtpd_tls_key_file = /etc/ssl/nic-certs/mail.nic.cz/mail.nic.cz.key
smtpd_tls_dh1024_param_file = /etc/postfix/dhparam/dh1024.pem
smtpd_tls_mandatory_ciphers = high
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3
smtpd_tls_exclude_ciphers = aNULL,eNULL,EXPORT,DES,RC4,MD5,PSK,aECDH,EDH-DSS-DES-CBC3-SHA,EDH-RSA-DES-CDB3-SHA,KRB5-DES,CBC3-SHA
smtpd_tls_security_level = may
### SMTP
#smtp_host_lookup = native
smtp_tls_CApath = /etc/ssl/certs
smtp_tls_exclude_ciphers = $smtpd_tls_exclude_ciphers
smtp_tls_loglevel = $smtpd_tls_loglevel
smtp_tls_mandatory_ciphers = $smtpd_tls_mandatory_ciphers
smtp_tls_mandatory_protocols = $smtpd_tls_mandatory_protocols
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
LMTP (local mail transfer protokol): je zjednodušenou verzí protokolu SMTP, rozdíl je ten že LMTP neřadí zprávy do fronty, tzn. nepokouší se znovu doručit zprávy, které nemůžou být doručeny okamžitě. Když MTA provádí doručování na SMTP server a zpráva je určena pro více příjemců, z nichž jednu nebo více zpráv nelze doručit, přebírá odpovědnost za doručení zprávy později odesílající MTA. LMTP se lokálně konfiguruje pomocí socketů s toutou syntaxí:
### SASL SETTINGS
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
Více viz.:
SASL (Simple Authentication and Security Layer) je obecná metoda pro přidávání nebo zlepšování ověřování v protokolech klient/server. Hlavním účelem je vyjednat způsob ověření klientů na serverech (plain, auth, md5, atd.). Když nastavujete SASL, musíte se rozhodnout pro ověřovací mechanismus, pro výměnu ověřovacích informací, nicméně to obstarává až Dovecot. IMAP, (POP3) a SMTP protokoly mají všechny podporu SASL. Od verze 2.3 Postfix podporuje SMTP Autorizaci skrz SASL Dovecotu, Postfix se nastaví takto:
### SASL SETTINGS
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
Více viz.:
Postfix má nastavení LDAP naspecifikované v adresáři /etc/postfix/ldap/, více viz. dokumentace. V LDAP můžou být definované:
/etc/postfix/virtual_alias protože je to pohodlnějíší, nicméně pokud by to bylo potřeba, i aliasy v LDAP můžou být.Uživatel, který je definovaný ve stromu ou=people,dc=yono,dc=cz, který má zároveň objectClass: postfixUser má zároveň emailovou schránku ve tvaru mail: jmeno.prijmeni@yono.cz. Pokud nechceme, aby uživatel mailovou schránku měl, tak mu tuto objectClass odebereme. Aby uživatelé a servisní mailboxy byly oddělené, jsou učty uživatelů v ou=people,dc=yono,dc=cz. A Servisní mailboxy případně aliasy budou v ou=mailbox,dc=yono,dc=cz. Co je nemilé je to, že jsem nepřišel na způsob, jak mít hesla zahashovaná.
# LDAP settings
server_host = ldap.yono.cz
#server_host = localhost
#server_port = 636
start_tls = yes
version = 3
tls_ca_cert_file = /etc/ssl/certs/ca.pem
tls_require_cert = yes
bind = yes
bind_dn = cn=reader,dc=yoho,dc=cz
bind_pw = heslo
search_base = ou=people,dc=yono,dc=cz
#debuglevel = 7
scope = one
query_filter = (&(objectClass=postfixUser)(mail=%s))
special_result_attribute = Member
result_attribute = homeDirectory
Nepoužívám, nicméne pro úplnnost, pokud bychom chtěli v LDAP virtuální aliasy, nakonfigurujeme to takto:
# LDAP settings
server_host = ldap.yono.cz
#server_port = 636
start_tls = yes
version = 3
tls_ca_cert_file = /etc/ssl/certs/ca.pem
tls_require_cert = yes
bind = yes
bind_dn = cn=reader,dc=yono,dc=cz
bind_pw = heslo
search_base = ou=people,dc=yono,dc=cz
#debuglevel = 7
scope = one
query_filter = (&(objectClass=postfixUser)(mail=%s))
special_result_attribute = Member
terminal_result_attribute = maildrop
leaf_result_attribute = mail
Postfix a Dovecot mám nastavený tak, že v LDAP hledají podle fitru s ObjectClass: postfixUser. Rozšiřující schéma navíc přidává to, že email se bere jako uživatelská schránka. Schéma ObjectClass se rozšíří o postfixUser pro všechny Mailboxy. Zde je schéma v .ldif, které je potřeba naimportovat:
#dn: cn={9}postfix,cn=schema,cn=config
#changetype: modify
#add: olcobjectclasses
#olcobjectclasses: {0}(1.3.6.1.4.1.4203.666.1.100 NAME 'postfixUser' DESC 'Po
# stfix mail user class' SUP top AUXILIARY MAY(mailacceptinggeneralid $ maild
# rop $ mail $ homeDirectory))
### Schema
dn: cn=postfix,cn=schema,cn=config
cn: postfix
objectclass: olcSchemaConfig
olcattributetypes: {0}(1.3.6.1.4.1.4203.666.1.200 NAME 'mailacceptinggeneral
id' DESC 'Postfix mail local address alias attribute' EQUALITY caseIgnoreMa
tch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1
024})
olcattributetypes: {1}(1.3.6.1.4.1.4203.666.1.201 NAME 'maildrop' DESC 'Post
fix mail final destination attribute' EQUALITY caseIgnoreMatch SUBSTR caseI
gnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024})
olcattributetypes: {2}(1.3.6.1.4.1.4203.666.1.202 NAME 'mailEnabled' DESC 'T
RUE to enable, FALSE to disable account' EQUALITY booleanMatch SYNTAX 1.3.6
.1.4.1.1466.115.121.1.7 SINGLE-VALUE)
olcattributetypes: {3}(1.3.6.1.4.1.4203.666.1.203 NAME 'mailQuota' DESC 'Mai
l quota limit in kilobytes' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1
466.115.121.1.26)
olcobjectclasses: {0}(1.3.6.1.4.1.4203.666.1.100 NAME 'postfixUser' DESC 'Po
stfix mail user class' SUP top AUXILIARY MAY(mailacceptinggeneralid $ maild
rop $ mail $ homeDirectory $ mailEnabled $ mailQuota))
Tento seed demonstruje, co můžeme do LDAP vložit. Pokud chceme vložit např. jen mailbox, nebo rovnou celého uživatele:
### INITIAL MAILBOX
dn: ou=mailbox,dc=yono,dc=cz
objectclass: organizationalUnit
objectclass: top
ou: mailbox
### Příklad mailboxu v ou=mailbox,dc=yono,dc=cz
dn: cn=master@yono.cz,ou=mailbox,dc=yono,dc=cz
cn: master@yono.cz
description: [#12345] mailbox master@yono.cz
homedirectory: /var/vmail/yono.cz/master/
mail: master@yono.cz
objectclass: top
objectclass: applicationProcess
objectclass: simpleSecurityObject
objectclass: postfixUser
userpassword: {SSHA}77777777777777777777777777777777
### Příklad uživatelského účtu v ou=people,dc=yono,dc=cz
dn: uid=test,ou=people,dc=yono,dc=cz
cn: Ondrej Pilip
displayname:: T25.........pcA==
gecos: Ondrej Pilip
gidnumber: 5555
givenname:: T25....ag==
homedirectory: /home/test
loginshell: /bin/bash
mail: ondrej.pilip@yono.cz
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
objectclass: shadowAccount
objectclass: sambaSamAccount
objectclass: sambaGroupMapping
objectclass: postfixUser
sambaacctflags: [U ]
sambagrouptype: 2
sambantpassword: 38935A73................FC2B2362
sambaprimarygroupsid: S-1-1-11-1111111111-1111111111-1111111111-1111
sambapwdcanchange: 1111111111
sambapwdlastset: 1111111111
sambasid: S-1-1-11-1111111111-1111111111-1111111111-1111
shadowlastchange: 11111
shadowmax: 55555
shadowwarning: 5
sn: Pilip
uid: test
uid: Ondrej Pilip
uidnumber: 5555
userpassword: {SSHA}55555555555555555555555555555555
# V pripade, ze bychom chteli v LDAP aliasy, neni nutne mame je v souboru /etc/postfix/virtual_alias:
dn: ou=test-alias123@yono.cz,ou=mailbox,dc=yono,dc=cz
cn: test-alias123@yono.cz
mail: test-alias123@yono.cz
member: cn=tester1@yono.cz,ou=mailbox,dc=yono,dc=cz
member: cn=tester2@yono.cz,ou=mailbox,dc=yono,dc=cz
member: cn=tester3@yono.cz,ou=mailbox,dc=yono,dc=cz
objectclass: top
objectclass: groupOfNames
objectclass: postfixUser
ou: test-alias123@yono.cz
# Nebo alias na domenovy kos
dn: ou=@rrr.cz,ou=mailbox,dc=yono,dc=cz
cn: @rrr.cz
mail: @rrr.cz
member: cn=monitoring@yono.cz,ou=mailbox,dc=yono,dc=cz
objectclass: top
objectclass: groupOfNames
objectclass: postfixUser
ou: @rrr.cz
Opendkim je nástroj pro elektronické podepisování hlaviček odsílaných emailů. DKIM umožňuje příjemci zjistit, zda-li email skutečně pochází od zdroje, který je uveden jako adresa odesílatele. Ověření DKIM podpisu v přijatém emailu je možné pomocí veřejného klíče vloženého v doméně odesílatele. DKIM rád spolupracuje s DMARC.
apt-get install opendkim opendkim-tools
mkdir /etc/opendkim
mkdir /etc/opendkim/keys
Konfigurák Opendkim je v /etc/opendkim.conf:
AutoRestart yes
AutoRestartRate 5/1m
AutoRestartCount 10
UMask 000
Syslog yes
SyslogSuccess Yes
LogWhy Yes
ReportAddress something@example.cz
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
Mode sv
SignatureAlgorithm rsa-sha256
RemoveOldSignatures yes
SignHeaders "Subject,To,From,Reply-to,Date,Cc"
UserID opendkim:postfix
V Postfixu používame připojení přes socket, což lze nastavit v /etc/default/opendkim:
RUNDIR=/var/spool/postfix/var/run/opendkim
SOCKET=local:$RUNDIR/opendkim.sock
USER=opendkim
GROUP=postfix
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=
Tabulky se "selectory" a doménami jsou v souboru /etc/opendkim/KeyTable. Selector se používá pro rozlišení DKIM v DNS, pokud jich existuje více, nebo se používají na různých strojích.
default._domainkey.yono.cz yono.cz:default:/etc/dkimkeys/yono.cz/default.private
default._domainkey.n0ip.cz n0ip.cz:default:/etc/dkimkeys/n0ip.cz/default.private
Je podpisová tabulká, která určuje které naše domény se podepisují a kterým klíčem:
/etc/opendkim/SigningTable
*@yono.cz default._domainkey.yono.cz
*@n0ip.cz default._domainkey.n0ip.cz
Je soubor, kde jsou textová data. Záznamy určují kterým domenám nebo ip adresám hostů se má věřit. TrustedHosts by mohla vypadat nějak takto:
/etc/opendkim/TrustedHosts
localhost
127.0.0.1
8.8.8.8
2001:4860:4860::8888/64
::1
*.example.com
Samotné klíče generujeme přes příkaz opendkim-genkey, do požadovaného adresáře /etc/opendkim/keys:
/usr/bin/opendkim-genkey -s <selector> -d <domena> -D /etc/opendkim/keys"
Hashe klíču pro DKIM vkládáme do DNS. Pozor délka TXT záznamu by neměla přesáhnout velikost 255 znaků, pokud je řetězec větší, je třeba ho rozdělit. V řetězci nesmí být znak '\n' který značí nový řádek. Socket, který Opendkim vytvoří ještě přídáme do Postfixe:
smtpd_milters = unix:/var/run/opendkim/opendkim.sock,
...
Otestovat můžeme pomocí opendkim-testkey:
opendkim-testkey -d <domena> -s <selector> -vvv
opendkim-testkey -d mailgwtest.nic.cz -s default -vvv
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key 'default._domainkey.mailgwtest.nic.cz'
opendkim-testkey: key not secure
opendkim-testkey: key OK
Qvóty v Dovecot určují kolik místa v Maildiru se rezervuje pro maily, určitě se vyplatí Qvóty držet v LDAP (čili na jednom místě), než je mít rozházené různě po systému. Nastavení qvót v Dovecotu:
plugin {
quota = maildir:User quota
quota_warning = storage=90%% quota-warning 90 %u
quota_warning2 = storage=75%% quota-warning 75 %u
quota_status_overquota="552 5.2.2 Mailbox is full"
}
service quota-status {
executable = quota-status -p postfix
inet_listener {
port = 12340
}
client_limit = 1
}
protocol imap {
mail_plugins = $mail_plugins imap_quota
}
mail_plugins = quota
V Postfixu přidáme sledování velikosti mailboxu:
smtpd_recipient_restrictions =
check_policy_service inet:mailstore.example.com:12340
Pro výpis qvót z Dovecot, jde použít příkaz doveadm:
doveadm quota recalc -u <mailbox>
doveadm quota get -u <mailbox>
plugin {
zlib_save_level = 6 # 1..9; default is 6
zlib_save = lz4 # or bz2, xz, lz4 or zstd
}
Nazačátek vytvoříme EC certifikáty, ideálně v míste pro to určeném a s vhodnými právy /etc/dovecot/private/:
openssl ecparam -list_curves
openssl ecparam -name prime256v1 -genkey | openssl pkey -out ecprivkey.pem
openssl pkey -in ecprivkey.pem -pubout -out ecpubkey.pem
Povolíme modul mail_crypt, abychom započali šifrování:
mail_plugins = mail_crypt
A použijeme vygenerované certifikáty, od tého chvíle by měly maily být maildiru nečitelné (nebudou v textové podobě)
plugin {
mail_crypt_global_private_key = pflogsum je analyzel mail logů.