Managed ad

Den optimala multidomain mailservern

Av Pontus, 23 februari, 2016

Hur ser den optimala maillösningen ut? Försökte med molntjänster. Google aps verkar riktigt grym, men saknar stöd för gruppmailboxar. Alltså en mailbox som alla kan arbeta i samtidigt. Det närmaste de har är att man kan skapa en grupp som är en mailbox, tanken är bra för tillexempelt supportärenden och liknande. Mailen kommer in och alla i gruppen kan se dem och hantera ärendena och kategorisera dem. Tyvärr har den en stor brist, man kan inte hantera den som en vanlig mailbox. Det jag måste ha är möjligheten att ansluta via imap för att kunna arbeta med mailen som vanligt i Outlook, Thunderbird eller något annat mail program. Man kan ju också skapa ett vanligt konto som alla ansluter till, förutom att Google avråder från det eftersom att man kan nå max antalet anslutningar och då bli utelåst från kontot. 

Microsoft har också en molntjänst för mail, Exchange Online. Försökte få fram information på deras hemsida om den tjänsten men tyvärr så är Microsoft riktigt dåliga på att presentera information på sina hemsidor.  De ploppade dock upp en chatruta så då frågade jag. De har ingen gruppmail, fick inte fram någon vettig information från dem vad som gäller om man skapar ett konto som många använder samtidigt. Det största problemet är utrymmet, man kan max ha 50 GB i mailboxen. Fast tar man Exchange Online-abonnemang 2 så får man obegränsat med lagring, fast fortfarande max 50 GB i mailboxen. Logiskt? Nja, men man kan tydligen arkivera mailen och det är det utrymmet som är obegränsat. Så därför faller dras lösning också bort.

Slutade med att jag installerade egen mailserver, bestående av Postfix för SMTP delen och Dovecot för IMAP kontona. För att framtidssäkra lite så installerar vi den med Postfixadmin så vi kan ha obegränsat med domäner och konton på servern.

Här går jag igenom vad som behövs för att installera en mailserver, inklusive DKIM, DSPAM för att skydda vår maildomän och förhindra viss spam. Vi installerar dock inget antivirus eller spamfilter. Det får bli en del två om det skulle behövas. 

Vad behövs

  • En Linux server med fast ip-nummer som inte är svartlistad. Jag använder mig av en Ubuntu 14.04 hostad hos en VPS-leverantör.
  • MySQL databasserver som mailservern kan ansluta till. Antingen på en egen server eller på samma som mailservern. 
  • En webbserver med PHP-stöd, antingen installerad lokalt på mailservern eller en separat server. Här använder jag en separat Ubuntu server med apache. 
  • Minst en domän som du kan ändra DNS värdena på. 
  • Kontroll över brandväggen. Vissa portar till servern måste vara åtkomliga från internet. Port 25 som SMTP ansluter över kan ibland vara spärrat.

Konfigurera DNS

Vi börjar med att ställa in DNS-servern eftersom att det kan ta lång tid innan det uppdateras över hela internet när man ändrar. 

När ett mail ska skickas från en servern till en annan så börjar den sändande servern med att kolla upp MX värden för den domänen. MX värdena är pekare mot adresserna till mailservern, med en prioritet. Så en domän, säg tillexempel example.com, kan ha flera olika MX värdar. Alla med sin prioritet, den med lägst prioritet är den som den sändande servern försöker ansluta till först. Om den inte svarar så fortsätter den med nästa. MX värdena kan inte peka mot en ip-adress direkt utan den måste ange en FQDN till servern. Vi kommer nu att sätta upp två mail servrar så att vi har en backup som tar emot mailen i fall den första ligger nere, "backup" servern kommer då att ta emot mailen och spara dem tills huvudservern är uppe igen. Då kommer den att leverera mailen dit. 

Här utgår jag ifrån att vi har en Bind server igång för domänen och vi lägger bara till två A värdrar och två MX värdrar för mailen. Öppna databasen för domänen ifråga och lägg till nedanstående (ersätt med dina värden). Glöm inte att uppdatera serienummret och säg åt BInd att läsa om värdena.

@                   IN      MX      10      mail
@                   IN      MX      20      mail02
mail            IN        A                192.168.75.24
mail02            IN        A                192.168.75.25

Nu har vi lagt till två värdar för mailservarna. Mail.example.com och mail02.example.com. När någon ska skicka ett mail till oss så kommer den att slå upp våra MX-värdar och får då svaret att mail.example.com har prioritet 10 och mail02.example.com har prioritet 20. Således kommer alla mail i första hand att skickas till huvudservern. Backupservern kommer att bestå av en Postfix installationen på vilken vi lägger till vilka domäner den ska acceptera mail för.

Finns det inga MX värden för en domän så kommer den sändande servern att kolla om det finns några A värdar för domänen. Så om vi inte har några MX för example.com så kommer den att söka upp ett ip nummer för example.com, finns det så kommer den att försöka att skicka till den servern.

Installera nödvändiga paket

Nu börjar vi med att installera paketen som behövs på servern. 

postfix

Mailtransport agenten som ansvarar för att skicka och ta emot mail med andra servrar på internet.

postfix-mysql

Ett tillägg till Postfix som gör det möjligt att hämta informaiton från en MySQL databas istället för konfigurationsfiler.

dovecot-mysql

IMAP/POP3 servern som vi ansluter till när vi ska läsa mailen från vår mailklient. Inklusive tillägg för att hämta information från en MySQL databas.

dovecot-imapd

Tillägg till Dovecot som gör det möjligt att hämta mailen via IMAP.

dovecot-lmtpd

Tillägg till Dovecott så att den kan ta emot mail från Postfix via LMTP. Vi kommer att använda oss av det för att hantera mailen.

dovecot-managesieved

Tillägg till Dovecot som gör det möjligt att skapa filter som körs på servern.

Vi börjar med postfix.

sudo apt-get install postfix postfix-mysql

Under installationen kommer frågan vilken typ av mailserver konfiguration vi vill använda. Där väljer vi Internet.

Image
Val av mail konfiguration i Postfix

Därefter frågar installationen om systemet mail namn. Det här är det som blir den lokala domänen i postfix, eftersom att vi kommer att använda oss av virtuella domäner så är det inte så noga vad vi anger här så länge vi inte anger någon av domänerna som vi ska ha som virtuell domän sen. Alla mail som skickas till domänen som anges här kommer att skickas till lokala användare istället för Dovecots virtuella. Vi kan till exemeplt ange det som mailserverns fulla DNS-adress.

Image
Ange mail domänen till Postfix

Därefter installerar vi Dovecot som hanterar mailboxarna och låter användarna hämta sina mail med hjälp av IMAP, alternativt även med POP3 fast det installerar jag inte stöd för nu (om du vill ha stöd för POP3 så får du även installera dovecot-pop3d)

apt-get install dovecot-mysql dovecot-imapd dovecot-managesieved dovecot-lmtpd

