Linux-Support.dk

v1.0 - v2.0

Postfix 2.1.3 med MySQL, Pop3, IMAP og AUTH before SMTP.

Postfix er en moderne MTA (mail transfer agent), dvs. et program til at flytte e-post fra én postserver til en anden. I mange år var Sendmail den MTA, alle brugte, men i de sidste par år har det vist sig, at Sendmail ikke kan leve op til de sikkerhedskrav, man typisk stiller.

Postfix har umiddelbart tre fordele:

Denne tutorial er ment, som en hjælp til system administratorer der ønsker at modtage e-mail fra flere forskellige domæner. I Postfix slag kaldes dette for "postfix virtual domains". Dette tillader dig at videreføre e-mails, såkaldt forward dem, til flere forskellige modtagere, og også beskytte dig imod spam, da e-mails kun er accepteret af de definerede modtagere i databasen. Derefter vil brugerne have mulighed for at hente deres e-mails via POP3 eller IMAP. Vi har her valgt, at fortælle hvordan du installere begge ting, men du bør gør dig nogle overvejelser om, hvilken en af delene du vil bruge. Jeg vil anbefale, at man læser følgende artikler om "IMAP vs. POP3"

http://www.simplicato.com/imap_vs_pop3

http://www.e-smith.org/docs/manual/4.1/imappop3.html

http://www.nevis.columbia.edu/mail/pop-vs-imap.html

Jeg skal her gøre opmærksom på, at disse artikler er på engelsk.

Normalt vil man konfigurerer de forskellige domæner i forskellige konfigurationsfiler til Postfix, men når antallet af brugere, domæner og daglige ændringer af dit system stiger, kan du nemt blive træt af, manuelt at ændre disse konfigurationsfiler. Min mening om den bedste løsning, er at bruge MySQL databasen til at gemme domæner, e-mail aliases og andet i. Det er på denne måde, de fleste web hosting firmaer ofte tilbyder deres selv konfigurerende e-mail services.

Denne fremgang, har visse fordele:

For at kunne bruge denne tutorial bedst muligt, forventes der et bedre kendskab til Linux Debian, samt system administration af dette. Det forventes, at du har basal viden om Mail servers, samt hvordan de virker.

Vores mål er, at der skal huskes så lidt som muligt, og e-mail brugere er ofte "dumme". Derfor har vi valgt, at brugernes brugernavn til deres e-mail, er deres e-mail adresse.

Det store billede, i helhed.

Det er sådan, at hele dit mail system, vil komme til at virke.

Jeg har en firewall?

Hvis du sidder bag en firewall, skal du åbne for følgende porte indadtil, efter behov:

Hvad har vi brug for?

Du skal have følgende Debian (SARGE, som er stable) pakker installeret, dette er Woody pakker.

Oprette databasen, og tabeller

Vi går ud fra, at du allerede kender til MySQL, og derfor behøver vi ikke forklare, hvordan du opretter databasen, og andet. (Husk at logge ind som root i MySQL)

Inden du kan starte med at oprette databasen og tabeller, skal oprette en bruger kaldet "postfix" i mysql. Denne bruger skal ingen rettigheder have til andre databaser. Derefter genstarter du din mysql server.

Følgende kode er til oprettelse af hele postfix mysql system. Jeg skal her gøre opmærksom på, at der i bunden skal rettes lidt i koden, da kodeordet for "postfix" brugeren skal indsættes i SQL syntaksen.

create database maildb;
use maildb;

DROP TABLE IF EXISTS `domains`;
CREATE TABLE `domains` (
`id` bigint(255) NOT NULL auto_increment,
`domain` varchar(128) NOT NULL default '',
`location` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM;

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(128) NOT NULL auto_increment,
`address` varchar(128) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`name` varchar(128) NOT NULL default '',
`uid` smallint(5) unsigned NOT NULL default '102',
`gid` smallint(5) unsigned NOT NULL default '102',
`home` varchar(128) NOT NULL default '/var/spool/postfix/virtual',
`domain` varchar(128) NOT NULL default '',
`maildir` varchar(255) NOT NULL default '',
`smtp_allow` int(1) NOT NULL default '0',
`disabled` int(1) NOT NULL default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY `address` (`address`),
KEY `id_2` (`id`),
KEY `address_2` (`address`) ) TYPE=MyISAM;

