Hosting více domén jedním poštovním serverem (Postfix+Dovecot)

Protože jsem nucen řešit postup instalace hostingu domén a chci se vyhnout opakování chyb, píšu další návod, tentokrát jak provést instalaci poštovního serveru spravujícího více domén. Z pohodlí domova se mi nejlépe konfiguruje Postfix a Dovecot, proto bych jako základ chtěl tuto kombinaci i nadále využívat. Protože je nutné někam ukládat data uživatelů (nikoliv e-maily), zvolil jsem databázi MySQL. Původně to mělo celé být řešeno přes LDAP, ale moje lenost mi nedovoluje tuto záležitost dořešit. Návod by měl být uveden níže, pravda bude dopsán na několikrát .... Jako zdroje jsem použil spoustu vlastních omylů a veškeré dostupné návody na internetu. Výsledek je poněkud chaotický, ale doufám, že funkční.



Proč více poštovních serverů (hosting)?
Přestože je pohodlnější využívat jeden server k správě jediné domény, takovy stroj je značně nevyužitý. Může dojít k situaci, kdy je nutné přidat další doménu a pak přidávat další server a spoustu zbytečností začíná být nevýhodné. Navíc i správa jediného serveru je podstatně lepší, než jich spravovat stovku. Nehledě na další problémy s tím spojené, jako je napájení a chlazení. Protože jsem se dostal k ekologii, je lepší skončit a přejít k věci.



Instalace
Instalace tohoto "komplexnějšího" prostředí je náročnější, než samotný poštovní server. Pro osobní pohodlí zde popíšu všechny související rady, včetně mých názorů. Na druhou stranu musím upozornit, že co člověk, to způsob návrhu. Tento návrh si neklade za cíl být nejlepší, pouze co možná nejjednodušší a snadno spravovatelný.

1) Instalace komponent
Jak už jsem uvedl, tato konfigurace je založená na Postfixu, ASSP, Dovecotu a MySQL. Mimo antispamové zde bude i antivirová kontrola, interface pro správu (phpMyAdmin a PostfixAdmin) a podobné srandičky pro lenivce. Níže je uveden příkaz, umožňující instalaci všech potřebných komponent.
!!! UPOZORNĚNÍ !!! - osobně nedoporučuji tyto web interface nechat vystrčené na internet. Je vhodné k nim přistupovat minimálně přes VPN, nebo je mít schované na interface dostupném pouze správci!!!

portinstall www/apache22 assp clamav dovecot dovecot-sieve mysql-client mysql-server pam-mysql php5 php5-extensions postfix stunnel postfixadmin phpMyAdmin

Druhou částí je instalace některých dalších utilit (hlavně v Perlu):

portinstall portinstall p5-Date-Calc p5-Bit-Vector p5-BDB-MySQL p5-Convert-UU p5-Unix-Syslog p5-TimeDate p5-Net-Server p5-MailTools p5-MIME-tools p5-IO-stringy p5-Convert-UUlib p5-Convert-TNEF p5-Convert-BinHex p5-Config-IniFiles p5-Compress-Zlib p5-CPANPLUS p5-BerkeleyDB p5-Archive-Zip p5-Archive-Tar p5-File-Scan-ClamAV

Protože se spousta aplikací ptá, je nutné zajistit jejich konfiguraci. To znamená následující nastavení, nutné pro jednotlivé aplikace a jejich celkovou funkčnost. Rozhodně by uvedená nastavení mohla být dokonalejší, ale mě to zatím postačí:

Aplikace Nastavení
Apache 2.2 - MySQL,- IPv6,- BDB,- LOG_FORENSIC
Ostatní defaultně
ClamAV 0.9x - ARC,- ARJ,- LHA,- UNZOO,- UNRAR,- MILTER,- ICONV
Dovecot 1.x - SSL,- IPv6,- POP3,- LDA,- GSSAPI,- VPOPMAIL,- MySQL
PHP-5 5.2.x - CLI,- CGI,- APACHE,- SUHOSIN(pokud to nebude v Jailu),- MULTIBYTE,- IPv6,- MAILHEAD
Pro PHP-Extensions záleží hlavně na požadavcích spouštěných aplikací
Postfix 2.5.x - PCRE,- DOVECOT,- TLS,- BDB,- MYSQL,- CDB,- VDA

Jako další doporučuji hlavně do budoucnosti nainstalovat ještě aplikace související s přibližnou lokalizací zemí odkud pochází jednotlivé IP adresy:
portinstall GeoIP p5-Geo-IP p5-Geo-IPfree

