Komplett guide til oppsett av e-postserver (Postfix, Dovecot, Horde 5, ActiveSync)

OBS! Informasjonen her kan være utdatert!

Denne artikkelen er mange år gammel, og mye kan ha endret seg siden den ble skrevet. Vær kritisk, og sjekk også andre kilder.

Etter fullføring av denne veiledningen vil du sitte igjen med en Ubuntu Server (installert med software RAID 1 om ønskelig), som tilbyr stort sett alt av e-posttjenester. Du vil ha virtuelle brukere og domener (Postfix), du vil ha Pop3 og Imap (Dovecot), et webgrensesnitt (Horde 5) som også er tilpasset mobil, og du tilbyr ActiveSync, så bl. annet kalendre og kontakter blir synkronisert mot mobiler. Følger du veiledningen til punkt og prikke vil du også ha inkrementell automatisert backup over nettverk (SSH).  Absolutt alt av programvare brukt er fritt tilgjengelig og godt testet.

Bare så det er sagt med en gang: Skal du følge denne veiledningen må du ikke være redd for å bruke terminal. Samtidig anbefaler jeg at du setter opp e-postserveren via ssh fra en maskin som har normalt skrivebordsgrensesnitt, fordi du da kan speede opp konfigurasjonen veldig ved å kopiere fra denne artikkelen og lime inn i terminalvinduet. (Da sikrer du deg også mot eventuelle skrivefeil, som kan ha store konsekvenser, men være vanskelig å feilsøke.)

En annen ting er at du følger denne veiledningen på egen risiko. Jeg garanterer ingenting (heller ikke at dette er uten skrivefeil), og tar intet ansvar dersom noe skulle gå galt for deg. Jeg anbefaler deg å lese deg opp på programvaren brukt i denne veiledningen for å være best mulig rustet til å gjøre ting riktig. Selv om dette fungerer her er det ikke gitt at det fungerer hos deg. Bare så det er sagt også... For øvrig; Jeg er overbevist om at det er lesere der ute som behersker dette emnet langt bedre enn meg, og har dere innspill er dere hjertlig velkomne.

Bruk teksteditor etter eget ønske (f.eks nano), men vær klar over at veiledningen er basert på at du bruker editoren vi (enkle vi-kommandoer ser du her).
---
Revidert: 14.04.2013 06:16: La til kalkulering av nedetid på server ved mellomlagring før nettverksbackup (i scriptet /usr/local/sbin/mellomlagring).
Revidert: 08.04.2013 23:08: La til forklaring på hvordan man deaktiverer APC for å unngå PHP-bug.
Revidert: 08.04.2013 22:25: La til LC_ALL=C i scriptet apacheErrorCheck (som restarter Apache ved feil på e-postserveren).
Revidert: 06.04.2013 07:47: La til PATH=/usr/sbin:/usr/bin:/sbin:/bin i cron for root på e-postserveren.
Revidert: 04.04.2013 18:56: La til informasjon vedrørende /etc/dovecot/conf.d/10-mail.conf og namespaces.
---

Mine kilder

Dette er mildt sagt ikke tenkt ut helt på egenhånd, men derimot satt sammen fra en rekke forskjellige veiledninger og forum på Internett. Her er de viktigste:

De fleste av disse inneholder også bedre beskrivelser av hva de respektive kommandoene innebærer enn det denne artikkelen gjør.

 

Hva du trenger

  • En datamaskin med to disker. (Til e-postserveren. De to diskene er nødvendig hvis du skal bruke Raid 1.)
  • En backupserver. (F.eks satt opp med Ubuntu 12.04 som i denne veiledningen.)
  • En fast, offentlig ip-adresse der e-postserveren står. Jeg anbefaler også sterkt å ha en fast ip-adresse der backupserveren står, hvis den ikke befinner seg i samme lokaler som e-postserveren.
  • En pc med grafisk grensesnitt (Denne veiledningen tar utgangspunkt i en maskin med Ubuntu 12.04 Desktop installert). Denne  pc'en er ikke nødvendig, men vil gjøre oppsettet av e-postserveren mye enklere, da du med denne kan kopiere fra denne veiledningen til terminalvinduet med SSH-tilkobling til e-postserveren.

 

Definisjoner brukt i dette innlegget

  • Mailserveren settes i dette tilfellet opp på domenet eksempel.no og det er også for dette domenet vi setter opp e-postadresser. (Brukere får e-postadresser tilsvarende brukernavn@eksempel.no).
  • Mailserverens offentlige ip-adresse er 195.159.20.50.
  • Mailserverens ip-adresse i lokalnettet er 192.168.10.10.
  • Ruterens ip-adresse i lokalnettet er 192.168.10.1
  • Mailserverens hostname er mail.eksempel.no.
  • Mailserveren er initielt satt opp med brukeren mailadmin.
  • Backupserveren er initielt satt opp med brukeren bakoppadmin.
  • Brannmuren er (iallefall avslutningsvis) satt til å rute nettverkstrafikk på portene 25 (SMTP), 80 (HTTP), 110 (POP3), 143 (IMAP), 443 (HTTPS), 465 (SMTPS), 993 (IMAPS), and 995 (POP3S) til mailserveren. (Det samme gjelder porten du velger for SSH (2022 i dette eksemplet.)).

Innhold i dette formatet indikerer mulig relevant informasjon jeg ikke har testet selv.

Sette opp Ubuntu 12.04 server med software RAID 1

Det finnes såpass mange guider på nett som forklarer hvordan man installerer Ubuntu, så det skal jeg ikke gå inn på her. Jeg vil derimot nevne at et enkelt software RAID 1 (hvor én disk speiler en annen) kan settes opp ved å følge denne veiledningen: https://help.ubuntu.com/12.04/serverguide/advanced-installation.html. Hvis du velger å sette opp software RAID 1 er du nødt til å deaktivere eventuell fysiske RAID-controllere på det som skal bli serveren din. (Diskene må settes opp som to frittstående, likeverdige, disker.) Hvis du ikke gjør det vil ikke bootloaderen (GRUB) laste etter at installasjonen er ferdig.

Det er viktig at veiledningen følges til punkt og prikke!

Når det gjelder Degraded RAID (skal maskinen boote på den fungerende disken hvis den andre "detter ut"?) bør BOOT_DEGRADED settes til TRUE. Dette til tross for at jeg mener det er en risiko for at den fungerende disken også kan få feil når dette valget er tatt. Årsaken til at vi setter til TRUE er en bug som gjør at tastaturet ikke virker når du skal svare på om du vil boote eller ikke når den er satt til FALSE. (Mildt sagt klønete...)

Et annet problem er at MDADM ikke genererer noen ordentlig logg. Vi må derfor lage et par script som kjøres fra CRON, slik at resultatet av scriptene (som viser MDADM status) sendes oss på e-post. Da kan vi kanskje være i forkant. Disse scriptene kommer jeg tilbake til senere i veiledningen.

Som sagt, jeg skal ikke gå inn på hvordan man installerer Ubuntu Server, men her er generelle valg jeg gjorde, samt noen viktige innstillinger: (Jeg installerte ingen ekstra-pakker under hovedinstallasjonen av Ubuntu.) (Mange av disse valgene er hentet herfra.)

Logg deg inn som root:

sudo su

Installér Vim-nox (en bedre versjon av vi enn den som er installert standard i Ubuntu):

apt-get install vim-nox

Husk å sette statisk ip-adresse på serveren:

vi /etc/network/interfaces

# This file describes the network interfaces available on your system 
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
 auto lo
 iface lo inet loopback

# The primary network interface
 auto eth0
 iface eth0 inet static
 address 192.168.10.10
 netmask 255.255.255.0
 network 192.168.10.0
 broadcast 192.168.10.255
 gateway 192.168.10.1
 dns-nameservers 195.159.0.100 195.159.0.200

I eksemplet over har jeg brukt Powertech sine navnetjenere. Det er definitivt ikke sikkert at du skal bruke de samme tjenerne...

Deretter må du restarte nettverket:

service networking restart

Rediger /etc/hosts og justér tilsvarende eksemplet under:

vi /etc/hosts

127.0.0.1       localhost.localdomain   localhost
192.168.10.10   mail.eksempel.no     mail

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Deretter må du kjøre:

echo mail.eksempel.no > /etc/hostname
/etc/init.d/hostname restart

Kjør så:

hostname
hostname -f

Begge skal nå vise mail.eksempel.no.

Fjern AppArmor:

/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils

Synkronisér systemklokken:

apt-get install ntp ntpdate

Installér OpenSSH server:

apt-get install ssh openssh-server

Redigér konfigurasjonsfilen til OpenSSH (Jeg har strippet eksemplet under for kommenterte linjer):

vi /etc/ssh/sshd_config

Port 2022

Protocol 2

HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key

UsePrivilegeSeparation yes

KeyRegenerationInterval 3600
ServerKeyBits 768

SyslogFacility AUTH
LogLevel INFO

LoginGraceTime 120
PermitRootLogin no
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys

IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no

PermitEmptyPasswords no

ChallengeResponseAuthentication no

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes

AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

UsePAM yes

Restart SSH-serveren:

service ssh restart

Vi er nå klare til neste skritt i prosessen:

SSH-tilgang uten passord til e-postserveren

Har du fulgt veiledningen til hit har du nå en server ferdig satt opp, uten grafisk grensesnitt. I og med at det vil være mye enklere å gjøre de neste punktene i veiledningen hvis man kan kopiere fra dette innlegget setter vi opp SSH på en slik måte  at vi slipper å skrive passord hver gang vi forsøker å logge oss inn fra en annen maskin (som har grafisk grensesnitt). Mye av dette har jeg hentet herfra. (Og jeg anbefaler å lese denne boken.)

Før vi begynner må jeg nevne at hvis du velger denne løsningen må du huske å ta vare på din private nøkkel. (Ha en offline backup, låst inn i en safe eller bankboks.) Anse den som hellig, og la ikke engang bikkja få se den.

Jeg forutsetter i eksemplet her at du sitter på en klientmaskin i samme lokalnett som der den ferske e-postserveren står.

På klientmaskinen (den du skal logge deg inn via SSH på serveren fra):

Vi må opprette en mappe, (hvis den ikke allerede finnes) og generere en privat og en offentlig nøkkel:

OBS! Dette skal ikke gjøres som root!

mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa

Du blir nå bedt om å fylle ut plassering for filene, og en eventuell passfrase. Trykk [Enter] på hvert spørsmål.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/b/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/b/.ssh/id_rsa.
Your public key has been saved in /home/b/.ssh/id_rsa.pub.