Under installationen kommer frågan om du vill använda ett självsignerat certifikat. Vi kör på den så länge. Nackdelen med självsignerat är att användarna kommer att få frågan om de litar på certifikatet eftersom att det inte är signerat av ett root-certifikat. VI ska testa att intallera certifikat med Lets Encrypt när tid finns. Bara att följa mina instruktioner för att installera letsencrypt med apache, typ. Man får ta alternativet att använda pythonscriptet för att skapa en temporär webbserver. Glöm inte att öppna 443 och 80 i brandväggen. Det här är smidigast att göra efter instruktionen när vi kommer till steget med cert under konfigurationen lite senare i den här guiden.

Image
Ska vi använda självsignerat certifikat i dovecot

När vi väljer att skapa ett eget certifikat så kommer sedan frågan vilket commonName certifikatet ska ha. Här måste vi ange den adressen som mail-klienterna kommer att ansluta till sen.  

Image
Värdnamnet för certifikatet i dovecot

Installera Postfixadmin på webbservern

Postfixadmin är ett administrationsverktyg för virtuella domäner som Postfix och Dovecot hämtar informaiton ifrån. Även frånvarohantering, autoreply och andra funktioner kan användarna själva justera genom att logga in på Postfixadmin.  

Det finns ett färdigt paket i Ubuntu som man kan installera men den versionen är dels gammal plus att den kommer att installera MySQL på webbservern. Vilket kan vara helt ok om man ska köra allt från mailservern eller om man har en kombinerad databas och webbserver. Jag kör alltid databasen på en egen server. Så för att få senaste versionen och slippa MySQL så installerar vi direkt från källkoden, det är inte så komplicerat eftersom att det bara är en databas och en PHP hemsida. 

Vi börjar med att ladda ner senaste versionen av Postfix Admin från sourceforge, 2.8.3 just nu. Observera att 2.93 står som senaste versionen men det är en beta för kommande 3.0-releasen, därför installerar jag 2.8.3 nu. Här finns listan över alla hämtningsbara versioner.

Logga in på webbservern och ladda ner arkivet med wget.

cd ~
wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.8/postfixadmin-2.3.8.tar.gz

Skapa en värd på webbservern för postfixadmin, glöm inte dns-posterna. Därefter packar vi upp PostfixAdmin till katalogen för den värden, här döpd till pfadmin.example.com.

tar -xf postfixadmin-2.3.8.tar.gz -C /var/www/pfadmin.example.com --strip-components=1

För att PostfixAdmin ska kunna hantera IMAP-mapparna så behöver vi även installera php5-imap på webbservern samt aktivera den.

sudo apt-get install php5-imap
sudo php5enmod imap
sudo service apache2 restart

Informationen om de virtuella domänerna sparas i en databas, från vilken alla systemen hämtar informationen om domäner och mailadresser. Vi måste därför skapa den databasen och minst en användare. Antingen skapar vi en användare som används av Postfix, Dovecot och PostfixAdmin eller en för varje system, det är helt upp till dig. Vi börjar med att skapa databasen och första användaren, här gör jag det i terminalen men det går lika bra med PHPMyAdmin eller något anant verktyg. (ersätt xxx.xxx.xxx.xxx med ip-nummret till webbservern)

mysql -u root -p -h db01.example.com
mysql> CREATE DATABASE postfix;
mysql> CREATE USER 'postfix'@'xxx.xxx.xxx.xxx' IDENTIFIED BY 'lösenord';
mysql> GRANT ALL PRIVILEGES ON postfix . * TO 'postfix'@'xxx.xxx.xxx.xxx';
mysql> FLUSH PRIVILEGES;

Redigera config.inc.php i PostfixAdmin och lägg till uppgifterna för databasen och ändra $CONF['configured'] = false; till true. Databasinställningarna är på rad 49 och framåt. Ett tips för att skydda användarnamnet och lösenordet till databasen är att ange de som Env variablar i Apache. För att göra det så lägger du till 

SetEnv DB_USER "postfix"
SetEnv DB_PASS "lösenord"

i apache vhost config filen. Sedan anger du följande som användarnamn och lösenord i config.inc.php.

$CONF['database_user'] = $_SERVER['DB_USER'];
$CONF['database_password'] = $_SERVER['DB_PASS'];

Glöm inte att ändra adressen till databasservern och namnet på databasen, ändra även så att den använder mysqli istället för mysql, skillnaden är att mysqli är nyare och mysql kommer att försvinna inom kort. Det gör du genom att ändra

$CONF['database_type'] = 'mysql';

till 

$CONF['database_type'] = 'mysqli';

Dags att kontrollera så att det fungera och ställa in admin-lösenordet. Starta en webbläsare och besök din nya PostfixAdmin installation http://pfadmin.example.com/setup.php. Nu kommer installationen att kontrolleras och databasen skapas, det tar en liten stund så bara ha tålamod.

Längst ner kan vi sedan ställa in setup-lösenordet, skriv i och klicka på "Generate password hash".

Image
Ställ in adminlösenordet till postfixadmin

På nästa sida står det sedan vad vi ska göra med hashen som kommer, den ska läggas in i config.inc.php under $CONF['setup_password']. När den hashen är inlagd så har vi angett lösenordet som behövs för att man ska kunna komma åt setup.php filen.

När vi har lagt in hashen så skapar vi superadmin kontot. Ange lösenordet som vi precis skapade i rutan för "Setup password", ange sedan mailadress och lösenord till nya superusern.

Nu är PostfixAdmin installerad och redo. Logga in med superadmin som du precis skapade på http://pfadmin.example.com, där kan du sedan ange domäner och mailadresser. De nya domänerna kommer dock inte att fungera än, vi har nämligen inte sagt åt Postfix och Dovecot var de ska hämta informationen.

För att vi ska kunna testa att det fungerar när vi ändrar Postfix och Dovecot så kan du redan nu lägga upp domänen, bocka i "Add default mail aliases:", då skapas mailadresser till abuse, hostmaster,postmaster och webmaster på den domänen. Skapa därefter en mailbox och ett alias som vi kan använda när vi testar.

Ändra Postfix till att hämta domäner och adresser från PostfixAdmin

Postfix är installerad, likaså PostfixAdmin med sin databas från vilken Postfix ska hämta domänerna. Nu ska vi skapa några konfigurationsfiler i vilka vi anger hur informationen ska hämtas.

Vi börjar med informationen om vilka domänerna som finns. Skapa en textfil som heter /etc/postfix/mysql-virt-mail-domains.cf

sudo joe /etc/postfix/mysql-virt-mail-domains.cf

I filen skriver vi (ersätt med dina värden för att ansluta till databasen)

user = postfix
password = lösenord
hosts = db01.example.com
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1

När ett mail kommer till Postfix så kommer SQL-frågan på sista raden att köras och %s ersätts med domänen. 

Först måste vi tala om för Postfix att den ska använda den här filen när den ska söka upp domäner. Antingen redigerar vi /etc/postfix/main.cf och startar om Postfix manuellt eller så använder vi postconf som lägger till raden och säger till Postfix att använda de nya inställningarna direkt.