2) Konfigurace MySQL
Do souboru /etc/rc.conf je nutné přidat řádky:
mysql_enable="YES"
mysql_dbdir="/mysql/data"


Dále vytvořit soubor /usr/local/etc/my.cnf obsahující přibližně následující obsah:

[client]
port = 3306
socket = /tmp/mysql.sock

[mysqld]
port = 3306
bind-address = 127.0.0.1
socket = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
ft_min_word_len=3
sort_buffer_size = 512K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
net_buffer_length = 8K
thread_stack = 64K
myisam_sort_buffer_size = 1M
query-cache-type = 1
query-cache-size = 4M
server-id = 1
innodb_data_home_dir = /mysql/innodb_data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /mysql/innodb_log
innodb_log_arch_dir = /mysql/innodb_archive
innodb_buffer_pool_size = 8M
innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[isamchk]
key_buffer = 8M
sort_buffer_size = 8M

[myisamchk]
key_buffer = 8M
sort_buffer_size = 8M

[mysqlhotcopy]
interactive-timeout


A nezbývá než vytvořit potřebnou adresářovou strukturu, nastavit oprávnění a spustit MySQL. To se provede následujícím způsobem:
mkdir -p /mysql/data /mysql/innodb_archive /mysql/innodb_data /mysql/innodb_log
chown -R mysql:mysql /mysql
/usr/local/etc/rc.d/mysql-server start


Po spuštění MySQL je potřeba vytvořit databázi pro budoucí použití Postfixem stejně jako uživatele, který má potřebná oprávnění. Postup je následující:
mysql -u root
> CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'password';
> GRANT USAGE ON * . * TO 'postfix'@'localhost' IDENTIFIED BY 'password' ;
> CREATE DATABASE IF NOT EXISTS `postfix` ;
> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';


3) Konfigurace Apache
V tuto chvíli je funkční MySQL a je možné začít konfigurovat Apache. Základ nastavení je uveden zde. Poté je nutné zprovoznit phpMyAdmin a Postfix admin. Text konfigurace pro obě aplikace je nutné vložit do konfigurace Apache. Ještě jednou upozorňuji, že není vhodné tuto část systému mít veřejně dostupnou z internetu.

Alias /myadmin "/usr/local/www/phpMyAdmin" <Directory "/usr/local/www/phpMyAdmin">
    Options none
    AllowOverride Limit
    Order Allow,Deny
    Allow from all
</Directory>
Alias /postfix "/usr/local/www/postfixadmin"
<Directory "/usr/local/www/postfixadmin">
    Options none
    AllowOverride Limit
    Order Allow,Deny
    Allow from all
</Directory>


Po restartu Apache je teď dostupný interface pro konfiguraci MySQL a databáze určené pro Postfix. Tyto dvě aplikace je nutné také nakonfigurovat, aby s nimi bylo možné nadále pracovat.
Konfiguraci phpMyAdmin je možné provést pomocí browseru na adrese odpovídající konfiguraci (viz. nastavení výše):
http://host/myadmin/scripts/setup.php

Konfiguraci PostfixAdmin je možné provést pomocí browseru na adrese odpovídající konfiguraci (viz. nastavení výše), kde nastavení databáze a uživatelského jména odpovídá parametrům v SQL příkazech spuštěných po startu MySQL serveru:
http://host/postfix/setup.php

Posledním úkolem před konfigurací Postfixu je nastavení Certifikační autority a vygenerování certifikátů pro poštovní server. Pokud máte zájem, certifikáty je možné navázat na existující certifikační úřady, v Čechách je to například První Cerfitikační Autorita(PVT), PostSignum(Česká Pošta) nebo CA Czechia. Ze zahraničních je to například velice známý Verisign nebo komunitní a i v Čechách působící CA Cert.org.



Konfigurace Postfix
Vlastní konfigurace Postfixu je trošičku složitější, než je obvyklé. Při konfiguraci jsem vycházel z manuálů a howto, které jsou k dispozici na následujících stránkách:
Postfix Howtos
Postfixadmin forum
ASSP FAQ a ASSP Forum
Dovecot Wiki
HowTo Forge
Marlow ISP solution
Zdenda - Postfix+IMAP+Maildrop+MySQL
... o spoustě dalších ani nemluvě. Každopádně pomoc je vhodné vyhledac nejdříve pomocí strýčka
Google, ten najde většinu věcí.