DROP TABLE IF EXISTS `virtual`;
CREATE TABLE `virtual` (
`address` varchar(255) NOT NULL default '',
`goto` varchar(255) NOT NULL default '',
UNIQUE KEY `address` (`address`)
) TYPE=MyISAM;

GRANT SELECT
ON maildb.*
TO postfix@localhost
IDENTIFIED BY 'kodeord';
FLUSH privileges;

Husk at ændre "kodeord" oven for, til dit eget kodeord, da du oprettede brugeren.

Oprette en bruger til postfix i systemet

Alle de virtuelle brugere, skal også have deres egen mappe på systemet. Du tænker sikkert nu: "Jamen, skal jeg så til ind og oprette en mappe hver gang, jeg opretter en e-mail adresse?". Svaret er nej. Dette klarer postfix nemlig helt selv. Når man har oprettet en konto i MySQL databasen, er e-mail kontoen næsten klar. For, at postfix selv opretter en mappe på systemet, til at komme sine mails i, skal du sende 1 e-mail til den nye mail. Derefter vil postfix automatisk selv oprette et såkaldt Maildir.

Derfor, skal vi have tilføjet en bruger i vores system, som har rettigheder til dette:

groupadd -g 2000 postfix
useradd -g postfix -u 2000 postfix

Læg her mærke til, at giver postfix brugere uid 2000, samt gruppen "postfix" gid 2000. Dette skal vi senere bruge, når vi skal indtaste data i mysql databasen.

Konfiguration af Postfix

Vi skal nu have sat Postfix op, således at det kommer til at køre sammen med vores MySQL database. Ret eller opret følgende filer, og tilføjet det efterfølgende indhold:

#########################
#/etc/postfix/main.cf:
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
program_directory = /usr/lib/postfix
queue_directory = /var/spool/postfix

transport_maps = mysql:/etc/postfix/mysql_transport.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mbox.cf
virtual_uid_maps = mysql:/etc/postfix/mysql_uids.cf
virtual_gid_maps = mysql:/etc/postfix/mysql_gids.cf

virtual_mailbox_base = /var/spool/postfix/virtual/

virtual_maps = mysql:/etc/postfix/mysql_virtual.cf
virtual_mailbox_limit = 102400000
virtual_minimum_uid = 1000

inet_interfaces = all
home_mailbox = Maildir/

myhostname = (Indæt dit domain navn her)
mydestination = $transport_maps

relayhost = smtp.mail.dk
relay_domains = $mydestination, $virtual_maps

mynetworks = 172.16.0.0/16, 127.0.0.0/8
#NB - Her burger jeg mit eget class B netværk. Bruger du andet, bedes du venligst rette dette

mynetworks_style = $myhostname

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_sender_domain, reject_unauth_pipelining, reject_unknown_recipient_domain, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_non_fqdn_hostname, check_relay_domains

broken_sasl_auth_clients = yes

Jeg vil ikke komme nærmere ind på de overnævnte kommandoer, samt deres betydning. Alt dette kan findes og læses om, på Postfix's egen hjemmeside www.postfix.org

Dernæst, skal vi oprette filerne, der tilslutter til MySQL databasen og kommunikere med denne. Husk at ændre kodeordet til din MySQL bruger i filerne.

############################
#/etc/postfix/mysql_gids.cf:
hosts=localhost
user=postfix
password=*****
dbname=maildb
table=users
select_field=gid
where_field=address

#################################
#/etc/postfix/mysql_transport.cf:
hosts=localhost
user=postfix
password=*****
dbname=maildb
table=domains
select_field=location
where_field=domain

############################
#/etc/postfix/mysql_uids.cf:
hosts=localhost
user=postfix
password=*****
dbname=maildb
table=users
select_field=uid
where_field=address