sudo postconf virtual_mailbox_domains=mysql:/etc/postfix/mysql-virt-mail-domains.cf

Testa om det fungerar med postmap

postmap -q example.com mysql:/etc/postfix/mysql-virt-mail-domains.cf

Den ska returnera domänen. 

Nu går vi vidare med de virtuella mailboxarna. Postfix har en inbyggd funktion som kan placera mailen i rätt mapp på disken, fast för att underlätta så låter vi Dovecot  sköta om den biten. Dock måste Postfix kunna söka upp mailadresserna och kolla så att de finns innan den accepterar mailen från avsändaren. Vi skapar därför /etc/postfix/mysql-virt-mailbox.cf.

sudo joe /etc/postfix/mysql-virt-mailbox.cf

I filen skriver vi

user = postfix
password = lösenord
hosts = db01.example.com
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

Sedan har vi alias domäner. Aliasdomäner är domäner som är ett alias för en annan domän, till exempel kan vi ange att example.org är ett alias till example.com. Då kommer alla mail till .org adresserna att skickas till mailboxen för den adressen i .com domänen istället.

skapa  /etc/postfix/mysql-virt-alias-domains-mailbox.cf

sudo joe /etc/postfix/mysql-virt-alias-domains-mailbox.cf

I den här filen skriver vi, observera att query ska vara på en rad.

user = postfix
password = lösenord
hosts = db01.example.com
dbname = postfix
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' AND mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'

Säg till Postfix att använda ändringarna

sudo postconf "virtual_mailbox_maps=mysql:/etc/postfix/mysql-virt-mailbox.cf, mysql:/etc/postfix/mysql-virt-alias-domains-mailbox.cf"

Testa med vår test-konto som vi skapade när vi installera PostfixAdmin

postmap -q test@example.com mysql:/etc/postfix/mysql-virt-mailbox.cf

Den ska returna "test@example.com" om det fungerar.

Dags för aliasadresser, alias är mailadresser som inte har en egen mailbox utan de skickas direkt vidare till en annan adress och sparas i den mailboxen istället. Så nu skapar vi /etc/postfix/mysql-virt-alias.cf. 

sudo joe /etc/postfix/mysql-virt-alias.cf

I den filen skriver vi 

user = postfix
password = lösenord
hosts = db01.example.com
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'  

Sedan har vi alias domänerna igen. 

skapa  /etc/postfix/mysql-virt-alias-domains.cf

sudo joe /etc/postfix/mysql-virt-alias-domains.cf

I den här filen skriver vi, observera att query ska vara på en rad.

user = postfix
password = lösenord
hosts = db01.example.com
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' AND alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

Ifall man vill använda sig av catchall adresser så behövs en till fil. Den här kan man dock skippa om man inte vill använda catchall, vilket man inte vill. En catchall är aldrig en bra lösning. Finns mer info om varför man inte ska ha catchall här.

skapa  /etc/postfix/mysql-virt-alias-domains-catchall.cf
sudo joe /etc/postfix/mysql-virt-alias-domains-catchall.cf

I den här filen skriver vi.

user = postfix
password = lösenord
hosts = db01.example.com
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' AND alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

Aktivera i Postfix

sudo postconf "virtual_alias_maps=mysql:/etc/postfix/mysql-virt-alias.cf, mysql:/etc/postfix/mysql-virt-alias-domains.cf, mysql:/etc/postfix/mysql-virt-alias-domains-catchall.cf"

och slutligen testa

postmap -q alias@example.com mysql:/etc/postfix/mysql-virt-alias.cf

Den ska returnera adressen som mailen ska vidarebefordras till. Här testar jag inte alias-domäner eller några catchall-adresser. 

I de här filerna som vi nu skapade så har vi lösenorden till MySQL i klartext, därför vill vi begränsa åtkomsten så att bara Postfix kan läsa filerna. Först ändrar vi ägare och gruppen för filerna till postfix.

sudo chown postfix:postfix mysql-*

Därefter ser vi till att bara ägaren och gruppen kan läsa filerna.

chmod u=rw,g=r,o= /etc/postfix/mysql-*

Nu är Postfix vara konfigurerad för att ta emot mail för alla adresser som konfigureras i PostfixAdmin. Nästa steg är att konfigurera Dovecot att hantera mailen.

Konfigurera Dovecot att hantera virtuella mailboxar från MySQL

Nu ställer vi Dovecot att hämta mailen från Postfix, köra eventuella filter och spara ner dem i rätt mapp. IMAP aktiveras också så att användarna kan ansluta till Dovecot med sitt mailprogram och hämta mailen.

Först skapar vi en användare och grupp som kommer att äga alla mailen till de virtuella användarna. Hade vi haft lokala användare istället för virtuella så hade de rätta ägarna ägt filerna men det fungerar inte nu när de inte har riktiga konton på servern. Vi skapar alltså gruppen virtmail och en användare med samma namn, standard gruppen för användaren är gruppen virtmail. Här tilldelas de grupp id 150 och user id 150, kontrollera så att de inte används först. Hemkatalogen för anvädnaren blir /var/virtmail, här kommer alla mailen att sparas. Här bör vi ha en separat stor partition monterad så att inte servern kraschar om den blir full. 

sudo groupadd -g  150 virtmail
sudo useradd -g virtmail -u 150 virtmail -d /var/virtmail -m

Om du redan har monterat en partition här och katalogen finns så kommer useradd att gnälla på att katalogen redan finns. Du får då även se till att katalogen har rätt ägare och rättigheter.

chown -R virtmail:virtmail /var/virtmail

Alla konfigurationsfiler för Dovecot laddas från /etc/dovecot/conf.d, filerna är döpta i formen XX-YYY.conf. XX är två siffror och YYY är själva namnet. Det finurliga här är de två siffrorna ser till att filerna läses in i rätt ordning och man kan då redigera vissa delar och man har koll på i vilken ordning de olika inställningarna läses in. Ändrar man en variabel på två ställen så är det den sista som sparas i Dovecot.

10-auth.conf

Om du har användare som fortfarande använder Outlook Express (win XP) eller Microsoft Mail ( VIsta) så bör du se till så att de uppgraderar snart. Men om de ska kunna logga in så måste du tillåta att de kan ansluta med LOGIN metoden. Det gör du genom att lägga till login efter plain så det ser ut enligt nedan, finns på rad runt 100.

auth_mechanisms = plain login

Längst ner anger vi vilken metod som ska användas för att slå upp giltiliga användare. Som standard används system användarna vilket vi inte vill nu utan den ska slå upp det i vår SQL databas. Kommentera bort raden för auth-system och aktivera auth-sql istället. Det ska se ut enligt nedanstående.

#!include auth-system.conf.ext
!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext

auth-sql.conf.ext

Som standard så söker Dovecot upp vilken användare och grupp som ska äga mailfilerna från SQL-databasen. Eftersom att vi har en användare och grupp för alla så ändrar vi det till statisk information. Kommentera därför bort den aktiva userdb sektionen och aktivera den längst ner med driver = statich och ändra så det ser ut enligt nedan.

