Postfix - bezpieczny i wydajny serwer MTA
Data: 18-11-2004 o godz. 17:42:57
Temat: Konfiguracje SMTP, POP3, IMAP


Postfix jest serwerem MTA (Mail Transport Agent). Jest on o wiele przyjemniejszy i łatwiejszy w konfiguracji, bardziej wydajny oraz bezpieczniejszy niż powszechnie używany sendmail, którego kod źródłowy zintegrowany jest z kodem źródłowym systemów *BSD. Mówiąc krótko, jest to bardzo dobry serwer poczty pozbawiony wad i błędów, które posiada sendmail. Warto również wspomnieć, że Postfix zdobywa ostatnio coraz większą popularność i jest godnym konkurentem dla innych serwerów MTA, takich jak np. Qmail, Exim i wcześniej wspomniany sendmail.

"Postfix - bezpieczny i wydajny serwer MTA"

Opis konfiguracji: Postfix + SASL2 + TLS + popa3d + AMaViS + Clam AntiVirus
Autor: Tomasz Stala [tomek(at)zso.tbg.net.pl]
Napisano: 17.04.2004 r.
Wersja: 1.2 (poprawiona)

1. Wstęp

Postfix jest serwerem MTA (Mail Transport Agent). Jest on o wiele przyjemniejszy i łatwiejszy w konfiguracji, bardziej wydajny oraz bezpieczniejszy niż powszechnie używany sendmail, którego kod źródłowy zintegrowany jest z kodem źródłowym systemów *BSD. Mówiąc krótko, jest to bardzo dobry serwer poczty pozbawiony wad i błędów, które posiada sendmail. Warto również wspomnieć, że Postfix zdobywa ostatnio coraz większą popularność i jest godnym konkurentem dla innych serwerów MTA, takich jak np. Qmail, Exim i wcześniej wspomniany sendmail. W niniejszym artykule chciałbym przedstawić krótki opis jego instalacji oraz konfiguracji. Artykuł ten powstał z myślą o użytkownikach systemu FreeBSD, którzy chcieli by na swojej maszynie zainstalować Postfix'a z autoryzacją i szyfrowanym połączeniem SMTP oraz dodatkowo skaner antywirusowy. Ma on być wyjaśnieniem niektórych zagadnień, które nie zostały opisane w innych podobnych artykułach, lub zostały one opisane w sposób niezrozumiały dla przeciętnego użytkownika. Opisane tu informacje są już dostępne w internecie, ja jednak postarałem się to wszystko zebrać do kupy i opisać w jednym możnaby powiedzieć "krótkim" artykule, tak aby zaoszczędzić Twój czas na żmudnym przeszukiwaniu zasobów sieci. Mam nadzieję, że po przeczytaniu go nie będziesz miał problemów z zainstalowaniem Postfix'a i wszystkie informacje zawarte w tym artykule będą dla Ciebie jasne i przejrzyste. Życzę miłego czytania. Z góry przepraszam za być może mnóstwo błędów wynikających z niedopatrzeń lub braku czasu na sprawdzenie artykułu, który pisany był w wolnych chwilach spędzonych przy komputerze. Zakładam, że czytający ten artykuł posiada chociaż podstawową wiedzę w zakresie administracji systemami FreeBSD z linii 4.x oraz 5.x, na takich też systemach operacyjnych artykuł ten był testowany.

2. Instalacja Postfix'a i biblioteki SASL2

Źródła Postfix'a są dostępne do ściągnięcia na oficjalnej stronie projektu - http://www.postfix.org/. Do tego dochodzi ściągnięcie najnowszych poprawek (patch'y), jak również bardzo potrzebnej aby móc korzystać z autoryzacji SMTP biblioteki (SASL2). Dlatego najprostrzym i najłatwiejszym sposobem na zainstalowanie tego wszystkiego może być skorzystanie z drzewa portów, jak wiemy nasz komputer wszystkie te powyższe czynności (instalacja, patchowanie) wykona za nas automatycznie. No to do dzieła.Pierwszym krokiem, który powinniśmy wykonać jest zainstalowanie wyżej wymienionej biblioteki, jak już wspomniałem będziemy je instalować z portów, czyli wykonujemy poniższe polecenia:

# cd /usr/ports/security/cyrus-sasl2
# make build && make install && make clean
# cd /usr/ports/security/cyrus-sasl2-saslauthd
# make build && make install && make clean

Teraz powinniśmy skonfigurować SASL2, przechodzimy do katalogu /usr/local/lib/sasl2, tworzymy w nim plik `smtpd.conf`, następnie edytujemy go i ustawiamy metodę autoryzacji użytkowników:

# touch /usr/local/lib/sasl2/smtpd.conf
# vi /usr/local/lib/sasl2/smtpd.conf

-- smtpd.conf --

pwcheck_method: saslauthd
mech_list: plain login

-- end of smtpd.conf -- 

Przechodzimy teraz do katalogu z postfixem i instalujemy go. System automatycznie powinien pobrać najświeższe pliki (o ile uaktualniliśmy nasze drzewo portów) oraz najnowsze patche.

# cd /usr/ports/mail/postfix
# make build && make install && make clean

Po wydaniu tych poleceń powinno nam się pokazać menu, w którym wybieramy potrzebne nam opcje, z którymi nasz Postfix będzie współpracował. Wybieramy więc - DB3, SASL2, TLS. Opcjonalnie możemy także zaznaczyć opcję MySQL, która w późniejszym czasie będzie nam też potrzebna.

3. Podstawowa konfiguracja Postfix'a

Zacznijmy od wyłączenia sendmaila, edytujemy więc plik `rc.conf` i ustawiamy w nim następujące zmienne:

# vi /etc/rc.conf

-- rc.conf --

sendmail_enable="NONE"
mta_start_script=""
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"

-- end of rc.conf --

Teraz możemy stworzyć dowiązanie symboliczne do katalogu z postfixem, oraz do pliku z aliasami, czyli tak zwany `symbolic link` - nie jest to obowiązkowe, lecz dla zachowania estetyki polecam ich utworzenie:

# ln -s /usr/local/etc/postfix /etc/postfix
# ln -s /usr/local/etc/postfix/aliases /etc/aliases

Jeśli już wyłączyliśmy sendmaila, możemy przystąpić do konfiguracji naszego serwera, edytujemy plik `main.cf` następnie zmieniamy w nim co nam potrzeba, w zasadzie to mógłbyś zastąpić cały przykładowy plik konfiguracyjny tym, który jest poniżej. Początkowo nie zamierzałem tu opisywać dokładnie wszystkich opcji, jedynie te najważniejsze. Jednak skoro ma to być w pewnym sensie pomocnik, poszedłem na kompromis i postarałem się w miarę zrozumiale opisać poszczególne opcje. Zakładam, że masz skonfigurowany serwer DNS lub jakąś wydelegowaną domenę. W opisanym przeze mnie konfigu domeny te będą nosić nazwy `domana.pl` oraz `domena2.pl`, przy czym `domena2.pl` będzie domeną wirtualną, o czym napiszę w dalszej części artykułu. Niektóre z opcji są ustawione defaultowo i nie musisz ich zmieniać. Oto plik konfiguracyjny:

# vi /etc/postfix/main.cf

-- main.cf --

# LOCAL PATHNAME INFORMATION
# (Definiujemy ścieżki do katalogów)

# Katalog z plikami komunikującymi się z naszym MTA.
queue_directory = /var/spool/postfix
# Katalog zawierający pliki do administracji Postfixem.
command_directory = /usr/local/sbin
# Katalog z programami demona.
daemon_directory = /usr/local/libexec/postfix

# QUEUE AND PROCESS OWNERSHIP

# Ustawiamy właściciela.
mail_owner = postfix

# INTERNET HOST AND DOMAIN NAMES

# Wpisujemy nazwę naszego serwera lub domenę:
myhostname = domena.pl
# Ustawiamy nazwę naszej domeny:
mydomain = $myhostname

# SENDING MAIL