Din offentlige nøkkel er nå tilgjengelig som .ssh/id_rsa.pub i hjemmemappen din (/home/standardbruker/.ssh/id_rsa.pub).

Nå må den offentlige nøkkelen flyttes over til e-postserveren:
(SSH-porten på e-postserveren er jo endret fra port 20 til port 2022, derfor denne litt ekstra lange kommandoen. Hadde serveren kjørt på standard port 22 ville kommandoen vært: ssh-copy-id -i ~/.ssh/id_rsa.pub mailadmin@192.168.10.10)

ssh-copy-id -i ~/.ssh/id_rsa.pub ‘-p 2022 mailadmin@192.168.10.10’

For mer info: http://linux.die.net/man/1/ssh-copy-id

Nå skal du kunne logge deg inn uten å måtte skrive passord:

ssh -p 2022 mailadmin@192.168.10.10

Da følgende punkt naturlig hører hjemme i dette kapittelet inkluderer jeg det her, selv om vi strengt tatt skal sette det opp litt annerledes senere i veiledningen.

Vi kan lage en konfigurasjonsfil for SSH, som gjør det enklere å logge seg inn på andre maskiner. For enkel tilgang til e-postserveren kan vi legge til følgende i denne filen:

vi ~/.ssh/config

Fyll ut denne slik:

Host epostlokal
  Hostname 192.168.10.10
  Port 2022
  User mailadmin

Host epostinet
  Hostname mail.eksempel.no
  Port 2022
  User mailadmin

Nå har du laget to varianter av den samme tilkoblingen. Den ene, epostlokal, brukes hvis klienten din er på samme lokalnett som e-postserveren. Den andre, epostinet, bruker du hvis du har flyttet klientmaskinen ut av lokalnettet, og må koble deg til e-postserveren over Internett. (Dette forutsetter naturligvis at trafikk over port 2022 i ruteren hvor e-postserveren står sendes til e-postserveren...)

Brukeseksempel:

ssh epostlokal
eller
ssh epostinet

 

Installere e-postserveren

Dette er primært hentet fra denne bloggposten, som igjen er basert på veiledningen til Ivar Abrahamsen (Som nevnt tidligere; bør leses!). Begge disse inneholder mer detaljert beskrivelse av årsaken til at hvert punkt skal utføres en det min veiledning gjør.

Dette kapittelet er enklest å fullføre hvis du sitter på en maskin med grafisk grensesnitt, og kobler deg til boksen som skal bli e-postserver via SSH...

SSH deg inn på serveren:

ssh epostlokal

Endre til root (på serveren):

sudo su

Sette opp self-signed SSL

Selv om det beste naturligvis er å bruke kommersielle sertifikater fungerer det også helt greit med de du utsteder selv. Sikkerheten blir ikke dårligere! (Men det er litt mer masete, med diverse advarsler som popper opp her og der under bruk...)

Installér serfikater:

apt-get update
apt-get upgrade
apt-get install ssl-cert
make-ssl-cert generate-default-snakeoil –force-overwrite

Installere LAMP

Vi trenger en webserver (og PHP), og vi trenger en database:

apt-get install lamp-server^

Du blir i prosessen bedt om å oppgi et root-passord til MySQL. Lag et godt passord, og notér deg dette til senere bruk.

Installér ytterligere php-pakker:

apt-get install php-apc php5-memcache php5-curl php5-gd php-xml-parser

Konfigurér Apache:

Endelig mål er at Apache skal tilby en enkelt nettside, og at all trafikk skal gå over HTTPS.

Minimer hva som sendes ut av informasjon fra Apache

vi /etc/apache2/conf.d/security

#
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of:  Full | OS | Minimal | Minor | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Prod

#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature Off

Aktivér mod_rewrite, mod_ssl og default_ssl:

a2enmod rewrite ssl
a2ensite default-ssl

Enkelt oppsett av standardnettsiden:

vi /etc/apache2/sites-available/default

  ServerAdmin webmaster@localhost

  DocumentRoot /var/www
  <Directory "/">
    Options FollowSymLinks
    AllowOverride All

  ErrorLog ${APACHE_LOG_DIR}/error.log

  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn

  CustomLog ${APACHE_LOG_DIR}/access.log combined

Enkelt oppsett av Standard SSL:

vi /etc/apache2/sites-available/default-ssl

  
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    <Directory "/">
      Options FollowSymLinks
      AllowOverride All

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined

    #   SSL Engine Switch:
    #   Enable/Disable SSL for this virtual host.
    SSLEngine on
    #

    # ... more default SSL configuration ...

    # You will probably need to change this next Directory directive as well
    # in order to match the earlier one.
    <Directory "/">
      SSLOptions +StdEnvVars

    # ... yet more default SSL configuration ...

Hvis du har kommersielle sertifikater:

Råkopi fra http://www.exratione.com/2012/05/a-mailserver-on-ubuntu-1204-postfix-dovecot-mysql/
If you are using a purchased rather than self-signed SSL certificate, and you probably have a CA certificate bundle from the issuer, then you’ll want to further change these lines in /etc/apache2/sites-enabled/default-ssl:

# A self-signed (snakeoil) certificate can be created by installing
# the ssl-cert package. See
# /usr/share/doc/apache2.2-common/README.Debian.gz for more info.
# If both key and certificate are stored in the same file, only the
# SSLCertificateFile directive is needed.
SSLCertificateFile /path/to/my/cert.crt
SSLCertificateKeyFile /path/to/my/key.key

# Server Certificate Chain:
# Point SSLCertificateChainFile at a file containing the
# concatenation of PEM encoded CA certificates which form the
# certificate chain for the server certificate. Alternatively
# the referenced file can be the same as SSLCertificateFile
# when the CA certificates are directly appended to the server
# certificate for convinience.
SSLCertificateChainFile /path/to/my/ca-bundle.crt

Tving besøkende over på HTTPS ved å legge dette til i .htaccess:

vi /var/www/.htaccess

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*) https://mail.eksempel.no/$1 [L]

Installér og konfigurér Memcached:

apt-get install memcached

Installere Mailserver

Installér hele pakken fra Ubuntus pakkebrønn

apt-get install mail-server^

Under installasjonen av Postfix fil du bli spurt om type mailkonfigurasjon. Velg "Internet site".
Mailname er det samme som boksens hostname: mail.eksempel.no.

Installér støtte for MySQL, samt spamfilter, antivirus og IMAP-støtte:

apt-get install postfix-mysql dovecot-mysql dovecot-imapd postgrey
apt-get install amavis clamav clamav-daemon spamassassin
apt-get install php5-imap

(php5-imap støtter faktisk også POP3)

Restart Apache:

service apache2 restart

Installer pakker som utvider mulighetene til å filtrere spam og virus:

apt-get install libnet-dns-perl pyzor razor
apt-get install arj bzip2 cabextract cpio file gzip nomarch pax unzip zip unrar

Logg deg inn i MySQL som root:

mysql -uroot -p

Opprett en database og en bruker for e-postprogrammene. Denne vil lagre informasjon om brukerkontoer og domener, og den blir satt opp av pakken Postfixadmin:
(Anførselstegnene er en del av kommandoene under.)

create database mail;
grant all on mail.* to ‘mail’@’localhost’ identified by ‘sterktpassord’;
quit;

Gå ut av MySQL:

quit;

(Her kan du også bruke exit -og da trenger du ikke avslutte med semikolon.)

Postfix Admin

Med Postfix Admin kan du blant annet legge til og fjerne domener, brukere og aliaser i Postfix. Det er også Postfix Admin som konfigurerer databasen vi opprettet i sted for oss.

wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.6/postfixadmin-2.3.6.tar.gz
gunzip postfixadmin-2.3.6.tar.gz
tar -xf postfixadmin-2.3.6.tar
mv postfixadmin-2.3.6 /var/www/postfixadmin
chown -R www-data:www-data /var/www/postfixadmin

Nå følger et to-faset oppsett av Postfix Admin:

Endre følgende linjer i /var/www/postfixadmin/config.inc.php:

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

/*****************************************************************
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* You have to set $CONF['configured'] = true; before the
* application will run!
* Doing this implies you have changed this file as required.
* i.e. configuring database etc; specifying setup.php password etc.
*/
$CONF['configured'] = true;
// Postfix Admin Path
// Set the location of your Postfix Admin installation here.
// YOU MUST ENTER THE COMPLETE URL e.g. http://domain.tld/postfixadmin
$CONF['postfix_admin_url'] = 'https://mail.eksempel.no/postfixadmin';
// Database Config
// mysql = MySQL 3.23 and 4.0, 4.1 or 5
// mysqli = MySQL 4.1+
// pgsql = PostgreSQL
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'mail';
$CONF['database_password'] = 'sterktpassord';
$CONF['database_name'] = 'mail';
// Site Admin
// Define the Site Admins email address below.
// This will be used to send emails from to create mailboxes.
$CONF['admin_email'] = 'mailadmin@eksempel.no';

// Mail Server
// Hostname (FQDN) of your mail server.
// This is used to send email to Postfix in order to create mailboxes.
//
// Set this to localhost for now, but change it later.
$CONF['smtp_server'] = 'localhost';
$CONF['smtp_port'] = '25';
/ Encrypt
// In what way do you want the passwords to be crypted?
// md5crypt = internal postfix admin md5
// md5 = md5 sum of the password
// system = whatever you have set as your PHP system default
// cleartext = clear text passwords (ouch!)
// mysql_encrypt = useful for PAM integration
// authlib = support for courier-authlib style passwords
// dovecot:CRYPT-METHOD = use dovecotpw -s 'CRYPT-METHOD'. Example: dovecot:CRAM-MD5
$CONF['encrypt'] = 'md5crypt';
// Mailboxes
// If you want to store the mailboxes per domain set this to 'YES'.
// Examples:
//   YES: /usr/local/virtual/domain.tld/username@domain.tld
//   NO:  /usr/local/virtual/username@domain.tld
$CONF['domain_path'] = 'NO';
// If you don't want to have the domain in your mailbox set this to 'NO'.
// Examples:
//   YES: /usr/local/virtual/domain.tld/username@domain.tld
//   NO:  /usr/local/virtual/domain.tld/username
// Note: If $CONF['domain_path'] is set to NO, this setting will be forced to YES.
$CONF['domain_in_mailbox'] = 'YES';

Det neste du skal gjøre er å starte en nettleser og besøke
https://mail.eksempel.no/postfixadmin/setup.php
Følg instruksjonene på siden for å velge et oppsettspassord, og generer en hash av passordet.
Denne hashen må vi legge til i konfigurasjonsfilen:

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