userdb {
   driver = static
   args = uid=virtmail gid=virtmail home=/var/virtmail/d%/%n
}

%d ersätts med domänen och %n med användaren i mailadressen, alltså det som står till vänster om @ i mail-adressen. Mail till george@example.com kommer alltså att sparas i  /var/virtmail/example.com/george. Mer information om variablar som du kan använda finns på wikin för Dovecot.

10-mail.conf

Här anger vi var Dovecot letar efter mailen till en viss användare och om vi ska använda mbox formatet eller maildir. Mbox är när alla mailen sparas i en fil, maildir så sparas alla som separata filer. Finns mycket information på nätet om för och nackdelar men generellt så är maildir bättre. Ändra mail_location till samma som vi angav i föregående sektion med ett Maildir på slutet. Runt rad 30

mail_location = maildir:/var/virtmail/%d/%n/Maildir

Längre ner (runt rad 42 ) aktiverar vi separator och anger den till /. Det ser till att mappstrukturen blir /var/virtmail/example.com/george/Maildir/INBOX/mapp/. Mappstrukturen i IMAP speglas sig även på disken. 

separator = /

Slutligen behöver vi ändra first_valid_uid, runt rad 168. Standard är att användare med Id under 500 inte får skicka några mail. Eftersom att vanliga användare i Ubuntu har Id 100 och uppåt så kan det annars strula i slutet när vi ska testa systemet. Här ändrar vi det till 100.

first_valid_uid = 100

10-master.conf

Här anger vi vilka tjänster som Dovecot tillahandahåller till andra processer och klienter, till exempel POP3 och IMAP. Här behöver vi aktivera smtp-auth för Postfix för vi vill att Postfix ska anvädan Dovecot som autentisieringstjänst. Runt rad 98 aktiverar vi och ändrar sökvägen för socketen som Dovecot ska aktivera. Eftersom att Postfix körs i en chroot jail i /var/spool/postfix så måste vi se till att Postfix kan komma åt den.

# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
    mode = 0666
}

10-ssl.conf

Under installationen av Dovecot så skapades ett självsignerat certifikat. Sökvägen anges i den här filen runt rad 12. Här ändrar vi sökvägen när vi skapar andra certifikat sen.

ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.pem

Med letsencrypt certifikat

ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem

På rad 6 aktiverar vi SSL/TLS stöd. 

# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = yes

15-mailboxes.conf

Här aktiverar vi mapparna för skräppost, utkast och papperskorgen så att de finns när anvädaren loggar in. Skräpposten kommer inte att användas just nu men då är det klart när vi installerar SpamAssassin senare. Papperskorgen och draft behövs bland annat när vi installerar en webbmail.

mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
mailbox Junk {
    auto = subscribe
      special_use = \Junk
}
mailbox Trash {
    auto = subscribe
    special_use = \Trash
}

/etc/dovecot/dovecot-sql.conf.ext

Den här filen talar om för Dovecot hur den ansluter till databasen, det är alltså här vi anger användarnamn och lösenord.

Filen är full med kommentarer så det är rätt enkelt att hitta. Den snabba korta versionen är att bara lägga till nedanstående längst ner.

driver = mysql
connect = host=db01.example.com
dbname=pfadmin
user=mailuser
password=Lösenord
default_pass_scheme = MD5-CRYPT
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1' 

Det mesta är rätt självförklarande. Default_pass_scheme är vilket metod lösenorden är krypterade med, eftersom att PostfixAdmin använder MD5 som standard så kör vi på det nu. På sikt ska det ändras till SHA-256 eller SHA-512 men jag hinner inte grotta ner mig i hur man ändrar det i PostfixAdmin just nu.

Password_query är SQL-frågan som körs när Dovecot behöver slå upp en användare och lösenord. username i databasen är mailadressen och när vi loggar in så ersätts %u med inloggningsnamnet. Tillbaka får vi mailadressen (användarnamnet) och hashen av lösenordet. %u ersätts av användarnamnet när frågan körs.

Slutligen startar vi om Dovecot.

sudo service doveadm reload

Kolla så att det inte är några felmedelanden i loggen

tail /var/log/mail.log

Se till så att Postfix levererar mailen genom Dovecot

Postfix vet nu vilka mail den ska ta emot genom att slå upp det i databasen, men vi har inte sagt vad den ska göra med mailen. Det finns två metoder. Antingen så låter vi Postfix leverera mailen till rätt mailbox genom den inbyggda MDA (Mail Delivery Agent) som kallas "virtual" eller så skickar vi över dem till Dovecot. Eftersom att vi ändå har Dovecot installerad och den ger oss många möjligheter med till exempel sieve regler så kör vi på den. 

Kopplingen mellan Postfix och Dovecot kan antingen göras med den den gamla Dovecot-LDA (Local Delivery Agent), Den kan hantera ett mail i taget och det startas en ny process för varje mail. Eller så använder vi det nya LMTP-protokollet. Den kan hantera multipla mottagare och är alltid igång och väntar på nya mail, vilket ger oss en bättre prestanda.

Vi kör alltså med LMTP för kopplingen mellan Postfix och Dovecot. Öppna 10-master.conf och leta reda på raderna för service lmtp.

sudo joe /etc/dovecot/conf.d/10-master.conf

Runt rad 48 finns service lmtp. Ändra till eller kommentera bort befintliga rader och lägg till nedanstående

service lmtp {
    unix_listener /var/spool/postfix/private/dovecot-lmtp {
        group = postfix    
        mode = 0600
        user = postfix
    }
}

Nu kommer Dovecot att skapa en Unix socket i /var/spool/postfix/private/dovecot-lmtp eftersom att den ligger i Postfix chroot miljö så kommer Postfix att kunna ansluta genom den här.

Starta om Dovecot

sudo doveadm reload

Postfix hanterar mailleveransen genom det vi anger som "virtual_transport" därför anger vi i den variabeln att mailen ska skickas med LMTP till den Unix socketen som vi sa åt Dovecot att skapa i Postfix chroot miljö.

sudo postconf virtual_transport=lmtp:unix:private/dovecot-lmtp

Skicka mail med SMTP autentisiering

Det som kvarstår för att kunna skicka mail nu är att vi ska kunna skicka mail via vår nya server. Tyvärr kan man inte bara ställa in servern till att skicka vidare alla mail som inte har lokala mottagare. Det som händer då är att man har skapat något som kalas "open relay", det kommer inte dröja länge innan några upptäckter det och skickar spam via vår server. Sprider vi spam så dröjer det inte länga innan vi blir svartlistade och då blir det svårt att skicka mail, många mailservrar kommer sluta att ta emot våra mail. För att stoppa det så måste mailklienterna logga in först innan de kan skicka mail till mottagare so inte finns lokalt på servern.

Vi kan även tillåta att vissa nätverk får skicka via servern, till exempelt webbservern om vi har en webbmail installerad på den, eller användare på vårat lokala LAN. Det ändras i mynetwork inställningen

