Bociek PLD - Pisarz
I. Informacje podstawowe
II. Instalacja
III. Podręcznik użytkownika
IV. Podręcznik administratora
Usługi dostępne w PLD
Postfix - Transport poczty elektronicznej (MTA)
V. Tworzenie PLD - Praktyczny poradnik
VI. O podręczniku
O tej książce
Spis treści
Inne wersje tego dokumentu
PDF
HTML (jeden plik)
TXT
Odnośniki
Tworzymy dokumentację PLD
Strona PLD
Listy dyskusyjne PLD

Postfix - Transport poczty elektronicznej (MTA)

<- ->
 

Postfix jest MTU czyli w wielkim skrócie demonem poczty elektronicznej. No tak, w sumie powiecie ściągamy poldkiem instalujemy i działa... działa ale chcemy coś więcej... chcemy by nasz smtpd był ładnie skonfigurowany.

Zaczynamy

Ściągamy to co nam będzie potrzebne. Wiadomo... postfix i dodatki, które mu są potrzebne:

poldek -i postfix cyrus-sasl cyrus-sasl-plain cyrus-sasl-saslauthd \
    cyrus-sasl-login

A tutaj coś co będzie nam potrzebne do tworzenia certyfikatów.

poldek -i openssl-tools

A tutaj coś żebyśmy mogli pobrać pocztę z serwera.

poldek -i tpop3d inetd rc-inetd

Konfiguracja

Przyszedł czas na konfigurację postfix-a.

# echo 'pwcheck_method:saslauthd' > /etc/sasl/smtpd.conf

Należy jeszcze sprawdzić czy w /etc/pam.d/ znajduje się plik smtp, jeżeli nie to należy przegrać na to miejsce przykładowy konfig z /usr/share/doc/cyrus-sasl-saslauthd-*/cyrus.pam.gz , rozpakować i nazwać plik smtp.

Uruchom saslauthd:

# /etc/rc.d/init.d/saslauthd start

Uruchom postfix-a:

# /etc/rc.d/init.d/postfix start

Teraz chcemy, żeby postfix wymagał autentykacji:

# postconf -e smtpd_sasl_auth_enable=yes
# postconf -e smtpd_recipient_restrictions=permit_mynetworks, \
    reject_sender_login_mismatch,permit_sasl_authenticated, \
    reject_unauth_destination

Teraz linijka dla popsutych Outlook-ów.

# postconf -e broken_sasl_auth_clients=yes
# postconf -e mynetworks=127.0.0.0/8,192.168.1.1/32

Restart postfix-a:

# /etc/rc.d/init.d/postfix restart

No i to wszystko razem powinno wyglądać tak:

# postconf -n
alias_database = hash:/etc/mail/aliases
alias_maps = hash:/etc/mail/aliases
biff = no
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/mail
daemon_directory = /usr/lib/postfix
debug_peer_level = 2
default_privs = nobody
mail_owner = postfix
mail_spool_directory = /var/mail
myhostname = networking.ee
mynetworks = 127.0.0.0/8, 192.168.1.1/32, 192.168.1.1/32
myorigin = $myhostname
queue_directory = /var/spool/postfix
setgid_group = maildrop
smtpd_recipient_restrictions = permit_mynetworks, \
    reject_sender_login_mismatch,permit_sasl_authenticated, \
    reject_unauth_destination
smtpd_sasl_auth_enable = yes

Szyfrowanie

Włączamy teraz szyfrowanie wysyłania poczty oraz transmisji między MX-ami dla różnych domen

Następnie generujemy certyfikat SSL. Podczas generowania certyfikatu będziesz musiał odpowiedzieć na kilka prostych pytań.

Robimy to w sposób następujący:

# openssl genrsa -out key.pem 1024
# openssl req -new -x509 -key key.pem -out cert.pem
# cat cert.pem >> key.pem; mv -f key.pem cert.pem
# cp cert.pem /var/lib/openssl/certs/nasza.domena.pl.pem

Do pliku /etc/mail/main.cf należy dodać 4 linijki, takie jak poniżej:

smtpd_tls_cert_file = /var/lib/openssl/certs/nasza.domena.pl.pem
smtpd_tls_key_file = $smtpd_tls_cert_file
smtpd_use_tls = yes
smtp_use_tls = yes

