Version: 0.1.2 ---------------------------------------------------- Mailserver: Postfix + Dovecot + Squirrelmail 0. Indhold 1. Indledning 2. Download og Installering 3. Konfigurering af Postfix 4. Konfigurering af Dovecot 5. Konfigurering af SquirrelMail 6. SSL 7. Log og monitoring 8. Tests 9. Referencer/Links 10. TODO ----------------------------------------------------- 1. Indledning Denne guide er ment som dokumentation i forbindelse med opsaetning af min egen mailserver. Maalet er at faa en fungerende mailserver bestaaende af Postfix, dovecot og squirrelmail som tilbyder SMTP, IMAP og webinterface, samt sikker kommunikation gennem SSL. Da dette dokument er skrevet efter opsaetningen er den yderst mangelfuld, da jeg kun delvist undervejs dokumenterede processen. For en bedre guide se foelgende side: http://workaround.org/articles/ispmail-etch/ 2. Download og Installering Hent pakkerne fra dit repository med f.eks. apt-get: ~# apt-get install mysql ~# apt-get install postfix-mysql (evt. med smarthost) ~# apt-get install dovecot (evt. dovecot-pop3, hvis den protokol oenskes) ~# apt-get install squirrelmail 3. Konfiguration af Postfix 3.1 Konfigurationsfiler Undersoeg at konfigurationsfilerne indeholder foelgende: /etc/hostname : computerens navn /etc/mailname : det fuldt kvalificerede navn (computerens navn + domaene navn) 3.2 Mysql For at haandtere virtual aliases og domaener opsaettes en mysql database som postfix kan arbejde med. Start med saette mysql's root password: # mysqladmin password Dernaest oprettes en database som Postfix skal benytte: # mysql -p create Log ind i databasen som root med password: #mysql -p Opret en bruger med laeserettigheder, samt tabellerne: mysql> GRANT SELECT ON mailserver.* TO mailuser@localhost IDENTIFIED BY 'mailuser2007'; mysql> CREATE TABLE `virtual_domains` ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL ) ENGINE = InnoDB; mysql> CREATE TABLE `virtual_users` ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, domain_id INT(11) NOT NULL, user VARCHAR(40) NOT NULL, password VARCHAR(32) NOT NULL, CONSTRAINT UNIQUE_EMAIL UNIQUE (domain_id,user), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE = InnoDB; mysql> CREATE TABLE `virtual_aliases` ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, domain_id INT(11) NOT NULL, source VARCHAR(40) NOT NULL, destination VARCHAR(80) NOT NULL, FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE = InnoDB; 3.3 Postfix Map Postfix til databasen # vim /etc/postfix/mysql-virtual-mailbox-domains.cf user = mailuser password = hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s' Opdater Postfix: # postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mys ql-virtual-mailbox-domains.cf 'postconf' vedligeholder filen '/etc/postfix/main.cf', som ogsaa kan redigeres direkte. Test tabellen og mapningen ved at indsaette et domaene i tabellen: #mysqladmin -p mailserver mysql> INSERT INTO virtual_domains (id, name) VALUES (1, 'historiskfysik.dk'); exit #postmap -q historiskfysik.dk mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf Outputtet af postmap skulle gerne vaere '1'. Herefter oprettes en bruger som har kontrol over samtlige mailkontoer. # groupadd -g 5000 vmail # useradd -g vmail -u 5000 vmail -d /home/vmail -m Brugeren for uid og gid 5000, samt home i /home/vmail (hvorunder de virtuelle mailbox kommer til at ligge). Opdater Postfix, saa den benytter uid = gid = 5000: # postconf -e virtual_uid_maps=static:5000 # postconf -e virtual_gid_maps=static:5000 3.3.2 Virtual users Opret et map mellem bruger og domaener ved at indsaette en bruger fra fra et virtuelt domaene: # mysqladmin -p mailserver mysql> INSERT INTO virtual_users (id, domain_id, user, password) VALUES (1, 1, 'lacour', MD5('appel')); mysql> SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email FROM virtual_users LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id; Det nederste query skulle gerne udskrive en tabel bestaaende med en indgang bestaaende af 'lacour@historiskfysik.dk'. mysql> SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email, virtual_users.password FROM virtual_users LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id Nu indeholder tabellen ogsaa et password. For at goere det nemmere at referere til ovenstaaende query oprettes et view: mysql> CREATE VIEW view_users AS SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email, virtual_users.password FROM virtual_users LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id; Foelgende query skulle gerne give samme output som ovenstaaende: mysql> SELECT * FROM view_users; Postfix mappes til viewet: # vim /etc/postfix/mysql-virtual-mailbox-maps.cf user = mailuser password = hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 from view_users WHERE email='%s' # postconf -e virtual_mailbox_maps=my sql:/etc/postfix/mysql-virtual-mailbox-maps.cf Test at: # postmap -q lacour@historiskfysik.dk mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf udskriver '1'. 3.3.3 Virtual Aliases Insaet data i tabellen virtual_aliases: mysql> INSERT INTO virtual_aliases (id, domain_id, source, destination) VALUES (1, 2, 'nemo', 'jsc@umbraculum.org'), (2, 2, 'webmaster', 'jsc@umbraculum.org'); Forwarder nemo@umbraculum.org og webmaster@umbraculum.org til jsc@umbraculum.org. Opret et view: mysql> CREATE VIEW view_aliases AS SELECT CONCAT(virtual_aliases.source, '@', virtual_domains.name) AS email, destination FROM virtual_aliases LEFT JOIN virtual_domains ON virtual_aliases.domain_id=virtual_domains.id; Test at det virker: mysql> SELECT * FROM view_aliases; Opret et map til Postfix: # vim /etc/postfix/mysql-virtual-alias-maps.cf: user = mailuser password = hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM view_aliases WHERE email='%s' Test det: # postmap -q nemo@umbraculum.org mysql:/etc/postfix/ mysql-virtual-alias-maps.cf Har output 'jsc@umbraculum.org'. Databasen er nu koerende, og Postfix er opsat til at benytte den til virtuelle domaener og brugere. 3.3.4 Filadgang Ingen skal have adgang til mapningerne: # chgrp postfix /etc/postfix/mysql-*.cf # chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf 3.3.5 Postfix og Dovecot Saa skal Postfix opsaettes til at benytte dovecot LDA til levering af emails: # vim /etc/postfix/master.cf dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient} Reload konfigurationen: # postfix reload Opdater Postfix til at benytte Dovecot: # postconf -e virtual_transport=dovecot # postconf - e dovecot_destination_recipient_limit=1 4. Konfigurering af Docecot (Dovecot var allerede koerende paa maskinen, saa noget konfiguration er formentlig manglende). Saet stien for mails til '/home/vmail' samt i formatet Maildir: # vim /etc/dovecot/dovecot.conf mail_location = maildir:/home/vmail/%d/%n/Mail Mail bliver placeret i folderen '/home/vmail///Mail'. Vaelg at Dovecot skal benytte IMAP: # vim /etc/dovecot/dovecot.conf protocols = imap imaps Opdater dovecot konfigurationsfilen med foelgende (ikke naermere dokumenteret): auth default { mechanisms = plain login passdb sql { args = /etc/dovecot/dovecot-sql.conf } userdb static { args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes } } socket listen { master { path = /var/run/dovecot/auth-master mode = 0600 user = vmail } client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } } protocol lda { log_path = /home/vmail/dovecot-deliver.log auth_socket_path = /var/run/dovecot/auth-master postmaster_address = postmaster@example.com mail_plugins = cmusieve global_script_path = /home/vmail/globalsieverc } Herefter skal Dovecot mappes til databasen: # vim /etc/dovecot/dovecot-sql.conf driver = mysql connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuser2007 default_pass_scheme = PLAIN-MD5 password_query = SELECT email as user, password FROM view_users WHERE email='%u'; Genstart Dovecot: # /etc/init.d/dovecot restart Nu er baade Postfix og Dovecot sat op, saa det burde nu vaere muligt at logge ind paa serveren med testbrugeren gennem IMAP. 5. SquirrelMail Installer og opsaet squirrelmail under Apache som beskrevet andre steder. I /etc/squirrelmail/config.php skal foelgende vaere sat: # vim /etc/squirrelmail/config.php imapServerAddress = 'localhost'; useSendMail = false; smtpServerAddress = localhost; SquirrelMail benytter nu den lokale Postfix til at afsende emails. 6. Sikker kommunikation 6.1 Opret et certifikat: Foerst oprettes et certifikat samt en noegle: # openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/mserver.pem \ -keyout /etc/ssl/private/mserver.pem # chmod o= /etc/ssl/private/mserver.pem 6.2 Konfigurer Postfix: Definer det netvaerk som du vil tillade uautoriseret at videresende emails fra: # postconf -e mynetworks=192.168.1.0/24 Opsaet at Postfix skal benytte Dovecot til at haandtere SSL: # postconf -e smtpd_sasl_type=dovecot Opsaet Postfix til at bruge SSL: # postconf -e smtpd_sasl_path=private/auth # postconf -e smtpd_sasl_auth_enable=yes # postconf -e smtpd_recipient_restrictions=permit_mynetwo rks,permit_sasl_authenticated,reject_unauth_destination 6.3 Konfigurer Dovecot Aktiver at kun sikkerkommunukation er acceptabel under login: # disable_plaintext_auth = yes 7. Log og monitoring Til statistik kan f.eks. pflogsumm benyttes: # apt-get install pflogsumm Aendre i /etc/logrotate.conf # vim /etc/logrotate.conf /var/log/mail.log { missingok daily rotate 7 create compress start 0 } Opret et script: # vim /usr/local/sbin/postfix_report.sh #!/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin gunzip /var/log/mail.log.0.gz pflogsumm /var/log/mail.log.0 | formail -c -I"Subject: Mail Statistics" -I"From: pflogsumm@localhost" -I"To: postmaster@example.com" -I"Received: from www.example.com ([192.168.0.100])" | sendmail postmaster@example.com gzip /var/log/mail.log.0 exit 0 # chmod 755 /usr/local/sbin/postfix_report.sh Opdater crontab til at sende dagligt: # crontab -e 0 7 * * * /usr/local/sbin/postfix_report.sh &> /dev/null Vent paa en email i morgen klokken 7. 8. Test Generelt kan mailhaandtering foelges ved at vise log-filen: # cat /var/log/mail.log Et andet godt middel til test er brug af telnet paa SMTP og IMAP portene. Test for open relay: http://www.mob.net/~ted/tools/relaytester.php3 9. Referencer/Links Min fremgang er baseret paa denne guide: http://workaround.org/articles/ispmail-etch/ pflogsumm: http://www.howtoforge.com/mail_statistics_mailgraph_pflogsumm 10. TODO Virtual alias: Handle @. Meget andet!