# Opcja ta odpowiedzialna jest za definicję pola "From: " w nagłówkach:
myorigin = $myhostname

# RECEIVING MAIL

# Adresy interfejsów na których będzie nasłuchiwał Postfix:
inet_interfaces = $myhostname, localhost
# Opcja wskazująca Postfix'owi nazwy domen, na które serwer ma akceptować pocztę przychodzącą wyłącznie na te domeny:
mydestination = $myhostname, domena2.pl

# REJECTING MAIL FOR UNKNOWN LOCAL USERS

# Opcja odpowiedzialna za listę nazw odbiorców wiadomości:
local_recipient_maps = $alias_maps unix:passwd.byname
# Numer kodu, który będzie zwracany, gdy w systemie nie ma odbiorcy:
unknown_local_recipient_reject_code = 550
# Ustawiamy limit ilości wiadomości, które mogą być dostarczone do użytkownika w tym samym czasie:
local_destination_concurrency_limit = 2
# Ustawiamy limit ilości użytkowników, których Postfix może obsłużyć równocześnie w tym samym czasie:
default_destination_concurrency_limit = 10

# TRUST AND RELAY CONTROL

# Adresy sieci, z których będzie można przekierować pocztę:
mynetworks = 127.0.0.0/8, 192.168.1.0/24
# Adresy komputerów, z których można będzie przekierować pocztę (relay):
relay_domains = 127.0.0.0/8

# ALIAS DATABASE

# Ścieżka do pliku i bazy z aliasami:
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# DELIVERY TO MAILBOX

# Katalog, w którym przechowywane będą wiadomości:
mail_spool_directory = /var/mail

# SHOW SOFTWARE VERSION OR NOT

# Ustawienia nagłówna i banner'a naszego serwera:
mail_name = Postfix
smtpd_banner = $myhostname ESMTP $mail_name

# DEBUGGING CONTROL

debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         xxgdb $daemon_directory/$process_name $process_id & sleep 5

# INSTALL-TIME CONFIGURATION INFORMATION

sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = no

# OTHERS

# Maksymalna wielkość wysyłanej wiadomości (10 mb):
message_size_limit = 10240000
# Maksymalna pojemność skrzynki pocztowej (25 mb): 
mailbox_size_limit = 25600000
# Maksymalna ilość wiadomości wysłanych za jednym razem przez użytkownika:
smtpd_recipient_limit = 10
# Opcja odpowiedzialna za blokowanie komendy SMTP VRFY:
disable_vrfy_command = yes
# Parametr odpowiedzialny za dostarczanie maili jeżeli server jest wyłączony.
# (sprawdzaj zdalny server co pół godziny i zwracaj błąd do nadawcy po trzech dniach):
queue_run_delay = 30m
maximal_queue_lifetime = 3d
# Ustawienia czasów oczekiwania na komunikaty o błędach:
smtpd_error_sleep_time = 3
smtpd_soft_error_limit = 3
smtpd_hard_error_limit = 5

--- end of main.cf --

Oczywiście powyższe opcje musisz dostosować do własnych potrzeb. Myślę, że powyższe wyjaśnienie "niektórych" opcji zostało napisane w sposób dla Ciebie zrozumiały, jeśli nie to obszerny opis wszystkich parametrów konfiguracyjnych znajdziesz w dokumentacji i na stronach manuali, na które gorąco polecam zaglądnąć.

4. Instalacja i uruchamianie demona popa3d

No to mamy już skonfigurowanego Postfix'a, teraz wypadałoby zająć się serwerem POP3. Dobrym, solidnym, a zarazem bezpiecznym serwerem POP3, jest demon popa3d Solar Designer'a. Jest on bardzo prosty w instalacji, więc na początek możemy go zainstalować. Jak już opisałem wcześniej najwygodniejszym sposobem jest instalacja z portów, tak też uczynimy z popa3d. Wchodzimy do katalogu z demonem i wydajemy polecenia do instalacji naszego serwera POP3:

# cd /usr/ports/mail/popa3d
# make build && make install && make clean

Teraz edytujmy plik `inetd.conf` do którego wstawimy poniższą linijkę:

# vi /etc/inetd.conf

-- inetd.conf --

pop3    stream  tcp     nowait  root    /usr/local/libexec/popa3d   popa3d

-- end of inetd.conf --

Spowoduje to uruchamianie demona popa3d z poziomu inetd, jako standardowego serwer POP3. Pozostało więc tylko przeładować demona inetd w celu uruchomienia popa3d, aby to zrobić wydajemy polecenie:

# killall -HUP inetd

5. Uruchamianie Postfix'a

Skoro mamy już skonfigurowany i uruchomiony serwer POP3, został nam do uruchomienia serwer SMTP, utwórzmy plik `postfix.sh`, który będzie odpowiadał za uruchomienie Postfix'a przy starcie systemu i nie tylko. Będziesz mógł za jego pomocą również przeładować jego konfigurację (reload), edytuj teraz ten plik i wstaw do niego to co zostało napisane poniżej:

# touch /usr/local/etc/rc.d/postfix.sh
# vi /usr/local/etc/rc.d/postfix.sh

-- postfix.sh --

#!/bin/sh

case $1 in
	start)
	  if [ -x /usr/local/sbin/postfix ]; then
	       /usr/local/sbin/postfix start
	  fi
	  ;;
	stop)
	       /usr/local/sbin/postfix stop
	  ;;
	reload)
	      /usr/local/sbin/postfix reload
	  ;;
	*)
	  echo "USAGE $0 (start|stop|reload)"
	  exit 1
esac

-- end of postfix.sh --

Jak już wspomniałem użyjmy tego pliku do uruchomienia Postfix'a:

# /usr/local/etc/rc.d/postfix.sh start

Jeśli wszystko pójdzie dobrze, powinniśmy ujrzeć następujący komunikat "postfix/postfix-script: starting the Postfix mail system" Zalogujmy się teraz na nasz serwer na port 25 używając programu telnet, aby sprawdzić czy wszystko działa prawidłowo:

# telnet 127.0.0.1 25

Wpisz `EHLO domena.pl`, jeśli wyświetli się komunikat taki jak poniżej, znaczy to że udało nam się poprawnie skonfigurować serwer SMTP + POP3 i wszystko działa w należytym porządku.

$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 domena.pl ESMTP Postfix
EHLO domena.pl
250-domena.pl
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-XVERP
250 8BITMIME

Wpisujemy `QUIT` aby zakończyć połączenie.

6. Konfiguracja Postfix'a i SMTP AUTH

Autoryzacja poczty wychodzącej (SMTP AUTH) to zabezpieczenie uniemożliwiające wysyłkę poczty bez uprzedniego zalogowania się do konta. Dzięki niemu nikt nie będzie mógł podszyć się pod Twój adres e-mail, a odbiorca danej wiadomości będzie miał pewność, że jesteś jej autorem. Funkcja ta zabezpiecza także przed wysłaniem poczty za pośrednictwem Twojego serwera przez nie autoryzowanego nadawcę lub spamera. Opisana tu konfiguracja zapewnia taką autoryzację za pomocą biblioteki Cyrus-SASL2. Aby móc wysyłać pocztę z użyciem autoryzacji poczty wychodzącej, należy wejść w programie pocztowym do właściwości konta i w zakładce 'Serwery' włączyć opcję 'Serwer wymaga uwierzytelnienia', a w jego właściwościach wybrać 'Użyj tych samych ustawień co mój serwer poczty przychodzącej'.To było krótkie wyjaśnienie na jakiej zasadzie działa SMTP AUTH, teraz czas na jej skonfigurowanie. Edytuj plik `main.cf` i dodaj do niego poniższe linijki:

# vi /etc/postfix/main.cf

--- main.cf ---

# SASL AUTH