sudo postconf 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 YYY.ZZZ.XXX.YYY

Inloggningen löser vi genom att Postfix fråga Dovecot. Ett par ändringar så är det igång.

sudo postconf smtpd_sasl_type=dovecot
sudo postconf smtpd_sasl_path=private/auth
sudo postconf smtpd_sasl_auth_enable=yes

Och så aktiverar vi kryptering på SMTP inloggningen.

sudo postconf smtpd_tls_security_level=may
sudo postconf smtpd_tls_auth_only=yes
sudo postconf smtpd_tls_cert_file=/etc/dovecot/dovecot.pem
sudo postconf smtpd_tls_key_file=/etc/dovecot/private/dovecot.pem

Med Letsencrypt så får vi välja certifikatet från den istället.

sudo postconf smtpd_tls_security_level=may
sudo postconf smtpd_tls_auth_only=yes
sudo postconf smtpd_tls_cert_file=/etc/letsencrypt/live/mail.example.com/fullchain.pem
sudo postconf smtpd_tls_key_file=/etc/letsencrypt/live/mail.example.com/privkey.pem

Nu ska vi kunna skicka mail via port 25, jag kan ansluta från servern till servern. Tyvärr fungerar det inte från min dator hemma till mailservern, det ser ut som att det beror på att min internet leverantör spärrar port 25. Men inga problem vi ska ändå öppna upp en till port, nämligen 587 som är tänkt att använas av klienter när de ansluter till SMTP servern. Många klienter använder fortfarande port 25 så båda två behöver vara öppna.

Vi lägger även till en spärr så att en användare inte kan fakea en avsändare. Vi säkerställer alltså att den avsändaraddressen som användaren loggar in med är den som är avsändaren på mailet. Först skapar vi /etc/postfix/mysql-mail2mail.cf i vilken vi skriver följande.

user = postfix
password = lösenord
hosts = db01.example.com
dbname = postfix
query = SELECT username AS email FROM mailbox WHERE username='%s'

Den här fungerar som så att om en användare ska skicka ett mail från test@example.com så kommer Postfix att söka upp den adressen från PostfixAdmin, om raden finns så får Postfix användarnamnet tillbaka. Då godkänns mailet och det skickas. Skulle användare ange fel avsändaradress så kommer SQL-frågan inte att returnera något och mailet nekas.

Då öppnar vi upp port 587 för mailtrafik från klienterna. Redigera /etc/postfix/master.cf och lägg till nedanstående över den befintliga #submission, aktivera inte de befintliga raderna utan bara lägg till nedanstående. Alternativt redigera och avkommentera raderna.

submission inet n - - - - smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sender_login_maps=mysql:/etc/postfix/mysql-mail2mail.cf
  -o smtpd_sender_restrictions=reject_sender_login_mismatch
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

Det här aktiverar en ny SMTP daemon som lyssnar på port 587 med lite extra inställningar. I loggen kommer anslutningarna till den här porten att heta postfix/submission/smtpd (syslog_name), vi tvingar på kryptering (smtpd_tls_security_level), användaren måste logga in (sasl raderna) och kontrollerar att den inloggade användaren är den som är avsändaren (smtpd_sender_login_maps). 

Slutligen startar vi om Postfix.

sudo service postfix restart

Testa mailleverans

Fungerar allt nu? Mycket arbete men vi har ingen aning om det fungerar. Så nu testar vi att skicka lite mail för att se så att det fungerar. Först installerar vi mailutils för att kunna skicka mail.

sudo apt-get install mailutils

Öppna logfilen i en terminal för att se vad som händer.

tail -f /var/log/mail.log

I en annan terminal skickar vi ett mail genom att pipe texten till mail. 

echo test | mail test@example.com

I det första terminalfänstret med loggen så bör någor liknande nedanstående komma.

Jan  3 22:41:43 mail postfix/pickup[10986]: F080E82E1A: uid=1000 from=<user@mail.example.com>
Jan  3 22:41:43 mail postfix/cleanup[11299]: F080E82E1A: message-id=<20160103214143.F080E82E1A@mail.example.com>
Jan  3 22:41:43 mail postfix/qmgr[10987]: F080E82E1A: from=<user@mail.example.com>, size=326, nrcpt=1 (queue active)
Jan  3 22:41:44 mail dovecot: lmtp(11311): Connect from local
Jan  3 22:41:44 mail dovecot: lmtp(11311, test@example.com): jkNZA5iViVYvLAAAs/fTQA: msgid=<20160103214143.F080E82E1A@mail.example.com>: saved mail to INBOX
Jan  3 22:41:44 mail postfix/lmtp[11310]: F080E82E1A: to=<test@example.com>, relay=viggen.example.com[private/dovecot-lmtp], delay=0.14, delays=0.0
2/0.02/0.05/0.05, dsn=2.0.0, status=sent (250 2.0.0 <test@example.com> jkNZA5iViVYvLAAAs/fTQA Saved)
Jan  3 22:41:44 mail dovecot: lmtp(11311): Disconnect from local: Successful quit
Jan  3 22:41:44 mail postfix/qmgr[10987]: F080E82E1A: removed

DIn text ser inte likadan ut men om du ser texten som är fet så bör det fungera. Kontrollera om filen för mailet har sparats i användarens katalog med hjälp av find. Skriv:

sudo find /var/virtmail/beresor.com/test/Maildir/

och resultaten bör bli liknande nedanstående

/var/virtmail/example.com/test/Maildir
/var/virtmail/example.com/test/Maildir/tmp
/var/virtmail/example.com/test/Maildir/dovecot-uidvalidity
/var/virtmail/example.com/test/Maildir/dovecot.index.cache
/var/virtmail/example.com/test/Maildir/new
/var/virtmail/example.com/test/Maildir/new/1451856407.M406401P10504.mail01,S=551,W=565
/var/virtmail/example.com/test/Maildir/dovecot-uidlist
/var/virtmail/example.com/test/Maildir/cur
/var/virtmail/example.com/test/Maildir/dovecot.index.log

Raden med fet text är vårat mail. Kolla så att det verkligen stämmer genom att läsa filen.

sudo cat /var/virtmail/example.com/test/Maildir/new/1451856407.M406401P10504.mail01,S=551,W=565

Return-Path: <user@mail.example.com>
Delivered-To: <test@example.com>
Received: from mail.example.com
       by mail.example.com (Dovecot) with LMTP id mJcUGBeSiVYIKQAAs/fTQA
       for <test@example.com>; Sun, 03 Jan 2016 22:26:47 +0100
Received: by mail.example.com (Postfix, from userid 1000)
       id 806B382ECA; Sun,  3 Jan 2016 22:20:19 +0100 (CET)
To: <test@example.com>
X-Mailer: mail (GNU Mailutils 2.99.98)
Message-Id: <20160103212019.806B382ECA@mail.example.com>
Date: Sun,  3 Jan 2016 22:20:19 +0100 (CET)
From: user@mail.example.com

