CONTENT
  • CHANGES
Szukaj
counter

#top Instalacja


Instalację serwera Postfix można wykonać na różne sposoby: od kompilacji ze źdródeł poprzez instalację pojedynczych paczek rpm za pomocą polecenia rpm skończywszy na instalacja z użyciem menedżera pakietów, który zainstaluje wszystkie niezbędne paczki wraz zależnościami.
Celem niniejszego dokumentu nie jest rozważanie różnych metod instalacji tylko nieco usprawnienie użyteczności konfiguracji serwera Postfix po zainstalowaniu oraz wprowadzenie zalecanych restrykcji aby uniemożliwić nadużycia i rozsyłanie niechcianej korespondencji.
Poniższe wpisy o ile nie zaznaczono tego wyraźnie inaczej dotyczą głównego pliku konfiguracyjnego serwera Postfix /etc/postfix/main.cf.
Wszystko to zostało opisane poniżej.

#top Poinstalacyjna konfiguracja


Poniższe wpisy dotyczące konfiguracji o ile nie zaznaczono tego wyraźnie inaczej dotyczą głównego pliku konfiguracyjnego serwera Postfix /etc/postfix/main.cf.

#top Create and compile needed maps/files


W pierwszej kolejności należy utworzyć puste pliki (mapy: pcre, hash) używane w konfiguracji serwera Postfix.
touch /etc/postfix/client_access.pcre
touch /etc/postfix/client_access.cidr
touch /etc/postfix/helo_access.pcre
touch /etc/postfix/sender_login_maps
touch /etc/postfix/sender_access.pcre
touch /etc/postfix/recipient_access.pcre
touch /etc/postfix/header_checks.pcre
#postmap /etc/postfix/client_access
#postmap /etc/postfix/helo_access
postmap /etc/postfix/transport
postmap /etc/postfix/sender_login_maps



#top Enable smtps(465) and submission(587) services


Domyślnie serwer Postfix posiada tylko jedną aktywną usługę: smtp, można dodatkowo uaktywnić usługi submission oraz smtps wraz z konfiguracją pozwalającą korzystać z tych usług tylko i wyłącznie autoryzowanym użytkownikom.

/etc/postfix/master.cf
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
# smtpd_client_restrictions=permit_sasl_authenticated,reject - wysyłanie emaili poprzez 587 wymaga logowania
submission inet n       -       n       -       -       smtpd -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# smtpd_client_restrictions=permit_sasl_authenticated,reject - wysyłanie emaili poprzez 465 wymaga logowania
smtps     inet  n       -       n       -       -       smtpd -o smtpd_tls_wrappermode=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Dla przypomnienia poniżej znajduje się informacja zawarta w pliku/etc/services określająca porty używane przez usługi określone nazwami. Oczywiście zamiast nazwa można również użyć numerycznych portów.
smtp            25/tcp          mail
smtp            25/udp          mail
smtps           465/tcp                         # SMTP over SSL (TLS)
submission      587/tcp         msa             # mail message submission
submission      587/udp         msa             # mail message submission



#top Enable SSMTP


/etc/postfix/master.cf
smtps     inet  n       -       n       -       -       smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sender_restrictions=permit_sasl_authenticated,reject

/etc/postfix/main.cf
# enforce STARTTLS support to remote SMTP clients
#smtpd_enforce_tls_only = yes
smtpd_tls_auth_only = no
# require client for send certificate
# comment out this when enable smtpd_tls_wrappermode=yes
#smtpd_tls_req_ccert = yes



#top Listen on interfaces


Domyślnie serwer postfix nasłuchuje tylko na lokalnym interfejsie sieciowym. Aby umożliwić korzystanie z serwera Postfix wszystkim klientom, należy włączyć nasłuchiwanie na wszystkich interfejsach.

#inet_interfaces = localhost
inet_interfaces = all



#top Internet protocols


Domyślnie serwer postfix ma włączoną obsługę protokołu tylko IPv4 (wersje 2.3.3, 2.6.6, od wersji 2.9.9 włączona zostałą obsługa wszystkich protokołów) (IPv4). Aby umożliwić korzystanie serwerowi Postfix wszystkich obsługiwanych protokołów (czyli również IPv6), należy dodać/odkomentować stowny parametr analogicznie jak poniżej.

# Enable IPv4, and IPv6 if supported
inet_protocols = all



#top Transport maps


Aby móc korzystać z map transportu w serwerze Postfix określających transport za pomocą którego należy dostarczać wiadomości należy dodać/odkomentować następującą linię w pliku konfiguracyjnym.

# TRANSPORT MAP
#
# See the discussion in the ADDRESS_REWRITING_README document.
transport_maps = hash:/etc/postfix/transport



#top Header checks


Aby włączyć kontrolę nagłówków odbieranych wiadomości należy dodać/odkomentować następującą linię w pliku konfiguracyjnym.

# JUNK MAIL CONTROLS
#
[...]
#
# For details, see "man header_checks".
#
#header_checks = regexp:/etc/postfix/header_checks
header_checks = pcre:/etc/postfix/header_checks.pcre



#top TLS


W zamkniętej i zabezpieczonych sieciach wiadomości mogą być przesyłane w postaci jawnej (nieszyfrowanej). Wiadomości przesyłane przez sieć Internet narażone mogą być na podsłuchanie, w związku z tym należy skonfigurować i uaktwnić w serwerze Postfix szyfrowanie TLS (wymaga to posiadania klucza i certyfikatu dla domeny wskazującej na adres serwera Postfix (domena wskazująca na adres serwera Postfix nie musi być zgodna z nazwą domeny odbieranej poczty), klucz i certyfikat można również wygenerować i podpisać własnoręcznie, jednakże taki certyfikat nie będzie uznawany za zaufany).