###############################
#/etc/postfix/mysql_virtual.cf:
hosts=localhost
user=postfix
password=*****
dbname=maildb
table=virtual
select_field=goto
where_field=address

####################################
#/etc/postfix/mysql_virtual_mbox.cf:
hosts=localhost
user=postfix
password=*****
dbname=maildb
table=users
select_field=maildir
where_field=address

Derefter opretter du mappen

/var/spool/postfix/virtual/

som du tildeler al adgang til brugeren postfix:

chown -R postfix:postfix /var/spool/postfix/virtual/

AUTH SMTP med Postfix

Forestil dig, at dine brugere henter deres e-mail med POP3 eller IMAP. Nu skal de også bruge en måde, at sende mails igennem din mail server på. Af sikkerhedsmæssige hensyn, tillader Postfix brugere i det lokale (=trusted) netværk, at sende e-mail. Det er indlysende, at du vil have denne sikkerhed, så du ikke vil virke som en åben relay server for spammere. Her er mit forslag, at du brugere AUTH before SMTP. Dette betyder, at mail klienterne giver et brugernavn samt et kodeord til mailserver, for derefter at blive godkendt af denne. De fleste e-mail klienter nu omdage har denne funktion indbygget.

Der er mange måder, at bruge denne legaliseringsmetode på, med SMTP. Postfix bruger Cyrus SASL for at authentikeret SMTP. Så derfor skal vi har have fortalt Postfix hvorledes vi forbinder til SASL, det gør vi ved at oprette følgende mappe:

mkdir /etc/postfix/sasl

I denne mappe ligger vi konfigurationsfilen til sasl, vi opretter denne fil kaldet smtpd.conf:

pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login cram-md5 digest-md5
sql_engine: mysql
sql_hostnames: localhost
sql_user: postfix
sql_passwd: ********
sql_database: maildb
sql_select: select password from users where address='%u@%r'

Her skal du igen huske, at ændre kodeordet til din mysql burger.

Et lille "problem" på debian er, at postfix kører i chroot tilstand. Det betyder, at Postfix ikke kan læse udenfor mappen /var/spool/postfix. Vi skal derfor have lagt filerne over, således postfix får adgang til disse:

mkdir -p /var/spool/postfix/usr/lib/sasl2
mkdir -p /var/spool/postfix/etc/postfix/sasl
cp /usr/lib/sasl2/* /var/spool/postfix/usr/lib/sasl2/
cp /etc/postfix/sasl/smtpd.conf /var/spool/postfix/etc/postfix/sasl/smtpd.conf

Postfix vil nu have mulighed for at kunne læse disse filerne, når den skal forbinde til SASL.

Opsætning af IMAP og POP3

Et af de sidste skridt er nu, at få enten POP3 eller IMAP til at bruge mysql databasen for at verificere brugernavn og kodeord.

Først skal du ændre i filen /etc/courier/authdaemonrc, hvor du skal ændre authmodulelist til authmysql:

authmodulelist="authmysql"

Dernæst skal vi definere hvilke felter der er hvad, i vores MySQL tabel. Dette gøres i filen:

##########################
#/etc/courier/authmysqlrc:
MYSQL_SERVER localhost
MYSQL_USERNAME postfix
MYSQL_PASSWORD *****
MYSQL_SOCKET /var/run/mysqld/mysqld.sock
MYSQL_PORT 3306
MYSQL_OPT 0
MYSQL_DATABASE maildb
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD address
MYSQL_HOME_FIELD home
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir
MYSQL_WHERE_CLAUSE disabled != '1'

Jeg har igen tilføjet en lille finesse. Denne gang er det feltet "disabled" i vores users tabel, der er snak om. Hvis feltet "disabled" er sat til 1, for den enkelte bruger, har vedkommende ikke lov til at tjekke mail. Dog vil brugeren stadig modtage sine mails, vedkommende vil bare ikke få lov til at hente dem og læse dem. Denne funktion er til at suspendere enkelte brugeres konti.

Hvis du vælger at bruge POP3 til at hente mails med, skal du springe næste kapitel over.

Opsætning af IMAP

Selve opsætningen af IMAP kræver ikke meget pilleri. En enkelt fil, skal der ændres i:

####################
#/etc/courier/imapd:
ADDRESS=0
PORT=143
MAXDAEMONS=40
MAXPERIP=20
PIDFILE=/var/run/courier/imapd.pid
TCPDOPTS="-nodnslookup -noidentlookup"
AUTHMODULES="authdaemon"
AUTHMODULES_ORIG="authdaemon"
DEBUG_LOGIN=0
IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"
IMAP_CAPABILITY_ORIG="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT AUTH=CRAM -MD5 AUTH=CRAM-SHA1 IDLE"
IMAP_IDLE_TIMEOUT=60
IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN"
IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN"
IMAP_DISABLETHREADSORT=0
IMAP_CHECK_ALL_FOLDERS=1
IMAP_OBSOLETE_CLIENT=0
IMAP_ULIMITD=65536
IMAP_USELOCKS=0
IMAP_ENHANCEDIDLE=0
IMAP_TRASHFOLDERNAME=Trash
IMAP_EMPTYTRASH=Trash:150
IMAP_MOVE_EXPUNGE_TO_TRASH=0
SENDMAIL=/usr/sbin/sendmail
HEADERFROM=X-IMAP-Sender
IMAPDSTART=YES

Øge sikkerheden

Til sidst, vil vi øge sikkerheden på vores system. Da der er en del filer, som indeholder vores mysql kodeord, bør vi gøre disse filer ikke læselige for andre personer på Debian maskinen. Dette gør vi ved at chmod filerne 600.

chmod 600 /etc/courier/authmysqlrc
chmod 600 /etc/pam.d/smtp
chmod 600 /etc/postfix/mysql_gids.cf
chmod 600 /etc/postfix/mysql_transport.cf
chmod 600 /etc/postfix/mysql_uids.cf
chmod 600 /etc/postfix/mysql_virtual.cf
chmod 600 /etc/postfix/mysql_virtual_mbox.cf

Indtaste data i MySQL databasen

Domæner

For hvert nyt domæne, mail serveren skal lytte på:

Tabellen "domains" bruges her. I feltet "domain" indtastet det ønskede domæne navn, som der skal lyttes på. Og i "location" feltet, indtastet "virtual:". Husk kolon efter virtual. Du kan også bruge denne SQL syntaks:

INSERT INTO domains (domain, location) VALUES ('domain.dk','virtual:');

Hvor du kun skal ændre på domain.dk, til dit eget domæne.

Forwarding

Opsætning af "forwardning" af e-mails, er utrolig simpelt. Forwarding betyder, at mails der er blevet sendt til konto x bliver automatisk sendt videre til konto y.

Vi koncentrerer os her om tabellen "virtual". I feltet "address" indtastet den e-mail, hvor den indkomne e-mail kommer ind på. I "goto" feltet indtastet den e-mail adresse som man ønsker at sende sine e-mail vildere til.

Hvis vi indtastedet x@domain.dk i "address" og y@domain.dk i "goto", ville alle mails der blev sendt til x@domain.dk blive sendt automatisk videre til y@domain.dk.

Du kan bruge den efterfølgende SQL syntaks til at indsætte data i tabellen:

INSERT INTO virtual (address, goto) VALUES ('x@domain.dk','y@domain.dk');

Oprette kontoer

For det først, skal du indtaste e-mail adressen i både "address" og "goto", i "virtual" tabellen. Dette sørger for, at e-mailen bliver sendt til den rigtige konto. Se ovenfor, hvordan dette gøres.

Dernæst, skal du udfylde felterne i users tabellen. Jeg vil her kort beskrive, hvad de forskellige felter er og betyder.

Din e-mail system er nu klar, til at tage i brug. Tillykke.

© Linux-Support.dk 2004-2006. Valid XHTML 1.0 Strict Valid CSS 2.1 Applies to accessibility guidelines Sidst opdateret: 21-09-2006