// In order to setup Postfixadmin, you MUST specify a hashed password here.
// To create the hash, visit setup.php in a browser and type a password into the field,
// on submission it will be echoed out to you as a hashed value.
$CONF['setup_password'] = 'Den lange hash-strengen';

Besøk deretter på nytt
https://mail.eksempel.no/postfixadmin/setup.php
Opprett en initiell bruker ved å benytte passordet du genererte en hash-streng av. Det er for øvrig nå Postfix Admin vil generere tabeller etc i databasen.

Begrens tilgangen til /var/www/postfixadmin/setup.php:

vi /var/www/postfixadmin/.htaccess

<Files "setup.php">
deny from all

Opprette domener og kontoer i Postfix Admin

I nettleseren; besøk
https://mail.eksempel.no/postfixadmin
og logg deg inn med den nyopprettede admin-kontoen.
Her kan du opprette det nye domenet eksempel.no (New domain under Domain List). Når det er gjort kan du legge til e-postbrukere (Add mailbox) og aliaser (Add alias).
Når det gjelder alias har feltene i skjemaet du fyller ut følgende betydning:

  • Alias: Aliaset (alias@eksempel.no)
  • To: E-postadressen(e) det skal videresendes til (eksisterendemailbox@eksempel.no) Én adresse/mailbox per linje.

For øvrig kan du også gjennom Postfix Admin sende e-post til lokale brukere. Dette er fint for testing og feilsøking.

Opprett en bruker for håndtering av virtuelle e-postkataloger

Brukerne i e-postserveren er ikke lokale brukere, men virtuelle (og administreres av Postfix Admin ved hjelp av databasen vi opprettet tidligere). Alle brukere vil ha en mappe liggende under domenet sitt i /var/vmail. Eksempelvis vil mailadmin@eksempel.no ha tilgang til /var/vmail/eksempel.no/mailadmin. Disse mappene skal eies av én enkelt bruker; vmail, og det er via denne brukeren Dovecot kan opprette og oppdatere mail-filer.
Opprett vmail og sett rettigheter:

useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c «Virtual maildir handler» vmail
mkdir /var/vmail
chmod 770 /var/vmail
chown vmail:mail /var/vmail

Konfigurere Dovecot

Det er Dovecot som håndterer POP3- og IMAP-forbindelser, lokale e-postmapper og mottar innkommende e-post overlevert fra Postfix. Det håndterer også autentisering for SMTP-forbindelser.
Det første vi må gjøre er å sørge for at Dovecot ser etter brukerinformasjon i databasen opprettet av Postfix Admin:
Opprett eller rediger /etc/dovecot/conf.d/auth-sql.conf.ext så den har følgende innhold:

vi /etc/dovecot/conf.d/auth-sql.conf.ext

# Look up user passwords from a SQL database as
# defined in /etc/dovecot/dovecot-sql.conf.ext
passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
# Look up user information from a SQL database as
# defined in /etc/dovecot/dovecot-sql.conf.ext
userdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

Redigér følgende linjer i /etc/dovecot/dovecot-sql.conf.ext så den bruker databasen vår:

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

# Database driver: mysql, pgsql, sqlite
driver = mysql
# Examples:
#   connect = host=192.168.1.1 dbname=users
#   connect = host=sql.example.com dbname=virtual user=virtual password=blarg
#   connect = /etc/dovecot/authdb.sqlite
#
connect = host=localhost dbname=mail user=mail password=sterktpassord
# Default password scheme.
#
# List of supported schemes is in
# http://wiki2.dovecot.org/Authentication/PasswordSchemes
#
default_pass_scheme = MD5-CRYPT
# Define the query to obtain a user password.
password_query = \
  SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, \
  'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid \
  FROM mailbox WHERE username = '%u' AND active = '1'
# Define the query to obtain user information.
user_query = \
  SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, \
  150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota \
  FROM mailbox WHERE username = '%u' AND active = '1'

Endre kontrolldefinisjoner og annet i /etc/dovecot/conf.d/10-auth.conf:
Dette så Dovecot leser innloggingsinformasjon fra MySQL. Vi deaktiverer samtidig plaintext authentication så lenge ikke forbindelsen er kryptert eller lokal.

vi /etc/dovecot/conf.d/10-auth.conf

# Disable LOGIN command and all other plaintext authentications unless
# SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP
# matches the local IP (ie. you're connecting from the same computer), the
# connection is considered secure and plaintext authentication is allowed.
disable_plaintext_auth = yes
# Space separated list of wanted authentication mechanisms:
#   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp skey
#   gss-spnego
# NOTE: See also disable_plaintext_auth setting.
auth_mechanisms = plain login
##
## Password and user databases
##

#
# Password database is used to verify user's password (and nothing more).
# You can have multiple passdbs and userdbs. This is useful if you want to
# allow both system users (/etc/passwd) and virtual users to login without
# duplicating the system users into virtual database.
#
# <doc/wiki/PasswordDatabase.txt>
#
# User database specifies where mails are located and what user/group IDs
# own them. For single-UID configuration use "static" userdb.
#
# <doc/wiki/UserDatabase.txt>

#!include auth-deny.conf.ext
#!include auth-master.conf.ext

#!include auth-system.conf.ext
# Use the SQL database configuration rather than any of these others.
!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

Vi må fortelle Dovecot hvor katalogene til de virtuelle brukerne skal plasseres.
Endre /etc/dovecot/conf.d/10-mail.conf:

vi /etc/dovecot/conf.d/10-mail.conf:

# Location for users' mailboxes. The default is empty, which means that Dovecot
# tries to find the mailboxes automatically. This won't work if the user
# doesn't yet have any mail, so you should explicitly tell Dovecot the full
# location.
#
# If you're using mbox, giving a path to the INBOX file (eg. /var/mail/%u)
# isn't enough. You'll also need to tell Dovecot where the other mailboxes are
# kept. This is called the "root mail directory", and it must be the first
# path given in the mail_location setting.
#
# There are a few special variables you can use, eg.:
#
#   %u - username
#   %n - user part in user@domain, same as %u if there's no domain
#   %d - domain part in user@domain, empty if there's no domain
#   %h - home directory
#
# See doc/wiki/Variables.txt for full list. Some examples:
#
#   mail_location = maildir:~/Maildir
#   mail_location = mbox:~/mail:INBOX=/var/mail/%u
#   mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
#
# <doc/wiki/MailLocation.txt>
#
mail_location = maildir:/var/vmail/%d/%n
# System user and group used to access mails. If you use multiple, userdb
# can override these by returning uid or gid fields. You can use either numbers
# or names. <doc/wiki/UserIds.txt>
mail_uid = vmail
mail_gid = mail
# Valid UID range for users, defaults to 500 and above. This is mostly
# to make sure that users can't log in as daemons or other system users.
# Note that denying root logins is hardcoded to dovecot binary and can't
# be done even if first_valid_uid is set to 0.
#
# Use the vmail user uid here.
first_valid_uid = 150
last_valid_uid = 150

Når det gjelder dokumentet over (/etc/dovecot/conf.d/10-mail.conf) anbefaler jeg å lese litt i wikien til Dovecot om såkalte namespaces. Dette avgjør hvordan strukturen på e-postserveren din blir oppfattet av e-postklienter (inkludert Horde, webklienten vi skal installere senere). Dessverre oppfører ikke disse seg likt. I min ekspimerintering har jeg opplevd at mapper opprettet i eM Client ikke vises i Horde, at mapper opprettet i Thunderbird ikke vises i eM Client osv. (Kjenner du ikke til eM Client? Det er et glimrende e-postprogram for Windows!)
Jeg regner med at det er mindretallet som faktisk bruker eM Client, så derfor har jeg ikke inkludert påfølgende oppsett i filen over. Men setter du direktivet som under vil mapper du oppretter i eM Client havne korrekt i forhold til innboks. Det vil i praksis si at hvis du ikke gjør det, og bruker eM Client til å opprette mapper vil de legge seg under en skjult innboks det kan være vanskelig å finne igjen i f.eks Horde...

namespace {
  prefix =
  separator = /
  subscriptions = yes
  inbox = yes
}

Til slutt her må jeg si at med oppsettet satt slik det er i filen nå vil det som skiller mappene være et punktum (.). Den praktiske konsekvensen av dette er at punktum ikke kan være en del av mappenavnet. Igjen, kast et blikk på oppsettet vedrørende eM Client. Der ser dere jeg har satt "separator = / ". Det er viktig å eksperimentere med dette før du setter e-postserveren i produksjon!

Vis Dovecot hvor sertifikatene våre er:

(Husk å inkludere sti til CA-bundlen din hvis du bruker et kommersielt sertifikat.)
[message_box  color="red"]vi /etc/dovecot/conf.d/10-ssl.conf. [/su_note]

##
## SSL settings
##

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

# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
#ssl_cert = </etc/ssl/certs/dovecot.pem
#ssl_key = </etc/ssl/private/dovecot.pem
ssl_cert = </etc/ssl/certs/ssl-cert-snakeoil.pem
ssl_key = </etc/ssl/private/ssl-cert-snakeoil.key
# If key file is password protected, give the password here. Alternatively
# give it when starting dovecot with -p parameter. Since this file is often
# world-readable, you may want to place this setting instead to a different
# root owned 0600 file by using ssl_key_password = <path.
#ssl_key_password =

# PEM encoded trusted certificate authority. Set this only if you intend to use
# ssl_verify_client_cert=yes. The file should contain the CA certificate(s)
# followed by the matching CRL(s). (e.g. ssl_ca = </etc/ssl/certs/ca.pem)
#ssl_ca = 

# Request client to send a certificate. If you also want to require it, set
# auth_ssl_require_client_cert=yes in auth section.
#ssl_verify_client_cert = no

# Which field from certificate to use for username. commonName and
# x500UniqueIdentifier are the usual choices. You'll also need to set
# auth_ssl_username_from_cert=yes.
#ssl_cert_username_field = commonName

# How often to regenerate the SSL parameters file. Generation is quite CPU
# intensive operation. The value is in hours, 0 disables regeneration
# entirely.
#ssl_parameters_regenerate = 168

# SSL ciphers to use
#ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL

Definér postmaster-adressen i /etc/dovecot/conf.d/15-lda.conf:
(Husk at e-postadressen du definerer her må eksistere på serveren i form av en mailbox eller et alias.)

vi /etc/dovecot/conf.d/15-lda.conf

# Address to use when sending rejection mails.
# Default is postmaster@.
postmaster_address = postmaster@eksempel.no