# Uaktywniamy autoryzację:
smtpd_sasl_auth_enable = yes
# Zgodność ze starszymi klientami pocztowymi, np. Outlook Express 4:
broken_sasl_auth_clients = yes
# Metod autoryzacji, które nie będą obsługiwane:
smtpd_sasl_security_options = noanonymous
# Ustawienie autoryzacji jest wymagana przy wysyłaniu listów z określonych tutaj domen. Jeśli zostawisz ten parametr 
# pusty będzie to oznaczało, że autoryzacja jest wymagana przy wszystkich domenach na Twoim serwerze:
smtpd_sasl_local_domain = 
# Restrykcje - Sprawdzanie poczty na podstawie adresu nadawcy listu (RCPT TO):
smtpd_recipient_restrictions = 
			permit_sasl_authenticated,
			reject_unauth_destination,
			reject_unknown_recipient_domain,
			reject_non_fqdn_recipient,
			check_relay_domains,
# Restrykcje - Sprawdzenie IP komputera, z którego wysyłana jest wiadomość:
smtpd_client_restrictions = 
			permit_sasl_authenticated,
			reject_unknown_client,
			reject_rbl_client relays.ordb.org,
			reject_rbl_client dnsbl.njabl.org,
# Restrykcje - Sprawdzanie poczty na podstawie adresu odbiorcy listu (MAIL FROM): 
smtpd_sender_restrictions =
			permit_sasl_authenticated,
			reject_unknown_sender_domain,
			reject_non_fqdn_sender,
			hash:/usr/local/etc/postfix/access
			    
--- end of main.cf ---

Restrykcjami możemy manipulować dowolnie. Dostępne są 3 rodzaje restrykcji wymienione powyżej. Oto opis niektórych z nich:

  1. Sprawdzanie poczty na podstawie adresu nadawcy listu (RCPT TO). Zmienna odpowiedzialna za tą restrykcje to "smtpd_recipient_restrictions":
    • reject_non_fqdn_recipient - odrzuć list, jeśli podany adres odbiorcy nie jest "pełny" (fully-qualified domain form)
    • reject_unknown_recipient_domain - odrzuć, jeśli adres docelowy listu, jego adres nie istnieje w DNS (czyli i tak nie ma dokąd go wysłać)
    • check_recipient_access maptype:mapname - przeszukuje plik podany jako argument i na jego podstawie decyduje czy wysłać list.
    • permit_auth_destination - przyjmij list, jeśli to nasz serwer jest jego celem lub adres przeznaczenia zawiera się w zmiennej $relay_domains. Jeśli warunek nie jest spełniony, bierz pod uwagę następne ograniczenia.
    • reject_unauth_destination - podobne do poprzedniego, ale odrzuć list, jeśli to nasz serwer nie jest jego przeznaczeniem. Odrzuca list, nie sprawdza innych ograniczeń.
    • check_relay_domains - jeśli adres IP komputera, który wysyła list pasuje do $relay_domains lub celem listu jest $relay_domains lub to nasz serwer jest komputerem docelowym - przyjmij list, w przeciwnym wypadku go odrzuć i zakończ.
    • permit - pozwól na wysłanie listu. Przydatne na końcu listy ograniczeń, jako zachowanie domyślne, gdy poprzednie reguły nie pasują.
    • reject - odrzuć list. Przydatne na końcu listy ograniczeń, jako zachowanie domyślne, gdy poprzednie reguły nie pasują.
  2. Sprawdzenie IP komputera, z którego wysyłana jest wiadomość. Zmienna odpowiedzialna za tą restrykcje to "smtpd_client_restrictions":
    • permit_mynetworks - pozwala na połączenie się z naszym serwerem komputerom, z naszej sieci lokalnej (dokładnie: komputerom, które zostały ujęte w zmiennej $mynetworks)
    • reject_unknown_client - odrzuca komputer, którego adresu IP nie ma w DNS
    • check_client_access maptype:mapname - sprawdza IP/nazwę komputera w pliku wpisanym jako parametr.
    • permit - pozwól na połączenie. Przydatne na końcu listy ograniczeń, jako zachowanie domyślne, gdy poprzednie reguły nie pasują.
    • reject - odrzuć połączenie. Przydatne na końcu listy ograniczeń, jako zachowanie domyślne, gdy poprzednie reguły nie pasują.
  3. Sprawdzanie poczty na podstawie adresu odbiorcy listu (MAIL FROM). Zmienna odpowiedzialna za tą restrykcje to "smtpd_sender_restrictions":
    • reject_unknown_sender_domain - odrzuca list, jeśli adres nadawcy, dokładnie część po @ adresu nadawcy, nie ma wpisu w DNS.
    • reject_non_fqdn_hostname - odrzuca list, jeśli adres nadawcy, dokładnie część po @ adresu nadawcy nie jest "pełna" (fully-qualified domain form).
    • check_sender_access maptype:mapname - przeszukuje plik podany jako argument. Na jego podstawie decyduje czy użytkownik może wysyłać listy.
    • permit - pozwól na wysłanie listu. Przydatne na końcu listy ograniczeń, jako zachowanie domyślne, gdy poprzednie reguły nie pasują.
    • reject - odrzuć list. Przydatne na końcu listy ograniczeń, jako zachowanie domyślne, gdy poprzednie reguły nie pasują.

Jak już wspomniałem tymi zmiennymi możemy manipulować dowolnie. Szczegółowy ich opis znajdziesz w dokumentacji oraz w pliku `sample-smtpd.cf` w katalogu z Postfix'em.Utwórzmy teraz plik `access` w katalogu z plikami konfiguracyjnymi Postfix'a w celu ustawienia ograniczeń nawiązania połączeń z naszym serwerem. W praktyce dopisujemy do niego każdego użytkownika, który chciałby mieć możliwość wysyłania i odbierania poczty z naszego serwera, w opisanym przykładzie użytkownik tomek będzie mógł korzystać z naszego serwera SMTP, dostaje on takie przywileje gdy dopiszemy słowo `OK` przy jego username i nazwie domeny. Jeśli jednak chcesz aby użytkownik miał jedynie dostęp do powłoki i nie miał możliwości wysyłania i odbierania poczty dopisujemy przy jego loginie i nazwie domeny słowo `REJECT`. Krótko mówiąc `user@domena1.pl` nie będzie otrzymywał żadnej poczty, jak również na domenę `jakas_domena.pl` nie dojdzie żadna wiadomość. Zawartość tego pliku może być następująca:

# touch /etc/postfix/access
# vi /etc/postfix/access

--- access ---

tomek@domena1.pl		OK
user@domena1.pl		REJECT
jakas_domena.pl		REJECT

--- end of access ---

Po dokonaniu wpisów do tego pliku aktualizujemy bazę danych poleceniem:

# postmap /etc/postfix/access

Restartujemy Postfix'a i uruchamiamy saslauthd:

# /usr/local/etc/rc.d/postfix.sh reload
# /usr/local/etc/rc.d/saslauthd.sh start

Sprawdzamy teraz czy wszystko gra. Logujemy się przez telnet na port 25 naszego serwera i wpisujemy `EHLO domena.pl` i powinniśmy ujrzeć następujący komunikat, jeśli takowy nam się ukarze, znaczy to że Twoja konfiguracja jest poprawna i możesz przejść do następnej części tego artykułu.

$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 domena.pl ESMTP Postfix
EHLO domena.pl
250-domena.pl
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN LOGIN 
250-AUTH=PLAIN LOGIN
250-XVERP
250 8BITMIME

Wpisujemy `QUIT` aby zakończyć połączenie.

7. Konfiguracja Postfix'a i TLS

TLS polega na tym, że wszystkie wiadomości przesyłane i odbierane z danego programu pocztowego będą szyfrowane co uniemożliwi dostęp do nich niepowołanym osobom. Chyba każdy z nas nie chciałby aby ktoś podszył się pod naszą osobę i wysłał pocztę do kogoś w naszym imieniu. Szyfrowanie to będzie odbywać się za pomocą SSL. Secure Socket Layer jest to protokół bezpiecznej komunikacji między klientem a serwerem, stworzony przez firmę Netscape. SSL zapewnia trzy rzeczy:prywatność - połączenie jest szyfrowaneautoryzację - klient i serwer określa swoją tożsamośćintegralność przesyłanych danych - przez sumy kontrolneTo tak na wstępie chciałem przypomnieć na jakiej zasadzie działa szyfrowanie połączenia SMTP. Przejdźmy do konfiguracji. Czynnością jaką powinniśmy wykonać najpierw jest wygenerowanie odpowiednich certyfikatów. Utworzymy je w katalogu `/etc/ssl/mail` i nadamy mu odpowiednie uprawnienia:

