Mailserver - Postfix

Pokud máme připravenou databázi, přichází čas na nainstalování a nastavení MTA. Já jsem se rozhodl pro postfixe. Při psaní tohoto návodu byl použit postfix verze 2.5.5, takže případně u jiných verzí se může chování se stejným konfigurákem nějak lišit. Postfix musí mít podporu sasl, ssl a postgres (mysql).

Co tedy budeme po našem MTA chtít? Takže zaprvé jej musíme naučit rozeznávat, které maily má akceptovat a na které kašlat. Vysvětlíme mu tedy, jaké e-mailové schránky a aliasy máme, vysvětlíme mu, jak si je má vzít z databáze a jak je má následně doručit. Následně mu také povolíme SSL a povolíme se uživatelům přihlašovat. Příhlášení uživatelé pak můžou e-mail poslat kamkoliv.

Na začátek bude ještě třeba vytvořit si na stroji uživatele, pod kterým budou doručovány e-maily všem virtuálním schránkám. Můžete použít klidně i nějakého existujícího uživatele; já jsem si vytvořil nového. Respektive vytvořil jsem si skupinu mailsystem a následně uživatele mailsystem, který do této skupiny spadá. Tento uživatel musí být vlastníkem daných virtuálních schránek! Vlastník virtuální schránky se konkrétně nastavuje v databázi ve sloupcích uid a gid. Uid a gid uživatele jde zjistit například z /etc/passwd.

V konfiguraci se tedy budeme zabývat hlavně soubory /etc/postfix/main.cf a master.cf. Dále vytvoříme složku /etc/postfix/pgsql a do ní budeme vkládat konfiguraci pro selektování jednotlivých položek z databáze. V případě, že použijete MySQL databázi, nebudou cesty k souborům uvozeny pgsql:/, ale mysql:/.

main.cf

Konfigurák main.cf v mém případě tedy vypadá takto:

  1.  
  2.   home_mailbox = .maildir/
  3.   alias_maps = pgsql:/etc/postfix/pgsql/aliases.cf
  4.   transport_maps = pgsql:/etc/postfix/pgsql/transport.cf
  5.   virtual_maps = pgsql:/etc/postfix/pgsql/virtual.cf pgsql:/etc/postfix/pgsql/email.cf pgsql:/etc/postfix/pgsql/trash.cf
  6.   local_recipient_maps = $alias_maps $virtual_mailbox_maps unix:passwd.byname
  7.   virtual_mailbox_base = /home/mails/
  8.   virtual_mailbox_maps = pgsql:/etc/postfix/pgsql/virtual-maps.cf
  9.   virtual_uid_maps = pgsql:/etc/postfix/pgsql/virtual-uid.cf
  10.   virtual_gid_maps = pgsql:/etc/postfix/pgsql/virtual-gid.cf
  11.   smtpd_recipient_restrictions = check_recipient_access pgsql:/etc/postfix/pgsql/recipient.cf, reject_unknown_sender_domain, permit_mynetworks, permit_sasl_authenticated, check_relay_domains, reject
  12.   queue_directory = /var/spool/postfix
  13.   command_directory = /usr/sbin
  14.   daemon_directory = /usr/lib/postfix
  15.   mail_owner = postfix
  16.   myhostname = spamik.cz
  17.   mydomain = spamik.cz
  18.   inet_interfaces = all
  19.   unknown_local_recipient_reject_code = 550
  20.   mail_spool_directory = /var/spool/mail
  21.   smtpd_banner = $myhostname ESMTP $mail_name
  22.   debug_peer_level = 2
  23.   debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin xxgdb $daemon_directory/$process_name $process_id & sleep 5
  24.   sendmail_path = /usr/sbin/sendmail
  25.   newaliases_path = /usr/bin/newaliases
  26.   mailq_path = /usr/bin/mailq
  27.   setgid_group = postdrop
  28.   html_directory = /usr/share/doc/postfix-2.5.5/html
  29.   manpage_directory = /usr/share/man
  30.   sample_directory = /etc/postfix
  31.   readme_directory = /usr/share/doc/postfix-2.5.5/readme
  32.   message_size_limit = 504857600
  33.   mailbox_size_limit = 9504857600
  34.   virtual_mailbox_limit = 9504857600
  35.   dovecot_destination_recipient_limit = 1
  36.   smtpd_sasl_type = dovecot
  37.   smtpd_sasl_path = private/auth
  38.   smtpd_sasl_auth_enable = yes
  39.   smtpd_sasl_security_options = noanonymous
  40.   smtpd_sasl_tls_security_options = noanonymous
  41.   smtpd_use_tls = yes
  42.   smtpd_tls_key_file = /etc/ssl/cert.key
  43.   smtpd_tls_cert_file = /etc/ssl/cert.pem
  44.   smtpd_tls_CAfile = /etc/ssl/ca.pem
  45.   tls_random_source = dev:/dev/urandom
  46.   smtpd_tls_loglevel = 2
  47.   smtpd_tls_auth_only = yes

