Mail server
Pre-Requizity
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.
DNS
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
Porty
Mail-serverové služby těchto aplikací Postfix a Dovecot běží na těchto portech:
- POSTFIX:
- 25 smtp
- 587 submission (SMTP, SSL se startuje započetím STARTTLS)
- 465 smtps (SSL se encryptuje už před jakoukoliv SMTP komunikací)
- DOVECOT:
- 143 imap
- 993 imaps
- 110 pop3
- 995 pop3s
Schéma

U mailserveru se často mluví o 3 komponentach: - MTA (mail transfer agent) - řídí proces přenosu z jednoho serveru s druhý (Postfix) - MDA (mail delivery agent) - stará se o doručování pošty do poštovní schránky uživatele (Dovecot) - MUA (mail user agent) - programy odpovědné za vytvoření a přečtení zpráv (Thunderbird, Mutt)
Struktura uložení
- mbox - jeden soubor, do kterého se zapisují všechny maily pro všechny uživatele.
- maildir - každý uživatel má na disku svůj adresář, kam mu chodí pošta. Adresářovou strukturu vytváří sám Dovecot při prvním přihlášení uživatele.
Procesy Postfixu
- SMTPD - naslouchá na portu a přijímá "smtp" požadavky, pokud je požadavek přijat, je přeposlán na "cleanup"
- PICKUP - čeká na lokalně napsané maily a nasměruje je na "cleanup"
- CLEANUP - zpracuje přijatý mail (doplní případně chybející hlavičky apod.), nakonec mail vloží do fronty přijatých mailů a informuje "qmgr"
- QMGR - čeká na přijaté maily a stará se o jejich doručení, způsob doručení určí "trial-rewrite"
- TRIAL-REVRITE - přepisuje adresu do standartizované formy(připojuje jméno domény k lokálním mailům). Taky určí, jak a kam se mail bude doručovat.
- LOCAL - doručuje mail do lokalních schránek na servru.
- SMTP - smtp klient Postfixu, doručuje z mailové fronty maily, které jsou určene pro vzdalené smtp.
Key-servers
Pro šifrované maily pomocí OpenPGP, se pro propageni otisků klíčů mimo jiné používají veřejné key-servery: https://pgp.mit.edu/
Mailová fronta
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 -
Toolbox
Docela pěkný webový toolbox pro analýzu mailserver, mailů atp.: mxtoolbox.com
Blacklisty
V první řadě zjistíme jestli se nenachazíme na listině blokovaných adres: http://www.spamhaus.org/lookup/
Výpis konfigurace
dovecot -n
postconf -n
Komunikace
IMAP/IMAPs
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
SMTP/SMTPs/Submission
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.
.
Mail z Konzole
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
Postfix
Konfigurace
Restrictions
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.
Helo
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
smtpd_sender_restrictions
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.:
- http://www.postfix.org/postconf.5.html
- http://www.postfix.org/access.5.html
Tento soubor může vypadat třeba takto:
hodny_odesilatel.tld OK
spammer.tld REJECT
zly.spammer.tld REJECT You have been blacklisted -> Cháchaáá
zly@spammer.tld REJECT
zloun@ REJECT
spammer@ REJECT
reject_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
smtpd_recipient_restrictions
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
smtpd_relay_restrictions
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
Other
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
SSL/TLS
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
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.: - PostfixDovecotLMTP - DocevotLMTP
SASL
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.: - PostfixAndDovecotSASL
LDAP
Postfix má nastavení LDAP naspecifikované v adresáři /etc/postfix/ldap/, více viz. dokumentace. V LDAP můžou být definované:
- mailové schránky uživatelů (mailboxy)
- jejich aliasy (virtual_alias) - nepoužívám, místo toho mám /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.
Virtuální Mailboxy
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
Virtuální aliasy
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
Schéma
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))
Seed
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
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.
Instalace
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=
KeyTable
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
SignTable
Je podpisová tabulká, která určuje které naše domény se podepisují a kterým klíčem:
*@yono.cz default._domainkey.yono.cz
*@n0ip.cz default._domainkey.n0ip.cz
TrustedHosts
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:
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
Quota
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>
Komperse
plugin {
zlib_save_level = 6 # 1..9; default is 6
zlib_save = lz4 # or bz2, xz, lz4 or zstd
}
Šifrované maily
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 = </etc/dovecot/private/ecprivkey.pem
mail_crypt_global_public_key = </etc/dovecot/private/ecpubkey.pem
mail_crypt_save_version = 2
}
Log analyzer
pflogsum je analyzer mail logů.
Odkazy
MxToolBox
- https://mxtoolbox.com/domain/mail.nic.cz/?source=findmonitors
- http://www.aupads.org/test-relay.html
Zajimavé implementace
- Sender rewriting scheme (SRS)