Gentoo Logo

Wirtualny system pocztowy oparty o Postfix

Spis treści:

1.  Wprowadzenie

Związane z pocztą elektroniczną potrzeby większości użytkowników Gentoo może całkowicie zaspokajać prosty program kliencki oraz fetchmail. Do obsługi całej domeny potrzebny jednak będzie kompletny MTA (ang. Mail Transfer Agent - Agent Transferu Poczty). Natomiast jeśli istnieje potrzeba obsługi wielu domen, do przesyłania całej poczty zdecydowanie potrzebne będzie coś bardziej wydajnego. Ten system został opracowany jako eleganckie rozwiązanie tego problemu.

System poczty wirtualnej musi być zdolny do obsługi poczty wielu domen z wieloma użytkownikami korzystającymi z różnych interfejsów. To stwarza pewne problemy - na przykład, co zrobić kiedy dwóch użytkowników z różnych domen chce mieć taki sam login? Jeżeli udostępniany jest IMAP oraz SMTP-AUTH, jak połączyć zróżnicowane systemy uwierzytelniania w jedną usługę? Jak zapewnić bezpieczeństwo dla licznych komponentów z których zbudowany jest system? Jak zarządzać całością?

Ten podręcznik pokaże jak zbudować system do obsługi tylu domen, z iloma jest w stanie sobie poradzić sprzęt obsługujący wirtualnych użytkowników, dla których nie są niezbędne konta shellowe (z dostępem do powłoki), pozwala na powtarzanie się loginów w różnych domenach, może uwierzytelniać klientów WWW, IMAP, SMTP i POP3 z pojedynczej bazy danych, wykorzystuje SSL dla bezpieczeństwa warstwy transportu, ma interfejs WWW, obsługuje listy dystrybucyjne dla wszystkich domen na serwerze oraz jest kontrolowany ze zgrabnej, scentralizowanej i łatwej w obsłudze bazy MySQL.

System wirtualnego mailhostingu można zbudować na wiele sposobów. Przy tak wielu możliwościach inne rozwiązanie może okazać się w konkretnym przypadku lepsze. Warto zapoznać się zatem z projektami opisanymi na stronach http://www.netqmail.org/ oraz http://www.exim.org/.

W tym rozwiązaniu wykorzystane będą następujące pakiety: apache, courier-IMAP, courier-authlib, postfix, mod_php, phpmyadmin, squirrelmail, cyrus-sasl, mysql, php oraz mailman.

Należy się upewnić, że przed kompilacją zostały włączone następujące flagi USE /etc/make.conf: USE="mysql imap libwww maildir sasl ssl". W przeciwnym wypadku konieczna może okazać się rekompilacja w celu uzyskania obsługi wszystkich protokołów. Warto też wyłączyć pozostałe opcje poczty oraz sieci - na przykład ipv6.

Ważne: Do budowy publicznego serwera poczty niezbędna jest domena, a przynajmniej rekord MX dla niej. Najlepiej byłoby kontrolować co najmniej dwie domeny w celu wykorzystania nowych możliwości domen wirtualnych.

Ważne: Należy upewnić się, że /etc/conf.d/hostname jest ustawione na właściwą nazwę hosta dla serwera poczty. Zmiany można zastosować uruchamiając /etc/init.d/hostname restart. Należy sprawdzić czy nazwa jest właściwie skonfigurowana przy użyciu hostname. Należy też sprawdzić czy nie ma sprzecznych wpisów w /etc/hosts

Uwaga: Zalecane jest przeczytanie całego dokumentu i zapoznanie się z wszystkimi krokami przed podjęciem instalacji. Jeżeli w trakcie wykonywania któregokolwiek z etapów wystąpią problemy, należy skonsultować się ze znajdującym się na końcu podręcznika rozdziałem poświęconym rozwiązywaniu problemów. Dodatkowo nie wszystkie pakiety są niezbędne, system jest bardzo elastyczny. Na przykład, jeżeli nie jest potrzebny interfejs WWW, można bez obaw zignorować rozdział poświęcony Squirrelmail.

2.  Podstawy Postfiksa

Listing 2.1: Instalacja Postfiksa

# emerge postfix

Ostrzeżenie: Należy upewnić się, że nie jest zainstalowany żaden inny MTA (np. ssmtp, exim albo netqmail) albo z pewnością wystąpią DUŻE problemy.

Po instalacji Postfiksa należy go skonfigurować. Następujące opcje w /etc/postfix/main.cf powinny zostać zmienione, oczywiście wszystkie $zmienne należy zastąpić własnymi wartościami:

Listing 2.2: /etc/postfix/main.cf

myhostname = $host.domain.name
mydomain = $domain.name
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain $mydomain
mynetworks = numer.mojej.sieci.ip/24, 127.0.0.0/8
home_mailbox = .maildir/
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10

Następnie należy zmienić /etc/postfix/master.cf. To spowoduje zwiększenie ilości komunikatów, co ułatwi znajdowanie błędów.