Konfigurák není uplně nejkratší a některé volby si zaslouží podrobnějí vysvětlění. Takže popořadě:

  • home_mailbox značí, kde se nachází mailbox lokálních uživatelů. Cesta je zadaná relativně od jejich home složky.
  • alias_maps vrací seznam všech aliasů, v tomto případě opět pro lokální uživatele (tedy ty, co v systému skutečně existují). Jako hodnota se uvádí cesta k souboru, kde bude nastavení, jak tyto data dostat z databáze.
  • transport_maps je množina záznamů určující, jak se které e-maily budou doručovat (možnosti jako hledání v lokálních uživatelích, virtuálních, doručení přes MDA apod.)
  • virtual_maps jsou víceméně aliasy pro virtuální uživatele. Navíc je zde přidán doménový koš a e-mailové adresy, které spadají mimo doménový koš.
  • local_recipient_maps určuje platné příjemce mailů, obsahuje tedy aliasy pro lokální uživatele, mailboxy virtuálních uživatelů a seznam lokálních uživatelů
  • virtual_mailbox_base je cesta k místu, kde budou mailboxy virtuálních uživatelů. Kompletní cesta k mailboxu vznikne tím, že se k virtual_mailbox_base přidá část maildir v databázi u uživatele.
  • virtual_mailbox_maps je seznam virtuálních uživatelů
  • virtual_uid_maps a virtual_gid_maps je mapování uid a gidu na skutečného uživatele/skupinu, pod kterým se e-mail doručí. V databázi by měla být v políčkách hodnota uid a gid uživatele, kterého jsme si vytvořili.
  • smtpd_recipient_rescription vyjadřuje na základě jakých podmínek bude e-mail přijat po tom, co je znám adresát. V tomto případě je tedy přijato vše, co postfix zná jako své uživatele, které může doručit; můžou se libovolně posílat e-maily ze síťových rozsahů, které jsou na stroji nastaveny a také autorizovaní uživatelé můžou posílat kamkoliv. Ostatní je odmítnuto
  • myhostname je hostname daného stroje. Od samotné domény pro maily se může lišit (například maily pro doménu spamik.cz můžou chodit na mail s hostname mail.spamik.cz)
  • mydomain je samotná doména
  • message_size_limit je limit velikosti jedné zprávy (doporučuju nastavit nižší číslo než mám já; já to trochu přepísk :) )
  • mailbox_size_limit je limit velikosti schránky
  • virtual_mailbox_limit je limit velikosti virtuální schránky
  • smtpd_sasl_type - hodnota dovecot označuje, že se budeme autorizovat proti dovecotu. Tedy v tomto případě bude autorizace k SMTP serveru naprosto shodná, jako k POP3/IMAP
  • smtpd_sasl_auth_enable povolí autorizaci přes SASL
  • smtpd_use_tls povolí SSL spojení
  • smtpd_tls_key_files - cesta ke klíči, který patří k SSL certifikátu
  • smtpd_tls_cert_file - cesta k našemu SSL certifikátu
  • smtpd_tls_CAfile - cesta ke kořenovému certifikátu certifikační autority, která náš certifikát vydala
  • smtpd_tls_auth_only zajistí, že autorizovat se mohou pouze šifrovaná spojení

master.cf

Pravděpodobně master.cf budete mít nějaký defaultní, nicméně některé věci do něj musíme doplnit. Master.cf může vypadat takto:

  1.   smtp inet n - n - - smtpd
  2.   smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes
  3.   mailsystem unix - n n - - mailsystem
  4.   pickup fifo n - n 60 1 pickup
  5.   cleanup unix n - n - 0 cleanup
  6.   qmgr fifo n - n 300 1 qmgr
  7.   tlsmgr unix - - n 1000? 1 tlsmgr
  8.   rewrite unix - - n - - trivial-rewrite
  9.   bounce unix - - n - 0 bounce
  10.   defer unix - - n - 0 bounce
  11.   trace unix - - n - 0 bounce
  12.   verify unix - - n - 1 verify
  13.   flush unix n - n 1000? 0 flush
  14.   proxymap unix - - n - - proxymap
  15.   smtp unix - - n - - smtp
  16.   relay unix - - n - - smtp -o fallback_relay=
  17.   showq unix n - n - - showq
  18.   error unix - - n - - error
  19.   discard unix - - n - - discard
  20.   local unix - n n - - local
  21.   virtual unix - n n - - virtual
  22.   lmtp unix - - n - - lmtp
  23.   anvil unix - - n - 1 anvil
  24.   scache unix - - n - 1 scache
  25.   dovecot unix - n n - - pipe flags=DRhu user=mailsystem:mailsystem argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}

