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:
- http://www.exratione.com/2012/05/a-mailserver-on-ubuntu-1204-postfix-dovecot-mysql/ (Denne har vært utgangspunktet mitt, men den er basert på posten under.)
- http://flurdy.com/docs/postfix/ Denne bloggposten til Ivar Abrahamsen burde være obligatorisk lesestoff for alle som vil sette opp en e-postserver!
- https://help.ubuntu.com/12.04/serverguide/advanced-installation.html
- http://www.howtoforge.com/perfect-server-ubuntu-12.04-lts-apache2-bind-dovecot-ispconfig-3
- http://kamaradski.com/1245/how-to-install-and-setup-rsnapshot-incremental-remote-backup
- http://stackoverflow.com/questions/9293042/mysqldump-without-the-password-prompt
- http://ubuntuforums.org/showthread.php?t=1972302
- http://theupstairsroom.com/116
- http://www.howtoforge.com/install-horde-4-webmail-for-ispconfig-on-debian-squeeze-through-pear
- http://serverfault.com/questions/446541/horde-complains-that-imp-is-not-running
- http://technokracy.net/2011/01/07/root_sudo_rsnapshot/
- http://en.gentoo-wiki.com/wiki/Rsnapshot
- http://ubuntuforums.org/showthread.php?t=1132821
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.)).
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:
Installér Vim-nox (en bedre versjon av vi enn den som er installert standard i Ubuntu):
Husk å sette statisk ip-adresse på serveren:
# 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:
Rediger /etc/hosts og justér tilsvarende eksemplet under:
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:
/etc/init.d/hostname restart
Kjør så:
hostname -f
Begge skal nå vise mail.eksempel.no.
Fjern AppArmor:
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils
Synkronisér systemklokken:
Installér OpenSSH server:
Redigér konfigurasjonsfilen til OpenSSH (Jeg har strippet eksemplet under for kommenterte linjer):
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:
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!
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)
For mer info: http://linux.die.net/man/1/ssh-copy-id
Nå skal du kunne logge deg inn uten å måtte skrive passord:
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:
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:
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:
Endre til root (på serveren):
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 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:
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:
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
# # 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:
a2ensite default-ssl
Enkelt oppsett av standardnettsiden:
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:
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:
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:
RewriteEngine On RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*) https://mail.eksempel.no/$1 [L]
Installér og konfigurér Memcached:
Installere Mailserver
Installér hele pakken fra Ubuntus pakkebrønn
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 amavis clamav clamav-daemon spamassassin
apt-get install php5-imap
(php5-imap støtter faktisk også POP3)
Restart Apache:
Installer pakker som utvider mulighetene til å filtrere spam og virus:
apt-get install arj bzip2 cabextract cpio file gzip nomarch pax unzip zip unrar
Logg deg inn i MySQL som root:
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.)
grant all on mail.* to ‘mail’@’localhost’ identified by ‘sterktpassord’;
quit;
Gå ut av MySQL:
(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.
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:
/*****************************************************************
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* 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:
// 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:
<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:
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:
# 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:
# 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.
# 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:
# 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.)
# 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:
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 amavis clamav
Aktivér Amavis:
("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:
# 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:
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 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:
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:
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:
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:
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:
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:
/^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:
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:
# 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:
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:
# # 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 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:
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-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:
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 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:
Sjekk at php-utvidelser er aktivert:
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:
.htaccess har blitt overskrevet under installasjonen av Horde. Endre tilbake, så alt blir rutet til HTTPS:
# 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:
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:
Opprett databasen og brukeren:
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.)
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:
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
<?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:
Klargjøre ActiveSync
Lage en tmp-mappe:
chown -R www-data:www-data /var/www/phptmp
Lage /etc/apache2/conf.d/horde.conf og fylle den med innhold:
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:
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:
Lag scriptet som sender e-post med RAID-status hver morgen:
#!/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:
#!/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/mdadmError
Nå må vi legge til scriptene i CRON:
(Husk blank linje til slutt.)
# 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:
- Først og fremst: Satt opp SSH så jeg har rottilgang til e-postserveren uten å måtte logge meg på som root.
- Stoppe alle tjenester på e-postserveren som kan skrive til databasen.
- Bruke rsync til å kopiere relevante mapper over til et interrim-område på e-postserveren
- Starte alle tjenestene igjen
- Bruke rsnapshot på backupserveren og logge meg inn på e-postserveren via SSH for å kopiere dataene på interrim-området.
- 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:
Bytt til bruker rbackup og opprett et SSH nøkkelpar
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:
Host mail.eksempel.no Port 2022
Som bakoppadmin, opprett mappen ~/kanslettes og gjør den tilgjengelig for alle:
mkdir ~/kanslettes
chmod 777 ~/kanslettes
Som rbackup, kopier filen id_rsa.pub til /home/bakoppadmin/kanslettes:
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...)
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:
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
(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:
Gjøre backupserverens id_rsa.pub tilgjengelig for brukeren rbackup, og lagre den som filen authorized_keys i mappen .ssh:
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:
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:
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:
Fremdeles som rbackup: Gå tilbake til å være brukeren mailadmin igjen:
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):
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:
#!/bin/sh /usr/bin/sudo /usr/bin/rsync "$@";
Som mailadmin med sudo, gjør scriptet kjørbart og gi det riktige rettigheter:
Testing
Da er det klart for testing.
Test 1
Som brukeren rbackup på backupserveren:
Dette er det meningen at skal gi følgende feilmelding:
Connection to mail.eksempel.no closed.
Test 2
Som brukeren root på backupserveren:
Dette er det meningen at skal gi følgende feilmelding:
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:
/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 MÅ 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:
Du er nå innlogget. Kommandoene heretter skal kjøres (gjennom SSH) på e-postserveren.
Lag mappen /opt/interrim:
Lag scriptet /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:
Legg scriptet til i CRON:
(Jeg har satt det til å kjøre 02:50 hver natt.)
# 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:
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:
Lag en kopi vi skal jobbe med av /etc/rsnapshot.conf:
Redigér /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:
Ta en "dry-run" av scriptet:
Hvis du nå ser at rsnapshot opprettet mapper og lignende fungerte dette.
Sett opp kjøring av scriptet i CRON:
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.)
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:
Opprett scriptet /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:
Sett det opp i CRON:
(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:
;extension=apc.so
for så å restarte Apache:
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! +++++
Takk for det! Jeg håper det fungerer, og setter stor pris på tilbakemelding etter at du har testet det ut. 🙂
[…] 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… […]