Root-Server mit Ubuntu 14.04

Aus LT42-Wiki
Zur Navigation springen Zur Suche springen

Strato bietet im Moment ein interessantes Angebot für Bestandskunden an. Server, die nun einige Jahre im Einsatz waren, werden für annehmbare Preise eingerichtet und als Server zur Verfügung gestellt. Für 19€ bekommt man einen Server mit

  • Opteron 1214 HE mit 2 x 2,2 GHz (2x 2000 Bogomips)
  • 4 GB Arbeitsspeicher
  • 2 x 500 GB im RAID1-Verbund Festplattenspeicher

Dazu bietet Strato 500 GB FTP-Backupspeicher und die RemoteConsole, falls der Server-Zugang über SSH mal ausfallen sollte.

Smartmontools

Zu erst ist bei solchen Modellen natürlich interessant, wie lange der Server vorher schon benutzt wurde. Zumindest die Laufzeit der Festplatte ist leicht herauszufinden. Zu erst installieren wir die Smartmontools per APT

sudo apt-get update
sudo apt-get install smartmontools

Dann können wir per

sudo smartctl -a /dev/sda

und

sudo smartctl -a /dev/sdb

die Laufzeiten der beiden Festplatten herausfinden. Bei mir waren das 49377 und 49461 Stunden, also gut 5 1/2 Jahre.

Webserver

Zur Bereitstellung von Webseiten benutzen wir den Apache-Webserver. Da der Server unter mehreren Adressen erreichbar sein wird, richten wir VirtualHosts ein.

Die Installation läuft denkbar einfach über

sudo apt-get update
sudo apt-get install apache2 apache2-utils apache2-doc php5 php5-mysql php-pear

Wir installieren also auch gleich PHP und PHP-PEAR mit.

Nach der Installation geht es an die eigentliche Konfiguration des Webservers. Ziel ist es, das eine Reihe von Anwendungen (Roundcube, PHPMyAdmin, etc.) nur einmal installiert werden müssen und dann allen eingerichteten Domains zur Verfügung stehen. Gleichzeitig sollen Dummies, die den Server über seine IP oder einen nicht vorhandenen Namen ansprechen, keine Dienste nutzen können, sondern lediglich eine Fehler-Seite sehen. Die folgende Konfiguration habe ich in Teilen in ihrer Version vom 12. November 2014 aus dem Debacher-Wiki entnommen (CC-BY-SA). Wir legen also eine Grundkonfiguration für jeden "dummen" Aufruf an.

Die VHosts werden später unter /var/www/vhosts/ angelegt. Unter /var/www/vhosts/default/htdocs/ findet sich dann die Fehlerseite und unter /var/www/htdocs/ die entsprechenden Anwendungen.

Wichtig ist, dass wir die Datei vorher einmal sichern:

cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.org

/etc/apache2/sites-available/000-default.conf

ServerName default
ServerAdmin webmaster@lukasthiel.de

ServerTokens Major

DocumentRoot /var/www/htdocs/

# Aliase werden einmal zentral gesetzt. Diese Aliase sind von allen Domains aus erreichbar.
Alias /webmail   /var/www/htdocs/roundcube
Alias /ftp       /var/www/htdocs/webftp

<Directory "/var/www/vhosts">
       AllowOverride All
       Options +FollowSymLinks
       Order allow,deny
       Allow from all
       <IfModule mod_php5.c>
       </IfModule>
</Directory>

<IfModule mod_userdir.c>
       UserDir disabled
</IfModule>

<VirtualHost *:80>
       ServerName default
       UseCanonicalName Off
       DocumentRoot /var/www/vhosts/default/htdocs/
       ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

       # Blocken der Anfragen an eingerichtete Dienste
       Alias /webmail      /var/www/htdocs/dummy
       Alias /pma          /var/www/htdocs/dummy
       Alias /webftp       /var/www/htdocs/dummy
       Alias /roundcube    /var/www/htdocs/dummy

       <IfDefine MAILMAN>
          ScriptAlias     /mailman/       /var/www/htdocs/dummy
          Alias           /mailmanicons/  /var/www/htdocs/dummy
          Alias           /pipermail/     /var/www/htdocs/dummy
       </IfDefine>

       <IfModule mod_ssl.c>
               SSLEngine off
       </IfModule>
       # Deaktivieren des Zugriffs auf die CGI-Skripte von irgendwo
       <Directory "/var/www/cgi-bin/">
               AllowOverride None
               Options None
               Order allow,deny
               Deny from all   
       </Directory>
       <Directory /var/www/vhosts/default/htdocs>
               AllowOverride All
               Options None
               Order allow,deny
               Allow from all  

               <IfModule mod_php5.c>
                 php_admin_flag engine on
                 php_admin_flag safe_mode off
               </IfModule>
       </Directory>