Dovecot-konfigurasjonen skal gjøres tilgjengelig for både Dovecot og vmail-brukere:

chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot

Dovecot oppretter ikke noen mappe for e-post før brukeren faktisk mottar e-post. Ergo medfører ikke opprettelse av en bruker i Postfix Admin at det umiddelbart opprettes mapper under /var/vmail/.

Amavis, ClamAV og SpamAssassin

Oppsettet vårt støtter filtrering av spam og virus, så gjør noen grunnleggende innstillinger i forbindelse med dette.
Få Amavis og ClamAv til å samarbeide:

adduser clamav amavis
adduser amavis clamav

Aktivér Amavis:
vi /etc/amavis/conf.d/15-content_filter_mode

("Avkommenter" @bypass... linjene)

use strict;

# You can modify this file to re-enable SPAM checking through spamassassin
# and to re-enable antivirus checking.

#
# Default antivirus checking mode
# Please note, that anti-virus checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:

@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

#
# Default SPAM checking mode
# Please note, that anti-spam checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

1;  # ensure a defined return

Aktivér SpamAssassin:

vi /etc/default/spamassassin

# Change to one to enable spamd
ENABLED=1
# Cronjob
# Set to anything but 0 to enable the cron job to automatically update
# spamassassin's rules on a nightly basis
CRON=1

Vi setter opp SpamAssassin så den bruker Postfix Admins database til å finne ut hvilke meldinger som skal leveres lokalt (og derfor sjekkes).
Redigér /etc/amavis/conf.d/50-user så den ser slik ut:

vi /etc/amavis/conf.d/50-user

use strict;

#
# Place your configuration directives here.  They will override those in
# earlier files.
#
# See /usr/share/doc/amavisd-new/ for documentation and examples of
# the directives you can use in this file
#

# Add spam info headers if at or above that level - this ensures they
# are always added.
$sa_tag_level_deflt  = -9999;

# Check the database to see if mail is for local delivery, and thus
# should be spam checked.
@lookup_sql_dsn = (
    ['DBI:mysql:database=mail;host=127.0.0.1;port=3306',
     'mail',
     'mailpassword']);
$sql_select_policy = 'SELECT domain from domain WHERE CONCAT("@",domain) IN (%k)';

# Uncomment to bump up the log level when testing.
# $log_level = 2;

#------------ Do not modify anything below this line -------------
1;  # ensure a defined return

Restart Amavis og SpamAssassin:

service amavis restart
service spamassassin restart

Konfigurasjon av Postfix

Postfix håndterer innkommende e-post via SMTP-protokollen.
Som det står i "malen" jeg følger for å lage denne veiledningen; Vi ønsker å bruke Postfix til å formidle innkommende meldinger til spam- og virus-sjekkere før videreformidling til Dovecot for levering(!), og til å autentisere virtuelle brukere som kobler til via SMTP for å sende e-post.

Det første vi må gjøre her er å fortelle Postfix hvor den finner informasjon om brukere og domener. Vær obs på at "hosts"-direktivet i disse filene må samsvare 100 % med "bind-address" i /etc/mysql/my.cnf. Begge sider må bruke 127.0.0.1 (hvis en av de bruker "localhost" skjærer det seg trolig).
Opprett filen /etc/postfix/mysql_virtual_alias_domainaliases_maps.cf:

vi /etc/postfix/mysql_virtual_alias_domainaliases_maps.cf

user = mail
password = sterktpassord
hosts = 127.0.0.1
dbname = mail
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

Opprett filen /etc/postfix/mysql_virtual_alias_maps.cf:

vi /etc/postfix/mysql_virtual_alias_maps.cf

user = mail
password = sterktpassord
hosts = 127.0.0.1
dbname = mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'

Opprett filen /etc/postfix/mysql_virtual_domains_maps.cf:

vi /etc/postfix/mysql_virtual_domains_maps.cf

user = mail
password = sterktpassord
hosts = 127.0.0.1
dbname = mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

Opprett filen /etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf:

vi /etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf

user = mail
password = sterktpassord
hosts = 127.0.0.1
dbname = mail
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

Opprett filen /etc/postfix/mysql_virtual_mailbox_maps.cf:

vi /etc/postfix/mysql_virtual_mailbox_maps.cf

user = mail
password = sterktpassord
hosts = 127.0.0.1
dbname = mail
table = mailbox
select_field = CONCAT(domain, '/', local_part)
where_field = username
additional_conditions = and active = '1'

Opprett filen /etc/postfix/header_checks:

vi /etc/postfix/header_checks

/^Received:/                 IGNORE
/^User-Agent:/               IGNORE
/^X-Mailer:/                 IGNORE
/^X-Originating-IP:/         IGNORE
/^x-cr-[a-z]*:/              IGNORE
/^Thread-Index:/             IGNORE

Nå er vi egentlig kommet til oppsettet av filen /etc/postfix/main.cf, men før vi gyver løs på den skal vi sette i gang en annen liten ting: På serveren er det en del epost som sendes til (den lokale) brukeren root. Med oppsettet vi har i dag vil ikke dette bli fanget opp noe sted. Vi lager derfor en kobling mellom root-brukeren og administratorkontoen vi har satt opp for systemet mailadmin@eksempel.no)
Lag filen /etc/postfix/virtual:

vi /etc/postfix/virtual

root	mailadmin@eksempel.no

Enkelt og greit; her følger en /etc/postfix/main.cf som fungerer hos meg. Se nøye og langsomt igjennom hele filen, og forsikre deg om at endringene du gjør er riktige for deg. Legg for øvrig merke til henvisningen til filen vi akkurat lagde; /etc/postfix/virtual.
Redigér /etc/postfix/main.cf:

vi /etc/postfix/main.cf

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# SASL parameters
# Use Dovecot to authenticate.
smtpd_sasl_type = dovecot
# Referring to /var/spool/postfix/private/auth
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
smtpd_sasl_authenticated_header = yes

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
#smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

# SMTPD parameters
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
# will it be a permanent error or temporary
unknown_local_recipient_reject_code = 450
# how long to keep message on queue before return as failed.
# some have 3 days, I have 16 days as I am backup server for some people
# whom go on holiday with their server switched off.
maximal_queue_lifetime = 7d
# max and min time in seconds between retries if connection failed
minimal_backoff_time = 1000s
maximal_backoff_time = 8000s
# how long to wait when servers connect before receiving rest of data
smtp_helo_timeout = 60s
# how many address can be used in one message.
# effective stopper to mass spammers, accidental copy in whole address list
# but may restrict intentional mail shots.
smtpd_recipient_limit = 16
# how many error before back off.
smtpd_soft_error_limit = 3
# how many max errors before blocking it.
smtpd_hard_error_limit = 12

# This next set are important for determining who can send mail and relay mail
# to other servers. It is very important to get this right - accidentally producing
# an open relay that allows unauthenticated sending of mail is a Very Bad Thing.
#
# You are encouraged to read up on what exactly each of these options accomplish.

# Requirements for the HELO statement
smtpd_helo_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_hostname, reject_invalid_hostname, permit
# Requirements for the sender details
smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit
# Requirements for the connecting server
smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org, reject_rbl_client blackholes.easynet.nl, reject_rbl_client dnsbl.njabl.org
# Requirement for the recipient address. Note that the entry for
# "check_policy_service inet:127.0.0.1:10023" enables Postgrey.
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permit
smtpd_data_restrictions = reject_unauth_pipelining

# require proper helo at connections
smtpd_helo_required = yes
# waste spammers time before rejecting them
smtpd_delay_reject = yes
disable_vrfy_command = yes

myhostname = mail.eksempel.no
myorigin = /etc/hostname
mydestination = mail.eksempel.no
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
mynetworks_style = host

# Virtuelle ting
# This specifies where the virtual mailbox folders will be located.
virtual_mailbox_base = /var/vmail
# This is for the mailbox location for each user. The domainaliases
# map allows us to make use of Postfix Admin's domain alias feature.
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf, mysql:/etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf
# and their user id
virtual_uid_maps = static:150
# and group id
virtual_gid_maps = static:8
# This is for aliases. The domainaliases map allows us to make
# use of Postfix Admin's domain alias feature.
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_domainaliases_maps.cf, hash:/etc/postfix/virtual
# This is for domain lookups.
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf

# Integrasjon med andre pakker
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
content_filter = amavis:[127.0.0.1]:10024

# Header manipulering
header_checks = regexp:/etc/postfix/header_checks
enable_original_recipient = no
message_size_limit = 104857600

Kommersielle sertifikater:

Råkopi fra http://www.exratione.com/2012/05/a-mailserver-on-ubuntu-1204-postfix-dovecot-mysql/

To be clear, if you are using a purchased SSL certificate – and have a CA certificate bundle from the issuer – then you will have to alter these lines in /etc/postfix/main.cf:

# Replace this with your SSL certificate path if you are using one.
smtpd_tls_cert_file=/path/to/my/cert.pem
smtpd_tls_key_file=/path/to/my/key.key
# The snakeoil self-signed certificate has no need for a CA file. But
# if you are using your own SSL certificate, then you probably have
# a CA certificate bundle from your provider. The path to that goes
# here.
#smtpd_tls_CAfile=/path/to/ca/file


Redigering av /etc/postfix/master.cf
Dette er filen du virkelig ønsker å kunne kopiere direkte uten å måte skrive det manuelt. Her er hele filen, slik den fungerer hos meg:
vi /etc/postfix/master.cf

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       -       -       -       smtpd
#smtp      inet  n       -       -       -       1       postscreen
#smtpd     pass  -       -       -       -       -       smtpd
#dnsblog   unix  -       -       -       -       0       dnsblog
#tlsproxy  unix  -       -       -       -       0       tlsproxy
#submission inet n       -       -       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
  -o smtpd_sasl_security_options=noanonymous,noplaintext
  -o smtpd_sasl_tls_security_options=noanonymous
#  -o milter_macro_daemon_name=ORIGINATING
#628       inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       -       60      1       pickup
  -o content_filter=
  -o receive_override_options=no_header_body_checks
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent.  See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
#
# ====================================================================
#
# Recent Cyrus versions can use the existing "lmtp" master.cf entry.
#
# Specify in cyrus.conf:
#   lmtp    cmd="lmtpd -a" listen="localhost:lmtp" proto=tcp4
#
# Specify in main.cf one or more of the following:
#  mailbox_transport = lmtp:inet:localhost
#  virtual_transport = lmtp:inet:localhost
#
# ====================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Also specify in main.cf: cyrus_destination_recipient_limit=1
#
#cyrus     unix  -       n       n       -       -       pipe
#  user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
#
# ====================================================================
# Old example of delivery via Cyrus.
#
#old-cyrus unix  -       n       n       -       -       pipe
#  flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}
#
# ====================================================================
#
# See the Postfix UUCP_README file for configuration details.
#
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
#
# Other external delivery methods.
#
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}