W pliku /etc/mail/master.cf należy zastąpić aktualną linijkę czyli tą z domyślnej instalacji:

#smtps inet  n  -  n  -    -    smtpd
na naszą aktualną:
 smtps inet  n  -  y  -    -    smtpd -o smtpd_tls_wrappermode=yes \
    -o smtpd_sasl_auth_enable=yes

Domeny

Jeżeli posiadamy więcej niż jedną domenę na serwerze to w /etc/mail/main.cf dopisujemy:

mydestination = $myhostname, jakas.domena.pl, \
    costam.gdziestam.pl, PLD.biz.pl

Jeżeli chcemy aby nasz postfix obsługiwał wirtualne domeny (przyznawał się do nich) dopisujemy w /etc/mail/main.cf takie trzy linijki:

relay_domains = hash:/etc/mail/domains
virtual_maps = hash:/etc/mail/virtual
smtpd_sender_login_maps = hash:/etc/mail/virtual

Tworzymy /etc/mail/domains i robimy nastepujące wpisy:

# plik domains, w nim wpisane domeny dla których nasz serwer 
#pocztę będzie przyjmował.
pld-linux.org    		relay
81.0.225.27			relay

Do /etc/mail/virtual dopisujemy na przykład coś takiego:

# plik virtual, w nim wpisane są konta w domenach które obsługujemy
# schemat wpisu
# ktostam.nazwisko@domena.pl    konto_w_systemie
rafal.drozd@networking.ee           grifter
rafal.drozd@jakas.domena.pl         grifter
rafal.drozd@costam.gdziestam.pl	grifter
rafal.drozd@PLD.biz.pl		grifter
virusalert@networking.ee		grifter
# to ostatnie będzie nam później do amavisa potrzebne :)

Teraz musimy wklepać

# postmap /etc/mail/domains
# postmap /etc/mail/virtual

No i restart postfixa

# /etc/rc.d/init.d/postfix restart

Usprawnienia

Dodatkowe wpisy które poprawią pracę naszego postfix-a Edytujemy /etc/mail/main.cf i dodajemy następujące wpisy:

disable_vrfy_command = yes
# liczba odbiorców max 100 dla jednego maila
smtpd_recipient_limit = 100
smtpd_error_sleep_time = 5
smtpd_hard_error_limit = 10
smtpd_helo_required = yes
# ogranicz do 2 mega [2000000] wielkość przesyłki, właściwie mając \
# dobre łącze można
# wpisać 10 mega [10000000]
message_size_limit = 2000000
# spam fight! :>
header_checks = regexp:/etc/mail/header_checks
mail_name = PLD - $myhostname
smtpd_banner = $myhostname ESMTP $mail_name. We block/report all spam.
smtpd_soft_error_limit = 60
default_process_limit = 3
maps_rbl_domains = relays.ordb.org
smtpd_client_restrictions = reject_maps_rbl

Tworzymy /etc/mail/header_checks i dopisujemy:

/^To: .*friend@public/    REJECT Header-To address revoked \
    due to too much spam.
/^Subject: ADV\W/         REJECT Header-Subject beginning with \
    "spam" ADV tag rejected.

Końcowa konfiguracja

# postconf -n
alias_database = hash:/etc/mail/aliases
alias_maps = hash:/etc/mail/aliases
biff = no
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/mail
daemon_directory = /usr/lib/postfix
debug_peer_level = 2
default_privs = nobody
default_process_limit = 3
disable_vrfy_command = yes
header_checks = regexp:/etc/mail/header_checks
mail_name = PLD - $myhostname
mail_owner = postfix
mail_spool_directory = /var/mail
maps_rbl_domains = relays.ordb.org
message_size_limit = 2000000
myhostname = networking.ee
mynetworks = 127.0.0.0/8,192.168.1.1/32
myorigin = $myhostname
queue_directory = /var/spool/postfix
relay_domains = hash:/etc/mail/domains
setgid_group = maildrop
smtp_use_tls = yes
smtpd_banner = $myhostname ESMTP $mail_name. We block/report all spam.
smtpd_client_restrictions = reject_maps_rbl
smtpd_error_sleep_time = 5
smtpd_hard_error_limit = 10
smtpd_helo_required = yes
smtpd_recipient_limit = 100
smtpd_recipient_restrictions = permit_mynetworks, \
    reject_sender_login_mismatch,permit_sasl_authenticated, \
    reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_soft_error_limit = 60