</VirtualHost>

Die SSL-Konfiguration von Ubuntu ist soweit erst einmal ausreichend. Es muss lediglich der Block zum Ausblenden der Standard-Aliase übernommen werden.

Entscheidend ist, dass die angegebenen Pfade tatsächlich existieren, sonst gibt Apache beim nächsten Start eine Fehlermeldung aus. Sollten die Verzeichnisrechte nicht richtig gesetzt sein, kann das mittels

sudo chown -R www-data.www-data /var/www/
sudo chmod -R 0770 /var/www/

nachgeholt werden.

Nun geht es an die Konfiguration der Strato-Adresse. Ruft man den Server über seinen hXXXXXXX.stratoserver.net auf, kann man so beeinflussen, was angezeigt wird.

/etc/apache2/sites-available/stratoserver.net.conf

<VirtualHost *:80>
   ServerName h1234xyz.stratoserver.net
   UseCanonicalName Off
   DocumentRoot /var/www/vhosts/default/htdocs

   CustomLog  /var/log/apache2/access.log combined
   ErrorLog   /var/log/apache2/error.log

   ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
   # Soll PHPMyAdmin verfügbar sein, kann der Pfad hier aktiviert werden. 
#   Alias /pma /var/www/htdocs/phpMyAdmin
   Alias  /webstat /var/www/vhosts/default/webstat
   <IfModule mod_ssl.c>
       SSLEngine off
   </IfModule>

   <Directory "/var/www/cgi-bin/">
       AllowOverride None
       Options None
       Order allow,deny
       Allow from all
   </Directory>

   <Directory /var/www/vhosts/default/htdocs>
       AllowOverride All
       Options None
       Order allow,deny
       Allow from all 

       <IfModule mod_php5.c>
         php_admin_flag engine on
         php_admin_flag safe_mode off
#           php_admin_value include_path "/var/www/htdocs/horde/pear:/var/www/htdocs:./"
#           php_admin_value open_basedir "/var/www/htdocs:/tmp"
       </IfModule>
   </Directory>

</VirtualHost>

<IfModule mod_ssl.c>

<VirtualHost *:443 >
       ServerName h1234xyz.stratoserver.net
       UseCanonicalName Off  
       DocumentRoot /var/www/vhosts/default/httpsdocs 

       CustomLog  /var/log/apache2/access.log combined
       ErrorLog   /var/log/apache2/error.log 

       ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#       Alias /pma /var/www/htdocs/phpMyAdmin
#       Alias /webftp /var/www/htdocs/webftp   

       SSLEngine on

       SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNUL
       SSLCertificateFile /var/www/vhosts/default/ssl/server.crt
       SSLCertificateKeyFile /var/www/vhosts/default/ssl/server.key
       SSLProtocol All -SSLv2 -SSLv3
       SSLHonorCipherOrder On
       SSLCompression off
       # Add six earth month HSTS header for all users...
       Header add Strict-Transport-Security "max-age=15768000"
       SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA

       <Directory "/var/www/cgi-bin/">
               AllowOverride None
               Options None
               Order allow,deny
               Allow from all  
       </Directory>

       <Directory /var/www/vhosts/default/httpsdocs>
               SSLRequireSSL
               AllowOverride None
               Options None
               Order allow,deny
               Allow from all  
      </Directory>
 </VirtualHost>
</IfModule>

Damit ist die Grundkonfiguration von Apache abgeschlossen. Für jeden neuen VirtualHost legen wir ab dann eine Datei als /etc/apache2/sites-avaiable/<domain>.conf an.

Wichtig ist: Der Ubuntu-Apache unterscheidet zwischen aktivierten und verfügbaren Konfigurationen. Wir müssen also jede Datei noch einmal extra unter /etc/apache2/sites-enabled/ einbinden. Dazu einfach einen symbolischen Link erstellen:

sudo ln -s /etc/apache2/sites-available/<domain>.conf /etc/apache2/sites-enabled/<domain>.conf