test

Nu är du redo att testa med en mailklient. Är lärdom jag har gjort nu är att Thunderbird inte är den bästa att testa med. Den kommer nämligen bara säga att den inte lyckas ansluta till servern utan att säga något om varför. Claws är bättre då man kan få fram en logg med vad som gick fel. 

Säkra ditt namn och begränsa spam med DMARC, SPF och DKIM

Mail är en väldigt osäker teknik. Det är fullt med spam och folk försöker lura med phishing, det värsta är att de kan försöka göra det i ditt namn! Det finns tre tekniker som är framtagna i ett försök att minska på det här. De är:

  • SPF Sender Policy Framwork, den talar om för andra vilka mailservrar som får skicka mail i ditt namn.
  • DKIM Domain Keys Identified Mail, använder kryptering och DNS för att verifiera att mailet verkligen är skickad från vår server och att ingen har ändrat på mailet på vägen.
  • DMARC Domain Based Message Authentication, Reporting and Conformance, bygger vidare på SPF och DKIM och implementerar en policy och rapporteringssystem.

VI ska nu implementera de här teknikerna på våran mail-servern. Vi kommer inte att stoppa några mail som inte klarar kontrollen, bara för att inte missa några mail. Däremot kommer vi att kontrollera och lägga till resultaten i huvudet på mailet, då har vi den informationen den dagen vi installerar spam-kontroll på servern.

Lägg till SPF

Vem som helst ska inte få skicka mail i ditt namn så därför lägger vi till en SPF-post i DNSen som talar om för alla andra mailservrar vilka servrar som är tillåtna att skicka mail i vårat namn. SPF-posten är ett vanlig TXT värde i vår domän, i den anger vi att den är en SPF av version 1 efterföljt av de värden vi vill ha. Det finns massa att läsa om det på Internet därför lägger vi bara till en här utan massa långa förklaringar, den här godkänner att alla våra MX värdar får maila och på alla andra gör vi en softfail. Med softfail så godkänner vi att det kan skickas mail med andra servrar men att mottagande server ska markera att det inte kommer från rätt server. Med - istället för ~ så blir det en Fail och då ska mottagande server vägra att leverera mailet, kan vara lite riskabelt om vi inte är hundra på att inga mail kan skickas från andra servrar. Så länge det är människor inblandade så kan det ske, ja jag kan vara lite nojig.

Lägg till följande på din DNS-server för din domän.

@                IN        TXT     "v=spf1 mx ~all"

Nu vet alla andra servar vilka servrar som är godkända. Men vi kontrollerar inte mailen som vi tar emot, för att göra det behöver vi installera ett paket som heter postfix-policyd-spf-python. Sedan kan vi bestämma vad vi ska göra med mailen. Så först installerar vi.

sudo apt-get install postfix-policyd-spf-python

Sedan redigerar vi  /etc/postfix-policyd-spf-python/policyd-spf.conf och ändrar följande.

HELO_reject = False
Mail_From_reject = False

Alla mail kommer att godkännas men i huvudet kommer det att markeras om SPF-kontrollen misslyckas, den informationen kan vi sedan bearbeta när vi installerar spam-filter. Därefter aktiverar vi den i Postfix. Först lägger vi till policy-spf_time_limit, den säkerställer att spf-servern inte hänger sig om något går fel utan den avslutar efter timeout tiden. 

policy-spf_time_limit = 3600s

Sedan lägger vi till kontrollen av SPF. Om du kör Postfix före 2.10 så har finns inte smtpd_relay_restrictions så då läggs den till på smtpd_recipient_restrictions men då måste du se till att den hamnar efter reject_unauth_destination, annars öppnar du upp din mailserver som en open relay för alla som har giltliga SPF. För mer information, kolla dokumentationen för Postfix.

Före Postfix 2.10 (allt på en rad)

smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,check_policy_service unix:private/policy-spf

Om du kör Postfix 2.10 eller senare så lägger vi till nedanstående under rader smtpd_relay_restrictions i /etc/postfix/main.cf.

smtpd_recipient_restrictions = check_policy_service unix:private/policy-spf

Sedan lägger vi till följande i slustet på /etc/postfix/master.cf, det här lägger till tjänsten för att kontrollera spf i Postfix.

policy-spf  unix  -       n       n       -       -       spawn     user=nobody argv=/usr/bin/policyd-spf

Sedan är det bara att starta om Postfix och kontrollera så att det inte är några felmedelanden i loggen.

sudo service postfix restart
tail /var/log/mail.log

Loggen bör se ut ungefär enligt nedan om det fungerar.

Jan  15 20:53:51 mail postfix/master[2574]: terminating on signal 15
Jan  15 20:53:52 mail postfix/master[26774]: daemon started -- version 2.11.0, configuration /etc/postfix

Fungerar det?

Enklaste sättet att testa är att skicka ett mail till en extern adress som har implementerat SPF. Gmail är bra till det här. Så skicka ett mail från din server till en gmail adress. Öppna mailet och klicka på knappen uppe till höger, välj "Visa original", ett nytt fönster öppnas som visar hela huvudet på mailet.

Image
Kontrollera om SPF kontrollen fungerar hos gmail

Ungefär i mitten bör du se spf=pass om det fungerar, har du en Fail eller Softfail så är det dags att kontrollera DNSen. Det kan också vara så att DNS-värdena inte har hunnit slå igenom överallt.

Authentication-Results: mx.google.com;
spf=pass (google.com: domain of test@example.com designates XXX.YYY.XXX.YYY as permitted sender)

För kontrollera om Postfix kontrollera SPF så öppnar du ett mail som är skickat efter att vi har lagt till kontrollen och ser om vi har en rad liknande nedanstående i huvudet.

Received-SPF: Pass (sender SPF authorized) identity=mailfrom;

Grattis det fungerar, dags för DKIM.

Lägg till DKIM med ADSP

DKIM är lite mer komplicerad än SPF, den signerar mailen talar om för mottagande server hur signaturen ska se ut. Det görs genom att kryptera bodyn i mailen och vissa fält i huvudet och sen lägger till hash av resultatet. Mottagande server gör en DNS-uppslagning för att hämta nyckeln från ett TXT värde i DNSen och kontrollerar hashen mot nyckeln och kan då se om mailet kommer från vår server och om det är någon som har ändrat något på vägen.

Vi börjar med att installera nödvändiga paket.

sudo apt-get install opendkim opendkim-tools

Därefter redigerar vi /etc/opendkim.conf och lägger till följande i slutet. Det här gör det möjligt att hantera DKIM för flera domäner, eller bara en. Vi 

KeyTable           /etc/opendkim/key_table
SigningTable       /etc/opendkim/signing_table
ExternalIgnoreList /etc/opendkim/trusted_hosts
InternalHosts      /etc/opendkim/trusted_hosts
AutoRestart             Yes
AutoRestartRate         10/1h
Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256
Canonicalization        relaxed/simple
UserID                  opendkim:opendkim