Listing 2.3: /etc/postfix/master.cf

# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (50)
#
==========================================================================
(wystarcza dodać -v w następnym wierszu)
smtp      inet  n       -       n       -       -       smtpd -v

Do pliku /etc/mail/aliases trzeba dodać lokalne aliasy. Musi być co najmniej jeden wpis dla użytkownika root, taki jak root: twój@adres.email

Listing 2.4: Pierwsze uruchomienie Postfiksa

# /usr/bin/newaliases
(To spowoduje zainstalowanie nowych aliasów. Trzeba to robić tylko po
aktualizacji lub dodaniu aliasów.

# /etc/init.d/postfix start

Teraz, gdy Postfix działa, należy wysłać do siebie wiadomość testową przy użyciu wybranego klienta poczty. Autor tego dokumentu pod konsolą do całej poczty używa programu mutt. Należy sprawdzić czy poczta dociera do lokalnych użytkowników, następnie można przejść do następnego kroku.

Uwaga: Jest bardzo zalecane, aby zweryfikować czy Postfix działa poprawnie przed przejściem do czynności opisanych w dalszej części tekstu.

3.  Courier-IMAP

Listing 3.1: Emergowanie courier-imap i courier-authlib

# emerge courier-imap courier-authlib

Listing 3.2: Konfiguracja Courier-IMAP

# cd /etc/courier-imap
(Jeśli potrzebne są możliwości ssl courier-imap lub pop3, należy
założyć w tym celu certyfikaty.  Ten krok jest zalecany. Jeżeli ssl nie jest
potrzebne, można go jednak zignorować)

# nano -w pop3d.cnf
# nano -w IMAPd.cnf
(Pola C, ST, L, CN oraz email muszą być zmodyfikowane tak, aby pasowały
do serwera)

# mkpop3dcert
# mkIMAPdcert

Listing 3.3: Uruchomienie usług Courier IMAP

# /etc/init.d/courier-IMAPd start
# /etc/init.d/courier-IMAPd-ssl start
# /etc/init.d/courier-pop3d start
# /etc/init.d/courier-pop3d-ssl start

Teraz należy uruchomić klienta poczty i upewnić się, że wszystkie uruchomione połączenia działają przy odbiorze i wysyłaniu poczty. Oczywiście nie będzie możliwe zalogowanie się na żadną z usług, ponieważ nie skonfigurowaliśmy jeszcze autoryzacji. Warto jednak sprawdzić czy połączenie jest nawiązywane.

Gdy działają już podstawowe komponenty, pora na skonfigurowanie reszty systemu. Przed przejściem do dalszych kroków należy dokładnie sprawdzić czy to co zainstalowaliśmy do tej pory działa poprawnie.

4.  Cyrus-sasl

Następnie zainstalowany zostanie cyrus-sasl. SASL służy do przekazywania parametrów uwierzytelniających do courier-auth, który z kolei przekaże je do MySQL w celu uwierzytelnienia użytkowników SMTP. W tym podręczniku nawet nie spróbujemy sprawdzić czy SASL działa przed instalacją MySQL oraz założeniem testowego konta użytkownika. Nie stanowi to problemu, bo w ostateczności autoryzacja będzie i tak następowała za pośrednictwem MySQL.

Listing 4.1: Konfiguracja oraz instalacja Cyrus-sasl

# emerge cyrus-sasl

Następnie należy zmodyfikować /etc/sasl2/smtpd.conf.

Listing 4.2: Uruchamianie SASL

# nano -w /etc/sasl2/smtpd.conf
mech_list: PLAIN LOGIN
pwcheck_method: saslauthd
# nano -w /etc/conf.d/saslauthd
SASLAUTHD_OPTS="${SASLAUTH_MECH} pam -r"
# /etc/init.d/saslauthd start

5.  Certyfikaty SSL dla Postfiksa i Apache

Następnie założymy zestaw certyfikatów ssl dla Postfiksa i Apache.

Listing 5.1: Tworzenie certyfikatów SSL

# cd /etc/ssl/
# nano -w openssl.cnf

(Należy zmodyfikować następujące pola, by pasowały do domeny:)
countryName_default
stateOrProvinceName_default
localityName_default
0.organizationName_default
commonName_default
emailAddress_default.

(Jeśli zmiennych jeszcze nie ma, po prostu dodaj je we właściwym miejscu)

# cd misc
# ./CA.pl -newreq-nodes
# ./CA.pl -newca
# ./CA.pl -sign
# cp newcert.pem /etc/postfix
# cp newkey.pem /etc/postfix
# cp demoCA/cacert.pem /etc/postfix
(Następnie to samo dla apache)

# openssl req -new > new.cert.csr
# openssl rsa -in privkey.pem -out new.cert.key
# openssl x509 -in new.cert.csr -out new.cert.cert -req -signkey new.cert.key -days 365
(Na razie pozostawmy certyfikaty tam, gdzie są. Zainstalujemy je po instalacji Apache)

6.  Dodawanie obsługi SSL oraz SASL do Postfiksa

Konieczna jest też modyfikacja konfiguracji Postfiksa tak, aby uczynić go świadomym obecności SASL oraz SSL. W tym celu dodajemy następujące wpisy na końcu pliku, gdzie będzie łatwo je potem odnaleźć:

Listing 6.1: /etc/postfix/main.cf

# nano -w /etc/postfix/main.cf

smtpd_sasl_auth_enable = yes
smtpd_sasl2_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain =

(Opcja broken_sasl_auth_clients oraz metoda uwierzytelniania login są
przeznaczone wyłącznie dla programów Outlook oraz Outlook Express. Opcje te
są nieudokumentowane. smtpd_sasl_local_domain dodaje nazwę domeny do nazw
klientów korzystających z SMTP-AUTH. Należy się upewnić, że zmienna ta jest
pusta, w przeciwnym wypadku bowiem nazwy będą modyfikowane i Postfiks nie
będzie w stanie ich uwierzytelniać)

smtpd_recipient_restrictions =
  permit_sasl_authenticated,
  permit_mynetworks,
  reject_unauth_destination

(Kolejne dwie opcje umożliwiają szyfrowanie wychodzących wiadomości)
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_use_tls = yes
#smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/newkey.pem
smtpd_tls_cert_file = /etc/postfix/newcert.pem
smtpd_tls_CAfile = /etc/postfix/cacert.pem
smtpd_tls_loglevel = 3
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

(smtpd_tls_auth_only zostało wykomentowane aby ułatwić testowanie
systemu. Jeżeli jest potrzebne, może zostać w przyszłości przywrócone)

# postfix reload

Teraz zweryfikujemy czy nasza konfiguracja została przyjęta przez Postfiksa. W tym celu skorzystamy z programu telnet (z pakietu, na przykład, net-misc/netkit-telnetd). Można również skorzystać z nc z pakietu net-analyzer/netcat.

Listing 6.2: Weryfikacja wsparcia dla SASL oraz TLS

# telnet localhost 25

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.domain.com ESMTP Postfix
EHLO domain.com
250-mail.domain.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-XVERP
250 8BITMIME
^]
telnet> quit