Das muss selbstverständlich auch mit der Standardkonfiguration gemacht werden, sofern das nicht schon standardmäßig passiert ist.

Eine Beispiel-Konfiguration für VirtualHosts findet sich ebenfalls im Debacher-Wiki (CC-by-sa). Dabei muss <dummy> mit der Domain ersetzt werden. Die Verzeichnisse werden dann unterhalb von /var/www/vhosts/<dummy> angelegt.

/etc/apache/sites-avaiable/dummy.conf

<VirtualHost *:80>
 ServerName   www.<dummy>:80
 ServerAlias <dummy>
 UseCanonicalName Off
 DocumentRoot /srv/www/vhosts/<dummy>/htdocs

 CustomLog  /var/log/apache2-vhosts.d/<dummy>_access_log combined
 ErrorLog   /var/log/apache2-vhosts.d/<dummy>_error_log

 CustomLog /var/log/apache2/vhosts_access_log vhost_combined

 ScriptAlias  /cgi-bin/ /var/www/vhosts/<dummy>/cgi-bin/
 Alias  /webstat /var/www/vhosts/<dummy>/webstat

 <IfModule mod_ssl.c>
       SSLEngine off
 </IfModule>

 <Directory /var/www/vhosts/<dummy>/htdocs>

   <IfModule mod_php5.c>
       php_admin_flag engine on
       php_admin_flag safe_mode off
       php_admin_value include_path "/var/www/vhosts/<dummy>/httpdocs:.:/tmp:./:/usr/share/php5/PEAR/:/var/www/typo3src"
       php_admin_value open_basedir "/var/www/vhosts/<dummy>/httpdocs:/tmp:.:/usr/share/php5/PEAR/:/var/www/typo3src"

   </IfModule>

   <IfModule mod_python.c>
       <Files ~ (\.py$)>
               SetHandler python-program
               PythonHandler   mod_python.cgihandler
       </Files>
   </IfModule>

   Options -Includes +ExecCGI
 </Directory>
 <Directory "/var/www/vhosts/<dummy>/cgi-bin">
      AllowOverride None
      Options +ExecCGI -Includes
      Order allow,deny
      Allow from all  
 </Directory>

</VirtualHost>

<IfModule mod_ssl.c>

<VirtualHost *:443>
 ServerName   www.<dummy>:443
 ServerAlias <dummy>
 UseCanonicalName Off
 DocumentRoot /var/www/vhosts/<dummy>/htdocs

 CustomLog  /var/log/apache2-vhosts.d/<dummy>_access_log combined
 ErrorLog   /var/log/apache2-vhosts.d/<dummy>_error_log
 
 ScriptAlias  /cgi-bin/ /var/www/vhosts/<dummy>/cgi-bin/
 Alias  /webstat /var/www/vhosts/<dummy>/webstat

 SSLEngine on

 <Directory /var/www/vhosts/<dummy>/htdocs>

   <IfModule mod_php5.c>
       php_admin_flag engine on
       php_admin_flag safe_mode off
       php_admin_value include_path "/var/www/vhosts/<dummy>/htdocs:.:/tmp:./:/usr/share/php5/PEAR/:/var/www/typo3src"
       php_admin_value open_basedir "/var/www/vhosts/<dummy>/htdocs:/tmp:.:/usr/share/php5/PEAR/:/var/www/typo3src"
   </IfModule>

   <IfModule mod_python.c>
       <Files ~ (\.py$)>
               SetHandler python-program
               PythonHandler   mod_python.cgihandler
       </Files>
   </IfModule>

   Options -Includes +ExecCGI
 </Directory>

 <Directory "/var/www/vhosts/<dummy>/cgi-bin">
      AllowOverride None
      Options +ExecCGI -Includes
      Order allow,deny
      Allow from all
 </Directory>
  SSLProtocol all -SSLv2
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
  SSLHonorCipherOrder On
  SSLCompression off

  # Add six earth month HSTS header for all users...
  Header add Strict-Transport-Security "max-age=15768000"
  SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
  SSLCertificateFile /var/www/vhosts/<dummy>/ssl/ssl.crt
  SSLCertificateKeyFile /var/www/vhosts/<dummy>/ssl/ssl.key
  SSLCertificateChainFile /var/www/vhosts/<dummy>/ssl/sub.class1.server.ca.pem
  SSLCACertificateFile /var/www/vhosts/<dummy>/ssl/ca.pem
  SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
  CustomLog /var/log/apache2-vhosts.d/<dummy>_ssl_log  "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