Pokud máme vytvořené databáze, certifikační autoritu a klíče a nainstalovaný další software, čeká nás jako první krok konfigurace Postfixu. Protože vlastní Postfix nebude mít "vystrčený" interface, bude nastaven pro poslech pouze na loopbacku (127.0.0.1), komunikaci s okolím bude zajišťovat ASSP. Konfigurační soubor /usr/local/etc/postfix/main.cf pak bude vypadat následujícím způsobem:

command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
queue_directory = /var/spool/postfix
setgid_group = maildrop
html_directory = no
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = no
mail_owner = postfix
myhostname = host.domena.cz
mydomain = domena.cz
inet_interfaces = 127.0.0.1
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
mynetworks = 10.0.0.0/255.0.0.0, 127.0.0.0/8, 172.16.0.0/255.240.0.0, 192.168.0.0/16
mynetworks_style = host
append_at_myorigin = no
header_checks = regexp:$config_directory/header_checks
maildrop_destination_recipient_limit = 1
transport_maps = hash:/usr/local/etc/postfix/transport
relay_domains = mysql:/usr/local/etc/postfix/mysql/relay_domains_maps.cf
alias_maps = hash:/usr/local/etc/postfix/aliases
alias_database = hash:/usr/local/etc/postfix/aliases
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql/virtual_alias_maps.cf
virtual_uid_maps = static:10001
virtual_gid_maps = static:10001
virtual_mailbox_base = /mailserver/mail
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql/virtual_domains_maps.cf
virtual_mailbox_limit = 10737418240
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql/virtual_mailbox_maps.cf
virtual_minimum_uid = 10001
virtual_transport = virtual
vacation_destination_recipient_limit = 1
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql/virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
disable_vrfy_command = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_sasl_type = dovecot
#smtpd_sasl_path = smptd
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain =
smtpd_sasl_authenticated_header = yes
#smtpd_recipient_restrictions =
#    permit_mynetworks,permit_sasl_authenticated,reject_non_fqdn_hostname,
#    reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unauth_destination,
#    reject_unauth_pipelining,reject_invalid_hostname,reject_rbl_client opm.blitzed.org,
#    reject_rbl_client list.dsbl.org,reject_rbl_client bl.spamcop.net,
reject_rbl_client sbl-xbl.spamhaus.org
smtp_use_tls = no
smtpd_use_tls = yes
smtpd_tls_security_level = may
smtpd_tls_auth_only = no
smtpd_tls_key_file = /etc/ssl/server/mail.key
smtpd_tls_cert_file = /etc/ssl/server/mail.crt
smtpd_tls_session_cache_database = btree:/usr/local/etc/postfix/tls_smtpd_scache
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
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
unknown_local_recipient_reject_code = 450
delay_warning_time = 4
message_size_limit = 10485760
mailbox_size_limit = 1073741824
#Nakonec, proc nedoprat trochu zabavy navstevnikum
smtpd_banner = $myhostname0 Microsoft ESMTP MAIL Service, Version: 5.0.2195.6713 ready

Pro konfiguraci požadovaných MySQL map podle předchozího konfiguračního souboru vytvoříme adresář:
mkdir /usr/local/etc/postfix/mysql
se soubory obsahující text dle níže uvedené tabulky:
Název souboru Obsah
relay_domains_maps.cf user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'
virtual_alias_maps.cf user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1
virtual_domains_maps.cf user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s'
#optional query to use when relaying for backup MX
#query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '0' and active = '1'
virtual_mailbox_limit_maps.cf user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s'
virtual_mailbox_maps.cf user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1




To be continued ...



Konfigurace Dovecot



To be continued ...






Konfigurace ASSP
Vlastní instalace (nikoliv konfigurace) ASSP je popsána v odkazu zde. Pro konfiguraci je potřeba využít web interface, který je standardně přístupný přes port 55555 daného stroje. Přihlašovací jméno je admin, heslo nospam4me. Vlastní nastavení se u posledních verzí stává komplikovanější, ale stále velice kvalitně popsaná. Další slabinou je zatím neimplementovaná komunikace pomocí SMTP/SSL a využití Perl interpretru, což může znamenat problém s výkonností.

Pokud je nutné SMTP/SSL, je potřeba následující postup využívající stunnel:
portinstall stunnel
Vygenerování klíčů pro SSL/TLS komunikaci například pomocí lokální certifikační autority.
Vytvoření konfiguračního souboru /usr/local/etc/stunnel/smtp-ssl.conf
který bude obsahovat:




To be continued ...

Powered by Drupal - Design by artinet