# switch on TLS on smtpd server
smtpd_use_tls = yes
# smtpd server log level information
smtpd_tls_loglevel = 1
# enforce STARTTLS by remote SMTP clients, and never send mail in the clear
# set smtpd_enforce_tls=no to enable recv mail plain text
smtpd_enforce_tls = no
# force STARTTLS before command AUTH ("yes" need SASL)
# set smtpd_tls_auth_only=no to enable AUTH without STARTTLS
smtpd_tls_auth_only = yes
# require client for send certificate
# comment out this when enable smtpd_tls_wrappermode=yes
#smtpd_tls_req_ccert = yes
# smtpd server key
smtpd_tls_key_file = /etc/pki/tls/certs/smtpd.pem
# smtpd server cert
smtpd_tls_cert_file = /etc/pki/tls/certs/smtpd.pem
# smtpd server CA
smtpd_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt

# client use TLS when a remote SMTP server TLS support
smtp_use_tls = yes
# log the hostname of a remote SMTP server that offers STARTTLS, when TLS is not already enabled for that server
smtp_tls_note_starttls_offer = yes
# require that remote SMTP servers use TLS encryption, and never send mail in the clear
# set smtp_enforce_tls=no to enable send mail plain text
smtp_enforce_tls = no
# smtp client log level information
smtp_tls_loglevel = 1
# Postfix SMTP client SASL security options, disable anonymous and plain AUTH without TLS
smtp_sasl_security_options = noanonymous, noplaintext
# The SASL authentication security options that the Postfix SMTP client uses for TLS encrypted SMTP sessions, enable pain text AUTH after STARTTLS
smtp_sasl_tls_security_options = noanonymous
# smtp client key
smtp_tls_key_file = /etc/pki/tls/certs/smtpd.pem
# smtp client cert
smtp_tls_cert_file = /etc/pki/tls/certs/smtpd.pem
# smtp client CA
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt

# The external entropy source for the in-memory tlsmgr(8) pseudo random number generator (PRNG) pool
tls_random_source = dev:/dev/urandom



#top SASL AUTH MECHANISM


What is SASL and do I need it?
By default, postfix uses the $mynetworks parameter to control access,
i.e. who can send or relay mail through the mail server.
There is no other authentication performed other than checking
that the IP address of the user trying to send mail is part
of a trusted network as specified in $mynetworks.

If you are only implementing a mail server where all your users are based
on the same network then it is unlikely that you will need to use SASL or SSL/TLS.
However, if there are mobile users that wish to use the mail server whilst away
from base, we need a mechanism to authenticate them as trusted users
so that they are able to send mail through the mail server.

SASL (Simple Authentication and Security Layer) provides a mechanism
of authenticating users using their username and password.
Probably the most well known implementation of SASL
is provided by the Cyrus SASL library,
but dovecot also has it's own SASL implementation built in,
and as we are already running dovecot we may as well use
it for SASL rather than having to install and config another package.

# AUTH POSTFIX WITH DOVECOT
# -------------------------
# To config SASL in postfix, we need to make the following additions to /etc/postfix/main.cf:
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/dovecot-auth
smtpd_sasl_security_options = noanonymous

# Report the SASL authenticated user name in the smtpd(8) Received message header
# causes display in headers: Received: from ... (Authenticated sender: ...)
smtpd_sasl_authenticated_header = yes



#top with dovecot-1.*


/etc/dovecot.conf
# Next we need to config auth default in the authentication processes section of /etc/dovecot.conf.
# Uncomment and/or add the following lines as necessary (be careful as this section is heavily commented,
# some entries already exist, others are commented out and need uncommenting such as socket listen):
auth default {
  [...]
  user = root
  [...]
  socket listen {
    client {
      path = /var/spool/postfix/private/dovecot-auth
      mode = 0660
      user = postfix
      group = postfix
    }
  }
}



#top with dovecot-2.*


/etc/dovecot/conf.d/10-master.conf
service auth {
  unix_listener /var/spool/postfix/private/dovecot-auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}



#top UNIX ACCOUNT


W przypadku konfiguracji serwera Postfix wraz z dostarczaniem wiadomości do użytkowników posiadających konta w systemie unix, jedyną istotną informacją, którą należy skonfigurować w pliku /etc/postfix/main.cf to parametr mydestination. W przypadku posiadania jednej domeny domyślna konfiguracja tego parametru jest właściwa. W przypadku posiadania większej ilości domen należy te domeny dodać do istniejącej już listy domen. W przypadku większej ilości domen taka konfiguracja jest nieco ograniczona, gdyż pomimo wielu domen poczta adresowana do danego użytkownika (bez względu na domenę) zawsze będzie dostarczana do tego samego odbiorcy (użytkownika), np: jeśli serwer Postfix będzie odbiorcą wiadomości dla domeny example.org oraz example.com, poczta adresowana do odbiorcy kowalskij@example.com oraz kowalskij@example.com zostanie dostarczona do użytkownika będącego właścicielem konta kowalskij.
mydestination = $myhostname, localhost.$mydomain, localhost

Dovecot deliver
Kiedy poczta adresowana jest do domeny obsługiwanej przez serwer Postfix, serwer Postfix po odebraniu wiadomości dostarczy ją do skrzynki odbiorczej użytkownika (MBOX). Serwer Postfix sam nie obsługuje skrzynek pocztowych, należy poinformować serwer w jaki sposób ma dostarczyć do skrzynki odbiorczej użytkownika odebraną wiadomość. W przypadku, kiedy skrzynki odbiorcze osbługiwane są przez serwer Dovecot, konfiguracja jest następująca.
mailbox_command = /usr/libexec/dovecot/deliver



#top VIRTUAL ACCOUNT