Należy upewnić się, że w powyższym występują linie AUTH oraz STARTTLS. Jak zostało wcześniej napisane, w tej chwili AUTH nie będzie działać. Jest tak ponieważ SASL będzie próbował uwierzytelniać względem pliku shadow tylko sasldb, który z pewnych przyczyn nie został skonfigurowany. W takim razie musimy skonfigurować MySQL aby ten utrzymywał wszystkie informacje związane z uwierzytelnianiem oraz wirtualnymi domenami.

7.  Użytkownik vmail

Zanim przystąpimy do tworzenia całego środowiska hostingu poczty, musimy utworzyć konto użytkownika, do którego cały ten hosting będzie należał. Najprościej będzie jeśli nazwiemy go vmail:

Listing 7.1: Dodawanie konta vmail

# adduser -d /home/vmail -s /bin/false -m vmail

W ten sposób konto zostało utworzone. Oczywiście można stworzyć ich kilka. Id kont, id ich grup oraz ich katalogi domowe będą wpisane w tabelach MySQL.

Po utworzeniu konta użytkownika należy utworzyć katalog w którym będą znajdowały się skrzynki pocztowe.

Listing 7.2: Tworzenie skrzynek

# mkdir -p /home/vmail/virt-domain.com/foo
# chown -R vmail:vmail /home/vmail/virt-domain.com
# maildirmake /home/vmail/virt-domain.com/foo/.maildir

8.  MySQL

Następnie zainstalujemy oraz skonfigurujemy MySQL. W tym kroku niezbędny będzie plik genericmailsql.sql

Listing 8.1: Instalacja oraz konfiguracja MySQL

# emerge mysql

# /usr/bin/mysql_install_db
(Po zakończeniu wykonania tego polecenia należy postępować zgodnie z
poleceniami na ekranie aby dodać hasło roota dla mysql w przeciwnym wypadku baza
danych będzie otwarta na świat)

# /etc/init.d/mysql start
# mysqladmin -u root -p create mailsql
# mysql -u root -p mailsql < genericmailsql.sql

# mysql -u root -p mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE
  ->     ON mailsql.*
  ->     TO mailsql@localhost
  ->     IDENTIFIED BY '$password';