#
# The next two entries integrate with Amavis for anti-virus/spam checks.
#
amavis      unix    -       -       -       -       2       smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes
        -o disable_dns_lookups=yes
        -o max_use=20
127.0.0.1:10025 inet    n       -       -       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_delay_reject=no
        -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o smtpd_end_of_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

#
# Integration with Dovecot - hand mail over to it for local delivery, and
# run the process under the vmail user and mail group.
#
dovecot      unix   -        n      n       -       -   pipe
        flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -d $(recipient)

Restart alle tjenester:

service postfix restart
service spamassassin restart
service clamav-daemon restart
service amavis restart
service dovecot restart

Nå er det på tide å fullføre mappingen av root til mailadmin@eksempel.no:
postmap /etc/postfix/virtual

Når serveren nå (f.eks fra CRON) sender e-post til brukeren root, så havner den i innboksen til mailadmin@eksempel.no.

Testing av opplegget så langt

Tid for testing! Hold et øye med /var/log/mail.err og /var/log/mail.log. Forsøk å logge inn med POP og IMAP, send e-post til og fra serveren. Hvis det ikke virker: Google is your friend, som forfatteren av malen skriver...

Installasjon av Horde 5

Horde 5 er et rammeverk for gruppevare, og fungerer meget godt som webmail her. Med Horde kan brukerne lese/sende e-post på Internett, de har bl. annet egne og felles kalendre, kontakter og oppgaver, og alt kan synkes mot f.eks Android-telefoner. Horde har tidligere vært lite tiltalende rent visuelt, men med Horde 5 har det blitt kraftig forbedret. Det har også et meget bra grensesnitt for mobiler og nettbrett.

Vi trenger noen flere pakker installert fra pakkebrønnen til Ubuntu:

apt-get install php5-dev php5-sasl php-pear php5-tidy php5-imagick
apt-get install php5-geoip libgeoip1 geoip-bin geoip-database
apt-get install php-xml-serializer php5-memcache php-soap php5-intl
apt-get install libidn11-dev libmagickwand-dev libmagick++4 imagemagick
apt-get install libsasl2-dev libssh2-php libphp-jpgraph php-http-webdav-server

Oppdater PECL- og Pear pakkebehandlere, og installer resten av de påkrevde pakkene:

pecl channel-update pear.php.net
pear channel-update pear.php.net
pecl install lzf
pear install –alldeps channel://pear.php.net/Date_Holidays-0.21.5
pear install –alldeps channel://pear.php.net/Numbers_Words-0.16.2
pear install –alldeps channel://pear.php.net/Text_CAPTCHA-0.4.3
pear install –alldeps channel://pear.php.net/Date_Holidays_Norway-0.1.2

Installer Horde-komponentene:

pear channel-discover pear.horde.org
pear install horde/Horde_role
pear run-scripts horde/Horde_role

Du vil bli bedt om å oppgi "Filesystem location for the base Horde application". Her oppgir du /var/www (uten avsluttende slash).

Start installasjonsprosessen:

pear install -a -B horde/webmail

Sjekk at php-utvidelser er aktivert:

echo «extension=memcache.so» > /etc/php5/conf.d/memcache.ini
echo «extension=lzf.so» > /etc/php5/conf.d/lzf.ini
service apache2 restart

Horde er plassert i /var/www, men eies av root. Endre dette, så det er Apache som eier:

chown -R www-data:www-data /var/www

.htaccess har blitt overskrevet under installasjonen av Horde. Endre tilbake, så alt blir rutet til HTTPS:

# IMPORTANT: DO NOT EDIT THIS FILE!
# It will be overwritten with any future upgrade.

allow from all

RewriteEngine On

# Add the redirect to HTTPS rule.
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*) https://mail.eksempel.no/$1 [L]

# This is the default Horde rule.
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ rampage.php [QSA,L]


Som det kommer frem av selve filen: Dette vil bli overskrevet neste gang Horde oppgraderes, så akkurat denne operasjonen må gjentas da.
Hindre at andre har tilgang til konfigurasjonen av Horde:
Råkopi fra http://www.exratione.com/2012/05/a-mailserver-on-ubuntu-1204-postfix-dovecot-mysql/

Once Horde is running it is completely open to the world in order to allow initial configuration. So first lock it down to be accessible from your IP address only – at least until you have an administrator and authentication set up. Do that by making this change to the /var/www/.htaccess file – in the example below replace 10.10.10.10 with the IP address you are using:

#allow from all

# Remove this block when done
Order deny,allow
deny from all
allow from 10.10.10.10
allow from 127.0.0.1


Et besøk til https://mail.eksempel.no/test.php vil vise hva som virker og ikke. (LDAP og PAM-støtte er ikke i bruk hvis denne guiden følges.)

Vi må lage en database og databasebruker for Horde.
Logg inn i MySQL som root:

mysql -uroot -p

Opprett databasen og brukeren:
create database horde;
grant all on horde.* to ‘horde’@’localhost’ identified by ‘hordepassword’;
quit;

Horde kan virke monstruøst(?) når man skal sette det opp, men tar man tiden til hjelp vil man ende opp med et strålende produkt. Denne guiden tar bare for seg minimum av det som må til for å få Horde operativt. Jeg vil uansett legge ut conf-filene mine, så dere kan se hvordan de skal se ut når alt fungerer.
Vi fortsetter...