create table for aliases
mysql -u root -p mailer << EOF
DROP TABLE IF EXISTS cen05dev_alias;
CREATE TABLE cen05dev_alias (
fromaddr varchar(255) NOT NULL,
totoaddr varchar(255) NOT NULL,
PRIMARY KEY (`fromaddr`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
EOF

create table for aliases
mysql -u root -p mailer << EOF
DROP TABLE IF EXISTS cen06dev_alias;
CREATE TABLE cen06dev_alias (
fromaddr varchar(255) NOT NULL,
totoaddr varchar(255) NOT NULL,
PRIMARY KEY (`fromaddr`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
EOF

create user aliases
echo "INSERT INTO cen05dev_alias (fromaddr, totoaddr) VALUES ('postmaster@cen05dev.xen.wbcd.pl','sp@cen05dev.xen.wbcd.pl');" | mysql -u root -p mailer
echo "INSERT INTO cen05dev_alias (fromaddr, totoaddr) VALUES ('root@cen05dev.xen.wbcd.pl','sp@cen05dev.xen.wbcd.pl');" | mysql -u root -p mailer

echo "INSERT INTO cen06dev_alias (fromaddr, totoaddr) VALUES ('postmaster@cen06dev.xen.wbcd.pl','sp@cen06dev.xen.wbcd.pl');" | mysql -u root -p mailer
echo "INSERT INTO cen06dev_alias (fromaddr, totoaddr) VALUES ('root@cen06dev.xen.wbcd.pl','sp@cen06dev.xen.wbcd.pl');" | mysql -u root -p mailer

W przypadku konfiguracji serwera Postfix wraz z dostarczaniem wiadomości do użytkowników nie posiadających kont w systemie unix, informacje na temat kont użytkowników przechowywane są w bazie danych (PostgreSQL, MySQL, SQLite, LDAP) pierwszą istotną zmianą jaką należy wprowadzić to usunąć z parametru mydestination nazwy domen informujące serwer Postfix, że jest serwerem obsługującym domeny, usunięte domeny zostaną przeniesione do listy wirtualnych domen (parametr virtual_mailbox_domains), konta również bedą wirtualne (informacje będą przechowywane w bazie danych, a nie w systemie operacyjnym).
mydestination = localhost.$mydomain, localhost

Kolejną istotną różnicą pojawiającą się przy konfiguracji serwera Postfix jest konieczność wprowadzenia zmiany w sposobie dostarczania wiadomości do skrzynki odbiorczej użytkownia (MBOX). Należy zakomentować parametr mailbox_command, a następnie należy ustawić parametr virtual_transport na odpowiedni transport. Bez wykonania tej czynności i kosrzystania z parametru mailbox_command wiadomości w dalszym ciągu poprawnie będą dostarczane do skrzynki odbiorczej, jednakże przy takiej konfiguracji nie będzie funkcjonować filtracja wiadomości z użyciem filtrów sieve.
sieve: /etc/postfix/main.cf + dovecot
virtual_transport = dovecot
proxy_read_maps = $local_recipient_maps $smtpd_sender_login_maps $virtual_mailbox_domains $virtual_mailbox_maps $virtual_alias_domains $virtual_alias_maps $relay_domains $relay_recipient_maps

oraz zdefiniować ustawiony powyżej transport w pliku /etc/postfix/master.cf do obsługi dostarczania wiadomości do skrzynki odbiorczej użytkownika (MBOX). Dzięki tej zmianie podczas dostarczania wiadomości do skrzynki użytkownika za pomocą deliviera dostępnego wraz z serwerem Dovecot, delivier będzie mógł przetwarzać skrypty sieve znajdujące się w katalogu wirtualnego użytkownika.
sieve: /etc/postfix/master.cf + dovecot
# dovecot 1.*
# case sensitive mailaddresses
# You should use flags=DR (without hu) if you have case sensitive directories
# for storing mails. Otherwise dovecot delivers all mails to the wrong directory.
dovecot   unix  -       n       n       -       -       pipe flags=DR user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${user}@${nexthop} -m ${extension}

# dovecot 2.*
# case sensitive mailaddresses
# You should use flags=DR (without hu) if you have case sensitive directories
# for storing mails. Otherwise dovecot delivers all mails to the wrong directory.
dovecot   unix  -       n       n       -       -       pipe flags=DR user=vmail:vmail argv=/usr/libexec/dovecot/dovecot-lda -f ${sender} -d ${user}@${nexthop} -m ${extension}

W przypadku konfiguracji serwera Postfix korzystającej z kont wirtualnych, należy ustawić odpowiednie wartości następującym parametrom z prefixem virtual_. Jednym z istotnych szczegółów podczas konfiguracji serwera Postfix jest parametr virtual_alias_domains, który po ustawieniu na pustą wartość dla wersji serwera Postfix postfix-2.3.3 powoduje niemożliwość uruchomienia serwera oraz pojawienie się informacji w logach:
cen05dev: fatal: bad string length 0 < 1: virtual_mailbox_base =
toteż dla dla wersji serwera Postfix postfix-2.3.3 dostępnej w dystrybucji CentOS 5.* należy ten parametr zakomentować, dla dla wersji serwera Postfix postfix-2.6.6 dostępnej w dystrybucji CentOS 6.* ten parametr może być pusty.

/etc/postfix/main.cf ( postfix-2.3.3 (CentOS 5.*) )
dovecot_destination_recipient_limit = 1
virtual_uid_maps = static:450
virtual_gid_maps = static:450
virtual_mailbox_base = /home/vmail
#virtual_mailbox_domains = cen05dev.xen.wbcd.pl
virtual_mailbox_domains = cen05dev.cen05dev.xen.wbcd.pl, proxy:mysql:/etc/postfix/mailbox_domains.mysql.cf
#virtual_mailbox_maps = hash:/etc/postfix/mailbox_maps
virtual_mailbox_maps = hash:/etc/postfix/mailbox_maps, proxy:mysql:/etc/postfix/mailbox_maps.mysql.cf
# cen05: fatal: bad string length 0 < 1:
#virtual_alias_domains = proxy:mysql:/etc/postfix/virtual_alias_domains.mysql.cf
#virtual_alias_maps = hash:/etc/postfix/virtual
virtual_alias_maps = hash:/etc/postfix/virtual, proxy:mysql:/etc/postfix/virtual_alias_maps.mysql.cf

/etc/postfix/main.cf ( postfix-2.6.6 (CentOS 6.*) )
dovecot_destination_recipient_limit = 1
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_mailbox_base = /home/vmail
#virtual_mailbox_domains = cen06dev.xen.wbcd.pl
virtual_mailbox_domains = cen06dev.cen06dev.xen.wbcd.pl, proxy:mysql:/etc/postfix/mailbox_domains.mysql.cf
#virtual_mailbox_maps = hash:/etc/postfix/mailbox_maps
virtual_mailbox_maps = hash:/etc/postfix/mailbox_maps, proxy:mysql:/etc/postfix/mailbox_maps.mysql.cf
#virtual_alias_domains =
virtual_alias_domains = proxy:mysql:/etc/postfix/virtual_alias_domains.mysql.cf
#virtual_alias_maps = hash:/etc/postfix/virtual
virtual_alias_maps = hash:/etc/postfix/virtual, proxy:mysql:/etc/postfix/virtual_alias_maps.mysql.cf

Content /etc/postfix/mailbox_maps (domain: cen05dev.xen.wbcd.pl):
sp@cen05dev.xen.wbcd.pl   cen05dev.xen.wbcd.pl/sp/Maildir/
Content /etc/postfix/mailbox_maps (domain: cen06dev.xen.wbcd.pl):
sp@cen06dev.xen.wbcd.pl   cen06dev.xen.wbcd.pl/sp/Maildir/
Compile mailbox_maps into mailbox_maps.db:
postmap /etc/postfix/mailbox_maps
Content /etc/postfix/mailbox_domains.mysql.cf (domain: cen05dev.xen.wbcd.pl):
hosts = 10.5.5.5
user = postfix
password = postfix
dbname = mailer
query = SELECT SUBSTR(email,POSITION('@' in email)+1) FROM cen05dev_users WHERE SUBSTR(email,POSITION('@' in email)+1)='%s'
Content /etc/postfix/mailbox_maps.mysql.cf (domain: cen05dev.xen.wbcd.pl):
hosts = 10.5.5.5
user = postfix
password = postfix
dbname = mailer
query = SELECT CONCAT(SUBSTR(email,POSITION('@' in email)+1),"/",SUBSTR(email,1,POSITION('@' in email)-1),'/Maildir/') FROM cen05dev_users WHERE email='%s'
Content /etc/postfix/mailbox_domains.mysql.cf (domain: cen06dev.xen.wbcd.pl):
hosts = 10.5.5.5
user = postfix
password = postfix
dbname = mailer
query = SELECT SUBSTR(email,POSITION('@' in email)+1) FROM cen06dev_users WHERE SUBSTR(email,POSITION('@' in email)+1)='%s'
Content /etc/postfix/mailbox_maps.mysql.cf (domain: cen06dev.xen.wbcd.pl):
hosts = 10.5.5.5
user = postfix
password = postfix
dbname = mailer
query = SELECT CONCAT(SUBSTR(email,POSITION('@' in email)+1),"/",SUBSTR(email,1,POSITION('@' in email)-1),'/Maildir/') FROM cen06dev_users WHERE email='%s'

Nastepnym istotnym krokiem, który należy wykonać, jest zdefiniowanie konta postmaster, które jest używane jako nadawca dla wiadomości zwrotnych w przypadku konieczności dostarczenia do użytkownika wiadomości z informującej o przyczynie braku możliwości dostarzcenia do adresata wiadomości. Oprócz konta postmaster należy jeszcze zdefiniować konto użytkownika root będącego odbiorcą wszystkich wiadomości adresowanych do użytkowników systemowych. Najwygodniej powyższe konta zdefiniować jako aliasy dla ostniejącego konta, które jest używane do korespondencji, dzieki na bieżąco system będzie mógł informować o stanie pracy. Plik virtual jest jest odpowiednikiem pliku /etc/aliases zawierającym aliasy dla kont wirtualnych.
Content /etc/postfix/virtual (domain: cen05dev.xen.wbcd.pl):
postmaster@cen05dev.xen.wbcd.pl   sp@cen05dev.xen.wbcd.pl
root@cen05dev.xen.wbcd.pl         sp@cen05dev.xen.wbcd.pl
Content /etc/postfix/virtual (domain: cen06dev.xen.wbcd.pl):
postmaster@cen06dev.xen.wbcd.pl   sp@cen06dev.xen.wbcd.pl
root@cen06dev.xen.wbcd.pl         sp@cen06dev.xen.wbcd.pl
Compile virtual into virtual.db:
postmap /etc/postfix/virtual
Content /etc/postfix/virtual_alias_domains.mysql.cf (domain: cen05dev.xen.wbcd.pl):
hosts = 10.5.5.5
user = postfix
password = postfix
dbname = mailer
query = SELECT SUBSTR(fromaddr,POSITION('@' in fromaddr)+1) FROM cen05dev_alias JOIN cen05dev_users ON ( SUBSTR(totoaddr,POSITION('@' in totoaddr)+1)=SUBSTR(email,POSITION('@' in email)+1) ) WHERE SUBSTR(fromaddr,POSITION('@' in fromaddr)+1)='%s' AND SUBSTR(email,POSITION('@' in email)+1)!='%s'
Content /etc/postfix/virtual_alias_maps.mysql.cf (domain: cen05dev.xen.wbcd.pl):
hosts = 10.5.5.5
user = postfix
password = postfix
dbname = mailer
query = SELECT totoaddr FROM cen05dev_alias WHERE fromaddr='%s'
Content /etc/postfix/virtual_alias_domains.mysql.cf (domain: cen06dev.xen.wbcd.pl):
hosts = 10.5.5.5
user = postfix
password = postfix
dbname = mailer
query = SELECT SUBSTR(fromaddr,POSITION('@' in fromaddr)+1) FROM cen06dev_alias JOIN cen06dev_users ON ( SUBSTR(totoaddr,POSITION('@' in totoaddr)+1)=SUBSTR(email,POSITION('@' in email)+1) ) WHERE SUBSTR(fromaddr,POSITION('@' in fromaddr)+1)='%s' AND SUBSTR(email,POSITION('@' in email)+1)!='%s'
Content /etc/postfix/virtual_alias_maps.mysql.cf (domain: cen06dev.xen.wbcd.pl):
hosts = 10.5.5.5
user = postfix
password = postfix
dbname = mailer
query = SELECT totoaddr FROM cen06dev_alias WHERE fromaddr='%s'

Poniższy krok jest przydatny, ale nie wymagany. W przypadku rezygnacji z wykonania poniższego kroku należy usunąć z pliku konfiguracyjnego z parametru virtual_alias_maps wpis definujący mapę aliasów hash:/etc/postfix/etc-aliases. W rezultacie mapa aliasów wirtualnych będzie przedstawiać się następująco: virtual_alias_maps = hash:/etc/postfix/virtual
create for virtual_alias_maps file etc-aliases from /etc/aliases:
cat /etc/aliases | sed  -e 's,^\([A-Za-z0-9\.-]*\):,\1@host:,g' -e 's/\([^A-Za-z0-9\.-]\)\([A-Za-z0-9\.-]*\),/\1\2@host,/g' -e 's/^\([^#].*\), \([A-Za-z0-9\.-]*\)$/\1, \2@host/g' -e 's/^\([^#].*:[^A-Za-z0-9\.-]*\)\([A-Za-z0-9\.-]*\)$/\1\2@host/g' > /etc/postfix/etc-aliases
Compile etc-aliases into etc-aliases.db:
postmap /etc/postfix/etc-aliases





#top restrictions


W niniejszej sekcji zdefiniowane zostały restrykcje określające warunki dotyczące połączenia z serwerem Postfix, przywitaniem, określeniem nadawcy, odbiorcy, danych, pożegnania oraz klasy restrykcji. Uniwersalną regułą często występującą w poniższych restrykcjach jest permit_mynetworks. Jak sama nazwa sugeruje reguła akceptuje wiadomości od wszystkich nadawców zdefiniowanych w parametrze mynetworks. Niestety ta reguła jest bardzo restrykcyjna, zbyt restrykcyjna, gdyż powoduje zaakceptowanie wiadomości od nadawców zdefiniowanych w parametrze mynetworks i pominięcie pozostałych reguł znajdujących się na liscie danej restrykcji. Najczęściej w niniejszym parametrze określony jest adres loopback 127.0.0.0/8 oraz adres(y) IP serwera Postfix na których nasłuchuje i może odbierać wiadomości.

#top smtpd_delay_reject


Parametr smtpd_delay_reject zgodnie z nazwą, która jest intuicyjna, określa moment w którym następuje odrzucenie wiadomości (oczywiście w przypadku w którym nastąpi odrzucenie wiadomości). Dla wartości ustawionej na yes odrzucenie wiadomości następuje dopiero po odebraniu od serwera wysyłającego wiadomość komendy protokołu SMTP RCPT TO:. W przypadku ustawienia wartości tego parametru na no odrzucenie nastąpi po odebraniu komendy protokołu SMTP z argumentem niespełniającym ustawionych warunków w danej restrykcji, np: odrzucenie wiadomości może zostać wykonane po odebraniu następującej HELO localhost w restrykcji smtpd_helo_restrictions.

# default smtpd_delay_reject=yes causes that
# any rule smtpd_client_restrictions reject mail,
# then messago about that is send after 'RCPT TO:'.
smtpd_delay_reject = yes



#top smtpd_client_restrictions


Niniejsza restrykcja smtpd_client_restrictions jak sama nazwa sugeruje dotyczy klientów, konkretnie związana jest z adresacją klienta (adresem IP / domenowym klienta wysyłającego wiadomość). Niniejsza restrykcja jest doskonałym miejscem dla umieszczenia następujących reguł:
  • reject_rbl_client reguła sprawdzająca obecność adresu hosta na black list
  • reject_unknown_reverse_client_hostname sprawdzającej poprawność konfiguracja adresu IP (odrzucanie połączeń od hostów nie posiadających nazwy domenowej dla adresu IP z którego się łączą)
  • check_client_access reguła sprawdzająca nazwę, domenę lub adres hosta wysyłającego wiadomość poprzez dopasowanie do adresu IP/adresu podsieci lub według dopasowania nazwy hosta do wyrażenia regularnego PCRE. W przypadku konstruowania reguł określających od których serwerów należy odbierać pocztę, a od których odrzucać doskonałe zastosowanie znajduję zarówno tablica CIDR oraz PCRE. W przypadku CIDR można dosyć łatwo konstruowac reguły dotyczące całych podsieci bez konieczności specyfikowania każdego adresu IP osobno. Analogicznie PCRE pozwala korzystać z wyrażeń regularnych by móc określać, nadawcy używający jakich domen lub subdomen są pożądani a jakich niemile widziani. Poniższa treść w komentarzach dosyć dobrze to obrazuje.

Powyższe restrykcje obowiązują również klientów, którzy poprawnie autoryzowali się do serwera Postfix. Jeśli powyższe restrykcje będą utrudniać lub blokować wysyłanie wiadomości od klientów, którzy autoryzowali się należy tuż za regułą permit_mynetworks wstawić regułę akceptującą wiadomości od autoryzowanych użytkowników permit_sasl_authenticated i pominięcie pozostałych reguł znajdujących się za tą regułą.

# client restrictions
smtpd_client_restrictions =
    permit_mynetworks,
#    reject_rbl_client relays.ordb.org,
# reject_unknown_reverse_client_hostname - Reject the request when the client IP address has no address->name mapping
    reject_unknown_reverse_client_hostname,
    check_client_access cidr:/etc/postfix/client_access.cidr,
    check_client_access pcre:/etc/postfix/client_access.pcre,
    permit

# Content /etc/postfix/client_access.pcre:
# ----------------------------------------
# /64.170.162.98/   REJECT Get lost - You are not invited
# /unixwiz.net/     REJECT Get lost - You are not invited
# ----------------------------------------
# do not compile this file !!!

# Content /etc/postfix/client_access.cidr:
# ----------------------------------------
# 64.170.162.98/32 REJECT Get lost - You are not invited
# 224.0.0.0/8      REJECT multicast not invited
# 192.168.1.1      OK
# 192.168.0.0/16   REJECT
# ----------------------------------------
# do not compile this file !!!

# alternatively you can use hash:/etc/postfix/sender_access:
# ----------------------------------------------------------
# 64.170.162.98   REJECT Get lost - You are not invited
# unixwiz.net     REJECT Get lost - You are not invited
# ----------------------------------------------------------
# Compile client_access into client_access.db:
# postmap /etc/postfix/client_access



#top smtpd_helo_restrictions


Niniejsza restrykcja smtpd_helo_restrictions jak sama nazwa sugeruje dotyczy powitania wysyłanego przez klienta komendą protokołu SMTP HELO. Niniejsza restrykcja jest doskonałym miejscem dla umieszczenia następujących reguł (wymaga ustawienia parametru smtpd_helo_required = yes):
  • permit_sasl_authenticated reguła akceptująca wiadomości od hostów, które poprawnie autoryzowały się oraz pomijająca sprawdzanie następnych reguł, nie jest ona niezbędna, ale w praktyce jest przydatna, gdyż pozwala na wysyłanie wiadomości hostom, które nie są poprawnie skonfigurowane i często wysyłają nieprawidłową nazwę hosta w przywitaniu, lecz poprawnie autoryzowały się i są zaufane jako nadawcy wiadomości
  • reject_non_fqdn_helo_hostname reguła sprawdzająca poprawność formatu nazwy wysyłanej przez klienta w przywitaniu (odrzucanie połączeń od klientów wysyłających w przywitaniu nieprawidłową / niepełną nazwę domeny, niespełniającą wymagań zdefiniowanych w dokumentach RFC)
  • reject_invalid_helo_hostname reguła sprawdzająca prawidłowość nazwy wysyłanej przez klienta w przywitaniu (m.in. dozwolony zestaw znaków wystepujących w nazwie, itp.)
  • reject_unknown_helo_hostname reguła sprawdzająca nazwę wysyłaną przez klienta w przywitaniu (od połączeń od klientów wysyłających nieistniejącą nazwę hosta w przywitaniu, nazwę nie posiadającą rekordu A lub MX)
  • check_helo_access reguła sprawdzające nazwę wysyłaną przez klienta w przywitaniu poprzez dopasowanie do wyrażenia regularnego PCRE, reguła w której należy umieścić wszelkie nazwy wysyłane komendą protokołu SMTP HELO, które uznawane są za nieprawidłowe, np: localhost, localdomain, (nazwę jednej z obsługiwanych przez serwer Postfix domen)

# helo restrictions
#smtpd_helo_required is needed for: reject_unknown_helo_hostname+reject_non_fqdn_helo_hostname+reject_invalid_helo_hostname
smtpd_helo_required = yes
smtpd_helo_restrictions =
    permit_mynetworks,
# permit_sasl_authenticated - Permit the request when the client is successfully authenticated via the RFC 4954 (AUTH) protocol
    permit_sasl_authenticated,
# reject_non_fqdn_helo_hostname (Postfix<2.3: reject_non_fqdn_hostname) - Reject the request when the HELO or EHLO hostname is not in fully-qualified domain form, as required by the RFC
    reject_non_fqdn_helo_hostname,
# reject_invalid_helo_hostname (Postfix<2.3: reject_invalid_hostname) - Reject the request when the HELO or EHLO hostname is malformed
    reject_invalid_helo_hostname,
# reject_unknown_helo_hostname - Reject the request when the HELO or EHLO hostname has no DNS A or MX record
    reject_unknown_helo_hostname,
    check_helo_access pcre:/etc/postfix/helo_access.pcre,
    permit

# check_helo_access
# Content /etc/postfix/helo_access.pcre:
# --------------------------------------
# /^.*localhost.*$/     REJECT You are not localhost
# /^.*localdomain.*$/   REJECT You are not localdomain
# /^64.170.162.98$/     REJECT Get lost - you're lying about who you are
# /^unixwiz.net$/       REJECT Get lost - you're lying about who you are
# --------------------------------------
# do not compile this file !!!

# alternatively you can use hash:/etc/postfix/helo_access:
# --------------------------------------------------------
# localhost             REJECT You are not localhost
# localdomain           REJECT You are not localdomain
# localhost.localdomain REJECT You are not localhost.localdomain
# 64.170.162.98         REJECT Get lost - you're lying about who you are
# unixwiz.net           REJECT Get lost - you're lying about who you are
# --------------------------------------------------------
# Compile helo_access into helo_access.db:
# postmap /etc/postfix/helo_access



#top helo_access


Aby kontrolować poprawność wysyłanego przywitania przez serwery łączące się z serwerem Postfix należy plik z regułami wypełnić analogicznie jak poniżej. Co prawda bez poniższego pliki serwer Postfix odrzuci połączenia z następującymi przywitaniami HELO localhost oraz HELO localdomain (pod warunkiem włączenia poniższej opcji smtpd_helo_required oraz obecności restrykcji reject_non_fqdn_helo_hostname)jednakże już powitanie HELO localhost.localdomain zostanie zaakceptowanie gdyż jest poprawną nazwą domenową, jednakże niepoprawną nazwą w przywitaniu zarezerwowaną dla połączeń lokalnych.

Zawartość pliku /etc/postfix/helo_access.pcre:
/localhost/           REJECT need fully-qualified hostname
/localdomain/         REJECT need fully-qualified hostname
/^64.170.162.98$/     REJECT Get lost - you're lying about who you are
/^unixwiz.net$/       REJECT Get lost - you're lying about who you are



#top smtpd_sender_restrictions


Niniejsza restrykcja smtpd_sender_restrictions jak sama nazwa sugeruje dotyczy adresu nadawcy wiadomości wysyłanego przez klienta komendą protokołu SMTP MAIL FROM. Niniejsza restrykcja jest doskonałym miejscem dla umieszczenia następujących reguł (reguła reject_sender_login_mismatch wymaga ustawienia parametru smtpd_sender_login_maps):
  • reject_sender_login_mismatch reguła odrzucająca wiadomości wiadomości od hostów, które próbują wysyłać wiadomości jako nadawcy używając adresów, które należą do określonych zdefiniowanych na serwerze użytkowników, niniejsza reguła ma blokać występujące najczęsciej następujące nadużycia związane z nieprawidłowością adresu nadawcy:
    • blokowanie wiadomości od hostów, które nie autoryzowały się, a mimo wszystko próbują używać jako nadawcy adresów zdefiniowanych na serwerze i należących do użytkowników, od których wymagana jest autoryzacja przez użyciem adresu jako nadawcy
    • blokowanie wiadomości od hostów, które poprawnie autoryzowały się jako użytkownicy, ale próbują używać jako nadawcy adresów, których autoryzowani użytkownicy nie są właścicielami
  • permit_sasl_authenticated reguła akceptująca wiadomości od hostów, które poprawnie autoryzowały się oraz pomijająca sprawdzanie następnych reguł, nie jest ona niezbędna, ale w praktyce jest przydatna, gdyż pozwala na wysyłanie wiadomości hostom, które nie są poprawnie skonfigurowane i często wysyłają nieprawidłową nazwę hosta w przywitaniu, lecz poprawnie autoryzowały się i są zaufane jako nadawcy wiadomości
  • reject_unauth_pipelining reguła blokująca wiadomości od hostów, które nie przestrzegają reguł poprawnej komunikacji podczas wysyłania komend i nie oczekują na odpowiedź serwera po wysłaniu komendy, tylko próbują wysłać wiadomość wysyłając komendy protokołu SMTP oraz całą wiadomość w celu przyśpieszenia wysyłania wiadomości
  • reject_non_fqdn_sender
  • reject_unknown_sender_domain
  • check_sender_access pcre:/etc/postfix/sender_access.pcre
  • reject_unlisted_sender reguła odrzucająca wiadomości od hostów, które próbują używać jako nadawców adresów obsługiwanej przez serwer domeny, którzy nie są zdefiniowani na serwerze (użytkownicy/adresy, którzy nie istnieją), a więc nie są objęci restrykcją reject_sender_login_mismatch weryfikującą poprawność używania adresów dla użytkowników zdefiniowanych na serwerze (reguła reject_sender_login_mismatch dotyczy tylko użytkowników zdefiniowanych), stosowanie niniejszej reguły automatycznie, bez konieczności specyfikowania jej na liście reguł można włączyć poprzez ustawienie następującego parametru: smtpd_reject_unlisted_sender = yes

# smtpd_sender_login_maps
# Optional lookup table with the SASL login names that own sender (MAIL FROM) addresses
# Content /etc/postfix/sender_login_maps:
# ---------------------------------------
# sp@cen05.xen.wbcd.pl    sp
# ---------------------------------------
# MySQL (Database) Accounts / dovecot
# Content /etc/postfix/sender_login_maps:
# ---------------------------------------
# sp@cen05dev.xen.wbcd.pl   sp@cen05dev.xen.wbcd.pl
# root@cen05dev.xen.wbcd.pl sp@cen05dev.xen.wbcd.pl
# ---------------------------------------
# Compile sender_login_maps into sender_login_maps.db:
# postmap /etc/postfix/sender_login_maps
smtpd_sender_login_maps = hash:/etc/postfix/sender_login_maps
# Request that the Postfix SMTP server rejects mail from unknown sender addresses,
# even when no explicit reject_unlisted_sender access restriction is specified.
# This can slow down an explosion of forged mail from worms or viruses.
# An address is always considered "known" when it matches a virtual(5) alias or a canonical(5) mapping.
# * The sender domain matches $mydestination, $inet_interfaces or $proxy_interfaces, but the sender is not listed in $local_recipient_maps, and $local_recipient_maps is not null.
# * The sender domain matches $virtual_alias_domains but the sender is not listed in $virtual_alias_maps.
# * The sender domain matches $virtual_mailbox_domains but the sender is not listed in $virtual_mailbox_maps, and $virtual_mailbox_maps is not null.
# * The sender domain matches $relay_domains but the sender is not listed in $relay_recipient_maps, and $relay_recipient_maps is not null.
# cat /etc/aliases | sed -n 's,^\([^#].*\):.*$,\1,p' | sed "s,$,@$HOSTNAME root,g" >> /etc/postfix/sender_login_maps;
# postmap /etc/postfix/sender_login_maps;
# sender restrictions
smtpd_sender_restrictions =
    permit_mynetworks,
# reject_sender_login_mismatch must be before permit_sasl_authenticated to disable spoofing
# (reject_sender_login_mismatch after permit_sasl_authenticated not working !!!)
# reject_sender_login_mismatch (need: smtpd_sender_login_maps) - Reject the request when $smtpd_sender_login_maps specifies an owner for the MAIL FROM address,
# but the client is not (SASL) logged in as that MAIL FROM address owner or when the client is (SASL) logged in, but the client login name doesn't own the MAIL FROM address
    reject_sender_login_mismatch,
# permit_sasl_authenticated - Permit the request when the client is successfully authenticated via the RFC 4954 (AUTH) protocol
    permit_sasl_authenticated,
# reject_unauth_pipelining - Reject the request when the client sends SMTP commands ahead of time where it is not allowed (not talking, but send all SMTP commands (HELO,MAILFROM,RCPTTO,DATA,QUIT) in one write)
    reject_unauth_pipelining,
# reject_non_fqdn_sender - Reject the request when the MAIL FROM address is not in fully-qualified domain form, as required by the RFC
    reject_non_fqdn_sender,
# reject_unknown_sender_domain - Reject the request when Postfix is not final destination for the sender address,
# and the MAIL FROM domain has 1) no DNS A or MX record, or 2) a malformed MX record such as a record with a zero-length MX hostname (Postfix>2.3)
    reject_unknown_sender_domain,
# Reject the request when the MAIL FROM address is not listed in the list of valid recipients for its domain class.
# See the smtpd_reject_unlisted_sender parameter description for details.
    reject_unlisted_sender,
    check_sender_access pcre:/etc/postfix/sender_access.pcre,
    permit

# Content /etc/postfix/sender_access.pcre:
# ----------------------------------------
# /^sp@cen05.xen.wbcd.pl$/        OK
# /^ola@cen05.xen.wbcd.pl$/       OK
# /^nobody/                       REJECT
# /cen06x64.xen.wbcd.pl$/         Domain blocked in local recipient table (in reply to RCPT TO command))
# /^root@cen05dev.xen.wbcd.pl$/   User blocked in local recipient table (in reply to RCPT TO command))
# /^\@/                           550 5.1.7 Invalid address format.
# /[!%\@].*\@/                    550 5.1.7 This server disallows weird address syntax.
# ----------------------------------------
# do not compile this file !!!

# alternatively you can use hash:/etc/postfix/sender_access:
# ----------------------------------------------------------
# sp@cen05.xen.wbcd.pl        OK
# ola@cen05.xen.wbcd.pl       OK
# root@cen05.xen.wbcd.pl      REJECT
# ----------------------------------------------------------
# Filter only mail addressed to local domains:
# filter:dummy - i.e. pipe filter: /home/local/sbin/postfix-pipe-content-filter.sh
# example.com       FILTER filter:dummy
# example.net       FILTER filter:dummy
# otherdomain.ca    FILTER filter:dummy
# ----------------------------------------------------------
# Compile sender_access into sender_access.db:
# postmap /etc/postfix/sender_access



#top smtpd_recipient_restrictions


# smtpd_recipient_restrictions
smtpd_recipient_restrictions =
    permit_mynetworks,
# permit_sasl_authenticated - Permit the request when the client is successfully authenticated via the RFC 4954 (AUTH) protocol
    permit_sasl_authenticated,
# reject_unauth_destination - Reject the request unless one of the following is true:
# * Postfix is mail forwarder: the resolved RCPT TO domain matches $relay_domains or a subdomain thereof, and contains no sender-specified routing (user@elsewhere@doma
# * Postfix is the final destination: the resolved RCPT TO domain matches $mydestination, $inet_interfaces, $proxy_interfaces, $virtual_alias_domains, or $virtual_mail
# The relay_domains_reject_code parameter specifies the response code for rejected requests (default: 554).
    reject_unauth_destination,
    check_recipient_access pcre:/etc/postfix/recipient_access.pcre,
    permit

# Content /etc/postfix/recipient_access.pcre:
# -------------------------------------------
# /^sp@cen05.xen.wbcd.pl$/        OK
# /^ola@cen05.xen.wbcd.pl$/       OK
# /^nobody/                       REJECT
# /cen05x64.xen.wbcd.pl$/         Domain blocked in local recipient table (in reply to RCPT TO command))
# /^root@cen05dev.xen.wbcd.pl$/   User blocked in local recipient table (in reply to RCPT TO command))
# /^\@/                           550 5.1.7 Invalid address format.
# /[!%\@].*\@/                    550 5.1.7 This server disallows weird address syntax.
# -------------------------------------------
# Filter only mail addressed to local domains:
# filter:dummy - i.e. pipe filter: /home/local/sbin/postfix-pipe-content-filter.sh
# example.com       FILTER filter:dummy
# example.net       FILTER filter:dummy
# otherdomain.ca    FILTER filter:dummy
# -------------------------------------------
# do not compile this file !!!

# alternatively you can use hash:/etc/postfix/recipient_access:
# -------------------------------------------------------------
# sp@cen05.xen.wbcd.pl        OK
# ola@cen05.xen.wbcd.pl       OK
# root@cen05.xen.wbcd.pl   REJECT
# -------------------------------------------------------------
# Compile recipient_access into recipient_access.db:
# postmap /etc/postfix/recipient_access



#top smtpd_data_restrictions





#top smtpd_end_of_data_restrictions





#top smtpd_etrn_restrictions





#top smtpd_restriction_classes







#top Start postfix server


/etc/init.d/postfix start

tail -F /var/log/mail/mail.log




Zmodyfikowany ostatnio: 2017/03/24 21:15:00 (7 lat temu), textsize: 55,4 kB, htmlsize: 78,8 kB

Zapraszam do komentowania, zgłaszania sugestii, propozycji, własnych przykładów, ...
Dodaj komentarzKomentarze użytkowników