# mkdir /etc/ssl/mail
# chmod 700 /etc/ssl/mail
# cd /etc/ssl/mail

Zaczynamy od wygenerowania klucza prywatnego RSA, o długości 1024 bitów i nazwie ca.key. Powinniśmy ujrzeć komunikat taki jak poniżej. Jeśli masz już wygenerowany certyfikat CA, możesz ten krok pominąć i przejść dalej:

# openssl genrsa -out cakey.pem 1024
Generating RSA private key, 1024 bit long modulus
...............................++++++
.................................++++++
e is 65537 (0x10001)

Jeśli mamy już klucz prywatny możemy z niego wygenerować klucz publiczny odpowiadając na poniższe zapytania, podając w nich podstawowe informacje o serwerze oraz jego właścicielu, będzie on stanowił CSR (Certificate Signing Request), czyli nie podpisany certyfikat X.509:

# openssl req -new -key cakey.pem -out cacsr.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:PL
State or Province Name (full name) [Some-State]:Twoje województwo
Locality Name (eg, city) []:Twoje miasto
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Nazwa instytucji (np.
TEST Home Server)
Organizational Unit Name (eg, section) []:.
Common Name (eg, YOUR name) []:Twoje imię i nazwisko lub nazwa firmy
Email Address []:postmaster@domena.pl


Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.

Po wykonaniu powyższej czynności, przystępujemy do zgłoszenia naszego CSR, do podpisania, korzystamy z podpisywanego CSR oraz podpisującego klucza prywatnego i wynik zapisujemy do pliku cacert.pem, oczywiście podany został tu przykładowy komunikat zwrotny:

# openssl x509 -req -in cacsr.pem -signkey cakey.pem -out cacert.pem
Signature ok
subject=/C=PL/ST=podkarpackie/L=Tarnobrzeg/O=PLANET - Home LAN Server/CN=PLANET - 
Home LAN Server/emailAddress=postmaster@domena.pl
Getting Private key

W ten sposób otrzymaliśmy właściwy certyfikat CA instytucji, którym będziemy podpisywać inne certyfikaty.  Pozostało nam już tylko utworzyć klucz prywatny RSA i wygenerować odpowiedni certyfikat dla naszego SMTP oraz zgłosić go do podpisania.. Wydajemy więc polecenie, generujące klucz, o długości 1024 bitów i nazwie smtpkey.pem:

# openssl genrsa -out smtpkey.pem 1024
Generating RSA private key, 1024 bit long modulus
.............++++++
......++++++
e is 65537 (0x10001)

Teraz generujemy odpowiedni certyfikat, dla smtp. Uwaga! Zamiast nazwy firmy lub imienia i nazwiska w polu Common Name podajemy nazwę naszego serwera (nazwę domeny). Pole to będzie później wykorzystywane przez klientów do porównania z nazwą serwera, z którym się połączyli.:

# openssl req -new -key smtpkey.pem -out smtpcsr.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:PL
State or Province Name (full name) [Some-State]:Twoje województwo
Locality Name (eg, city) []:Twoje miasto
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Nazwa instytucji (np. TEST Home Server)
Organizational Unit Name (eg, section) []:.
Common Name (eg, YOUR name) []:domena.pl
Email Address []:postmaster@domena.pl

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.

Ostatnia czynność to złożenie podpisu, używamy do tego utworzony już wcześniej klucz prywatny CA, klucz publiczny CA:

# openssl x509 -CA cacert.pem -CAkey cakey.pem -req -CAcreateserial -in smtpcsr.pem -out smtpcert.pem
Signature ok
subject=/C=PL/ST=podkarpackie/L=Tarnobrzeg/O=PLANET - 
Home LAN Server/CN=domena.pl/emailAddress=postmaster@domena.pl
Getting CA Private Key

Możliwe jest też wygenerowanie certyfikatu "na skróty", otóż tworzymy nowy certyfikat X.509, który będzie ważny przez 3650 dni, utworzony zostanie plik smtpd.pem, który będzie zarówno kluczem prywatnym, jak i certyfikatem serwera. Musisz jednak pamiętać, że po wygenerowaniu takiego certyfikatu, w pliku konfiguracyjnym Postfix'a (main.cf) do zmiennych smtpd_tls_key_file , smtpd_tls_cert_file, smtpd_tls_CAfile dopisujesz ścieżkę właśnie do tego pliku smtpd.pem.:

# openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 3650
Generating a 1024 bit RSA private key
.................++++++
............................++++++
writing new private key to 'smtpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:PL
State or Province Name (full name) [Some-State]:Twoje województwo
Locality Name (eg, city) []:Twoje miasto
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Nazwa instytucji (np. TEST Home Server)
Organizational Unit Name (eg, section) []:.
Common Name (eg, YOUR name) []:domena.pl
Email Address []:postmaster@domena.pl

Osobiście preferuję to drugie rozwiązanie, ze względu na certyfikat instytucji CA, którym być może w późniejszym czasie podpisywał inne certyfikaty. Wybór pozostawiam Tobie.
Skoro mamy już wygenerowane certyfikaty, wypadało by zająć się plikiem `main.cf` w celu dodania do niego niezbędnych opcji, aby nasz Postfix mógł obsługiwać szyfrowane połączenie SMTP. Edytujmy więc ten plik i wstawmy do niego to co zostało napisane poniżej:

# vi /etc/postfix/main.cf

--- main.cf ---

# TLS

# Parametr uaktywniający używanie TLS dla SMTP i SMTPD:
smtp_use_tls = yes
smtpd_use_tls = yes
# Autoryzacja odbywa się jedynie poprzez szyfrowanie połączenia (poprzez tunele TLS):
smtpd_tls_auth_only = yes
smtp_tls_note_starttls_offer = yes
# Ścieżka do pliku zawierającego klucz prywatny RSA:
smtpd_tls_key_file = /etc/ssl/mail/smtpkey.pem
# Ścieżka do pliku zawierający wygenerowany certyfikat dla SMTP:
smtpd_tls_cert_file = /etc/ssl/mail/smtpcert.pem
# Ścieżka do pliku zawierającego wygenerowany certyfikat CA:
smtpd_tls_CAfile = /etc/ssl/mail/cacert.pem
# Wybieramy poziom logowania (0-4)
smtpd_tls_loglevel = 3
# Sprawdzenie, czy informacje dotyczące protokołu oraz szyfru zawarte są w nagłówku wiadomości:
smtpd_tls_received_header = yes
# Szacowany czas trwania sesji:
smtpd_tls_session_cache_timeout = 3600s
# ???
tls_random_source = dev:/dev/urandom

--- end of main.cf ---

Restartujemy Postfix'a i sprawdzamy, czy wszystko działa.

# /usr/local/etc/rc.d/postfix.sh reload

Aby móc korzystać z możliwości szyfrowania wysyłanych wiadomości za pomocą SSL należy dokonać odpowiednich ustawień w programie do odbioru poczty np. Outlook Express. Oto przykład ustawień w przypadku Outlook Express. Wchodzimy do zakładki Narzędzia / Konta / Poczta / Właściwości (właściwe konto) / Zaawansowane i ustawiamy w niej następujące opcje: Poczta wychodząca SMTP - port 25 [x] ten serwer wymaga bezpiecznego połączenia SSL Jeśli możesz wysyłać pocztę to napewno wszystko działa i udało Ci się poprawnie skonfigurować Postfix'a z autoryzacją i szyfrowanym połączeniem SMTP. Możesz również sprawdzić, czy wszystko działa dobrze logując się przez telnet na port 25:

$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to localhost
Escape character is '^]'.
220 domena.pl ESMTP Postfix
EHLO domena.pl
250-domena.pl
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-XVERP
250 8BITMIME

Zauważ, że poniższe dwie linijki, które były aktywne w czasie gdy konfigurowaliśmy SMTP AUTH, mowa tu o:

250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN

zastąpiła jedna:

250-STARTTLS

Jeśli ukazał Ci się taki komunikat, wszystko działa OK. Wpisz `QUIT`, aby zakończyć połączenie.

8. Instalacja i konfiguracja ClamAV (Clam AntiVirus)

Clam AntiVirus jest darmowym programem antywirusowym przeznaczonym dla systemów UNIX. Głównym jego celem jest integralność z serwerami poczty. W dodatku posiada on specjalne narzędzie do automatycznej aktualizacji bazy wirusów. Myślę, że jego instalacja jest prosta i niesprawi Ci wiele kłopotów. Zaczynając dodaj nową grupę i nowego użytkownika o nazwie `vscan`:

# pw group add vscan -g 130
# pw user add vscan -c "AntiVirus" -d "/nonexistent" -s "/sbin/nologin" -u 130 -g 130

Teraz wypadałoby zainstalować ClamAV, przedchodzimy więc do katalogu z gdzie mieści się port z ClamAV i wydajemy polecenie aby system sam ściągnął odpowiednie pliki i zainstalował nam nasz skaner antywirusowy:

# cd /usr/ports/security/clamav
# make build && make install && make clean

No i najważniejsza rzecz, czyli konfiguracja, której to najważniesze i najpotrzebniejsze opcje będe chciał tu opisać. W przypadku ClamAV jest ona bardzo prosta. Edytuj plik `clamav.conf`. Możesz wstawić do niego to co jest poniżej, lub poprostu pozmieniać to co chcesz:

# cp /usr/local/etc/clamav.conf.default /usr/local/etc/clamav.conf
# vi /usr/local/etc/clamav.conf

--- clamav.conf ---

# Ścieżka do pliku z logami:
LogFile /var/log/clamav/clamd.log

# Maksymalna wielkość logów  (Wpisz 0, aby wielkość była nieograniczona):
LogFileMaxSize 2M

# Ścieżka do katalogu, gdzie znajduje się baza wirusów:
DatabaseDirectory /usr/local/share/clamav

# Ścieżka do pliku z lokalnym gniazdem:
LocalSocket /var/amavis/clamd

# Kasowanie powyższego pliku podczas zatrzymania programu:
FixStaleSocket

# Maksymalna wielkość katalogu w którym znajdują się zeskanowane pliki:
MaxDirectoryRecursion 15

# Uruchomienie ClamAV jako wybrany użytkownik (Zalecane jest aby był jednak uruchomiony jako root):
User vscan

# Opcja ta daje możliwość użycia ClamAV użytkownikom wszystkich grup z pliku `/etc/group`:
AllowSupplementaryGroups

# Opcja uaktywniająca skanowanie wiadomości pocztowych:
ScanMail

-- end of clamav.conf ---

Zajmijmy się teraz narzędziem do automatycznej aktualizacji logów - FreshClam. Edytujemy plik `freshclam.conf` i dodajemy do niego poniższe linie:

# cp /usr/local/etc/freshclam.conf.default /usr/local/etc/freshclam.conf
# vi /usr/local/etc/freshclam.conf

--- freshclam.conf ---

# Ścieżka do katalogu, gdzie znajduje się baza wirusów:
DatabaseDirectory /usr/local/share/clamav

# Ścieżka do pliku z logami:
UpdateLogFile /var/log/freshclam.log

# Enable verbose logging.
LogVerbose

# Ustawienie właściciela bazy danych:
DatabaseOwner vscan

# Mirror z którego FreshClam będzie pobierał najświeższe bazy wirusów:
DatabaseMirror database.clamav.net

# Po ilu próbach nieudanego nawiązania połączenia program ma odpuścić:
MaxAttempts 3

# Jak często program ma sprawdzać czy są nowe uaktualnienia (12 godzin):
Checks 12

--- end of freshclam.conf ---

Teraz tworzymy wymagany katalog, w którym ClamAV będzie przechowywał plik z lokalnym gniazdem. Musimy także utworzyć pliki z logami i nadać im odpowiednie prawa:

# mkdir /var/amavis/
# chown -R vscan:vscan /var/amavis
# chmod 750 /var/amavis

# mkdir /var/log/clamav
# touch /var/log/clamav/freshclam.log
# chown vscan:vscan /var/log/clamav/freshclam.log
# chmod 600 /var/log/clamav/freshclam.log
# touch /var/log/clamav/clamd.log
# chown vscan:vscan /var/log/clamav/clamd.log
# chmod 600 /var/log/clamav/clamd.log

Na koniec dodajemy jeszcze do pliku `rc.conf` poniższą zmienną w celu uaktywnienia ClamAV i narzędzia do automatycznej aktualizacji bazy wirusów:

--- rc.conf ---

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"

--- end of rc.conf ---

9. Instalacja i konfiguracja AMaViS (A Mail Virus Scanner)