Dosti pravděpodobně vám budou chybět 3 věci:

  • smtps: bez tohoto řádku postfix nebude poslouchat na zabezpečeném portu 465
  • mailsystem: tato položka je shodná se jménem uživatele, kterého jsme si vytvořili pro virtuální schránky
  • dovecot: specifikuje, jak se budou e-maily předávat delivery agentu od dovecotu

Nastavení databáze

To hlavní bysme měli, nyní ještě musíme nastavit jednotlivé soubory, které jsme uvedli v main.cf, pro přístup do databáze. Poznámka: pokud je v položce table napsáno neco.necojineho, znamená to, že tabulka je pojmenována necojineho a je ve schématu neco. MySQL schémata nemá, tudíž se píše jenom necojineho. Zároveň u MySQL je potřeba dávat pozor na podmínky - MySQL nemá datový typ boolean a pokud tedy použijete třeba tinyint jako tuto hodnotu, nebudete porovnávat 't', 'f', ale třeba '0', '1'!.

Uváděné hodnoty jsou myslím celkem srozumitelné, tak pouze uvedu konfigurační soubory a nebudu je blíže komentovat.

aliases.cf

  1.   user = postfix
  2.   password = heslo
  3.   dbname = mailsystem
  4.   hosts = 127.0.0.1
  5.   table = hellmachine.postfix_alias
  6.   select_field = destination
  7.   where_field = alias

client.cf

  1.   user = postfix
  2.   password = heslo
  3.   dbname = mailsystem
  4.   hosts = 127.0.0.1
  5.   table = hellmachine.posftix_access
  6.   select_field = access
  7.   where_field = source
  8.   additional_conditions = and type = 'client'

email.cf

  1.   user = postfix
  2.   password = heslo
  3.   dbname = mailsystem
  4.   hosts = 127.0.0.1
  5.   table = hellmachine.postfix_email
  6.   select_field = email
  7.   where_field = email

recipient.cf

  1.   user = postfix
  2.   password = heslo
  3.   dbname = mailsystem
  4.   hosts = 127.0.0.1
  5.   table = hellmachine.postfix_access
  6.   select_field = access
  7.   where_field = source
  8.   additional_conditions = and type = 'recipient'

sender.cf

  1.   user = postfix
  2.   password = heslo
  3.   dbname = mailsystem
  4.   hosts = 127.0.0.1
  5.   table = hellmachine.postfix_access
  6.   select_field = access
  7.   where_field = source
  8.   additional_conditions = and type = 'sender'

transport.cf

  1.   user = postfix
  2.   password = heslo
  3.   dbname = mailsystem
  4.   hosts = 127.0.0.1
  5.   table = hellmachine.postfix_transport
  6.   select_field = destination
  7.   where_field = domain

trash.cf

  1.   user = postfix
  2.   password = heslo
  3.   dbname = mailsystem
  4.   hosts = 127.0.0.1
  5.   table = hellmachine.postfix_trash
  6.   select_field = destination
  7.   where_field = email

virtual-gid.cf

  1.   user = postfix
  2.   password = heslo
  3.   dbname = mailsystem
  4.   hosts = 127.0.0.1
  5.   table = hellmachine.postfix_users
  6.   select_field = gid
  7.   where_field = email
  8.   additional_conditions = and postfix = 't'

virtual-maps.cf

  1.   user = postfix
  2.   password = heslo
  3.   dbname = mailsystem
  4.   hosts = 127.0.0.1
  5.   table = hellmachine.postfix_users
  6.   select_field = maildir
  7.   where_field = email
  8.   additional_conditions = and postfix = 't'

virtual-uid.cf

  1.   user = postfix
  2.   password = heslo
  3.   dbname = mailsystem
  4.   hosts = 127.0.0.1
  5.   table = hellmachine.postfix_users
  6.   select_field = uid
  7.   where_field = email
  8.   additional_conditions = and postfix = 't'

virtual.cf

  1.   user = postfix
  2.   password = heslo
  3.   dbname = mailsystem
  4.   hosts = 127.0.0.1
  5.   table = hellmachine.postfix_virtual
  6.   select_field = destination
  7.   where_field = email