(Jeg hoppet over det påfølgende punktet på grunn av denne bug'en.)

Råkopi fra http://www.exratione.com/2012/05/a-mailserver-on-ubuntu-1204-postfix-dovecot-mysql/

If you want admins specified in the Horde configuration to receive alarm mails, you must add the following crontab entry – once every five minutes is a fair setting. See the Ubuntu crontab help document for instructions on how to add crontab entries.

# Horde Alarms
*/5 * * * * /usr/bin/horde-alarms

Dette er forresten et fint tidspunkt å nevne hvordan man avinstallerer Horde (du kan fort få bruk for det...)
[box type="info"]pear uninstall `pear list -c horde | tail -n +4 | awk '{ print "horde/"$1 }'`[/su_note]

Fra dette punktet av er du litt på egenhånd når det gjelder Horde. Horde består av mange moduler, og hver modul krever at du (innlogget som administrator) konfigurerer den riktig.
Gjør først dette:

cp /var/www/config/conf.php.dist /var/www/config/conf.php
chown www-data:www-data /var/www/config/conf.php

Nå kan du starte nettleseren og navigere til https://mail.eksempel.no. Du vil logges inn som en dummy-administrator, og trolig se en del feilmeldinger, som kan ignoreres for øyeblikket.
Hold musen over tannhjulet øverst på nettsiden, velg Administrasjon og deretter Configuration. Herfra konfigurerer du de forskjellige modulene.
Hver modul har sin egen konfigurasjonsfil, plassert i config-mappen til de respektive modulene. Horde sin e-postmodul, Imp, har for eksempel sin config-fil plassert her: /var/www/imp/config/config.php. I tillegg har de filer som håndterer andre vitale ting, kalt backends.php. Backends.php-filene blir overskrevet ved hver oppgradering, så endringer i disse kan ikke gjøres. I stedet må man opprette filer kalt backends.local.php, som inneholder de nødvendige konfigurasjonene.

For å gjøre dette enklere skal jeg legge ut eksempler på hvordan en Horde-installasjon kan settes opp.
Jeg tror ikke du kan kopiere direkte fra fil-eksemplene jeg legger ut. I stedet må du være innlogget og ha navigert til konfigurasjonsgrensesnittet. Lykke til...

Horde (horde) /var/www/horde/config/config.php

Det er primært denne filen det er viktig å få konfigurert riktig nå.

General
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['vhosts'] = false;
$conf['debug_level'] = E_ALL & ~E_NOTICE;
$conf['max_exec_time'] = 0;
$conf['compress_pages'] = true;
$conf['secret_key'] = 'xxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx-xxxxxxxxxxx';
$conf['umask'] = 077;
$conf['testdisable'] = true;
$conf['use_ssl'] = 2;
$conf['server']['name'] = $_SERVER['SERVER_NAME'];
$conf['urls']['token_lifetime'] = 30;
$conf['urls']['hmac_lifetime'] = 30;
$conf['urls']['pretty'] = false;
$conf['safe_ips'] = array('192.168.10.0');
$conf['session']['name'] = 'Horde';
$conf['session']['use_only_cookies'] = true;
$conf['session']['cache_limiter'] = 'nocache';
$conf['session']['timeout'] = 0;
$conf['session']['max_time'] = 0;
$conf['cookie']['domain'] = $_SERVER['SERVER_NAME'];
$conf['cookie']['path'] = '/';
Database
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['sql']['phptype'] = 'mysql';
$conf['sql']['persistent'] = false;
$conf['sql']['username'] = 'horde';
$conf['sql']['password'] = 'hordepassord';
$conf['sql']['protocol'] = 'unix';
$conf['sql']['database'] = 'horde';
$conf['sql']['charset'] = 'utf-8';
$conf['sql']['ssl'] = false;
$conf['sql']['splitread'] = false;
LDAP
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['ldap']['useldap'] = false;
Authentication
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['auth']['admins'] = array('mailadmin@eksempel.no');
$conf['auth']['checkip'] = true;
$conf['auth']['checkbrowser'] = true;
$conf['auth']['resetpassword'] = true;
$conf['auth']['alternate_login'] = false;
$conf['auth']['redirect_on_logout'] = false;
$conf['auth']['list_users'] = 'list';
$conf['auth']['params']['phptype'] = 'mysql';
$conf['auth']['params']['protocol'] = 'unix';
$conf['auth']['params']['username'] = 'mail';
$conf['auth']['params']['password'] = 'sterktpassord';
$conf['auth']['params']['database'] = 'mail';
$conf['auth']['params']['query_auth'] = 'SELECT * FROM mailbox WHERE username = \L AND password = \P';
$conf['auth']['params']['query_add'] = 'INSERT INTO mailbox (username,password) VALUES (\L, \P)';
$conf['auth']['params']['query_getpw'] = 'SELECT password FROM mailbox WHERE username = \L';
$conf['auth']['params']['query_update'] = 'UPDATE mailbox SET username = \L, password = \P WHERE username = \O';
$conf['auth']['params']['query_resetpassword'] = 'UPDATE mailbox SET password = \P WHERE username = \L';
$conf['auth']['params']['query_remove'] = 'DELETE FROM mailbox WHERE username = \L';
$conf['auth']['params']['query_list'] = 'SELECT username FROM mailbox';
$conf['auth']['params']['query_exists'] = 'SELECT 1 FROM mailbox WHERE username = \L';
$conf['auth']['params']['encryption'] = 'crypt-md5';
$conf['auth']['params']['show_encryption'] = false;
$conf['auth']['driver'] = 'customsql';
$conf['auth']['params']['count_bad_logins'] = false;
$conf['auth']['params']['login_block'] = false;
$conf['auth']['params']['login_block_count'] = 5;
$conf['auth']['params']['login_block_time'] = 5;
Sign Up
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['signup']['allow'] = false;
Logging
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['log']['priority'] = 'INFO';
$conf['log']['ident'] = 'HORDE';
$conf['log']['name'] = LOG_USER;
$conf['log']['type'] = 'syslog';
$conf['log']['enabled'] = true;
$conf['log_accesskeys'] = false;
Preference System
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['prefs']['params']['driverconfig'] = 'horde';
$conf['prefs']['driver'] = 'Sql';
Alarm System
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['alarms']['params']['driverconfig'] = 'horde';
$conf['alarms']['params']['ttl'] = 300;
$conf['alarms']['driver'] = 'Sql';
Groups
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['group']['driverconfig'] = 'horde';
$conf['group']['driver'] = 'Sql';
Permissions
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['perms']['driverconfig'] = 'horde';
$conf['perms']['driver'] = 'Sql';
Shares
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['share']['no_sharing'] = false;
$conf['share']['auto_create'] = true;
$conf['share']['world'] = true;
$conf['share']['any_group'] = false;
$conf['share']['hidden'] = false;
$conf['share']['cache'] = false;
$conf['share']['driver'] = 'Sqlng'
Cache System
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['cache']['default_lifetime'] = 86400;
$conf['cache']['params']['sub'] = 0;
$conf['cache']['driver'] = 'File';
$conf['cache']['compress'] = true;
$conf['cache']['use_memorycache'] = '';
$conf['cachecssparams']['url_version_param'] = true;
$conf['cachecss'] = false;
$conf['cachejsparams']['url_version_param'] = true;
$conf['cachejs'] = false;
$conf['cachethemes'] = false;
Lock System
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['lock']['params']['driverconfig'] = 'horde';
$conf['lock']['driver'] = 'Sql';
Token System
<<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['token']['params']['driverconfig'] = 'horde';
$conf['token']['driver'] = 'Sql';
Mailer
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['mailer']['params']['sendmail_path'] = '/usr/lib/sendmail';
$conf['mailer']['params']['sendmail_args'] = '-oi';
$conf['mailer']['type'] = 'sendmail';
$conf['mailformat']['brokenrfc2231'] = false;
Virtual File Storage
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['vfs']['params']['driverconfig'] = 'horde';
$conf['vfs']['type'] = 'Sql';
Custom Session Handler
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['sessionhandler']['type'] = 'Builtin';
$conf['sessionhandler']['memcache'] = false;
HTTP Proxy
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
Tomt...
Spell Checker
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['spell']['driver'] = '';
GnuPG
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['gnupg']['keyserver'] = array('pool.sks-keyservers.net');
$conf['gnupg']['timeout'] = 10;
OpenSSL
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
Tomt...
Themes
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['nobase64_img'] = false;
Image Manipulation
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['image']['driver'] = false;
$conf['exif']['driver'] = 'Bundled';
MIME Detection
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
Tomt...
Country Lookup
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
Tomt...
Timezone Lookup
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['timezone']['location'] = 'ftp://ftp.iana.org/tz/tzdata-latest.tar.gz';
Problem Reporting
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['problems']['email'] = 'webmaster@example.com';
$conf['problems']['maildomain'] = 'example.com';
$conf['problems']['tickets'] = false;
$conf['problems']['attachments'] = true;
Menu
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['menu']['links']['help'] = 'all';
$conf['menu']['links']['prefs'] = 'authenticated';
$conf['menu']['links']['problem'] = 'all';
$conf['menu']['links']['login'] = 'all';
$conf['menu']['links']['logout'] = 'authenticated';
Portal Blocks
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['portal']['fixed_blocks'] = array();
$conf['accounts']['driver'] = 'null';
User Capabilities and Constraints
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['user']['verify_from_addr'] = false;
$conf['user']['select_view'] = true;
API Keys
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['facebook']['enabled'] = false;
$conf['twitter']['enabled'] = false;
$conf['urlshortener'] = false;
$conf['weather']['provider'] = false;
IMAP Server
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['imap']['enabled'] = false;
IMSP Server
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['imsp']['enabled'] = false;
Kolab Server
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['kolab']['enabled'] = false;
Memcache Server
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $
$conf['memcache']['enabled'] = false;
Activesync
<?php
/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Id: Laaaangt_ID_nummer... $$conf['activesync']['emailsync'] = true;
$conf['activesync']['version'] = '12.1';
$conf['activesync']['autodiscovery'] = 'full';
$conf['activesync']['hosts']['imap']['host'] = 'mail.eksempel.no';
$conf['activesync']['hosts']['imap']['port'] = 993;
$conf['activesync']['hosts']['imap']['ssl'] = true;
$conf['activesync']['hosts']['pop']['host'] = 'mail.eksempel.no';
$conf['activesync']['hosts']['pop']['port'] = 995;
$conf['activesync']['hosts']['pop']['ssl'] = true;
$conf['activesync']['hosts']['smtp']['host'] = 'mail.eksempel.no';
$conf['activesync']['hosts']['smtp']['port'] = 465;
$conf['activesync']['hosts']['smtp']['popauth'] = true;
$conf['activesync']['hosts']['smtp']['ssl'] = true;
$conf['activesync']['outlookdiscovery'] = true;
$conf['activesync']['logging']['type'] = 'horde';
$conf['activesync']['ping']['heartbeatmin'] = 60;
$conf['activesync']['ping']['heartbeatmax'] = 2700;
$conf['activesync']['ping']['heartbeatdefault'] = 480;
$conf['activesync']['ping']['deviceping'] = true;
$conf['activesync']['ping']['waitinterval'] = 5;
$conf['activesync']['enabled'] = true;

Puh...

Backends.local.conf

Som nevnt tidligere må vi også lage noen filer kalt backends.local.php, og på testserveren min ser de (den, faktisk) nøyaktig slik ut:

/imp/config/backends.local.php

vi /var/www/imp/config/backends.local.php

<?php
$servers['imap']['hordeauth'] = full;
$servers['imap']['secure'] = false;

(Ja, det er riktig. Det er ingen avsluttende php-tag der. Horde-standard...)

Vi må endre eierskapet til filen:

chown www-data:www-data /var/www/imp/config/backends.local.php

Klargjøre ActiveSync

Lage en tmp-mappe:

mkdir /var/www/horde/phptmp/
chown -R www-data:www-data /var/www/phptmp

Lage /etc/apache2/conf.d/horde.conf og fylle den med innhold:

vi /etc/apache2/conf.d/horde.conf

Alias /Microsoft-Server-ActiveSync /var/www/rpc.php
Alias /horde /var/www

	Options +FollowSymLinks
	AllowOverride None
	order allow,deny
	allow from all
	AddType application/x-httpd-php .php
	php_value include_path ".:/usr/share/php"
	php_value open_basedir "none"
	php_value upload_tmp_dir "/var/www/phptmp/"

Restarte Apache:

service apache2 restart

Vel, så sant jeg ikke har glemt noe nå er e-postserveren ferdig konfigurert. Nå er det bare å legge til brukere via https://mail.eksempel.no/postfixadmin! (Alternativt kaste seg over Google for feilsøking...)
For øvrig finner du mye nyttig informasjon om Horde og deres applikasjoner her: http://www.horde.org/apps/. Tipset er å klikke på Documentation under de respektive appene.

Scriptene som sjekker status på RAID

Nå er e-postserveren operativ, og det er på tide å klargjøre scriptene jeg nevnte innledningsvis, som gir oss status på RAID.
Jeg har laget to stykker. Det ene kjører hver morgen, og sender meg (root, som er mappet til mailadmin@eksempel.no) en e-post med informasjon om at alt er bra. (Forhåpentligvis...)
Det andre sjekker status hvert kvarter, og fyrer av en e-post til meg hvis statusen endres.
Lag katalogen /usr/local/sbin hvis den ikke allerede finnes:

mkdir /usr/local/sbin

Lag scriptet som sender e-post med RAID-status hver morgen:

vi /usr/local/sbin/mdadmStatus

#!/bin/bash

# Dette scriptet sjekker mdadm og mailer status

/sbin/mdadm -D /dev/md0 &> /tmp/mdadmlog.log
/usr/bin/mail -s "RAID status på e-postserver" root < /tmp/mdadmlog.log

Lag scriptet som sender e-post hvis status endres på RAID:

vi /usr/local/sbin/mdadmError

#!/bin/bash

# Dette scriptet sjekker mdadm og mailer status hvis Error


/sbin/mdadm -D /dev/md0 &> /tmp/mdadmErrorlog.log

LOGGFIL="/tmp/mdadmErrorlog.log"

if ! grep -q "State : clean" "$LOGGFIL"; then
   /usr/bin/mail -s "RAID status ENDRET på e-postserver!" root < /tmp/mdadmErrorlog.log
fi

Vi må gjøre scriptene kjørbare:

chmod 755 /usr/local/sbin/mdadmStatus
chmod 755 /usr/local/sbin/mdadmError

Nå må vi legge til scriptene i CRON:
(Husk blank linje til slutt.)

crontab -e

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
PATH=/usr/sbin:/usr/bin:/sbin:/bin
30 06 * * * /usr/local/sbin/mdadmStatus
*/15 * * * * /usr/local/sbin/mdadmError
 

Nå har du iallefall litt kontroll på RAID-oppsettet...

Automatisk inkrementell backup med rsync og rsnapshot over SSH

Målet vårt er å automatisk ta backup av e-postserveren, mens den er i drift, til en backupserver stående på en annen fysisk lokasjon. Det er mange veier til Rom, men dette er hvordan jeg har valgt å løse det.
Skjematisk har jeg gjort det på følgende måte:

  1. Først og fremst: Satt opp SSH så jeg har rottilgang til e-postserveren uten å måtte logge meg på som root.
  2. Stoppe alle tjenester på e-postserveren som kan skrive til databasen.
  3. Bruke rsync til å kopiere relevante mapper over til et interrim-område på e-postserveren
  4. Starte alle tjenestene igjen
  5. Bruke rsnapshot på backupserveren og logge meg inn på e-postserveren via SSH for å kopiere dataene på interrim-området.
  6. Gjenta prosessen inkrementelt daglig.

Dette fungerer, men det har to ulemper: Jeg må ha nedetid på serveren, og jeg bruker dobbelt så mye plass på e-postserveren som det jeg ville gjort uten backup.
Dessverre er det ene problemet direkte relatert til det andre: For å slippe at serveren skal være nede mens jeg flytter filene via Internett over til backupserveren lagrer jeg de lokalt først. Med andre ord: Sett opp serveren med store og raske disker... 🙂
Når det gjelder nedetiden er den, hvis du ikke har svært mye trafikk med store mengder data hver dag, ikke spesielt lang. La oss si ett minutt eller to hvis du har en inkrementell backup på 1 GB. Gjøres dette på lei natterstid er det neppe mange brukere som lar seg affisere. Har du en bedre løsning er det naturligvis bare å komme med den, jeg er lutter øre!

For øvrig: Måten vi tar backup på beholder rettigheter og eierskap på filene slik de var originalt!

SSH med rottilgang

Dette var en lei nøtt å knekke, men her er metoden "min".
Jeg anbefaler at du er veldig observant på om kommandoene jeg skriver skal utføres på backupserveren eller på e-postserveren, og om de skal utføres som root eller ikke. Det er lett å trå feil her.

På Backupserveren

Først skal vi gjøre noen operasjoner på Backupserveren. (Jeg nevnte i innledningen at jeg forutsetter at dette er en boks med Ubuntu 12.04, og jeg håper du som jeg har den stående bak en fast, offentlig ip-adresse...)
(For ordens skyld kaller jeg brukeren som ble opprettet da backupserveren ble satt opp for bakoppadmin. (Dette er med andre ord standardbrukeren på backupserveren.))

Som root, opprett brukeren rbackup:

adduser rbackup

Bytt til bruker rbackup og opprett et SSH nøkkelpar

su rbackup
ssh-keygen -t rsa

Du blir nå bedt om å fylle ut plassering for filene, og en eventuell passfrase. Trykk [Enter] på hvert spørsmål.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/b/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/b/.ssh/id_rsa.
Your public key has been saved in /home/b/.ssh/id_rsa.pub.

Din offentlige nøkkel er nå tilgjengelig som .ssh/id_rsa.pub i hjemmemappen din (/home/rbackup/.ssh/id_rsa.pub).

Fremdeles som rbackup, opprett filen ~/.ssh/config:

vi ~/.ssh/config

Host mail.eksempel.no
  Port 2022

Som bakoppadmin, opprett mappen ~/kanslettes og gjør den tilgjengelig for alle:

su bakoppadmin
mkdir ~/kanslettes
chmod 777 ~/kanslettes

Som rbackup, kopier filen id_rsa.pub til /home/bakoppadmin/kanslettes:

su rbackup
cp /home/rbackup/.ssh/id_rsa.pub /home/bakoppadmin/kanslettes/id_rsa.pub

Som bakoppadmin, flytt id_rsa.pub over til e-postserveren:
(Har du klart å følge med helt hit regner jeg med at du allerede har SSH-tilgang til e-postserveren som standardbruker...)

su bakoppadmin
scp -P 2022 /home/bakoppadmin/kanslettes/id_rsa.pub/ mailadmin@mail.eksempel.no:~/

Bli root. Lag roots SSH-mappe hvis den ikke eksisterer. Gi riktige tillatelser og opprett SSHs config-fil:

sudo -i
mkdir .ssh
chmod 777 .ssh
cd .ssh
vi config

Host mail.eksempel.no-rsync
  Port 2022
  Hostname mail.eksempel.no
  User rbackup
  IdentityFile /home/rbackup/.ssh/id_rsa

chmod 600 config

(Også denne siste kommandoen var som root.)

På E-postserveren

Nå skal vi flytte oss over på e-postserveren (du kan gjøre dette via SSH som vanlig bruker).

Opprett brukeren rbackup:

sudo adduser rbackup

Gjøre backupserverens id_rsa.pub tilgjengelig for brukeren rbackup, og lagre den som filen authorized_keys i mappen .ssh:

su rbackup
cd
mkdir .ssh
chmod 700 .ssh
cd .ssh
cat /home/mailadmin/id_rsa.pub > authorized_keys
chmod 600 authorized_keys

Så kommer en utfordring: Vi skal begrense bruken av filen authorized_keys til kun backupserveren, og vi skal tillate den å kjøre kun én kommando. Det er her du er lykkelig hvis du har statisk, offentlig ip-adresse på backupserveren.
Hvis du logger deg ut fra SSH-tilkoblingen til e-postserveren, og så logger deg inn igjen, vil du se noe a lá følgende:

Last login: Tue Apr  2 10:53:15 2013 from 211.195-122-214.enduser.telenor.net

Den omvendte ip-adressen med litt tekst bak gir deg en unik identifikasjon. Notér ned denne. (For alt jeg vet klarer du å faktisk bruke den vanlige ip-adressen som identifikator. Hvis så er tilfelle, kommentér gjerne, og fortell hva du gjorde annerledes.)

Nå er du innlogget igjen,så vi fortsetter.
Det neste vi skal gjøre er altså, som rbackup, å redigere filen authorized_keys ved å legge til tekst først i nøkkelen:

su rbackup
cd
cd .ssh
vi authorized_keys

from="211.195-122-214.enduser.telenor.net",command="/home/rbackup/validate_rsync.sh" ssh-rsa AX
...resten av nøkkelen...rbackup@backupserver.domene.no

Fremdeles som rbackup, opprett et script kalt validate_rsync.sh:

cd
vi validate_rsync.sh

#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
  *\&*)
    echo "Connection closed"
    ;;
  *\;*)
    echo "Connection closed"
    ;;
    rsync*)
    $SSH_ORIGINAL_COMMAND
    ;;
  *true*)
    echo $SSH_ORIGINAL_COMMAND
    ;;
  *)
    echo "Connection closed."
    ;;