trusted_hosts filen talar om för opendkim vilka domäner som kan använda nycklarna och vilka värdar som är våra interna. Utgående mail från de interna värdarna kommer att signeras och signaturen på mail från de domänerna/värdarna kommer inte att kontrolleras.

Skapa katalogen som vi kommer att spara filerna i och filerna som behövs.

sudo mkdir /etc/opendkim
sudo touch /etc/opendkim/key_table
sudo touch /etc/opendkim/signing_table
sudo touch /etc/opendkim/trusted_hosts

Så skapa och redigera /etc/opendkim/trusted_hosts och lägg till dina värdar och domäner så att den ser ut som enligt nedan.

127.0.0.1
hostname1.example.com
example.com
hostname1.example1.com
example1.com

Dags att skapa nycklarna för alla domäner som ska signeras. Skapa först en katalog för varje domän som ska hanteras.

sudo mkdir /etc/opendkim/example.com
sudo mkdir /etc/opendkim/example1.com

Sedan skapar vi nycklarna för alla domänerna.

cd /etc/opendkim/example.com
opendkim-genkey -s mail -d example.com
cd /etc/opendkim/example1.com
opendkim-genkey -s mail -d example1.com

Öppna key_table, den här filen talar om för opendkim var nycklarna till alla domäner finns.  Den ska se ut enligt nedanstående.

mail._domainkey.example.com example.com:mail:/etc/opendkim/example.com/mail.private

Varje rad består av 

  1. mail._domainkey.example.com är NyckelID för domänen. Den byggs upp enligt väljare._domainkey.example.com, väljaren bestämdes med -s i opendkim-genkey. -d var domänen (example.com).
  2. example.com är domänen som den gäller för.
  3. mail är väljaren.
  4. Slutligen sökvägen till den privata nyckeln /etc/opendkim/example.com/mail.private  

Sedan redigerar vi signerings tabellen /etc/opendkim/signing_table. I den här filen lägger vi till en rad til varje domän som ska signeras. Varje rad består av domänen och nyckelid enligt nedan.

example.com mail._domainkey.example.com
example1.com mail._domainkey.example1.com

Ändra ägaren till alla filerna så att opendkim kan läsa filerna.

sudo chown -R opendkim:opendkim /etc/opendkim/

För att Postfix ska kunna ansluta till Opendkim så behöver vi skapa en Unix socket som Postfix kommer åt i sin chroot. Redigera /etc/default/opendkim och lägg till följande rad.

SOCKET="local:/var/spool/postfix/var/run/opendkim/socket"

Eftersom att private katalogen ägs av postfix så kan inte opendkim skriva till den katalogen, därför skapar vi katalogerna där som ägs av opendkim och så lägger till vill postfix till gruppen opendkim. Slutligen ser vi till så att användare i gruppen kan skriva till opendkim katalogen.

sudo mkdir /var/spool/postfix/var
sudo mkdir /var/spool/postfix/var/run
sudo mkdir /var/spool/postfix/var/run/opendkim
sudo chown opendkim:opendkim /var/spool/postfix/var/run/opendkim
sudo usermod -a -G opendkim postfix 
sudo chmod 0770 /var/spool/postfix/private/opendkim

Nu kan vi tala om för Postfix att den ska använda Opendkim på mailen.

sudo postconf "milter_protocol = 6"
sudo postconf "milter_default_action = accept"
sudo postconf "smtpd_milters = local:var/run/opendkim/socket"
sudo postconf "non_smtpd_milters = local:var/run/opendkim/socket"

För att de mottagande servarna ska kunna få vår nyckel så de kan kontrollera hashen så måste vi lägga till den i vår zon på DNSen. Det smidiga är att vad vi ska skriva in på vår TXT är redan färdigt. Öppna upp /etc/opendkim/example.com/mail.txt och lägg till raden i din zon-fil för Bind. 

Nu kan vi starta om alla tjänsterna och sedan testa.

sudo service opendkim restart
sudo service postfix restart
sudo service bind9 restart

Tester är likadant som för SPF, skicka ett mail till gmail (eller någon annan som du vet gör kontrollerna) och skicka ett mail tillbaka och kontrollera om dkim=pass finns med i huvudet av mailen.

Nu kan mottagande server kontrollera signaturen och se att mailet verkligen kommer från oss. Men hur ska de veta att mailen ska innehålla en signatur? Vem som helst skulle kunna skicka ett mail som ser ut att komma från din domän och bara strunta i signaturen, mottagande server vet ju inte att de ska vara signerade. Lösningen heter ADSP (Author Domain Signing Practices),  ADPS talar om för mottagande server vad de ska göra med osignera mail. Återigen är det bara en TXT post i DNSen som vi använder oss av. Så vi skapar en TXT i domänen och lägger till en tag i den "dkim=all". Den här talar om för mottagande server att alla mail ska vara signerade. Det finns tre olika värden man kan använda.

  1. unknown - Både signerade och osignerade mail är giltliga. Det är standard värdet om vi inte skapar en DNS-post
  2. all - Alla mail ska vara signerade. Men osignerade mail ska fortfarande godkännas.
  3. discardable - Alla mail är signerade och om ett mail inte är signerat så ska det raderas. Brukar normalt inte behövs men om ni sysslar med finansiell information så kan det vara aktuellt. Ta Payex som exempel.

Så lägga til följande rad på din DNS-server.

_adsp._domainkey    IN        TXT        "dkim=all"

 

Sista säkerhetssteget DMARC

Todo later ... 

Säkra traffiken mot andra mailserver med kryptering

För att inte alla ska kunna läsa mailen som skickas till andra servrar så är det bästa att även kryptera traffiken mot andra mailservrar, plus att bland annat gmail markerar mail som inte skickas krypterat till deras mailservrar med ett rött hänglås.

En liten rad att lägga (eftersom att vi redan har lagt till kryptering mellan klienterna och servern och då skapada certifikatet).

sudo postconf 'smtp_tls_security_level = may'

Sedan kan vi även aktivera loggning på den krypterade trafiken för att se så allt fungerar.

sudo postconf 'smtp_tls_loglevel = 1'
sudo postconf 'smtpd_tls_loglevel = 1'

Raden medd smtpd är för traffiken mellan mailklienterna och servern, medans smtp raden är för trafiken mellan vår server och andra servrar.

Nu kan vi kolla i /var/log/mail.log och se om det fungerar. Testa att skicka ett mail till en gmailadress och kolla sedan i loggen, eller följ loggen med tail -f /var/log/mail.log och se om det finns någon information om kryptering på raden där mailet skickas mot gmail. Något liknande följande kan vara med, här står det att mailet skickades med  Elliptic Curve Ephemeral diffie-Hellman (ECDHE) nyckelutbyte.

TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256

Låta användarna skapa AutoReply/out Of Office Reply

Postfix har ett plugin för AutoReply men den är tyvärr inaktiverad som standard. Därför ska vi nu aktivera den så vi kan skicka autoreply på mail. Reply mailen hanteras genom att om en användare har ställt in ett frånvaromeddelande så läggs det till ett alias i deras konto och en kopia av mailen skickas till autoreply tjänsten. Scriptet som vi nu ska aktivera kommer att ta hand om alla de mailen och skicka ett svar. Som standard skickas det bara en gång. 