smtpd_tls_cert_file = /var/lib/openssl/certs/nasza.domena.pl.pem
smtpd_tls_key_file = $smtpd_tls_cert_file
smtpd_use_tls = yes
virtual_maps = hash:/etc/mail/virtual
smtpd_sender_login_maps = hash:/etc/mail/virtual

Zawartość master.cf

# grep -v ^# /etc/mail/master.cf
smtp      inet  n  -  n  -     -  smtpd
smtps     inet  n  -  y  -     -  smtpd -o smtpd_tls_wrappermode=yes \
    -o smtpd_sasl_auth_enable=yes
pickup    fifo  n  -  n  60    1  pickup
cleanup   unix  n  -  n  -     0  cleanup
qmgr      fifo  n  -  n  300   1  qmgr
rewrite   unix  -  -  n  -     -  trivial-rewrite
bounce    unix  -  -  n  -     0  bounce
defer     unix  -  -  n  -     0  bounce
flush     unix  n  -  n  1000? 0  flush
smtp      unix  -  -  n  -     -  smtp
showq     unix  n  -  n  -     -  showq
error     unix  -  -  n  -     -  error
local     unix  -  n  n  -     -  local
virtual   unix  -  n  n  -     -  virtual
lmtp      unix  -  -  n  -     -  lmtp
cyrus     unix  -  n  n  -     -  pipe flags=R user=cyrus \
    argv=/usr/lib/cyrus/deliver -e -m ${extension} ${user}
uucp      unix  -  n  n  -     -  pipe flags=Fqhu user=uucp \
    argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -  n  n  -     -  pipe flags=F user=ftn \
    argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -  n  n  -     -  pipe flags=Fq. user=foo \
    argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient

tpop3d

tpop3d, czyli coś dzięki czemu będziemy mogli pobrać pocztę z serwera.

No i włączamy tpop3d-a

# /etc/rc.d/init.d/tpop3d start

amavis + mks

Przystępujemy do instalacji i konfiguracji amavisa + mks :)

Instalujemy poldkiem mks, serwer mksd, bazy, oraz skrypt aktualizujący bazy

poldek -i mks mksd mks-bases mks-updater mksd-clients

Teraz ściągamy jakiegoś wirusa i sprawdzamy czy mks32 działa...

# wget http://www.eicar.org/download/eicar.com
# mks32 eicar.com
mks_vir: init...  1.9.0 for Linux i386, 2003.07.02
mks_vir: database version 2003 7 11  13 23
mks_vir: init OK, scan mode
mks_vir: check file(s)
mks_vir: file: eicar.com
mks_vir:        --heuristic for virus Eicar.Test
mks_vir:        --heuristic for virus Eicar.Test
mks_vir: status: virus found: eicar.com
mks_vir: exit code: 0x01

Jeśli dostaliście coś takiego, tzn. że wszystko jest ok ;)

Teraz przetestujemy czy mksd działa poprawnie.

# /etc/rc.d/init.d/mksd  start
# mkschk /root/skaner/eicar.com
VIR Eicar.Test /root/skaner/eicar.com

Jeśli dostałeś coś takiego, tzn. że wszystko jest okej. mksd przyśpiesza znacznie pracę na słabych maszynach... wtedy znacznie odczujesz.

Instalujemy teraz amavisa

poldek -i amavisd-new

No i teraz najgorsze ;)

Edytujemy /etc/amavisd.conf

Odkomentuj linię:

@bypass_spam_checks_maps  = (1);  # uncomment to DISABLE anti-spam code

Pozmieniaj odpowiednie linie

$mydomain = 'twoja.domena.pl';      # (no useful default)
$daemon_user  = 'amavis';	# (no default;  customary: vscan or amavis)
$daemon_group = 'amavis';	# (no default;  customary: vscan or amavis)

Możemy tutaj ustawić użytkownika amavis. Dodatkowo należy dopisać mksd do grupy amavis, dzięki czemu będzie on mógł korzystać z katalogów z częściami maili amavisa.

# grep amavis /etc/group
amavis:x:116:mksd

Zakomentuj linię:

#$unix_socketname = "$MYHOME/amavisd.sock"; # amavis helper protocol socket