esac

Som rbackup, gjør scriptet kjørbart og gi det riktige rettigheter:

chmod 755 validate_rsync.sh

Fremdeles som rbackup: Gå tilbake til å være brukeren mailadmin igjen:

exit

I dette påfølgende punktet er det ekstremt viktig at du ikke gjør noe feil. Du kan risikere å låse deg selv fullstendig ute fra e-postserveren. Du er advart!!!
Vi skal nå gi brukeren rbackup muligheten til å kunne kjøre rsync med rotrettigheter, uten å måtte oppgi noe passord.
Start visudo (som mailadmin med sudo):

sudo visudo

Legg denne linjen til nederst i filen:

rbackup    ALL=NOPASSWD:/usr/bin/rsync

Som mailadmin med sudo, opprett en rsync wrapper kalt rsync_wrapper.sh i /usr/local/sbin:

sudo vi /usr/local/sbin/rsync_wrapper.sh

#!/bin/sh
/usr/bin/sudo /usr/bin/rsync "$@";

Som mailadmin med sudo, gjør scriptet kjørbart og gi det riktige rettigheter:

chmod 755 /usr/local/sbin/rsync_wrapper.sh

Testing

Da er det klart for testing.

Test 1

Som brukeren rbackup på backupserveren:

ssh mail.eksempel.no

Dette er det meningen at skal gi følgende feilmelding:
Connection closed.
Connection to mail.eksempel.no closed.

Test 2

Som brukeren root på backupserveren:

ssh mail.eksempel.no-rsync

Dette er det meningen at skal gi følgende feilmelding:
Connection closed.
Connection to mail.eksempel.no closed.

Test 3

Som brukeren root på backupserveren, forsøk å kjøre rsync av noe som er eid av root på e-postserveren:

rsync -ae ssh –rsync-path=’rsync_wrapper.sh’ mail.eksempel.no-rsync:/etc
/home/bakoppadmin/kanslettes/

Dette er det meningen at skal kopiere mappen /etc fra e-postserveren over til /home/bakoppadmin/kanslettes/ på backupserveren.

Hvis alle testene ga forventet resultat er du klar til å gå videre. Du (og kun du, fra backupserveren) kan nå kjøre rsync (og dermed rsnapshot) mellom maskinene, og det gjøres uten root i SSH. Hvis testene ikke ga forventet resultat er det ut å google...

rsynk til interrimmappe på e-postserveren

Målet her er hver natt å kjøre et script som stopper essensielle tjenester, kopierer essensielle mapper og deretter starter essensielle tjenester igjen. Vi ønsker også å få tilsendt en e-post som viser utfallet av jobben etter at den er gjort. Vi må opprette en mappe på serveren som brukes til mellomlagring. Fordi vi ønsker å kjøre rsync (delvis) inkrementelt kan denne ikke legges under /tmp. Vi ønsker også at mappen skal være eid av root. Derfor oppretter jeg den under /opt, selv om det muligens ikke er det korrekte stedet å legge den. Igjen, kom gjerne med innspill om hvordan dette kan forbedres.
Når det gjelder MySQL tar jeg en kopi av hele mappen /var/lib/mysql. Ved gjenoppretting MySQL være i samme versjon som den var da det ble tatt backup.
Synkroniseringen foregår på den måten at nye filer legges til interrimmappen, mens gamle filer slettes (eller erstattes hvis de er endret). Det inkrementelle er det rsnapshot som tar seg av senere på backupserveren.

Logg deg inn (som bakoppadmin) på e-postserveren via SSH:

ssh -p 2022 mailadmin@mail.eksempel.no

Du er nå innlogget. Kommandoene heretter skal kjøres (gjennom SSH) på e-postserveren.

Lag mappen /opt/interrim:

sudo mkdir /opt/interrim

Lag scriptet /usr/local/sbin/mellomlagring:

sudo vi /usr/local/sbin/mellomlagring

#!/bin/bash
#: Title:       : mellomlagring
#: Date:        : 2013.04.01
#: Author:      : Erol Haagenrud
#: Version:     : 1.0
#: Description: : Stop services, copy files and start services again
#: Options:     : None

# Stopping essential services
/usr/sbin/service postfix stop
/usr/sbin/service dovecot stop
/usr/sbin/service amavis stop
/usr/sbin/service clamav-daemon stop
/usr/sbin/service apache2 stop
/usr/sbin/service mysql stop

# At what time did the services stop?
# (Based on  http://stackoverflow.com/questions/8903239/
# how-to-calculate-time-difference-in-bash-script )
date1=$(date +"%s")