</VirtualHost>

</IfModule>

Damit ist die Einrichtung des Webservers abgeschlossen.

Bugzilla

Für eine bereits vorhandene Bugzilla-Version musste nach dem Umzug eine neue Perl-Grundinstallation vorgenommen werden. Die Installation von Zusatzpaketen erfolgt hier über die benutzerfreundliche Oberfläche cpan, die einfach im Terminal mit Befehlen versorgt wird. Vor der Installation via CPAN können aber auch folgende Schritte versucht werden, um die Bugzilla-Installation zu überprüfen:

Prüfen auf fehlende Perl-Module (Ordner der Bugzilla-Dateien):

./checksetup.pl --check-modules

Vor dem Installieren der Pakete sollte das Paket make installiert werden:

sudo apt-get install make

Im Bedarfsfall dann via

/usr/bin/perl install-module.pl --all

nachinstallieren.

Ansonsten via CPAN:

cpan

Mit dem Befehl install können Pakete installiert werden. Für Bugzilla 4.0 müssen folgende Pakete installiert werden:

CGI (3.51)
Date::Format (2.21)
DateTime (0.28)
DateTime::TimeZone (0.71)
DBI (1.41)
DBD::mysql (4.00) (für MySQL-Datenbanken)
DBD::Pg (1.45) (für PostgreSQL-Datenbanken)
DBD::Oracle (1.19) (Für Oracle-Datenbanken)
Digest::SHA (any)
Email::Send (2.00)
Email::MIME (1.904)
Template (2.22)
URI (any)

Für das Paket Template wird zusätzlich das Paket YAML benötigt. Template kann auch direkt über die Debian-Quellen installiert werden:

apt-get install libtemplate-perl

Mit den neueren Versionen von Perl sind einige Abhängigkeiten der älteren Bugzilla-Versionen aktualisiert worden, womit Bugzilla selbst aber nicht mehr umgehen kann. Es empfiehlt sich also, die Version vor dem Update auf einen neuen Server zu aktualisieren und, wenn von nöten, auch ein Perl- und die CPAN-Updates laufen zu lassen.

Datenbank-Server

Als Datenbank-Server benutzen wir MySQL. Diesen Server installieren wir ganz einfach per apt:

sudo apt-get install mysql-server mysql-client

Falls die Abfrage während der Installation nicht schon kommt, setzen wir dem root-Benutzer in MySQL ein neues Passwort:

sudo mysqladmin -u root password "newpwd"

Mail-Server

Der Mailserver macht mir immer wieder Sorgen. Beim Update von Dovecot 1 auf Dovecot 2 gab es massive Veränderungen am Konfigurations-Aufbau. Mal sehen, wie es jetzt ist. Zu erst installieren wir entsprechende Pakete via APT. Wir benutzen Postfix als MTA und Dovecot als IMAP-(u. POP3-)Server. Um mehreren Benutzern verschiedener Domains die Möglichkeit zu geben, ihre Mail abzurufen und zu empfangen bedienen wir uns virtuellen Domains, die bequem übers Web mit dem Postfixadmin verwaltet werden können.

sudo apt-get install postfix postfix-mysql

Falls bei der Installation ein Konfigurations-Dialog auftritt, wählen wir hier einfach erstmal "Keine Konfiguration" aus.

Dann erstellen wir im MySQL-Server eine neue Datenbank "mail" und einen neuen Benutzer "mail" mit allen Rechten:

root@server:/# mysql -u root -p
mysql> CREATE DATABASE mail;
mysql> GRANT ALL PRIVILEGES ON mail.* TO 'mail'@'localhost' IDENTIFIED BY 'mail';
mysql> quit

Postfix Admin

Dann laden wir den Postfix Admin von der Webseite herunter und entpacken ihn in ein eingerichtetes Verzeichnis z.B. einer Subdomain (z.B. mail.<domain>)

sudo mkdir /var/www/vhosts/mail.<domain>/htdocs
cd /var/www/vhosts/mail.<domain>/htdocs
tar xvfz postfixadmin-X.X.X.tgz

Nun passen wir noch den Postfix Admin an unsere Zwecke an. Dazu wechseln wir in das vorhin angelegte Verzeichnis postfixadmin-X.X.X/ und editieren die Standardkonfiguration:

cd ./postfixadmin-X.X.X/
vi config.inc.php

Hier passen wir folgende Parameter an:

$CONF['postfix_admin_url'] = ‘'var/www/vhosts/mail.<domain>/postfixadmin/';
$CONF['database_type'] = 'mysqli';
$CONF['database_user'] = 'mail';
$CONF['database_password'] = 'mail';
$CONF['database_name'] = 'mail';

(Natürlich an die eigenen Zwecke angepasst)

Sind wir mit der Konfiguration fertig, setzen wir den Parameter

$CONF['configured'] = false;

auf true und können unter der angelegten Domain den Installer starten. (postfixadmin/setup.php)

Postfix

Die Konfiguration liegt in /etc/postfix wir wechseln also in das Verzeichnis und bearbeiten die (vielleicht neue) Datei main.cf

root@server:/# cd /etc/postfix
root@server:/# vi main.cf

Dann richten wir die Datei wie folgt ein (denken Sie dran myhostname und myorigin an Ihre eigenen Bedürfnisse anzupassen). Mit Dovecot 2.0 hat sich einiges an der SASL-Authentifizierung geändert... das ist hier schon eingearbeitet:

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
#delay_warning_time = 4h
myhostname = mail.mycompany.com
myorigin = mycompany.com
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf
virtual_mailbox_base = /var/vmail
virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf
virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf
virtual_minimum_uid = 150
virtual_uid_maps = static:150
virtual_gid_maps = static:8
virtual_transport = dovecot
# SASL Authentication
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes

smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_rbl_client cbl.abuseat.org, reject_rbl_client ix.dnsbl.manitu.net, reject_rbl_client bl.spamcop.net, reject_rbl_client dul.dnsbl.sorbs.net, reject_rbl_client dnsbl.lern-server.de, reject_unknown_client

smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname

smtpd_sender_restrictions = reject_unknown_sender_domain

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

# Zum Aktivieren von SSL die Rauten entfernen
# smtpd_use_tls = yes
# smtp_tls_note_starttls_offer = yes
# smtpd_tls_key_file = /etc/postfix/sslcerts/default/server.key
# smtpd_tls_cert_file = /etc/postfix/sslcerts/default/server.pem
# smtpd_tls_loglevel = 1
# smtpd_tls_received_header = yes
# smtpd_tls_session_cache_timeout = 3600s
# # Poodlebleed-Abwehr
# smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3
# tls_random_source = dev:/dev/urandom
# tls_random_prng_update_period = 3600s

Diese Konfiguration legt die Mails in /var/vmail ab und benutzt den Benutzer vmail mit der UID 150 (legen wir gleich an):

sudo useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c “Virtual mailbox” vmail
sudo mkdir /var/vmail
sudo chmod 770 /var/vmail/
sudo chown vmail:mail /var/vmail/

Jetzt fangen wir an, die Maps zu konfigurieren. Hiermit bringen wir Postfix bei, wir er die Datenbank nach Mail-Adressen abfragen muss. Dafür müssen wir einige Dateien anlegen:

sudo touch /etc/postfix/mysql_virtual_alias_maps.cf
sudo touch /etc/postfix/mysql_virtual_domains_maps.cf
sudo touch /etc/postfix/mysql_virtual_mailbox_limit_maps.cf
sudo touch /etc/postfix/mysql_virtual_mailbox_maps.cf

/etc/postfix/mysql_virtual_alias_maps.cf

user = mail
password = mail
hosts = localhost
dbname = mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

/etc/postfix/mysql_virtual_domains_maps.cf

user = mail
password = mail
hosts = localhost
dbname = mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'

/etc/postfix/mysql_virtual_mailbox_limit_maps.cf

user = mail
password = mail
hosts = localhost
dbname = mail
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active = '1'
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'

/etc/postfix/mysql_virtual_mailbox_maps.cf

user = mail
password = mail
hosts = localhost
dbname = mail
table = mailbox
select_field = CONCAT(domain,'/',maildir)
where_field = username
additional_conditions = and active = '1'
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'

Wichtig ist es, hier den Benutzernamen und das Passwort an die MySQL-Einstellungen anzupassen.

Als letzte Postfix-Konfiguration müssen wir in der master.cf ganz unten die Pipe für Dovecot einrichten:

dovecot unix – n n – – pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d $(recipient)
submission inet n - - - - smtpd
 -o smtpd_tls_security_level=encrypt
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_sasl_type=dovecot
 -o smtpd_sasl_path=private/auth
 -o smtpd_sasl_security_options=noanonymous
 -o smtpd_sasl_local_domain=$myhostname
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
 -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
 -o smtpd_sender_restrictions=reject_sender_login_mismatch
 -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

Nachtrag vom 01. Dezember 2014

Nachdem ich Probleme hatte, Mails mit Thunderbird ordentlich abzuliefern und immer wieder auf den Fehler:

5.7.1 <mail@domain.tld>: Sender address rejected: not owned by user mail@domain.tld

gestoßen bin, ist mir aufgefallen, dass folgende Zeile in der master.cf den Fehler zu verursachen scheint:

-o smtpd_sender_restrictions=reject_sender_login_mismatch

Sollte der Fehler also auftreten, kommentieren wir diese Zeile einfach aus.

Dovecot

Nun beginnen wir, den zweiten Teil des Mailservers anzupassen. Hierfür installieren wir Dovecot über apt:

sudo apt-get install dovecot-imapd dovecot-pop3d dovecot-mysql

Wir können hier auch das Paket "dovecot-pop3d" weglassen, wenn wir keine POP3-Anmeldung am Server brauchen.

Die Abfrage nach einem SSL-Zertifikat können wir entweder mit Ja beantworten. Dann richtet Dovecot ein selbstsigniertes SSL-Zertifikat ein. Falls wir eines haben, sagen wir Nein.

Zur Sicherheit sichern wir die originale Konfigurationsdatei via

sudo mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.org

Anschließend können wir mit der Konfiguration von Dovecot unter /etc/dovecot/dovecot.conf beginnen. Diese Konfiguration kann einfach so kopiert werden. Es bringt auch eine SSL-Unterstützung mit, die aber von Haus aus deaktiviert ist. Natürlich müssen der Hostname und der Postmaster angepasst werden.

auth_mechanisms = plain login
disable_plaintext_auth = no
first_valid_uid = 150
hostname = mail.example.org
last_valid_uid = 150
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/var/vmail/%d/%u
passdb {
  args = /etc/dovecot/dovecot-sql.conf
  driver = sql
}
postmaster_address = xxx@example.com
service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0660
    user = postfix
  }
  unix_listener auth-userdb {
    group = mail
    mode = 0600
    user = vmail
  }
}
service imap-login {
  executable = imap-login
  inet_listener imap {
    port = 143
  }
}
service pop3-login {
  executable = pop3-login
  inet_listener pop3 {
    port = 110
  }
}
# Hier kann bei Bedarf die SSL-Verschlüsselung eingeschaltet werden.
ssl = no
#ssl_cert = </etc/ssl/certs/dovecot.pem
#ssl_key = </etc/ssl/private/dovecot.pem
userdb {
  args = /etc/dovecot/dovecot-sql.conf
  driver = sql
}
protocol imap {
  mail_max_userip_connections = 10
}

Nun müssen wir Dovecot nur noch sagen, wie sich Dovecot die Anmelde-Daten beschaffen kann. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot-sql.conf:

driver = mysql
connect = host=localhost dbname=mail user=mail password=mail
# The new name for MD5 is MD5-CRYPT so you might need to change this depending on version
default_pass_scheme = MD5
# Get the mailbox
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'
# Get the 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'
# If using client certificates for authentication, comment the above and uncomment the following
#password_query = SELECT null AS password, '%u' AS user

Hier müssen wir möglicherweise die Felder user= und password= an unsere Zwecke anpassen.

Dann setzen wir noch die Rechte für Dovecot:

sudo chmod 600 /etc/dovecot/*.conf
sudo chown vmail /etc/dovecot/*.conf

Dovecot ist jetzt konfiguriert. Momentan noch ohne SSL, aber das kommt später.

Nun ist der Mailserver eingerichtet. Wir starten nun die Services neu:

service postfix restart
service dovecot restart
service apache2 restart
service mysql-server restart

Nun können wir unter http://mail.example.org/postfixadmin/ einen neuen Benutzer und eine neue Domain anlegen und einige Tests durchführen. Damit ist der Mailserver eingerichtet.

Sieve

Ich wollte meine Mails gerne mit Hilfe von Sieve filtern. Bisher habe ich die Abwesenheitsbenachrichtigungen immer mit dem Postfixadmin-Virtual-Vacation realisiert, das ist aber unschön. Sieve klingt da schöner und kann auch mehr.

Zuerst installieren wir das Paket mit APT:

apt-get update
apt-get install dovecot-managesieved

Dann geht es an die Einrichtung von Dovecot. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot.conf und fügen folgende Zeilen an:

managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date
# Mail-Filterung mit Sieve
service managesieve-login { 
 inet_listener sieve {
  port = 4190
 }
}

protocol lda {
 mail_plugins = $mail_plugins sieve
}

plugin {
 sieve = /var/vmail/%d/%n/.dovecot.sieve
 sieve_dir = /var/vmail/%d/%n/sieve
}

Falls Sie Ihre Mails mit LMTP zustellen, muss in der Zeile "protocol lda" natürlich "protocol lmtp" stehen.

Nun fügen wir sieve noch als Protokoll für Dovecot hinzu. Dazu fügen wir an die Zeile

protocols = imap pop3

noch sieve an, also

protocols = imap pop3 sieve

Nach einem Neustart von Dovecot, sollte alles funktionieren. Nun geht es an die Erstellung der Filter. Dazu bringt beispielweise Thunderbird ein Tool mit, allerdings finde ich die Lösung per Webmailer wesentlich schöner. Passenderweise bringt auch Roundcube von Haus aus eine Möglichkeit zur Bearbeitung von Sieve-Scripten mit.

Zum Aktivieren wechseln wir in das Roundcube-Installationsverzeichnis und bearbeiten die config/config.inc.php. Dort muss lediglich folgendes Array erweitert werden:

$config['plugins'] = array();

wird zu

$config['plugins'] = array('managesieve');

Wichtig ist, dass der Name mit dem Namen des Ordners in plugins/ übereinstimmt. Nach der Installation können wir im Roundcube unter Einstellungen/Filter die Filter bearbeiten.

Passwort ändern mit Roundcube

Ich wollte schon lange alle möglichen Einstellungen für Benutzer unter ein Dach bringen. Bisher habe ich Benutzern immer einen Link zum Webmailer und einen für den Postfixadmin gegeben, damit sie ihr Passwort ändern können. Doch Roundcube bringt einige spannende Plugins (s.o. Sieve) mit, die diese Arbeit ebenso übernehmen können.

Für das Ändern des Passwort bedienen wir uns dem mitgelieferten Plugin password. Zuerst kopieren wir uns die Datei plugins/password/config.inc.php.dist (von der Roundcube-Wurzel aus) in plugins/password/config.inc.php und bearbeiten die folgenden zwei Zeilen:

$config['password_db_dsn'] = 'mysql://benutzer:passwort@localhost/db';
$config['password_query'] = 'UPDATE mailbox SET password=%c WHERE username=%u';

Die Zugangsdaten sind in diesem Fall die gleichen, wie bei Postfix und Dovecot, was naheliegt, da wir ja an die Mail-Datenbank heran wollen. In unserem Fall waren das mail, mail und mail. Im password_query tragen wir dann den SQL-Befehl zum Update des Passwortes ein. Dieses lässt sich aus dem Datenbank-Aufbau erahnen.

Zum Abschluss speichern wir die Datei und binden das Plugin wie oben auch in der config/config.inc.php in dem Array $config['plugins'] ein. Dann können wir unser Passwort im Roundcube ändern.

Mailman

Die Dokumentation der MailMan-Einrichtung folgt später.

Nachtrag 01.05.2015

Beim Erstellen einer neuen Mailingliste über die Weboberfläche ist immer wieder folgender Fehler in /var/log/mailman/error aufgetreten:

RuntimeError: command failed: /usr/sbin/postalias /var/lib/mailman/data/aliases (status: 1, Operation not permitted)

Im Netz ergab sich folgende Lösung: Die .db-Dateien unter /var/lib/mailman/data müssen Gruppen-Schreibrechte besitzen. Damit lässt sich auch der folgende Fehler von postmap ausschließen:

RuntimeError: command failed: /usr/sbin/postmap /var/lib/mailman/data/virtual-mailman (status: 1, Operation not permitted)

Die Gruppen-Rechte werden via

chmod 0660 /var/lib/mailman/data/*.db

angepasst.