Query OK, 0 rows affected (0.02 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> quit
(Należy upewnić się, że użytkownik mailsql może połączyć się z serwerem)

# mysql -u mailsql -p mailsql

Nowa baza danych ma zdefiniowane domyślne wartości i tablice dla dwóch domen. Założone zostają następujące tabele:

  • alias - lokalne aliasy email oraz informacje o aliasach Mailmana.
  • relocated - adresy przeniesionych użytkowników oraz mapy adresów.
  • transport - informacja o domyślnych transportach pocztowych dla wszystkich domen które są utrzymywane na serwerze.
  • users - informacja o kontach użytkowników.
  • virtual - mapy aliasów dla domen wirtualnych.

Listing 8.2: Przykładowa tabela aliasów

id   alias    destination
1    root     foo@bar.com
2  postmaster foo@bar.com

Listing 8.3: Przykładowa tabela użytkowników

(Wiersze zostały zawinięte dla przejrzystości)
id email            clear     name     uid     gid     homedir     \
  maildir                                quota  postfix
10 foo@virt-domain.org $password realname virtid  virtid  /home/vmail \
  /home/vmail/virt-domain.org/foo/.maildir/        y
13 foo@bar.com      $password realname localid localid /home/foo   \
  /home/foo/.maildir/                           y

Wartość virtid w polach uid oraz gid powinny zostać zastąpione odpowiednimi wartościami dla użytkownika vmail.

Listing 8.4: Przykładowa tabela transportów

id   domain       destination
1    bar.com      local:
2    virt-domain.org virtual:

Listing 8.5: Przykładowa tabela virtual

id   email            destination
3   root@virt-domain.org other@email.address

9.  Apache oraz phpMyAdmin

Teraz skonfigurujemy Apache oraz dodamy interfejs ułatwiający współpracę z bazą danych.

Listing 9.1: Instalacja Apache oraz phpMyAdmin

# emerge apache phpmyadmin

Opisów konfiguracji PHP dla Apache jest wiele, na przykład te na stronach projektu Gentoo PHP. Jest także wiele postów na http://forums.gentoo.org opisujących jak rozwiązać problemy z instalacją (wyszukiwanie 'apache php'). W związku z tym proces ten nie będzie tutaj opisany. Należy skonfigurować Apache oraz PHP, następnie powrócić do tego podręcznika. Dobra rada: powinno się zabezpieczyć katalog z phpMyAdmin plikiem .htaccess. Jeśli się tego nie zrobi, automaty przeszukujące sieć WWW odnajdą go i zindeksują, po czym każdy użytkownik będzie w stanie odnaleźć go oraz wyrzystać do dowolnego modyfikowania bazy - co jest ZŁE! Jest wiele podręczników opisujących jak tego uniknąć, na przykład http://www.csoft.net/docs/micro/htaccess.html.en.

Teraz można zainstalować certyfikaty Apache, które wcześniej przygotowaliśmy. Dyrektywy Apache-SSL których należy użyć są następujące:

  • SSLCertificateFile /ścieżka/do/certyfikatów/new.cert.cert
  • SSLCertificateKeyFile /ścieżka/do/certyfikatów/new.cert.key

Listing 9.2: Instalacja certyfikatów SSL dla Apache

# cp /etc/ssl/misc/new.cert.cert /etc/apache2/ssl/
# cp /etc/ssl/misc/new.cert.key /etc/apache2/ssl/
# cd /etc/apache2/vhosts.d

Należy sprawdzić czy istnieje już wzorzec ssl-vhost, jeśli tak, należy
nim nadpisać default_vhost
# cp 00_default_vhost.conf ssl-vhost.conf
# nano -w ssl-vhost.conf

(Należy zmodyfikować następujące parametry):
NameVirtualHost host.domain.name:443
<VirtualHost host.domain.name:443>
ServerName host.domain.name
ServerAdmin your@email.address

DocumentRoot "/var/www/localhost/htdocs/phpmyadmin";
<Directory "/var/www/localhost/htdocs/phpmyadmin">
  ...
</Directory>

 SSLCertificateFile /etc/apache2/ssl/new.cert.cert
 SSLCertificateKeyFile /etc/apache2/ssl/new.cert.key
 SSLEngine on
 ...
</VirtualHost>

# nano -w /etc/conf.d/apache2
(Dodajemy -D SSL -D PHP5 to the APACHE2_OPTS)

# /etc/init.d/apache restart

Teraz konfigurujemy phpMyAdmin.

Listing 9.3: Konfiguracja phpMyAdmin

# cd /var/www/localhost/htdocs/phpmyadmin
# cp config.sample.inc.php config.inc.php
# nano -w config.inc.php
(Zmieniamy następujące opcje)
$cfg['blowfish_secret'] = 'someverysecretpassphraze';

$cfg['Servers'][$i]['host'] = 'localhost';          // Nazwa serwera MySQL
$cfg['Servers'][$i]['controluser'] = 'mailsql';     // Użytkownik kontroli MySQL
                                                    // (ten użytkownik musi mieć
$cfg['Servers'][$i]['controlpass'] = '$password';   // dostęp tylko-do-odczytu
                                                    // do bazy i tabel "mysql/db")
$cfg['Servers'][$i]['user'] = 'mailsql';            // Użytkownik MySQL
$cfg['Servers'][$i]['password'] = '$password';      // Hasło  MySQL

Teraz przejdziemy na stronę phpMyAdmin, aby przeglądać tabele. Można tu dodać lokalna aliasy, edytować tablicę użytkowników aby dodać użytkownika testowego oraz zmienić tabelę transportów aby dodać właściwe domeny. Domyślne wpisy dostarczone razem z wstępnym plikiem powinny być wystarczającą podpowiedzią co do tego gdzie co należy. Należy się upewnić, że informacja umieszczona w bazie danych jest dokładna, na przykład że katalogi domowe istnieją oraz że wartości uid/gid są poprawne. Katalogi maildir powinny zostać założone automatycznie przez Postfiksa gdy użytkownik otrzyma swojego pierwszego emaila. W praktyce dobrze jest wysłać email powitalny do każdego nowego użytkownika, aby upewnić się, że katalog .maildir zostanie założony.

10.  Konfiguracja vhostów oraz uwierzytelniania MySQL

Zmienimy konfigurację uwierzytelniania tak, aby korzystała z bazy danych mailsql dla Courier-IMAP oraz Postfiksa. W następującym przykładzie należy zamienić $password hasłem użytkownika mailsql.

Listing 10.1: Konfiguracja uwierzytelniania

# nano -w /etc/courier/authlib/authdaemonrc
authmodulelist="authmysql authpam"

# nano -w /etc/courier/authlib/authmysqlrc
MYSQL_SERVER            localhost
MYSQL_USERNAME       mailsql
MYSQL_PASSWORD      $password
MYSQL_DATABASE          mailsql
MYSQL_USER_TABLE        users
(Kolejna linia musi zostać zakomentowana, ponieważ przechowujemy otwarty tekst)
#MYSQL_CRYPT_PWFIELD    crypt
MYSQL_CLEAR_PWFIELD     clear
MYSQL_UID_FIELD         uid
MYSQL_GID_FIELD         gid
MYSQL_LOGIN_FIELD       email
MYSQL_HOME_FIELD        homedir
MYSQL_NAME_FIELD        name
MYSQL_MAILDIR_FIELD     maildir

# /etc/init.d/courier-authlib restart
# /etc/init.d/saslauthd restart

Wszystko jest prawie gotowe. Teraz trzeba jeszcze skonfigurować resztę Postfiksa do współpracy z bazą danych dla wszystkich potrzeb transportowych. Każda z wartości musi zostać zastąpiona odpowiednią nazwą użytkownika, jego id, hasłem, aliasem, adresem e-mail i tak dalej.

Listing 10.2: /etc/postfix/mysql-aliases.cf

# nano -w /etc/postfix/mysql-aliases.cf
# mysql-aliases.cf

user           = mailsql
password       = $password
dbname         = mailsql
table          = alias
select_field   = destination
where_field    = alias
hosts          = unix:/var/run/mysqld/mysqld.sock

Listing 10.3: /etc/postfix/mysql-relocated.cf

# nano -w /etc/postfix/mysql-relocated.cf
# mysql-relocated.cf

user           = mailsql
password       = $password
dbname         = mailsql
table          = relocated
select_field   = destination
where_field    = email
hosts          = unix:/var/run/mysqld/mysqld.sock

Listing 10.4: /etc/postfix/mysql-transport.cf (opcjonalnie)

# nano -w /etc/postfix/mysql-transport.cf
# mysql-transport.cf

user           = mailsql
password       = $password
dbname         = mailsql
table          = transport
select_field   = destination
where_field    = domain
hosts          = unix:/var/run/mysqld/mysqld.sock

Listing 10.5: /etc/postfix/mysql-virtual-gid.cf (opcjonalnie)

# nano -w /etc/postfix/mysql-virtual-gid.cf
# mysql-virtual-gid.cf

user            = mailsql
password        = $password
dbname          = mailsql
table           = users
select_field    = gid
where_field     = email
additional_conditions = and postfix = 'y'
hosts           = unix:/var/run/mysqld/mysqld.sock

Listing 10.6: /etc/postfix/mysql-virtual-maps.cf

# nano -w /etc/postfix/mysql-virtual-maps.cf
#myql-virtual-maps.cf

user          = mailsql
password        = $password
dbname          = mailsql
table           = users
select_field    = maildir
where_field     = email
additional_conditions = and postfix = 'y'
hosts           = unix:/var/run/mysqld/mysqld.sock

Listing 10.7: /etc/postfix/mysql-virtual-uid.cf (opcjonalnie)

# nano -w /etc/postfix/mysql-virtual-uid.cf
# mysql-virtual-uid.cf

user            = mailsql
password        = $password
dbname          = mailsql
table           = users
select_field    = uid
where_field      = email
additional_conditions = and postfix = 'y'
hosts           = unix:/var/run/mysqld/mysqld.sock

Listing 10.8: /etc/postfix/mysql-virtual.cf

# nano -w /etc/postfix/mysql-virtual.cf
# mysql-virtual.cf

user           = mailsql
password       = $password
dbname         = mailsql
table          = virtual
select_field   = destination
where_field    = email
hosts          = unix:/var/run/mysqld/mysqld.sock

Na koniec edytujemy jeszcze raz /etc/postfix/main.cf.

Listing 10.9: /etc/postfix/main.cf

# nano -w /etc/postfix/main.cf
(Upewniamy się, że nie ma żadnych innych definicji alias_map)
alias_maps = mysql:/etc/postfix/mysql-aliases.cf
relocated_maps = mysql:/etc/postfix/mysql-relocated.cf

local_transport = local
local_recipient_maps = $alias_maps $virtual_mailbox_maps unix:passwd.byname

virtual_transport = virtual
(Domeny wypisane w mydestination nie powinny być wpisane w zmiennej virtual_mailbox_domains
virtual_mailbox_domains =
  virt-domain.com, $inna-domena-wirtualna.com

virtual_minimum_uid = 1000
(Zastępujemy $vmail-gid GID-em grupy vmail)
virtual_gid_maps = static:$vmail-gid
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual.cf
(Zastępujemy $vmail-uid UID-em użytkownika vmail)
virtual_uid_maps = static:$vmail-uid
virtual_mailbox_base = /
#virtual_mailbox_limit =

Ze względów bezpieczeństwa należy zmodyfikować uprawnienia plików /etc/mail/mysql-*.cf:

Listing 10.10: Modyfikacja uprawnień

# chmod 640 /etc/postfix/mysql-*.cf
# chgrp postfix /etc/postfix/mysql-*.cf

Pomiędzy wersjami Postfiksa 2.0.x oraz 1.1.x wystąpiło kilka istotnych zmian. W szczególności tablice transport, virtual-gid oraz virtual-uid nie są już niezbędne. Nadal są one dostępne, na wypadek, gdyby okazały się przydatne.

Uwaga: Zalecane jest przeczytanie pliku VIRTUAL_README dołączonego do dokumentacji Postfiksa w celu uzyskania dalszych informacji.

Listing 10.11: Niech Postfix przeładuje swoje tablice

# postfix reload

Jeśli wszystko się powiodło malhost powinien już działać. Użytkownicy powinni być w stanie uwierzytelniać się dla POP3, IMAP oraz SMTP. Zalecane jest sprawdzenie czy w tej chwili wszystko działa. Jeżeli pojawią się jakiekolwiek problemy(przy tak licznych elementach systemu jest to dość prawdopodobne) należy skonsultować się z rozdziałem poświęconym rozwiązywaniu problemów.

11.  Squirrelmail

Listing 11.1: Instalacja Squirrelmail

# emerge squirrelmail
(Instalacja Squirrelmail dla localhost tak, aby był on dostępny pod
adresem http://localhost/mail)
(1.4.3a-r2 należy zastąpić używaną wersją)

# webapp-config -I -h localhost -d /mail squirrelmail 1.4.3a-r2
# cd /var/www/localhost/htdocs/mail/config
# perl ./conf.pl
(Zmodyfikuj pola Organization, Server oraz Folder dla Squirrelmail.
Teraz powinno być możliwe zalogowanie się do Squirrelmail - pełnym adresem email
- oraz użycie nowego Webmaila)

12.  Mailman

Krok ostatni: mailman. Najnowsza wersja Mailmana ma bardzo przyjemne wsparcie dla domen wirtualnych, co jest przyczyną dla której autor z niego korzysta - nie wspominając o tym, że jest to świetny pakiet. Aby zainstalować oraz prawidłowo skonfigurować go dla domen wirtualnych potrzebne będzie nieco hackerstwa. Zdecydowanie zalecane jest przeczytanie całej dokumentacji mailmana, w szczególności plik README.POSTFIX.gz, aby zrozumieć, co teraz zostanie zrobione.

Listing 12.1: Instalacja mailmana

# emerge mailman

Listing 12.2: Konfigurowanie wartości domyślnych: Mailman/Defaults.py

#  nano -w /usr/local/mailman/Mailman/Defaults.py
(Następujące wartości powinny zostać zmodyfikowane tak, aby odpowiadały
głównej domenie. Domeny wirtualne zostaną skonfigurowane w przyszłości)
DEFAULT_EMAIL_HOST = 'domain.com'
DEFAULT_URL_HOST = 'www.domain.com'

Listing 12.3: Konfiguracja mailmana: mm_cfg.py

# nano -w /usr/local/mailman/Mailman/mm_cfg.py
MTA = "Postfix"
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['virt-domain.com', 'virt.domain2.com']
add_virtualhost('www.virt.domain.com', 'virt.domain.com')
add_virtualhost('www.virt.domain2.com', 'virt.domain2.com')
(Jest to konieczne dla działania domen wirtualnych)

Listing 12.4: Na koniec...

(Teraz można dodać pierwszą listę)

# su mailman
# cd ~
# ./bin/newlist --urlhost='www.virt-domain.com' --emailhost='virt-domain.com' test
Enter the email of the person running the list: Twój@adres.email
Initial test password:
Hit enter to continue with test owner notification...
(Listy dla domen wirtualnych mogą być podane w stylu lista@domena.com
# bin/genaliases
(Teraz, gdy aliasy zostały dodane można zweryfikować czy zostało to
wykonane skutecznie)

# nano -w data/aliases
# STANZA START: test
# CREATED:
test:             "|/usr/local/mailman/mail/mailman post test"
test-admin:       "|/usr/local/mailman/mail/mailman admin test"
test-bounces:     "|/usr/local/mailman/mail/mailman bounces test"
test-confirm:     "|/usr/local/mailman/mail/mailman confirm test"
test-join:        "|/usr/local/mailman/mail/mailman join test"
test-leave:       "|/usr/local/mailman/mail/mailman leave test"
test-owner:       "|/usr/local/mailman/mail/mailman owner test"
test-request:     "|/usr/local/mailman/mail/mailman request test"
test-subscribe:   "|/usr/local/mailman/mail/mailman subscribe test"
test-unsubscribe: "|/usr/local/mailman/mail/mailman unsubscribe test"
# STANZA END: test

(Tworzymy wymagane listy)
# ./bin/newlist mailman
# ./bin/genaliases

(Wracamy na konto roota)
# exit

# /etc/init.d/mailman start
# rc-update add mailman default
(Aby mailman startował natychmiast po ponownym uruchomieniu komputera)

Listing 12.5: Dodawanie wsparcia dla aliasów mailmana do Postfiksa

# nano -w /etc/postfix/main.cf
owner_request_special = no
recipient_delimiter = +
(W pliku README.POSTFIX.gz znajdują się dalsze szczegóły)

alias_maps     =
  hash:/usr/local/mailman/data/virtual-mailman,
  mysql:/etc/postfix/mysql-aliases.cf

virtual_alias_maps =
  hash:/var/mailman/data/virtual-mailman,
  mysql:/etc/postfix/mysql-virtual.cf
(W ten sposób dodaje się wsparcie Mailmana do Postfiksa. Oczywiście
można w tym celu wykorzystać tabele MySQL, ale autor naprawdę nie lubi robienia
tego ręcznie. Poza tym jeżeli domeny wirtualne nie są wykorzystane, dodawanie
map aliasów wirtualnych może wywołać problemy)

Listy dystrybucyjne powinny już działać na wszystkich domenach obsługiwanych przez serwer. Należy uważać, aby wszystkie polecenia dla Mailmana wydawać jako użytkownik mailman (su mailman) - w przeciwnym wypadku uprawnienia będą nieprawidłowe i konieczna będzie korekta. W dokumentacji Mailmana można znaleźć więcej informacji na temat jego konfiguracji i zarządzania.

13.  Filtrowanie zawartości oraz obrona antywirusowa

Dla filtrowania zawartości oraz obrony antywirusowej należy skonsultować się z naszym opisem konfiguracji bramy filtrującej pocztę.

14.  Zakończenie

Teraz, gdy wszystko jest gotowe, należy zmodyfikować /etc/postfix/master.cf oraz wyłączyć szczegółowe informowanie o przebiegu procesu (verbose). Prawdopodobnie będzie również potrzebne dodanie usług do procesu standardowego. Należy upewnić się, że dodane są wszystkie wykorzystane usługi - apache, mysql, saslauthd, postfix, courier-imapd, courier-imapd-ssl, courier-pop3d oraz courier-pop3d-ssl. U autora wszystkie te usługi są zazwyczaj uruchomione.

Listing 14.1: Wykończenie

# postfix reload
# rc-update add $service default

Życzymy udanej zabawy!

15.  Rozwiązywanie problemów

Wprowadzenie

Rozwiązywanie problemów: to jest krótki przewodnik rozwiązywania problemów które mogą wystąpić podczas instalacji systemu tutaj opisanego. Nie jest on wyczerpujący - jest pomyślany raczej jako miejsce, gdzie można rozpocząć wyszukiwanie rozwiązań problemów. Dla skomplikowanego systemu taki jak ten bardzo istotne jest, aby zawęzić poszukiwania do konkretnego komponentu który nie funkcjonuje prawidłowo. Zwykle robi się to w kilku krokach. Rozpoczyna się od podstawy systemu i kontynuuje "do góry", wyłączając z poszukiwania komponenty, które działają prawidłowo, aż do momentu odnalezienia komponentu, który sprawia problemy.

Krok 1: Sprawdzenie plików konfiguracyjnych

Literówki są poważnym problemem, szczególnie w przypadku systemów uwierzytelniania. Należy teraz przejrzeć konfigurację oraz bazę mailsql w poszukiwaniu tego rodzaju błędów. Debugować można dowolnie długo, ale jeżeli system ne otrzymuje właściwej informacji to nie będzie on działał. Po zmianie konfiguracji należy pamiętać o przeładowaniu usługi tak, aby zmiany zostały przyjęte.

Listing 15.1: Przeładowanie usługi

# /etc/init.d/service restart

Krok 2: Czy wszystkie potrzebne usługi działają?

Jeżeli któraś z usług nie działa - należy ją uruchomić. Naprawdę trudno jest debugować usługę która nie jest włączona. Czasem niektóre usługi zachowują się tak, jakby działały, ale jednak nie funkcjonują. Czasem, gdy konfiguracje jest błędna albo któryś z komponentów otrzyma nieprawidłową transmisję usługa zawiesi się i zablokuje port, uniemożliwiając ponowne jej uruchomienie. Często można to wykryć przy użyciu netstata. Ewentualnie można zwyczajnie zrestartować system - usunie to wszystkie zawieszone usługi.

Listing 15.2: Sprawdzanie stanu usług:

# /etc/init.d/$usługa status
# netstat -a | grep $usługa (lub $port)

Krok 3: Czy wszystkie usługi korzystają z aktualnej konfiguracji?

Jeżeli plik konfiguracyjny był modyfikowany to restartujemy usługę, której on dotyczył, aby upewnić się, że wykorzystuje ona aktualną jego wersję. Niektóre usługi potrafią pokazać swoją aktualną konfigurację - na przykład Postfix.

Listing 15.3: Niektóre usługi potrafią pokazać swoją konfigurację

# apache2ctl fullstatus (wymaga zainstalowania pakietu lynx)
# apache2ctl configtest (sprawdza konfigurację)
# /etc/init.d/$service restart

Krok 4: Logi

Następnym krokiem powinno być przeczytanie logów. Czasem praktycznie jest ponowić nieudaną operację i następnie sprawdzić logi - wtedy komunikat błędu jest dokładnie na dole (albo na górze, zależnie od loggera) w przeciwieństwie do znajdowania się gdzieś w głębi pliku. Należy sprawdzić czy w logach znajduje się jakakolwiek informacja przydatna w diagnostyce błędu albo przynajmniej w określeniu, który komponent sprawia kłopoty.

Listing 15.4: Sprawdzanie logów:

# kill -USR1 `ps -C metalog -o pid=`(aby wyłączyć buforowanie metaloga)
# nano -w /var/log/mail/current
# cat /var/log/mysql/mysql.log
# tail /var/log/apache2/error_log

Warto też sprawdzić parametr debug_peer w pliku main.cf. Ustawienie go zwiększy ilość danych wysyłanych do loga.

Listing 15.5: Dodawanie wsparcia dla debug_peeer

# nano -w /etc/postfix/main.cf
debug_peer_level = 5
debug_peer_list = $host.domain.name
(Należy też odkomentować jedno z sugerowanych poleceń debuggera)

Krok 5: Rozmowa z usługą

SMTP, IMAP oraz POP3 odpowiadają na połączenia za pomocą telnetu - co było zademonstrowane podczas weryfikacji konfiguracji Postfiksa. Czasem warto jest otworzyć sesję do usługi i zobaczyć, co się dzieje.

Listing 15.6: Połączenie telnetowe z usługą

# telnet localhost $port
(SMTP to 25, IMAP to 143, POP3 to 110. Powinno się otrzymać
przynajmniej łańcuch OK, potwierdzający, że usługa działa i jest gotowa do
odpowiadania na żądania)

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK Courier-IMAP ready. Copyright 1998-2002 Double Precision, Inc.

Krok 6: Wytaczamy artylerię: strace

Zawsze warto mieć ten program na podorędziu. Jest to nieocenione narzędzie do debugowania oprogramowania. Można dzięki niemu uruchamiać programy z linii poleceń i obserwować wszystkie wywołania systemowe, które one wykonują. Często zrzuca on ogromne ilości danych, więc konieczne będzie albo obserwowanie go w czasie wykonywania testów albo zrzucenie danych do pliku na później.

Listing 15.7: Użycie strace

# emerge strace
# strace $command
# strace -p `ps -C $service -o pid=`

Krok 7: Badania

Dość często zebrane do tej pory informacje okażą się wystarczające do diagnozy oraz korekty problemu. W przeciwnym wypadku potrzebne może się okazać będzie przeszukanie sieci w poszukiwaniu dalszych danych. Poniżej znajduje się lista stron, które warto odwiedzić w trakcie tego procesu. Jest tu również bardzo dobry podręcznik opisujący konfigurację SMTP-AUTH, zawierający kilka świetnych pomysłów na znajdowanie błędów.



Drukuj

Zaktualizowano 28 września 2008

Oryginalna wersja tego dokumentu została po raz ostatni zaktualizowana 1 marca 2011. Jeśli chcesz pomóc w aktualizacji tego dokumentu do najnowszej wersji, skontaktuj się z Łukaszem Damentko, koordynatorem polskiego projektu tłumaczeń dokumentacji Gentoo.

Podsumowanie: Opis budowy systemu wirtualnego hostingu poczty opartego o Postfix, mysql, courier-IMAP oraz cyrus-sasl.

Ken Nowack
Autor

Ezra Gorman
Autor

Zack Gilburd
Redaktor

Scygro
Redaktor

Sven Vermeulen
Redaktor

Aleksander Modzelewski
Tłumacz

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.