AMaViS, jak zostało napisane na jego oficjalnej stronie (http://www.amavis.org/), jest wysoko-wydajnym interfejsem pośredniczącym pomiędzy MTA i programami (skryptami) zajmujących się filtrowaniem treści: skanerów antywirusowych lub filtrów antyspamowych. Jest napisany w Perlu, co w znaczący sposób wpływa (pozytywnie) na jego wydajność. Zwraca się do MTA przez (E)SMTP lub LMTP, lub używając pomocniczych programów. Najlepiej współpracuje z Postfixem.Zainstalujmy naszego AMaViS'a. Jak zwykle posłużymy się portami. Przechodzimy do katalogu gdzie znajduje się AMaViS i wydajemy poniższe polecenia:

# cd /usr/ports/security/amavisd-new
# make build && make install && make clean

Nie pozostaje nam nic innego jak przystąpić do konfiguracji. Nie będę tutaj opisywał dokładnie jego wszystkich opcji, jedynie te, które uznałem za najważniejsze i które należy zmienić abyś mógł używać na swoim serwerze AMaViS'a. Jego plik konfiguracyjny składa się z 8 sekcji, po bliższe informacje dotyczące pozostałych parametrów zapraszam na oficjalną stronę projektu lub skorzystanie z dokumetacji. Edytuj plik `amavisd.conf` i pozmieniaj w nim następujące linijki. Warto przypomnieć jak wiemy wartość 0 odpowiada słowu false, a wartość 1 odpowiada słowu true. Oto przykładowe opcje, które powinniśmy zmienić. Pozostałe zostawiamy bez zmian, lub czytamy dokumentację, aby dowiedzieć się o nich więcej. Oczywiście definiujemy je według własnych upodobań i potrzeb. Uwaga, zmieniasz je na własną odpowiedzialność:

# cp /usr/local/etc/amavisd.conf-dist /usr/local/etc/amavisd.conf
# vi /usr/local/etc/amavisd.conf

--- amavisd.conf ---

# Początek pliku:

use strict;

# Section I - Essential daemon and MTA settings

# Katalog domowy AMaViS'a:
$MYHOME = '/var/amavis';
# Domena Twojego serwera:
$mydomain = 'domena.pl';
# Z poziomu jakiego użytkownika i grupy będzie uruchamiany demon:
$daemon_user  = 'vscan';
$daemon_group = 'vscan';
# Roboczy katalog domowy, w którym będą przechowywane rozpakowane wiadomości:
$TEMPBASE = $MYHOME;
# Ustawienie zmiennej środowiskowej `TMPDIR`:
$ENV{TMPDIR} = $TEMPBASE;
# Maksymalna liczba uruchomionych serwerów:
$max_servers  =  2;
$max_requests = 10;
$child_timeout=5*60;
# Wpisujemy tu nazwy domen obsługiwanych przez nasz serwer w formacie takim jak poniżej:
@local_domains_acl = ( ".$mydomain", '.domena2.pl' );

# Section II - MTA specific (defaults should be ok)

# Ścieżka do pliku z gniazdem:
$unix_socketname = "$MYHOME/amavisd.sock";
# Port na którym będzie nasłuchiwał AMaViS:
$inet_socket_port = 10024;
# Dopuszczaj połączenia jedynie poprzez lokalny adres IP:
@inet_acl = qw( 127.0.0.1 ); 

# Section III - Logging

# Włączenie logowania od syslog'a, ustawiamy na nie (0), ponieważ będziemy wszystko logować do osobnego pliku:
$DO_SYSLOG = 0;
# Ścieżka do pliku z logami:
$LOGFILE = "$MYHOME/amavis.log";
# Poziom logowania 
# (Standardowo - 0 informacje o uruchomieniu, zatrzymaniu, komunikaty o niepowodzeniach, wykrytych wirusach):
$log_level = 0;
# Logowanie zarówno zawirusowanych i niezawirusowanych wiadomości:
$log_templ = '[? %#V |[? %#F |[?%#D|Not-Delivered|Passed]|BANNED name/type (%F)]|INFECTED (%V)], #
<%o> -> [<%R>|,][? %i ||, quarantine %i], Message-ID: %m, Hits: %c';
# Wybór strony kodowej, kolejno dla nagłówna i dla sekcji body wiadomości:
$hdr_encoding = 'iso-8859-2';
$bdy_encoding = 'iso-8859-2';
# Ścieżki do plików z szablonem wiadomości (zawiadomienia), które będą zwracane do nadawcy, odbiorcy i 
# administratora, jeśli wiadomość będzie zawierała wirusy, po więcej informacji zapraszam do `README.customize`:
$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');
# Podajemy naszemu AMaViS co ma zrobić z wiadomościami:
# D_PASS - Poczta zostanie wysłana do adresata nie patrząc na jej złą zawartość
# D_DISCARD - Poczta nie zostanie dostarczona do adresata oraz nadawca nie dostanie o tym zawiadomienia
# D_BOUNCE - Poczta nie zostanie dostarczona do, ale zostanie do niego wysłane zawiadomienie 
#	     (wyjątek: zawiadomienie nie zostanie dostarczone jeśli adresat znajduje się w $viruses_that_fake_sender_re)
# D_REJECT - Poczta zostanie odrzucona, a nadawca otrzyma jej zwrot wraz z informacją o niepowodzeniu od Postfix'a
$final_virus_destiny      = D_DISCARD;
$final_banned_destiny     = D_BOUNCE;
$final_spam_destiny       = D_REJECT;
$final_bad_header_destiny = D_PASS;
# Zawiadomienie nadawcy o wirusie:
$warnvirussender = 0;
# Zawiadomienie odbiorcy o wirusie:
$warnvirusrecip = 0;
# Definiujemy nazwy najczęściej spotykanych robaków:
# Definiujemy tutaj nazwy wirusów, które fałszują nagłówki pocztowe. Można z tego korzystać 
# przy wysyłaniu powiadomien. Dla wymienionych wirusów powiadomienia nie zostaną wysłane:
$viruses_that_fake_sender_re = new_RE(
  qr'nimda|hybris|klez|bugbear|yaha|braid|sobig|fizzer|palyh|peido|holar'i,
  qr'tanatos|lentin|bridex|mimail|trojan.dropper|dumaru|parite|spaces'i,
  qr'dloader|galil|gibe|swen|netwatch|bics|sbrowse|sober|rox|val(hal)?la'i,
  qr'frethem|sircam|be?agle|tanx|mydoom|novarg|shimg|netsky|somefool|moodown'i,
  qr'@mm|@MM',    # mass mailing viruses as labeled by f-prot and uvscan
  qr'Worm'i,      # worms as labeled by ClamAV, Kaspersky, etc
  [qr'^(EICAR|Joke.|Junk.)'i         => 0],
  [qr'^(WM97|OF97|W95/CIH-|JS/Fort)'i  => 0],
  [qr/.*/ => 1],  # true by default  (remove or comment-out if undesired)
);
# Definiujemy konto, na które będą wysyłane powiadomienia o wirusach itp. Musisz pamiętać aby utworzyć alias lub 
# dodać nowe konto wirtualne o nazwie `virusalert`. O tym w dalszej części artykułu.
$virus_admin = "virusalert@$mydomain";
# Definiujemy konta, z których będą wysyłane zawiadomienia do użytkowników:
$mailfrom_notify_admin     = "virusalert@$mydomain";
$mailfrom_notify_recip     = "virusalert@$mydomain";
# Wyłączamy kwarantanne, która jest nam niepotrzebna:
$virus_quarantine_to = undef;
# Zmiana nagłówka, aby wyłączyć całkowicie wyświetlanie nagłówka ustaw de dwie zmienne jako `undef`, zmienne te możemy 
# edytować dodając np. swoje nazwy:
$X_HEADER_TAG = 'X-Virus-Scanned';
$X_HEADER_LINE = "by amavisd-new at $mydomain";
# Tytuł wiadomości, ktory będzie wysyłany w wypadku gdy archiwa będą zabezpieczone hasłem:
$undecipherable_subject_tag = '***UNCHECKED*** ';  # undef disables it
# Kasowanie istniejących nagłówków - ustawiamy wartość false:
$remove_existing_x_scanned_headers = 0;
# Definiujemy typy plików, których nasz AMaViS ma nierozpakowywać. Ma je trzymać w spakowanej formie dla narzędzia  
# antywirusowego:
$keep_decoded_original_re = new_RE(
# qr'^MAIL$',   # retain full original message for virus checking (can be slow)
  qr'^MAIL-UNDECIPHERABLE$',  # retain full mail if it contains undecipherables
  qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i,
# qr'^Zip archive data',
);
# Pliki, które są tutaj wyszczególnione nie zostaną przepuszczone dalej:
$banned_filename_re = new_RE(
#  qr'^UNDECIPHERABLE$',  # is or contains any undecipherable components
   qr'.[^.]*.(exe|vbs|pif|scr|bat|cmd|com|dll)$'i, # double extension
#  qr'..(exe|vbs|pif|scr|bat|cmd|com)$'i,           # banned extension - basic
#  qr'..(ade|adp|bas|bat|chm|cmd|com|cpl|crt|exe|hlp|hta|inf|ins|isp|js|
#         jse|lnk|mdb|mde|msc|msi|msp|mst|pcd|pif|reg|scr|sct|shs|shb|vb|
#         vbe|vbs|wsc|wsf|wsh)$'ix,                  # banned extension - long
#  qr'..(mim|b64|bhx|hqx|xxe|uu|uue)$'i, # banned extension - WinZip vulnerab.
#  qr'^.(zip|lha|tnef|cab)$'i,                      # banned file(1) types
   qr'^.exe$'i,                                     # banned file(1) types
   qr'^application/x-msdownload$'i,                  # banned MIME types
   qr'^application/x-msdos-program$'i,
#  qr'^message/partial$'i, qr'^message/external-body$'i, # block rfc2046
);

# Section V - Per-recipient and per-sender handling, whitelisting, etc.

# Rezygnujemy z bazy SQL, w której przechowywane są tzw. whitelist i blacklist:
$sql_select_white_black_list = undef;
# Czarna lista użytkowników, od których wiadomości będą automatycznie odrzucane:
$blacklist_sender_re = new_RE(
    qr'^(bulkmail|offers|cheapbenefits|earnmoney|foryou|greatcasino)@'i,
    qr'^(investments|lose_weight_today|market.alert|money2you|MyGreenCard)@'i,
    qr'^(new.tld.registry|opt-out|opt-in|optin|saveonlsmoking2002k)@'i,
    qr'^(specialoffer|specialoffers|stockalert|stopsnoring|wantsome)@'i,
    qr'^(workathome|yesitsfree|your_friend|greatoffers)@'i,
    qr'^(inkjetplanet|marketopt|MakeMoney)d*@'i,
);

# Section VI - Resource limits

# Maksymalny poziom dla rozpakowania/rozkodowania (0 - bez limitu):
$MAXLEVELS = 14;
# Maksymalna liczba rozpakowanych plików (0 - bez limitu)
$MAXFILES = 1500;

# Section VII - External programs, virus scanners

# Ścieżki do narzędzi wymienionych poniżej:
$path = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin';

# Narzędzia, które nasz AMiViS będzie wykorzystywał do dekompresji plików:

$file   = 'file';

$gzip   = 'gzip';
$bzip2  = 'bzip2';
$lzop   = 'lzop';
$uncompress = ['uncompress', 'gzip -d', 'zcat'];
$unfreeze   = ['unfreeze', 'freeze -d', 'melt', 'fcat'];
$arc        = ['nomarch', 'arc'];
$unarj      = ['arj', 'unarj'];
$unrar      = ['rar', 'unrar'];
$zoo    = 'zoo';
$lha    = 'lha';
$cpio   = 'cpio';

# Definiujemy ustawienia dla naszego skanera antywirusowego, którym będzie ClamAV, pamiętaj o poprawnym podaniu 
# ścieżki do pliku socket:

@av_scanners = (

['Clam Antivirus-clamd',
&ask_daemon, ["CONTSCAN {}
", '/var/amavis/clamd'],
qr/OK$/, qr/FOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],

);

# Możliwe jest również dodanie zapasowego skanera, którym może być na przykład MKSd, do tego służy zmienna 
# @av_scanners_backup = (" ");

# Koniec pliku:
1;

--- end of amavisd.conf ---

To tylko moim zdaniem najważniejsze opcje, z którymi powinieneś się zapoznać podczas używania AMaViS'a. Po więcej informacji dotyczących tego właśnie programu jak wspomniałem już wcześniej zapraszam do przejrzenia dokumentacji, która znajduje się w katalogu `/usr/local/share/doc/amavisd-new`.Edytuj teraz plik `main.cf` i dodaj do niego następującą linikę:

# vi /etc/postfix/main.cf

--- main.cf

# AMaViS

content_filter=smtp-amavis:[127.0.0.1]:10024

--- end of main.cf ---

Na koniec edytujemy plik `master.cf`, do którego wstawiamy poniższe linijki:

# vi /etc/postfix/master.cf

--- master.cf ---

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

127.0.0.1:10025 inet n       -       n       -       -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000

--- end of master.cf ---

Pozostało nam już tylko uruchomienie AMaViS'a oraz ClamAV. Do pliku `rc.conf` wstawiamy poniższe zmienne:

# vi /etc/rc.conf

--- rc.conf ---

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
amavisd_enable="YES"

--- end of rc.conf ---

Teraz wydajemy polecenia, po których zostaną uruchomione programy, przed uruchomieniem, jak wspomniałem wcześniej pamiętaj o dodaniu do bazy wirusów konta wirtualnego, lub aliasa o nazwie `virusalert`. W tym celu zobacz rozdział 'Administracja Postfix'em' w tym artykule:

# /usr/local/etc/rc.d/clamav-clamd.sh start
# /usr/local/etc/rc.d/clamav-freshclam.sh start
# /usr/local/etc/rc.d/amavisd.sh start

I oczywiście restartujemy Postfix'a:

# /usr/local/etc/rc.d/postfix.sh reload

W celu sprawdzenia czy nasz AMaViS uruchomił się i działa poprawnie, zaloguj się przez telnet na port 10024 naszego serwera, powinieneś ujrzeć następujący komunikat (QUIT wpisujemy w celu zakończenia sesji):

$ telnet 127.0.0.1 10024
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready
QUIT
221 2.0.0 [127.0.0.1] (amavisd) closing transmission channel
Connection closed by foreign host.

Jeśli pojawił Ci się taki lub podobny komunikat to znaczy, że wszystko działa jak należy. Sprawdź jeszcze w logach, czy system nie pokazuje żadnych błędów. Jeśli takowe się pojawią, polecam przejrzenie raz jeszcze wszystkich plików, w celu upewnienia się czy nie popełniliśmy jakiegoś drobnego błędu (mowa tu o literówkach), lub nie dopisaliśmy jakiejś niezbędnej opcji, bez której nasz serwer nie mógłby działać poprawnie.

10. Administracja Postfix'em

Rozdział ten poświęcony jest głównie tematom 'Aliasy i mapowania' oraz 'Wirtualne domeny'. Przedstawię w nim podstawy posługiwania się wyżej wymienionymi możliwościami, które posiada Postfix. O czym należy pamiętać przy modyfikacjach plików konfiguracyjnych naszego MTA? Otóż, po każdej wprowadzonej zmianie musimy zrestartować nasz serwer poczty, używając do tego komendy opisanej już wyżej:

# /usr/local/etc/rc.d/postfix.sh reload

Z kolei w celu zaktualizowania lub utowrzenia bazy danych posłużymy się narzędziem `postmap`, dla przykładu, po dokonaniu zmian w pliku, który zawiera wpisy dla wirtualnych domen dla naszego serwera, wydajemy polecenie:

# postmap /etc/postfix/virtual

10.1 Aliasy i mapowania:

Czym jest alias? Jest to poprostu dodatkowa nazwa dla twojej skrzynki pocztowej. Czyli mówiąc krócej, możesz posiadać 2 lub więcej różne adresy e-mail, a mimo to, pocztę odbierzesz z jednego konta. Weźmy taki przykład: Ostatnio coraz bardziej popularne stały się adresy typu: `tomek.stala@domena.pl`, więc chcemy aby poczta wysłana właśnie na taki adres trafiała na konto `tomek` istniejące juz na naszym serwerze. Plik odpowiedzialny za listę aliasów jest zdefiniowany w zmiennych `alias_maps` i `alias_database`. Powracając do naszego przykładu, w pliku o nazwie `aliases` (którego nazwę i ścieżkę zdefiniowaliśmy w opisanych zmiennych w pliku `main.cf`), dodajemy nowy alias. Wpisów dokonujemy w następuący sposób - (najpierw wpisujemy nazwę aliasa, następnie piszemy dwukropek, oddzielamy spacją lub tabulatorem i wpisujemy nazwę użytkownika, którego konto znajduje się już w naszym systmie). Oto przykład - edytujemy wymieniony przeze mnie plik i wstawiamy do niego poniższe linijki:

# vi /etc/postfix/aliases

--- aliases ---

tomek.stala: tomek
administrator: root, tomek
tomus: tomek@jakisadresemail.pl

--- end of aliases ---

Analogicznie rozważając powyższy przykład możemy się domyślić, że poczta wysłana na adres `administrator@domena.pl` trafi na konta utworzone już w systemie, tj. konto `root` oraz konto `tomek`. W celu zaktualizowania bazy aliasów wydajemy poniższe polecenie i restartujemy nasz serwer MTA. Po wpisaniu tych poleceń sprawdzamy, czy wszystko działa. Wysyłamy wiadomości na konta, które są aliasami. Jeśli otrzymamy pocztę, znaczy to, że wszystko działa:

# newaliases
# /usr/local/etc/postfix.sh reload

Jedną z możliwości Postfix'a jest zmiana nazwy użytkownika i nazwy domeny dla poczty wychodzącej. Przydaje się to np. wtedy, gdy chcemy mieć podczas wysyłania poczty adres e-mail zamiast `tomek@domena.pl` , przykładowo adres `tomek.stala@domena.pl`. Krótko mówiąc działa to podobnie jak w przypadku aliasów, lecz w odwrotną stronę. W tym celu edycji poddajemy plik `canonical`, który powinien znajdować się w katalogu z wszystkimi innymi plikami konfiguracyjnymi Postifx'a, jeśli go tam nie ma, możesz utworzyć ten plik. Wpisów dokonujemy w następujący sposób - (najpierw wpisujemy nazwę użytkownika, następnie oddzielamy spacją lub tabulatorem i wpisujemy zmienioną nazwę, która będzie wyświetlana przed tzw. małpą `@` w naszym adresie e-mail. Prawda, że proste?

# vi /etc/postfix/canonical

--- canonical ---

tomek tomek.stala

--- end of canonical ---

Na koniec edytujemy jeszcze plik `main.cf`, w którym definiujemy ścieżkę do pliku `canonical` dodając do niego poniższą linię:

# vi /etc/postfix/main.cf

--- main.cf ---

sender_canonical_maps = hash:/etc/postfix/canonical

--- end of main.cf ---

Tworzymy bazę dla pliku `canonical` i restartujemy Postfix'a.

# postmap /etc/postfix/canonical
# /usr/local/etc/postfix.sh reload

10.2 Wirtualne domeny

Wirtualne domeny, inaczej nazywane też wirtualnymi kontami są to poprostu nowe nazwy domen dla naszych skrzynek pocztowych. Postfix umożliwia korzystanie z wirtualnych domen na dwa sposoby. Pierwszym z tych sposobów jest styl przyjęty z sendmaila, który różni się od stylu przyjętego w Postfix'ie tym, że przykładowo: Domeną podstawową dla naszego serwera jest `domena.pl`, gdy zostanie utworzona nowa wirtualna domena np. `domena2.pl`, to użytkownicy, którzy posiadają konto na naszym serwerze (np. `tomek@domena.pl`) automatycznie dostają nowy adres e-mail, w postaci (np. `tomek@domena2.pl`),a poczta wysłana na drugi adres, zostanie przekierowana na adres pierwszy. Rozdział ten podzieliłem na dwa podrozdziały, w których opiszę dodanie konta wirtualnego za pomocą tych dwóch stylów.W obydwu przypadkach niezbędne jest dodanie zmiennej do pliku `main.cf`, która będzie definiowała ścieżkę do pliku, w którym będziemy dopisywać nowe wirtualne konta/domeny. Edytujmy więc ten plik i dodajmy do niego poniższą linijkę:

# vi /etc/postfix/main.cf

--- main.cf ---

virtual_maps = hash:/etc/postfix/virtual

--- end of main.cf ---
  1. Wirtualne domeny w stylu Postfix'a:

    Zacznijmy od opisania drugiego ze stylów, czyli tego jak w temacie. Dodanie wirtualnej domeny jest bardzo prostę, mianowicie wystarczy tylko zainteresować się plikiem `virutal`, w którym będziemy dokonywać zmian. Dla przykładu naszą domeną wirtualną, którą chcemy utworzyć będzie `domena2.pl`. Edytujemy teraz plik odpowiedzialny za nasze wirtualne domeny i konta i wpisujemy do niego poniższą linijkę. Uwaga! W pliku `main.cf` nic innego nie dopisujemy. Jeśli jednak w tym pliku w zmiennej `$mydestination` wpisaliśmy nazwę domeny, którą chcemy utworzyć jako wirtualną w stylu Postfix'a, edytujemy go i kasujemy wpis dotyczący właśnie tej domenie. Jeżeli tego nie zrobisz, będzie to równoznaczne z tym, że chcesz utworzyć domenę wirtualną w stylu sendmaila (o tym poniżej):

    --- virtual ---
    
    domena2.pl druga_domena
    
    tomek@domena2.pl tomek
    tomus@domena2.pl tomek
    root@domena2.pl	 root
    
    --- end of virtual ---
    
    

    Teraz wyjaśnienie. Jak nie trudno się domyślić pierwsza w pierwszej linijce definiujemy nazwę domeny, która będzie domeną wirtualną, a wyraz `druga_domena` jest to dowolny opis, który możemy przyporządkować naszej domenie. Może tutaj znajdować się dowolny ciąg znaków. Linie kolejne to już definiowanie użytkowników/kont wirtualnych. Sposób w jaki dodajemy nowego wirtualnego użytkownika, jest bardzo prosty. Otóż, najpierw podajemy jego nazwę i po znaku `@` nazwę naszej zdefiniowanej wcześniej domeny. Następnie po oddzieleniu spacją lub tabulatorem wpisujemy nazwę użytkownika, który istnieje już w systemie. Dla bliższego wyjaśnienia podam, że konto `tomus@domena2.pl` jest kontem wirtualnym utworzonym w stylu Postfix'a, dzięki czemu poczta wysłana właśnie na ten adres nie będzie przychodzić na adres naszej podstawowej domeny (np. tomek@domena.pl).

  2. Wirtualne domeny w stylu sendmail'a:

    Jak już wspomniałem wcześniej, w tym przypadku interesujemy się dwoma plikami. Pierwszy z nich to oczywiście plik o nazwie `virtual`, a drugi to plik konfiguracyjny naszego MTA - `main.cf`. W tym drugim odnajdujemy zmienną `$mydestination`, w której dopisujemy po przecinku nazwy domen wirtualnych, na które będzie akceptowana poczta przychodząca. Zmienna ta może przedstawiać się następująco:

    --- main.cf ---
    
    mydestination = $myhostname, domena2.pl, inna_domena.pl
    
    --- end of main.cf ---
    

    Gdy dokonamy stosownych zmian w pliku `main.cf`, możemy przejść do edycji drugiego, czyli pliku `virtual`, odpowiedzialnego za nazwy wirtualnych kont/użytkowników. Jego zawartość w przypadku wirtualnych domen w stylu sendmaila, powinna przedstawiać się następująco:

    --- virtual ---
    
    tomek@domena2.pl tomek
    tomus@domena2.pl tomek
    root@domena2.pl  root
    
    --- end of virtual ---
    

    Nie będe wyjaśniał skąd to się wzięło, ponieważ zrobiłem już to w poprzednim podrozdziale. Dodam jedynie, że zniknęła linia, która w przypadku drugiego ze styli definiowała nazwę domeny. Rezygnujemy z niej, ponieważ my nazwę domeny zdefiniowaliśmy w innym pliku - `main.cf`.

Osobiście preferuję dodawanie wirtualnych kont/domen w pierwszym opisanym przeze mnie stylu, czyli w stylu Postfix'a. Jednak końcowy wybór pozostawiam Tobie.

11. Na koniec

Dokument nie zawiera opisu wszystkich możliwości Postfix'a, jedynie te najważniejsze, które powinny ułatwić początkującemu administratorowi systemu zapoznanie się z tym serwerem MTA. Mogę powiedzieć, że pewnie zawiera on kilka błędów, które wynikają z tego, że artykuł ten był pisany "na kolanie", czyli w wolnych chwilach spędzonych przy komputerze. Za co z góry przepraszam. Wszelkie sugestie dotyczące poprawek, pytań do tego tekstu proszę kierować na mój adres email. Postaram się szybko nanieść do niego poprawki. Jeśli czujesz niedosyt, po przeczytaniu tego artykułu polecam jak zwykle zajrzeć do dokumentacji, w która jest dość obszerna i na pewno znajdziesz odpowiedź na nurtujące Cię pytanie. Niniejszy artykuł dedykuję mojej Wspaniałej i Kochanej Anusi! Oryginalna oraz najnowsza wersja tego artykułu znajduje się na stronie http://zso.tbg.net.pl/~tomek/postfix_howto.html. Jeśli chcesz umieścić ten artykuł na swojej stronie, skontaktuj się ze mną poprzez e-mail - tomek(at)zso.tbg.net.pl, podając w nim adres strony, na której będzie się on znajdował. Jedynym ważnym warunkiem, jaki musisz spełnić, jest zamieszczenie tego dokumentu w całości (ma on być zgodny z oryginałem), oraz w miarę możliwości jego aktualizacja, po ukazaniu się najnowszej jego wersji w sieci.

$Id: postfix_howto.html,v 1.2 2004/06/26 19:12:43 tomek Exp $







Artykuł jest z FreeBSD na www.malisz.eu.org
http://www.malisz.eu.org/

Adres tego artykułu to:
http://www.malisz.eu.org/16_Postfix.htm