Jeśli nie chcesz żeby amavis używał pewnych pakerów to zakomentuj odpowiednie linie, np.

#$unrar  =  'unrar';

Usuń wszystkie wpisy na temat antywirusów (@av_scanners = ) i zastąp to wpisem z pliku README z archiwum mksd:

['MkS_Vir daemon',
'mksscan', '-s -Q {}',
[0], [1..7],
qr/^... (\S+)/
 ],

Usuń wpisy z @av_scanners_backup =

W swoim systemie pocztowym (postfix) utwórz użytkownika (lub alias) "virusalert" lub pozmieniaj wpisy:

$mailfrom_notify_admin
$mailfrom_notify_recip
$virus_admin

My zrobiliśmy wcześniej aliasa dla virusalert ;)

Ja sobie jeszcze dopisałem:

$hdrfrom_notify_sender = $mailfrom_notify_admin;

Jeśli nie chcesz aby nadawcy listów oraz admini dostawali informacje o wirusach w domyślnym języku (English) to odkomentuj linie i zrób własne wpisy w /var/amavis/*.txt

# $notify_sender_templ      = read_text('/var/amavis/notify_sender.txt');
# $notify_virus_sender_templ=read_text('/var/amavis/notify_virus_sender.txt');
# $notify_virus_admin_templ = read_text('/var/amavis/notify_virus_admin.txt');
# $notify_virus_recips_templ=read_text('/var/amavis/notify_virus_recips.txt');

i zmień 

#$bdy_encoding = 'iso-8859-1';  # (default: 'iso-8859-1')

na

$bdy_encoding = 'iso-8859-2';  # (default: 'iso-8859-1')

Według licencji powinieneś umieścić w notify_sender.txt reklamę http://www.mks.com.pl gdyż jest do warunek licencji na używanie mks. Na końcu pliku /usr/sbin/amavisd znajdują się przykładowe szablony.

W pliku /etc/mail/master.cf dopisujemy nową linię:

localhost:10025 inet n  -       n       -       -       smtpd

No i restart postfix-a, amavisd-a i mks

# /etc/rc.d/init.d/postfix restart
# /etc/rc.d/init.d/mksd restart
# /etc/rc.d/init.d/amavisd restart

Teraz testujemy amavis-a:

# telnet 127.0.0.1 10024
Trying 127.0.0.1.10024...
Connected to localhost.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready
MAIL FROM: <root>
250 2.1.0 Sender root OK
RCPT TO: <root>
250 2.1.5 Recipient root OK
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: test bez wirusa
test
.

250 2.6.0 Ok, id=29569-01, from MTA: 250 Ok: queued as A1017FD1E

Dostałeś 250? To znaczy, ze amavisd sprawdził przesyłkę :) nie wierzysz? tail -n 100 -f /var/log/maillog

A teraz sprawdzimy jak reaguje na przesyłkę z wirusem:

# telnet 127.0.0.1 10024
Trying 127.0.0.1.10024...
Connected to localhost.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready
MAIL FROM: <root>
250 2.1.0 Sender root OK
RCPT TO: <root>
250 2.1.5 Recipient root OK
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: test z wirusem

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
.
250 2.5.0 Ok, but 1 BOUNCE

No i znalazł wirusa :) w logach mamy:

Jul 14 04:17:43 networking amavis[29569]: (29569-02) INFECTED (Eicar.Test), 
<root> -> <root>, quarantine virus-20030714-041716-29569-02, \
    Message-ID: , Hits: -

Teraz jeszcze mała obróbka plików cf od postfix-a ;)

Edytujemy /etc/mail/master.cf

Linijkę:
smtp      inet  n  -   n    -    -    smtpd

zamieniamy na:

smtp      inet  n  -   n    -    -    smtpd -o \
    content_filter=smtp-amavis:[127.0.0.1]:10024
	

oraz dodajemy jeszcze:

smtp-amavis unix -      -       n       -       2       smtp
-o smtp_data_done_timeout=1200
-o disable_dns_lookups=yes

Restart postfix-a:

# /etc/rc.d/init.d/postfix restart

i powinno wszystko nam pięknie latać:)

Wyślij sobie eicar.com w załączniku a zobaczysz, że smtp odrzuci i dostaniesz maila z alertem :]

postifx.admin

TODO (http://high5.net/postfixadmin/)

 
&lt;- ->