# Copying Essential folders
/usr/bin/rsync -av -delete /var/www/ /opt/interrim/_WWWBakopp/
/usr/bin/rsync -av -delete /var/mail/ /opt/interrim/_MAILBakopp/
/usr/bin/rsync -av -delete /var/vmail/ /opt/interrim/_VMAILBakopp/
/usr/bin/rsync -av -delete /var/lib/mysql/ /opt/interrim/_SQLBakopp/
/usr/bin/rsync -av -delete /etc/ /opt/interrim/_ETCBakopp/

# Starting essential services again
/usr/sbin/service mysql start
/usr/sbin/service apache2 start
/usr/sbin/service postfix start
/usr/sbin/service clamav-daemon start
/usr/sbin/service amavis start
/usr/sbin/service dovecot start

# At what time did the services start up again?
date2=$(date +"%s")

# Calculating downtime
diff=$(($date2-$date1))

# Presenting the downtime
echo "Nedetid var $(($diff / 60)) minutter og $(($diff % 60)) sekunder."

Gjør scriptet kjørbart og gi det riktige rettigheter:

sudo chmod 755 /usr/local/sbin/mellomlagring

Legg scriptet til i CRON:
(Jeg har satt det til å kjøre 02:50 hver natt.)

sudo crontab -e

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
PATH=/usr/sbin:/usr/bin:/sbin:/bin
30 06 * * * /usr/local/sbin/mdadmStatus
*/15 * * * * /usr/local/sbin/mdadmError
50 02 * * * /usr/local/sbin/mellomlagring
 

Kjør scriptet manuelt:
For å se at det hele fungerer kan du kjøre scriptet manuelt:

sudo bash /usr/local/sbin/mellomlagring

Du skal nå etterhvert motta en e-post med oversikt over alle filer kopiert.

rsnapshot på backupserveren

Nå er det på tide å sette opp backupserveren slik at den tar automatisk, inkrementell backup av interrimmappen på e-postserveren.
Bestem deg på forhånd for hvilken mappe på backupserveren du ønsker å lagre backup-filene i, og opprett denne. Her bruker jeg mappen /home/bakoppadmin/Backup/Epostserver

Installér rsnapshot:

sudo apt-get install rsnapshot

Lag en kopi vi skal jobbe med av /etc/rsnapshot.conf:

sudo cp /etc/rsnapshot.conf /etc/rsnapshot-epost.conf

Redigér /etc/rsnapshot-epost.conf:

sudo vi /etc/rsnapshot-epost.conf

For å gjøre det enkelt å se hvilke innstillinger som fungerer (hos meg) har jeg fjernet alle kommentarer som er i filen. Jeg anbefaler at du i det minste tar en titt på den originale /etc/rsnapshot.conf for å se hva de respektive kommandoene betyr.

#################################################
# rsnapshot.conf - rsnapshot configuration file #
#################################################
#                                               #
# PLEASE BE AWARE OF THE FOLLOWING RULES:       #
#                                               #
# This file requires tabs between elements      #
#                                               #
# Directories require a trailing slash:         #
#   right: /home/                               #
#   wrong: /home                                #
#                                               #
#################################################

#######################
# CONFIG FILE VERSION #
#######################

config_version	1.2

snapshot_root	/home/bakoppadmin/Backup/Epostserver/

cmd_cp		/bin/cp

cmd_rm		/bin/rm

cmd_rsync	/usr/bin/rsync

cmd_ssh	/usr/bin/ssh

cmd_logger	/usr/bin/logger

cmd_du		/usr/bin/du

retain		daily	7
retain		weekly	4
retain		monthly	3

verbose		2

loglevel	3

logfile	/var/log/rsnapshot.log

lockfile	/var/run/rsnapshot-epost.pid

backup	rbackup@mail.eksempel.no-rsync:/opt/interrim/	/	rsync_long_args=--rsync-path=rsync_wrapper.sh

Test om syntax er ok:

sudo rsnapshot -c /etc/rsnapshot-epost.conf configtest

Ta en "dry-run" av scriptet:

sudo rsnapshot -c /etc/rsnapshot-epost.conf configtest -t daily

Hvis du nå ser at rsnapshot opprettet mapper og lignende fungerte dette.

Sett opp kjøring av scriptet i CRON:

sudo crontab -e

Jeg har bedt om at scriptet i daily-versjon skal kjøres daglig klokka 03:30.
Jeg har bedt om at scriptet i weekly-versjon skal kjøres hver søndag klokka 04:30.
Jeg har bedt om at scriptet i monthly-versjon skal kjøres den 1. hver måned klokka 05:30.

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
30 03 * * * /usr/bin/rsnapshot -c /etc/rsnapshot-epost.conf daily
30 04 * * 0 /usr/bin/rsnapshot -c /etc/rsnapshot-epost.conf weekly
30 05 1 * * /usr/sbin/rsnapshot -c /etc/rsnapshot-epost.conf monthly

Nå kan du kjøre scriptet manuelt og utføre den første backupen:
(Dette kan naturligvis ta litt tid, og forutsetter også at du har kjørt rsync-jobben på e-postserveren minst én gang.)

sudo rsnapshot /etc/rsnapshot-epost.conf configtest daily

Dett var dett! Har du fulgt denne veiledningen, og fått det hele til å fungere, så gratulerer jeg på det varmeste! Ta deg noe kaldt å drikke, og klapp deg selv på skulderen! 🙂

PHP bug

Hvis du, som jeg, får crash i apacheserveren fra tid til annen, med årsak

PHP Fatal error:  Base lambda function for closure not found in /var/www/imp/config/prefs.php

så skyldes dette en bug i PHP, og det er ikke funnet noen løsning ennå. Det virker for meg som om det er synkronisering mot mobiler som innimellom trigger dette.
Måten jeg omgår problemet på er ved å regelmessig sjekke Apaches errorlog, og restarte hvis jeg finner feil. Inspirasjonen hentet jeg herfra (Inspirasjon er feil uttrykk. Scriptet er tilnærmet råkopiert...).

Logg deg inn (som bakoppadmin) på e-postserveren via SSH:

ssh -p 2022 mailadmin@mail.eksempel.no

Opprett scriptet /usr/local/sbin/apacheErrorCheck:

sudo vi /usr/local/sbin/apacheErrorCheck

#!/bin/bash

# Exec og set genererer en loggfil for feilsøking.
# Fjern de når du ser at scriptet fungererer.
exec &>/tmp/ApacheErrorCheck.log
set -x

# I /var/log/apache2/error.log presenteres datoer slik:
# [Mon Apr 08 16:37:01 2013]
# %b skal egentlig returnere forkortet versjon av månedens navn (Apr),
#
# men med norsk Ubuntu returnerer både %b, %h og %B hele navnet (april).
# For å få scriptet til å matche datoen i Apache-loggen må du derfor legge til
# LC_ALL=C
# som setter nasjonale innstillinger til standardspråk (engelsk).
DATE=`LC_ALL=C date +%b" "%d" "%H`

#Mention the ID/User used to start the apache service
ApacheID=root

#Statement to check if the last hour has more than 7 errors registered in error.log file of Apache

if [ `grep "$DATE" /var/log/apache2/error.log | awk '{print $2" "$3" "$4}' | awk 'BEGIN {FS=":"};{print $1":"$2}' | uniq -c | awk '{print " "$1" "}' | grep -v " 1 " | awk '{tot=tot+$1} END {print tot+1}'` -gt 7 ]

then

#Setting up the email message file
email="/tmp/email.txt"

#Sending the output of top for user webadm to the email message body
#/usr/bin/top -b -U $ApacheID -n 1 >$email

#Appending a line break to the email body
echo "">>$email

#This command sends the current semaphore count to the email body
ipcs -s>>$email

#Send the composed email message
mail -s "Error i Apache logfilen; Restarter Apache" "mailadmin@eksempel.no" < $email

#Stopping Apache
service apache2 stop

#This makes sure that Apache stops/sleeps before continuing
while [ `ps -eaf | grep [h]ttpd | wc -l` -gt 0 ]
do
sleep 1
done

#Clean up any memory available, If memhog utility is not available in your system then comment out below line qith a # mark
#/usr/bin/memhog 1G

#Rotate the error log file to a fresh one keeping a backup of old.
mv /var/log/apache2/error.log /var/log/apache2/error.log_restarted_`date +\%Y.\%m.\%d.\%H`

#Start-up Apache
service apache2 start

fi

Gjør scriptet kjørbart og gi det riktige rettigheter:

sudo chmod 755 /usr/local/sbin/apacheErrorCheck

Sett det opp i CRON:

sudo crontab -e

(Jeg har satt det opp på denne måten for å unngå at det kjører mens serveren er nede på grunn av backup.)

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
PATH=/usr/sbin:/usr/bin:/sbin:/bin
30 06 * * * /usr/local/sbin/mdadmStatus
*/15 * * * * /usr/local/sbin/mdadmError
50 02 * * * /usr/local/sbin/mellomlagring
*/2 00-01 * * * /usr/local/sbin/apacheErrorCheck
00-40/2 02 * * * /usr/local/sbin/apacheErrorCheck
30-59/2 03 * * * /usr/local/sbin/apacheErrorCheck
*/2 04-23 * * * /usr/local/sbin/apacheErrorCheck

Til slutt må det nevnest at det å deaktivere APC trolig løser problemet, men kan gjøre at nettsidene lastes tregere. For å deaktivere APC legger du til et semikolon i /etc/php5/apache2/conf.d/apc.ini:

vi /etc/php5/apache2/conf.d/apc.ini

;extension=apc.so

for så å restarte Apache:

service apache2 restart

 

 

 

3 kommentarer

  1. Marius Hov Lauritzen på 7. august 2013 kl 16:26

    Fantastisk guide! Vil teste dette ut i nærmeste fremtid.
    Må si jeg er stor tilhenger av dine løsninger i forholdt til Linux-servere. Veldig bra forklart! +++++

    • Envide på 14. august 2013 kl 20:52

      Takk for det! Jeg håper det fungerer, og setter stor pris på tilbakemelding etter at du har testet det ut. 🙂

  2. […] Envide Datakonsultasjon » Komplett guide til oppsett av e-postserver (Postfix, Dovecot, Horde 5, Ac… Etter fullføring av denne veiledningen vil du sitte igjen med en Ubuntu Server (installert med software RAID 1 om ønskelig), som tilbyr stort sett alt av e-posttjenester. Du vil ha virtuelle brukere o… […]

Legg igjen et svar Avbryt svar