Först måste vi installera lite Perl beroenden. 

sudo apt-get install libmail-sender-perl libdbd-mysql-perl libemail-valid-perl libmime-perl liblog-log4perl-perl liblog-dispatch-perl libgetopt-argvfile-perl libmime-charset-perl libmime-encwords-perl

Sedan lägger vi till en användare och grupp som vi använder för att hantera autoreply mailen. Anledningen till att vi har en separat användare för det är för att den kommer att hantera alla mailen som eventuellt kan innehålla skadlig kod. Den här användaren kommer aldrig att användas för att logga in med och bör således spärras från den möjligheten (därför anger vi shell till /sbin/nologin). Användaren får hemkatalogen /var/spool/vacation i vilken alla temporära filer kommer att lagras.

sudo groupadd -r -g 151 vacationmail
sudo useradd -r -u 151 -g vacationmail -m -d /var/spool/vacation -s /sbin/nologin vacationmail

Nu behöver vi en fil från PostfixAdmin installationen. Om den är installerad på samma server som mailservern så kan vi kopiera den direkt därifrån. Annars är det enklaste att ladda ner installationsfilerna och kopiera filen. Så vi laddar ner PostfixAdmin till mailservern,

wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.8/postfixadmin-2.3.8.tar.gz

Packa upp

tar -xf postfixadmin-2.3.8.tar.gz

kopiera vacataion.pl filen och ändra till rätt ägare och grupp.

sudo cp postfixadmin-2.3.8/VIRTUAL_VACATION/vacation.pl /var/spool/vacation/
sudo chown vacataionmail:vacationmail /var/spool/vacation.pl
sudo chmod u+x /var/spool/vacation/vacation.pl

Lägg till dina värden i vacation scriptet.

sudo joe /var/spool/vacation.pl

Runt rad 119 och neråt ligger värdena för databasanslutningen. Glöm inte att ändra databastyp till mysql om du inte använder postgree på rad 114.

På rad 125 ändrar vi vilken domän som ska användas för autoreply tjänsten.

our $vacation_domain = 'autoreply.example.org';

Ändra den till vad du vill att den ska vara. Lägg även till den i host filen på mailservern eller som A-record i domänen.

För att få det till att fungera så fick jag även ändra mailservern som den ska skicka med till adressen för mailservern. Alltså rad 128 ändras.

our $smtp_server = 'mail01.example.com';

Som standard skickas ett autoreply bara en gång. Det går att ändra på rad 162, ändra tidsintervallet i sekunder hur ofta ett mail ska skickas 86400 här nedan motsvarar en gång per dyng.

our $interval = 86400;

Vid felsökning så kan man aktivera loggning genom att se till att vactanionmail användaren kan skriva till loggfilen som anger på rad 151 (our $logfle='/var/log/vacation.log';). Därefter aktiverar man loggen genom att ändra rad till en etta på rad 155.

our $log_to_file = 1;

Nu lägger vi till vacation scriptet som en transport typ i postfix.

sudo joe /etc/postfix/master.cf

lägg till nedanstånde, jag lägger den längst ner.

vacation    unix  -       n       n       -       -       pipe   flags=Rq user=vacationmail argv=/var/spool/vacation/vacation.pl -f ${sender} -- ${recipient}

Postfix måste sen använda en transport maps fil som vi först skapar 

sudo joe /etc/postfix/transport

och lägger till vår autoreply domän.

autoreply.yourdomain.com        vacation:

Fixa rättigheterna.

sudo chown postfix:postfix  /etc/postfix/transport

Sedan talar vi om för postfix att använda den filen.

sudo joe /etc/postfix/main.cf

I slutet av filen lägger vi till.

transport_maps = hash:/etc/postfix/transport 

Sedan skapar vi den hashade databasen som postfix använder.

sudo postmap /etc/postfix/transport

och så säger vi till postfix att läsa in våra nya inställningar.

sudo postfix reload

Dags att aktivera möjligheten att lägga in out of office i PostfixAdmin. Logga in på webbservern som du har PostfixAdmin på och redigera config.inc.php.

joe /var/www/postfixadmin/config.inc.php

ändra rad 212 till YES.

$CONF['vacation'] = 'NO';

och på rad 217 lägger du in autoreplydomänen.

$CONF['vacation_domain'] = 'autoreply.example.com';

Nu kommer användarna ha en funktion "Set Vacation" när de loggar in i PostfixAdmin.

Diverse tips och tricks

Här kommer jag att fylla på med lite små trix och tips.

Autoforward av mail till annan mailbox

För att kunna skicka en kopia av alla mail som kommer till en mailbox så måste vi kunna redigera aliasen för mailboxarna. Det skapas nämligen ett alias för mailboxarna för annars fungerar det inte om man har en catchall adress. Försöker du lägga till ett alias så får man bara ett felmeddelande att den adressen redan finns. 

Lösningen är redigera config.ing.php i rooten på postfixadmin. I den filen letar vi upp värdet:

$CONF['alias_control'] = 'NO';

och ändrar NO till YES.

Nu får superadmin upp en Alias knapp vid mailboxarna och man kan lägga in forward adresser i den. Om även domän admin ska kunna ändra så ändrar vi även:

$CONF['alias_control_admin'] = 'NO';

Förnya letsencrypt certifikatet

Var tredje månad så går certet från letsencrypt ut så det behöver förnyas, tillräckligt länge för att man ska glömma hur man gör. Eventuell borde man kanske lägga det i crontaben. Har inte hunnit fixa ett script för det än eftersom att brandvägge måste öppna och stängas under processen.

Öppna port 443 i brandväggen:

sudo ufw allow 443

Förnya certet

/opt/letsencrypt/letsencrypt-auto renew --standalone

När processen är klar så stänger vi brandväggen igen.

sudo ufw deny 443

Använda ett specifikt ip för att sända mail

Scenariot är som följande. På mail servern har vi flera olika ip-nummer. Vi vill använda ett för att ta emot mail och ett annat för att skicka. 

Först kontrollerar vi i /etc/postfix/main.cf att inet_interfaces är inställd på det ip-nummret som vi vill ta emot mail på.

Därefter ändrar vi master.cf och letar upp följande rad (runt rad 69 kanske):

smtp     unix  -       -       -       -       -       smtp

Under den raden lägger vi till följande (ändra 192.168.0.1 till ip-nummret på din server som du vill använda)

  -o smtp_bind_address=192.168.0.1

När du är klar så ska det se ut enligt nedan.

smtp      unix  -       -       -       -       -       smtp
 -o smtp_bind_address=192.168.0.1

Slutligen säger vi till postfix att läsa in de nya inställningarna.

sudo service postfix reload

Testa sedan att skicka ett mail och kontrollera att mailet har skickats med rätt ip.

 

 

Managed ad