Root-Server mit OpenSUSE 11.4

Aus Debacher-Wiki
Zur Navigation springenZur Suche springen

HighQ-Server SR7

Nach drei Jahren ist der bisherige Root-Server für Netthelp nicht mehr aktuell. Ein Rechnerwechsel ist günstiger, als eine einfache Neuinstallation des Rechners. Der HighQ-Server SR7 kostet monatlich nur noch 49€, das bisherige Modell SR5 kostet uns 59€ im Monat. Für die ersten drei Monate kostet der Rechner sogar nur 29€, so dass die Umstellung mit viel Zeit erfolgen kann (Stand Oktober 2011).

Die technischen Daten:

   Opteron 1381 mit 4x2,5 GHz (4 x 5000 Bogomips)
   4 GB RAM
   2x500 GB HD als Raid1 

Strato installiert anscheinend nicht mehr ein Standard-System auf Verdacht vor, sondern man muss über den Kundenservicebereich ein System auswählen, ich habe das Gerät mit OpenSUSE 11.4 64-Bit eingerichtet.

Die Umstellung auf den neuen Server musste dann doch viel schneller erfolgen, als geplant. Kaum hatte ich die Grundeinrichtung einigermaßen erledigt, da fing der alte Server an zu spinnen. Ein Hardwaredefekt, ich tippe auch einen Speicherfehler, führte dazu, dass der Rechner immer häufiger hängen blieb. Da gerade Herbstferien waren habe die Chance genutzt und alle Domains so schnell wie irgend möglich auf den neuen Rechner übertragen. Der Strato-Support war diesmal weniger hilfreich, als bei den letzten Defekten, man wollte mir nicht glauben, dass ein Hardware-Problem vorlag. Auch die Tatsache, dass der Kurztest (ca. 2h) nach 24 Stunden noch nicht durchgelaufen war hat mir anfangs nicht viel gebracht. Erst als ich alles auf den neuen Server gebracht hatte kam die Bestätigung vom Support, dass die Hardware ausgewechselt wird. Ich habe dann den alten Rechner gleich gekündigt und Mitte November war Schluss mit dem alten Gerät. Wenn nicht zufällig schon der neue Rechner bereit gewesen wäre, dann hätte es für die Domains Ausfälle von einer ganzen Woche gegeben.


PowerServer M

Mein privater Server war jetzt, im Januar 2012, auch schon vier Jahre alt. Daher habe ich bei dem Strato-Angebot für einen PowerServer M zu 29€ nicht Nein sagen können. Der Server hat folgende technische Daten:

   Opteron™ 1212 HE mit 2x2,0 GHz (2 x 2010 Bogomips)
   2 GB RAM
   2x250 GB HD als Raid1
   aber beschränkten Traffic auf 1000 GB

Den Rechner haben ich ebenfalls mit OpenSUSE 11.4 64-Bit eingerichtet. Der Server war bis Januar 2015 bei mir im Einsatz und hat 59000 Betriebsstunden (wohl nicht nur bei mir) mit gerade einmal 23 Bootvorgängen hinter sich.

zusätzliche Software

Auf den Strato-Servern ist das Installationsmedium übers Netz fest eingebunden. Das ist für die meisten Installationen ganz praktisch, Leider fehlen auf diesem Installationsmedium viele wichtige Pakete, wie z.B. phpMyAdmin. Die Pakete kann man sich aber unter http://download.opensuse.org/repositories/server:/php:/applications/openSUSE_11.4/noarch/ herunterladen. Dummerweise hat man dann aber das Problem die Abhängigkeiten per Hand auflösen zu müssen.

Im Prinzip kann man Pakete auch über die Oberfläche unter http://software.opensuse.org/114/de suchen und per 1-Klick-Installation einrichten. Das ist aber für einen root-Server nicht unbedingt praktisch, wenn man keine grafische Oberfläche eingerichtet hat.

Eine nette Hilfe für die Installation über die die Konsole ist das Programm Zypper. Hat man den genauen Namen und Pfad des zu installierenden Paketes, so kann man es folgendermaßen installieren, wobei Zypper die Abhängigkeiten selber auflöst.

zypper install http://download.opensuse.org/repositories/server:/php:/applications/openSUSE_11.4/noarch/phpMyAdmin-3.4.9-30.1.noarch.rpm

Eine sehr universelle Möglichkeit besteht darin, das Repositorie generell in Yast hinzuzufügen. Das geht in Yast unter Software -> Software Repositories. Hier klickt man auf Hinzufügen und gibt dann die folgende URL an:

http://download.opensuse.org/repositories/server:/php:/applications/openSUSE_11.4

Hinweis: Aktualisierungen z.B. der PHP-Pakete bekommt man unter

http://download.opensuse.org/repositories/server:/php/openSUSE_11.4/i586/

Mail mit Postfix und virtuellen Benutzern

Auf diesem Server soll es möglichst wenig Systembenutzer geben. Alle Mailadressen sollen also virtuell sein. Das System besteht aus folgenden Komponenten:

  • Postfix
  • Dovecot
  • PostfixAdmin

Für die folgende Beschreibung wird ein Benutzer vmail (uid 207) und eine Gruppe vmail (gid 207) benutzt. Der Benutzer hat als Homeverzeichnis /var/vmail, wo dann auch die eingehenden Mails liegen.

groupadd -g 207 vmail
mkdir /var/vmail
chmod a+rxw /var/vmail
useradd -d /var/vmail/ -s /bin/false -u 207 -g 207 vmail 


PostfixAdmin

Die Beschreibung geht aus von dem Programmpaket PostfixAdmin, welches die Verwaltung der virtuellen Mail-Adressen über ein kleines nettes Webfrontend erlaubt. Die Homepage dieses Programmes ist http://postfixadmin.sourceforge.net/. Das Programmpaket greift nur auf eine MySQL-Datenbank zu und nicht direkt in das Mailsystem ein.

Das Programm lässt sich ganz einfach über Yast installieren und liegt in der Version 2.3.3. vor, verfügbar ist bereits die Version 2.3.4 mit aber nur minimalen Änderungen.

Komischerweise konnte ich es auf einem zweiten Server nicht direkt über YAST installieren. Auch

zypper install http://download.opensuse.org/repositories/server:/php:/applications/openSUSE_11.4/noarch/postfixadmin-2.3.4-14.1.noarch.rpm

funktionierte nicht sofort, weil die Abhängikeit vom Paket perl Email::Valid nicht erfüllt war. Dieses Paket habe ich auch leider nirgends finden können, daher habe ich es un noch ein weiteres Paket über CPAN installiert:

perl -MCPAN -e 'install Email::Valid'
perl -MCPAN -e 'install MIME::EncWords'

Danach musste ich Zypper nur veranlassen die Abhängigkeiten zu ignorieren. Hier habe ich dann aber gleich die aktuelle Version von Postfixadmin.

Bei ersten Aufruf von Postfixadmin startet das Setup-Programm, welches auch die notwendigen Datenbanktabellen anlegt, bzw.aktualisiert, wenn es sich um ein Update handelt.

Problem Roundcube

Bei mir wollte das Setup Programm anfangs nicht starten, in der Fehlermeldung gab es Hinweise auf Probleme mit open_basedir Restriktionen. Ursache dafür war Roundcube, dieses Programmpaket hatte ich bereits vorher installiert. In dessen Datei /etc/apache/conf.d/roundcubemail.conf ist die Vorgabe wenig kooperativ:

<IfModule mod_php5.c>
# remove the next line to get real UTF-8 support
# AddDefaultCharset UTF-8
php_admin_flag    display_errors  Off
php_admin_flag    log_errors  On
php_admin_flag    file_uploads on
php_admin_value   upload_max_filesize 5M
php_admin_value   error_log   logs/errors
php_admin_value   open_basedir "/srv/www/roundcubemail:/etc/roundcubemail:/tmp"

<Directory /srv/www/roundcubemail>
 <FilesMatch "(\.inc|\~)$|^_">
  Order allow,deny
  Deny from all

Die php_admin_value Zeilen gelten generell für den Standardserver. Sie sollten besser nur für das Verzeichnis roundcubemail gelten. Eine Lösung besteht darin, die Directory-Zeile einfach vor die php_admin_value Zeilen zu verschieben, dann gelten die Einstellungen nur noch für dieses Verzeichnis und nicht mehr allgemein.

Datenbanken

Nach dem Lauf des Setup-Programmes gibt es folgende Tabellen in der Datenbank postfix:

CREATE TABLE `admin` (
 `username` varchar(255) NOT NULL default ,
 `password` varchar(255) NOT NULL default ,
 `created` datetime NOT NULL default '0000-00-00 00:00:00',
 `modified` datetime NOT NULL default '0000-00-00 00:00:00',
 `active` tinyint(1) NOT NULL default '1',
 PRIMARY KEY  (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Admins';


CREATE TABLE `alias` (
 `address` varchar(255) NOT NULL,
 `goto` text NOT NULL,
 `domain` varchar(255) NOT NULL,
 `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `active` tinyint(1) NOT NULL DEFAULT '1',
 PRIMARY KEY (`address`),
 KEY `domain` (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Aliases';


CREATE TABLE `alias_domain` (
 `alias_domain` varchar(255) NOT NULL,
 `target_domain` varchar(255) NOT NULL,
 `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `active` tinyint(1) NOT NULL DEFAULT '1',
 PRIMARY KEY (`alias_domain`),
 KEY `active` (`active`),
 KEY `target_domain` (`target_domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Domain Aliases';


CREATE TABLE `config` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) NOT NULL DEFAULT ,
 `value` varchar(20) NOT NULL DEFAULT ,
 PRIMARY KEY (`id`),
 UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COMMENT='PostfixAdmin settings';


CREATE TABLE `domain` (
 `domain` varchar(255) NOT NULL,
 `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Keine Beschreibung',
 `aliases` int(10) NOT NULL DEFAULT '0',
 `mailboxes` int(10) NOT NULL DEFAULT '0',
 `maxquota` bigint(20) NOT NULL DEFAULT '0',
 `quota` bigint(20) NOT NULL DEFAULT '0',
 `transport` varchar(255) NOT NULL,
 `backupmx` tinyint(1) NOT NULL DEFAULT '0',
 `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `active` tinyint(1) NOT NULL DEFAULT '1',
 PRIMARY KEY (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Domains';


CREATE TABLE `domain_admins` (
 `username` varchar(255) NOT NULL default ,
 `domain` varchar(255) NOT NULL default ,
 `created` datetime NOT NULL default '0000-00-00 00:00:00',
 `active` tinyint(1) NOT NULL default '1',
 KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Domain Admins';


CREATE TABLE `fetchmail` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `mailbox` varchar(255) NOT NULL,
 `src_server` varchar(255) NOT NULL,
 `src_auth` enum('password','kerberos_v5','kerberos','kerberos_v4','gssapi','cram-md5','otp','ntlm','msn','ssh','any') DEFAULT NULL,
 `src_user` varchar(255) NOT NULL,
 `src_password` varchar(255) NOT NULL,
 `src_folder` varchar(255) NOT NULL,
 `poll_time` int(11) unsigned NOT NULL DEFAULT '10',
 `fetchall` tinyint(1) unsigned NOT NULL DEFAULT '0',
 `keep` tinyint(1) unsigned NOT NULL DEFAULT '0',
 `protocol` enum('POP3','IMAP','POP2','ETRN','AUTO') DEFAULT NULL,
 `usessl` tinyint(1) unsigned NOT NULL DEFAULT '0',
 `extra_options` text,
 `returned_text` text,
 `mda` varchar(255) NOT NULL,
 `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


CREATE TABLE `log` (
 `timestamp` datetime NOT NULL default '0000-00-00 00:00:00',
 `username` varchar(255) NOT NULL default ,
 `domain` varchar(255) NOT NULL default ,
 `action` varchar(255) NOT NULL default ,
 `data` varchar(255) NOT NULL default ,
 KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Log';


CREATE TABLE `mailbox` (
 `username` varchar(255) NOT NULL,
 `password` varchar(255) NOT NULL,
 `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `maildir` varchar(255) NOT NULL,
 `quota` bigint(20) NOT NULL DEFAULT '0',
 `local_part` varchar(255) NOT NULL,
 `domain` varchar(255) NOT NULL,
 `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `active` tinyint(1) NOT NULL DEFAULT '1',
 PRIMARY KEY (`username`),
 KEY `domain` (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Mailboxes';


CREATE TABLE `quota` (
 `username` varchar(255) CHARACTER SET latin1 NOT NULL,
 `path` varchar(100) CHARACTER SET latin1 NOT NULL,
 `current` bigint(20) DEFAULT NULL,
 PRIMARY KEY (`username`,`path`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `quota2` (
 `username` varchar(100) CHARACTER SET latin1 NOT NULL,
 `bytes` bigint(20) NOT NULL DEFAULT '0',
 `messages` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE `vacation` (
 `email` varchar(255) NOT NULL,
 `subject` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `body` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `cache` text NOT NULL,
 `domain` varchar(255) NOT NULL,
 `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `active` tinyint(1) NOT NULL DEFAULT '1',
 PRIMARY KEY (`email`),
 KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Vacation';


CREATE TABLE `vacation_notification` (
 `on_vacation` varchar(255) NOT NULL,
 `notified` varchar(255) NOT NULL,
 `notified_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`on_vacation`,`notified`),
 CONSTRAINT `vacation_notification_pkey` FOREIGN KEY (`on_vacation`) REFERENCES `vacation` (`email`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Vacation Notifications';
Superadministrator

Am Ende der Installationsprozedur wird ein Superadministrator angelegt. Mit diesen Daten kann man sich dann unter http://localhost/postfixadmin/ anmelden.

Postfixadmin233.png

Damit ist der PostfixAdmin Teil vollständig abgeschlossen. Das Programm übernimmt nur die Verwaltung der angegebenen Datenbanktabellen, mehr macht es nicht. Die Nutzung dieser Datenbanktabellen für das Mailsystem muss über die jeweiligen Programme konfiguriert werden.

Postfix

Postfix ist bei jedem SuSE-System dabei und normalerweise auch installiert. Im Zweifelsfall installiert man Postfix einfach von den Datenträgern nach und konfiguriert es soweit, dass es im normalen Betrieb läuft, also auch Mails von anderen Rechnern annimmt. Wenn man Postfix über YaST konfiguriert (Netzwerkdienste -> Mail Transfer Agent) dann kann man auch gleich AMaVis zur Absicherung des Mailverkehres mit installieren.


Yast-postfix-114.png

Man installiert und konfiguriert dann auch gleich den Virenscanner Clamav mit, wobei man den clamd und freshclam eventuell noch aktivieren muss.

Damit Postfix MySQL-Tabellen nutzen kann muss man zusätzlich per YaST das Paket postfix-mysql installieren. Hier gibt es aber bei openSUSE 11.4 eine Merkwürdigkeit. Das Paket beinhaltet folgende Dateien:

/etc/postfix/main.cf-mysql
/etc/postfix/mysql_relay_domains_maps.cf
/etc/postfix/mysql_virtual_alias_maps.cf
/etc/postfix/mysql_virtual_domains_maps.cf
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
/etc/postfix/mysql_virtual_mailbox_maps.cf
/usr/lib/postfix/dict_mysql.so
/usr/share/doc/packages/postfix-mysql
/usr/share/doc/packages/postfix-mysql/postfix-mysql.sql

Wirklich benötigt wird nur die Datei /usr/lib/postfix/dict_mysql.so, bei openSUSE 11 enthielt das Paket auch nicht mehr. Aktuell sind jetzt einige Dateien vorhanden, wie sie im folgenden beschrieben werden. Diese Dateien weichen aber erheblich von der folgenden Beschreibung ab. Laut http://www.postfix.org/MYSQL_README.html sind die bei 11.4 mitgelieferten Dateien für Postfix-Versionen vor 2.2 gedacht. Die im folgenden beschriebenen Dateien sind für neuere Postfix -Versionen gedacht, bei openSUSE 11.4 ist das die Version 2.7. Schon bei openSUSE 11.0 war Postfix aber in der Version 2.5 dabei.

Die 6 mysql-Dateien im Verzeichnis /etc/postfix kann man also getrost löschen, die Dokumentationsdatei stört wenigstens nicht.

Nun müssen in /etc/postfix passende Dateien angelegt werden, die sich direkt auf die entsprechenden Datenbanktabellen beziehen. Muster duzu finden sich in der Datei /usr/share/doc/packages/postfixadmin/POSTFIX_CONF.txt. Im Prinzip wird Postfix hier mitgeteilt, wie die Datenbanktabellen abgefragt werden. Benutzername und Passwort müssen hier an die eigenen Einstellungen angepasst werden.

mysql_virtual_alias_maps.cf

user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

mysql_virtual_domains_maps.cf

user = postfix
password = postfix
hosts = localhost
dbname = postfix
#query = SELECT description FROM domain WHERE domain='%s' AND active = '1'
query          = SELECT domain FROM domain WHERE domain='%s' AND active = '1'

mysql_virtual_mailbox_limit_maps.cf

user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'

mysql_virtual_mailbox_maps.cf

user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'


Neu sind die folgenden Maps:

mysql_virtual_alias_domain_maps.cf

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

mysql_virtual_alias_domain_catchall_maps.cf:

# handles catch-all settings of target-domain
user = postfix
password = password
hosts = localhost
dbname = postfix
query  = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'


mysql_virtual_alias_domain_mailbox_maps.cf:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'


main.cf

Nun muss noch die main.cf von Postfix erweitert werden, damit die Tabellen auch benutzt werden. Mit dieser Erweiterung erfolgt der erste Eingriff ins System. Zuerst eine kleine Änderung an der Datei /etc/sysconfig/postfix:

POSTFIX_SMTP_AUTH_SERVER="yes"

Im Idealfall erweitert man dann die Datei /etc/sysconfig/postfix um die notwendigen Zeilen und ruft dann SuSEconfig --module postfix auf. Hier das Ende meiner Datei, die ersten Zeilen waren schon vorhanden:

## Type:        string
## Default:     0
POSTFIX_ADD_MAILBOX_SIZE_LIMIT="0"

## Type:        string
## Default:     10240000
POSTFIX_ADD_MESSAGE_SIZE_LIMIT="0" 

## Type:        yesno
## Default:     yes  
## Config:      postfix
#
# Automatically register to slpd, if running?
#
POSTFIX_REGISTER_SLP="yes"

## Type: list(subnet,host,class)
## Default: subnet
## Config: postfix
#
#
# The postfix default for this setting is "subnet"
# for security reasons you should use host
# otherwise every user in the same subnet as you, can use
# your postfix server as a mail relay for spam.
# If you set POSTFIX_DIALUP to "yes" mynetworks_style
# will be set to "host" by SuSEconfig.
#
POSTFIX_ADD_MYNETWORKS_STYLE="subnet"
POSTFIX_NODAEMON="no"

# Ab hier Konfiguration fuer virtuelle Domains
## Type:        string
## Default:     "noanonymous"
POSTFIX_ADD_SMTPD_SASL_SECURITY_OPTIONS="noanonymous"

## Type:        string
## Default:     "yes" 
POSTFIX_ADD_BROKEN_SASL_AUTH_CLIENTS="yes"

## Type:        string
## Default:     "\$myhostname"
POSTFIX_ADD_SMTPD_SASL_LOCAL_DOMAIN=""

## Type:        string
## Default:     ""
POSTFIX_ADD_VIRTUAL_ALIAS_MAPS="hash:/etc/postfix/virtual, proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf"

## Type:        string
## Default:     ""
POSTFIX_ADD_VIRTUAL_GID_MAPS="static:207"

## Type:        string
## Default:     ""
POSTFIX_ADD_VIRTUAL_MAILBOX_BASE="/var/vmail/"

## Type:        string
## Default:     ""
POSTFIX_ADD_VIRTUAL_MAILBOX_DOMAINS="proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf"

## Type:        string
## Default:     ""
POSTFIX_ADD_VIRTUAL_MAILBOX_LIMIT="0"

## Type:        string
## Default:     ""
POSTFIX_ADD_VIRTUAL_MAILBOX_MAPS="proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf"

## Type:        string
## Default:     ""
POSTFIX_ADD_VIRTUAL_MINIMUM_UID="207"

## Type:        string
## Default:     ""
POSTFIX_ADD_VIRTUAL_TRANSPORT="virtual"

## Type:        string
## Default:     ""
POSTFIX_ADD_VIRTUAL_UID_MAPS="static:207"


SuSEconfig hängt dann folgende Zeilen an die main.cf an:

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks,reject_unauth_destination
smtp_sasl_auth_enable = no
smtpd_sasl_auth_enable = yes
smtpd_use_tls = no  
smtp_use_tls = no
smtp_enforce_tls = no
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
mailbox_size_limit = 0      
message_size_limit = 0
smtpd_sasl_local_domain = 
smtpd_sasl_security_options = noanonymous
virtual_alias_maps = hash:/etc/postfix/virtual, proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf
virtual_gid_maps = static:207
virtual_mailbox_base = /var/vmail/
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 0
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_minimum_uid = 207 
virtual_transport = virtual
virtual_uid_maps = static:207


Kontrollieren muss man dann noch, ob auch folgende Zeile in der main.cf auftaucht:

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination,

Die Zahlen 207 stehen hier übrigens für uid und gid des Vmail-Eigentümers. Die meisten Beschreibungen gehen davon aus, dass man sich einen User vmail mit den entsprchenden Daten anlegt. Die Zahlen sind beliebig, tauchen aber auch später immer wieder auf.

Hinweis: Es gibt noch ein kleines Problem. Das Script /sbin/conf.d/SuSEconfig.postfix (eine Mischung aus Shell- und Perl-Code) hat in der aktuellen Version eine blöde Macke, ab Zeile 640 findet sich eine Schleife, mit der die bereits erzeugt Konfigurationsdatei noch einmal bearbeitet wird.

while( <MNCF> ) {
   chomp;

       if( /\#?(virtual_alias_maps\s=\s).*/ ) {
         if ($with_mysql ne "yes" && $with_ldap ne "yes") {
               $line = $1."hash:/etc/postfix/virtual";
         } elsif ($with_ldap eq "yes" && $with_mysql ne "yes") {
               $line = $1."hash:/etc/postfix/virtual ldap:/etc/postfix/ldap_aliases.cf";
         } elsif ($with_mysql eq "yes" && $with_ldap ne "yes") {
               $line = $1."hash:/etc/postfix/virtual mysql:/etc/postfix/mysql_virtual_alias_maps.cf";
         } elsif ($with_mysql eq "yes" && $with_ldap eq "yes") {
               $line = $1."hash:/etc/postfix/virtual ldap:/etc/postfix/ldap_aliases.cf mysql:/etc/postfix/mysql_virtual_alias_maps.cf";
         }
       } elsif( /\#?(virtual_uid_maps\s=.*)/ ) {
         if ($with_mysql ne "yes") {
               $line = "#".$1;
         } else {
               $line = $1;
         }
       ...
       } else {  
               $line = $_;
       }  

       if( $line =~ /^\#/ ) {
               print $line."\n";
       next;
       } 

       print $line."\n";

Leider hat der erste Teil den Effekt, dass die Einstellungen aus /etc/sysconfig/postfix für virtual_alias_maps verloren gehen. Ich habe dafür keine saubere Lösung gefunden. Entweder korrigiert man die erzeugte main.cf per Hand, oder man verändert das erwähnte Script. Im Prinzip kann der ganze Teil wegfallen, es geht immer nur um die virtual_... Einstellungen, die wir sowieso unabhängig machen.

Entweder ändere ich im oberen Bereich die Zuweisung, oder hinter dem else-Fall ergänze ich einfach $line = $_; dann wird das Ergebnis der Überarbeitung ignoriert. Die zweite Lösung erscheint mir am einfachsten. Dann endet der Abschnitt auf:

       ...
       } else {
               $line = $_;
       }
# geändert von Uwe Debacher am 9.10.2011
$line = $_;
       if( $line =~ /^\#/ ) {
               print $line."\n";
       next;
       } 

       print $line."\n";


Einen weiteren komischen Effekt gibt es noch im Zusammenhang mit der Vorkonfiguration von virtuellen Domains in YaST. In der main.cf waren viele Einträge doppelt. Das hängt damit zusammen, dass YaST anscheinend die Datei main.cf-mysql als Vorlage zum Erstellen der main.cf benutzt folgende Schritte führen zu einer ordentlichen Datei:

cd /etc/postfix
cp main.cf-mysql main.cf
SuSEconfig --module postfix

SuSEconfig meutert, dass man selber an der main.cf Hand angelegt hat und erstellt eine eigene Datei mit der neuen Version. Die kopiert man über die main.cf und löscht dann die zusätzliche Datei.

cp main.cf.SuSEconfig main.cf
rm main.cf.SuSEconfig

Nun sollte SuSEconfig in Zukunft sauber durchlaufen.

SuSEconfig --module postfix

Nach einem Neustart von Postfix sollte es möglich sein Mails für die virtuellen Benutzer zu schicken, die in der Datenbank eingetragen sind.

Die virtuellen Postfächer liegen alle unterhalb von /var/vmail.

Wo genau sie liegen stellt man über die Konfigurationsdatei des PostfixAdmin ein. Entscheidend sind hier die Zeilen:

// Mailboxes
// If you want to store the mailboxes per domain set this to 'YES'.
// Example: /usr/local/virtual/domain.tld/username@domain.tld
$CONF['domain_path'] = 'NO';
// If you don't want to have the domain in your mailbox set this to 'NO'.
// Example: /usr/local/virtual/domain.tld/username
$CONF['domain_in_mailbox'] = 'YES';

Es macht Sinn diese beiden Vorgaben zu ändern, wenn man mit mehreren Domains arbeitet.

Damit ist die Postfix-Konfiguration erst einmal abgeschlossen und sowohl Systembenutzer, als auch virtuelle Benutzer können Mails empfangen. Weitere Schritte sind erst notwendig, wenn auch Mailman aktiviert werden soll.

Hinweis: In der Datei /etc/sysconfig/postfix sollte man nicht die Einstellung

POSTFIX_MDA="local"

auf dovecot verändern. Dann werden Mails für lokale Benutzer nicht mehr zugestellt, z.B. für root und die Mailinglisten.

SASL

Soll der Rechner auch Mails von virtuellen Benutzern über das Netz annehmen, so muss der Benutzer eine Möglichkeit haben sich beim Abliefern der Mails zu authentifizieren. Dazu dient in der Regel der Simple Authentication and Security Layer (SASL). Für die Konfiguration gibt es mehrere Möglichkeiten.

Die theoretisch einfachste Möglichkeit ist die Nutzung des SASL-Moduls von Dovecot. Dann muss man den Datenbankzugriff nur an einer einzigen Stelle konfigurieren, nämlich bei Dovecot. Leider funktioniert dies nur, wenn die Passwörter in der Datenbank im Klartext abgelegt sind. In vielen Kontexten wird man das nicht wollen.

Dann muss man Cyrus-SASL installieren und konfigurieren. Die zugehörige Postfix-Konfiguration erscheint anfangs etwas unübersichtlich, weil der Rechner sowohl als SASL-Client gegenüber anderen Server wirken kann, als auch als Server gegenüber beliebigen Clients. Es gibt also Konfigurationsschalter smtp_xxx für die Client-Seite und Schalter smtpd_xxx für die hier zu betrachtende Server-Seite.

Das Problem bei Cyrus-SASL besteht darin, dass es normalerweise nicht mit verschlüsselten Daten aus einer MySQL-Datenbank umgehen kann. Die meisten Beschreibungen im Web funktionieren nur mit unverschlüsselten Passwörtern (auch wenn das nicht immer erwähnt wird). Für verschlüsselte Passwörter gibt es drei Möglichkeiten, einerseits eine gepatchte auxprop-Version dann den Weg über ein zusätzliches Modul pam_mysql und dann auch eine Möglichkeit über ein IMAP-Login des SASLAuthd.

Mir erscheint der Weg über pam_mysql am einfachsten, er erlaubt dann u.a. auch die Benutzung der MySQL-Datenbank für den VsFTPd. Auf einem Rechner klappte das aber einfach nicht, da habe ich dann die IMAP-Variante realisiert.

Für SASL kann man folgende Pakete installieren, vermutlich benötigt man nur die ersten drei davon.

cyrus-sasl-2.1.21-3
cyrus-sasl-saslauthd-2.1.21-3
cyrus-sasl-plain-2.1.21-3
cyrus-sasl-digestmd5-2.1.21-3
cyrus-sasl-otp-2.1.21-3
cyrus-sasl-gssapi-2.1.21-3
cyrus-sasl-crammd5-2.1.21-3

Auf keinen Fall installieren sollte man

cyrus-sasl-sqlauxprop-2.1.21-3

Da wir den SASL-Dämon auf pam zugreifen lassen wird seine SQL-Funktionalität nicht benötigt. Wenn der Dämon aber erkennt, dass SQL-Fähigkeiten zur Verfügung stehen, dann versucht er sie zu initialisieren, was zu ständigen Fehlermeldungen in der /var/log/messages führt:

Oct 12 09:07:08 h1938324 postfix/smtpd[5456]: sql_select option missing
Oct 12 09:07:08 h1938324 postfix/smtpd[5456]: auxpropfunc error no mechanism available
Oct 12 09:07:08 h1938324 postfix/smtpd[5456]: _sasl_plugin_load failed on sasl_auxprop_plug_init for plugin: sql

Es ist aber eher ein kosmetisches Problem.

Nun muss man sich pam_mysql-Quellen von Sourceforge holen (bei mir war immer noch die Version 0.7 aktuell) und installieren:

wget http://heanet.dl.sourceforge.net/sourceforge/pam-mysql/pam_mysql-0.7RC1.tar.gz
tar xvfz pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
./configure --with-pam-mods-dir=/lib64/security 
make install

Zum erfolgreichen Übersetzen müssen einige devel-Pakete installiert sein. Also einfach das Übersetzen anstoßen und auf die Fehlermeldungen achten. Lange gesucht habe ich nach dem devel-Paket für mysqlclient und es dann unter libmysqlclient-devel gefunden. In früheren Versionen war es unter mysql_client-devel zu finden.

Dann ist noch die Datei /usr/lib64/sasl2/smtpd.conf zu erzeugen

cp /etc/sasl2/smtpd.conf /usr/lib64/sasl2/

kontrollieren, die Standard-Version sollte aber vollkommen in Ordnung sein.

pwcheck_method: saslauthd
mech_list: plain login

Nun muss man nur noch die entsprechende PAM-Konfiguration anlegen, die Datei /etc/pam.d/smtp

#%PAM-1.0
auth    required pam_mysql.so user=postfix passwd=postfix host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1 where=active="1"
account required pam_mysql.so user=postfix passwd=postfix host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1 where=active!="0"

(die Unterschiede am Ende der beiden Zeilen sollen nur eine Zuordnung in den MySQL-Log-Dateien ermöglichen, praktisch sind bei Versionen gleichwertig) Statt der beiden langen Parameterlisten könnte man auch mit einem config_file arbeiten ( auth required pam_mysql.so config_file=/lib/security/pam_mysql.conf). Das hätte dann folgenden Aufbau:

users.host localhost
users.database postix
users.db_user postfix
users.db_passwd postfix
users.table mailbox
users.user_column username
users.password_column password
users.password_crypt 1
users.where_clause active="1"

Will man auch den Unix-Benutzern zusätzlich das Einleifern von Mails gestatten, so muss man die Datei /etc/pam.d/smtp entsprechend anpassen und um die alten Zeile ergänzen:

#%PAM-1.0
auth  sufficient pam_mysql.so user=postfix passwd=postfix host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1 where=active="1"
account sufficient pam_mysql.so user=postfix passwd=postfix host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=passwordcrypt=1 where=active!="0"

auth     include        common-auth
account  include        common-account
password include        common-password
session  include        common-session


Es bleibt noch ein kleines (naja letztendlich hat es mich zwei Tage gekostet) Problem zu lösen. Der saslauth entfernt in der Standardeinstellung den Domainteil aus dem Benutzernamen. Aus debacher@meine-maildomain.de wird also einfach debacher. Damit ist die Authentifizierung gegen das MySQL nicht mehr korrekt. Man kann ihm das abgewöhnen, indem man ihn mit dem zusätzlichen Schalter -r startet. SuSE hat nun leider in seiner Konfiguration keine direkte Möglichkeit vorgesehen zusätzliche Parameter zu übergeben, deshalb hänge ich den einfach hinter den Standardparameter mit an. /etc/sysconfig/saslauthd

## Path:           System/Security/SASL
## Type:           list(getpwent,kerberos5,pam,rimap,shadow,ldap)
## Default:        pam
## ServiceRestart: saslauthd
#
# Authentication mechanism to use by saslauthd.
# See man 8 saslauthd for available mechanisms.
#
SASLAUTHD_AUTHMECH="pam -r"

die Anführungsstriche sind dabei auch wichtig, sonst kommt es zu einer Fehlermeldung.

Bei der IMAP-Variante lautet der gleiche Abschnitt:

## Path:           System/Security/SASL
## Type:           list(getpwent,kerberos5,pam,rimap,shadow,ldap)
## Default:        pam
## ServiceRestart: saslauthd
#
# Authentication mechanism to use by saslauthd.
# See man 8 saslauthd for available mechanisms.
#
SASLAUTHD_AUTHMECH=" rimap -O localhost -r "


Nun noch vorsichtshalber die Dienste neu starten:

rcsaslauthd restart
rcpostfix restart

Zum Testen gibt es verschiedene Möglichkeiten.

Im einfachsten Fall testet man lokal mittels

testsaslauthd -u benutzer@virt.domain -p passwort -s smtp

bzw.

testsaslauthd -u benutzer@virt.domain -p passwort

Über das Netz kann man eine Telnet-Verbindung nutzen, mann muss nur vorher die Anmeldedaten Base64 kodieren mit:

perl -MMIME::Base64 -e 'print encode_base64("benutzer\@virt.domain\0benutzer\@virt.domain\0passwort");'

Dann kann man einen Telnet auf Port 25 machen, nach

EHLO <Absender-Domain> 

gibt man in der nächsten Zeile an:

auth plain <codiertes Passwort>


SuSEconfig meckert übrigens, wenn der saslauthd nicht läuft.


Sollte die SASL-Anmeldung fehlschlagen und die Logdateien nichts hergeben, so kann man auch die MySQL-Datenbank mit zusätzlichen Informationen starten. Zuerst beendet man sie und startet sie dann direkt mit zusätzlichem Parameter:

rcmysql stop
/bin/sh /usr/bin/mysqld_safe --user=mysql --pid-file=/var/run/mysql/mysqld.pid --socket=/var/run/mysql/mysql.sock --datadir=/var/lib/mysql --log=/var/lib/mysql/sasl-informationen.log --log-long-format &


Bei Problemen mit SASL kann man sich eventuell hilfreiche Informatioen verschaffen mit dem Programm saslfinger http://postfix.state-of-mind.de/patrick.koetter/saslfinger/, welches mittels

saslfinger -s

die Serverseite und mittels

saslfinger -c

die hier nicht weiter beschriebene Clientseite beleuchtet.

Dovecot

Hier gibt es wieder einige Änderungen seit die Version 2.0.X verfügbar ist. Die Konfiguration wurde gegenüber den vorherigen Versionen verändert, so dass man auf ältere Beschreibungen nur sehr eingeschränkt zurückgreifen kann.

Die Angabe einer mail_location hat anscheinend nur für die Systembenutzer eine Funktion, nicht für die virtuellen Benutzer. Insofern kann es unterbleiben hier überhaupt eine Angabe zu machen, dann sucht Dovecot für die Systembenutzer den richtigen Ort heraus.

In der Datei /etc/dovecot/dovecot.conf sind dann die folgenden Ergänzungen notwendig:

protocols = imap pop3 imaps pops

nur dann, wenn die Zertifikate erzeugt wurden, ansonsten funktioniert folgende einfach Version:

disable_plaintext_auth = no
first_valid_uid = 207
mail_access_groups = postfix
mail_privileged_group = postfix
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
passdb {
 args = /etc/dovecot/dovecot-mysql.conf
 driver = sql
}
passdb {
 driver = pam
}
plugin {
 sieve = ~/.dovecot.sieve
 sieve_dir = ~/sieve
}
protocols = imap pop3
ssl = no
userdb {
 args = /etc/dovecot/dovecot-mysql.conf
 driver = sql
}
userdb {
 driver = passwd
}
verbose_proctitle = yes
protocol pop3 {
 pop3_uidl_format = %08Xu%08Xv
}


Die Datei /etc/dovecot/dovecot-mysql.conf besitzt folgenden Inhalt:

# Database driver: mysql, pgsql
driver = mysql

# Currently supported schemes include PLAIN, PLAIN-MD5, DIGEST-MD5, and CRYPT.
default_pass_scheme = CRYPT

# Database options
#db_unix_socket = /var/lib/mysql/mysql.sock

connect = host=/var/run/mysql/mysql.sock dbname=postfix user=postfix password=assword

password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('maildir:/var/vmail/',maildir) as mail, 207 AS uid, 207 AS gid FROM mailbox WHERE username = '%u' AND active = '1'


Diese Beschreibung funktioniert zwar, entspricht aber nicht dem Konfigurationsschema der aktuellen Version. Ich muss da noch mal ran.


Dovecot mit SSL

Will man mit Dovecot auch SSl-Verbindungen nutzen, so sind mehrere Schritte notwendig. Zuerst braucht man ein Zertifikat, wenn man dafür keinen Anbieter hat, dann kann man ein Zertifikat selbst erstellen, mit den dabei anfallenden Einschränkungen und Problemen.

Im Ordner /usr/share/doc/packages/dovecot/ findet man die dafür notwendigen Dateien. Zuerst muss man die Konfigurationsdatei dovecot-openssl.cnf anpassen. Dann kann man die Zertifikate erzeugen mittels

sh mkcert.sh

Nun muss noch die Dovecot-Konfiguration angepasst werden.

disable_plaintext_auth = no
first_valid_uid = 207
mail_access_groups = postfix
mail_privileged_group = postfix
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
passdb {
 args = /etc/dovecot/dovecot-mysql.conf
 driver = sql
}
passdb {
 driver = pam
}
plugin {
 sieve = ~/.dovecot.sieve
 sieve_dir = ~/sieve
}
protocols = imap pop3
ssl = yes
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem

userdb {
 args = /etc/dovecot/dovecot-mysql.conf
 driver = sql
}
userdb {
 driver = passwd
}
verbose_proctitle = yes
protocol pop3 {
 pop3_uidl_format = %08Xu%08Xv
}

Nach einem Dovecot-Neustart kann man mittels

openssl s_client -connect imap.debacher.com:pop3s 

testen, ob die Einstellungen funktionieren.


Nun muss der Client aber auch noch dieses Zertifikat akzeptieren, das hängt aber von der jeweiligen Anwendung ab. Bei fetchmail muss man sich den Fingerprint des Zertifikates holen. Dazu muss man fetchmail mit dem Parameter -v (Verbose) starten. Dann findet man in der /var/log/mail.info eine Zeile wie:

Feb  5 17:13:59 acer-server fetchmail[17975]: imap.debacher.de-Schlüssel-Fingerabdruck: 59:51:61:89:CD:DD:B2:35:94:BB:44:97:A0:39:D5:B4

Die Zeichenkette am Ende wird benötigt und in die /etc/fetchmailrc aufgenommen:

poll imap.debacher.com with proto POP3
  user 'uwe@meine-maildomain.de' there with password 'assword' 
  ssl sslfingerprint "59:51:61:89:CD:DD:B2:35:94:BB:44:97:A0:39:D5:B4"
  is debacher here 

Jetzt ist eine gesicherte Verbindung möglich, ohne dass Fetchmail meckert.


Dovecot und Apparmor

Ein Problem gibt es beim Start von Dovecot. Das vorinstallierte Apparmor ist anscheinend nicht passen konfiguriert und Dovecot liefert eine Fehlermeldung wie

Starting dovecot Fatal: execv(/usr/bin/doveconf) failed: No such file or directory

Erst ein Deaktivieren von apparmor lässt den Start von Dovecot zu. Danach kann man dann apparmor auch wieder starten.

Roundcube

Hierbei handelt es sich um ein nettes Webinterface für das Mailsystem. Man muss nur das Paket roudcubemail mittels YaST nachinstallieren. Die Webkonfiguration sollte man dann etwas anpassen, wie oben bereits beschrieben, damit andere Programme nicht in Schwierigkeiten kommen.

Ansonsten ist die Konfiguration recht einfach. Man legt eine Datenbank roundcubemail an und einen passenden Benutzer, z.B. roundcube mit dem Password assword.

mysql roundcubemail -u roundcube -p < /srv/www/roundcubemail/SQL/mysql.initial.sql

Anschließend müssen noch ein paar Einstellungen an den Dateien in /etc/roundcubemail vorgenommen werden.

db.inc.php

$rcmail_config['db_dsnw'] = 'mysql://roundcube:assword@localhost/roundcubemail';

db.inc.php.dist

$rcmail_config['db_dsnw'] = 'mysql://roundcube:assword@localhost/roundcubemail';

main.inc.php (dann verschindet die Server-Zeile im Anmeldefenster)

$rcmail_config['default_host'] = 'localhost';

Neuerdings gibt es etwas Probleme bei der Installation von Roundcube. Im Suse-Rpository ist jetzt die Version 0.6-4.1. Dies Version ist abhängig vom Modul php5-intl, das auch mitinstalliert wird. Leider ist das Modul nicht in Ordnung und muss deaktiviert werden, damit der Apache ohne Fehlermeldungen startet. Eine saubere Lösung, ohne das komplette PHP-System zu aktualisieren habe ich bisher nicht gefunden.

Group-Office

Group-Office ist ein sehr umfangreiches Webinterface für das Mailsystem und bietet vom Kalender über das Adressbuch nahezu alles, was man so haben möchte. Zur Installation lädt man sich das tar-Archiv: http://downloads.sourceforge.net/project/group-office/3.7/groupoffice-com-3.7.41.tar.gz und entpackt es in das Verzeichnis /srv/www/htdocs und benennt es anschließend in groupoffice um:

cd /srv/www/htdocs
tar xvfz /tmp/groupoffice-com-3.7.41.tar.gz
mv groupoffice-com-3.7.41 groupoffice

Danach muss man dann noch eine leere config.php anlegen

cd groupoffice
touch config.php
chown wwwrun.www config.php

Nun noch mittels z.B. phpMyAdmin eine Datenbank und den zugehörigen Benutzer anlegen, dann kann die Installation starten. Dazu ruft man groupoffice im Browser auf, wodurch das Installations-Script startet.

Groupoffice1.png

Wenn alle Erfordernisse erfüllt sind, dann kann man sich Schritt für Schritt durch die Installation hangeln. Am Ende des Prozesses wird ein Administrator-Zugang angelegt.


Groupoffice9.png

Danach erfolgt dann noch eine Auswahl der Module, die für Benutzer zur Verfügung stehen sollen. Diese Auswahl kann man aber auch später noch verändern. Wichtig ist jetzt, dass man sich einmal als Administrator anmeldet, um die IMAP-Authentifizierung nachinstallieren zu können.

Groupoffice15.png

Danach muss man dann noch die Konfigurationsdatei in das groupoffice-Verzeichnis kopieren

cd groupoffice
cp modules/imapauth/imapauth.config.php.example imapauth.config.php

Danach erfolgt dann die Benutzer-Authentifizierung gegen den IMAP-Server, so dass keine zusätzliche Benutzerverwaltung notwendig ist. Jeder Benutzer, der sich per IMAP anmelden kann wird automatisch auch als Group-Office Benutzer eingerichtet.

Etwas aufpassen muss man mit den Eingaben in die Datei imapauth.config.php. Leerzeichen haben hier unerwünschte Effekte.

'imapauth_combo_domains' => 'debacher.de,debacher.name,debacher.com'

setzt man hier nach dem Komma Leerzeichen, so stehen die später auch nach dem Klammeraffen, mit unerwünschten Effekten.

apache

In der Datei /etc/sysconfig/apache muss noch das Modul rewrite aktiviert werden.

# EXAMPLES:
#
# fairly minimal
# APACHE_MODULES="authz_host alias auth dir log_config mime setenvif"
#
# apache's default installation
# APACHE_MODULES="authz_host actions alias asis auth autoindex cgi dir imap include log_config mime negotiation setenvif status userdir"
# your settings
APACHE_MODULES="authz_host actions alias auth_basic authz_groupfile authn_file authz_user autoindex cgi dir include log_config mime negotiation setenvif status userdir asis imagemap php5 authz_default rewrite"

nach einem Neustart des Apache steht dann auch dieses Modul zur Verfügung.


squirrelmail

Dieses Webmail-Programm wirkt etwas hausbacken, ist aber sehr gutmütig und läuft sofort. Man kann kann noch etwas an den Einstellungen drehen, vor allem an den Spracheinstellungen. Dazu gibt es zwei Dateien im Unterverzeichnis config nämlich

  • config.php für die allgemeinen Einstellungen
  • config_default.php für die Vorgaben für neue Benutzer

Die Datei config.php muss man nicht direkt bearbeiten, dafür ist im gleichen Verzeichnis das Script conf.pl zuständig.

Horde

Es ist zum Verzweifeln mit dem Ding. Die Version 4 von SuSE wollte nicht laufen, weil die Horde-Datenbank-Tabellen fehlten. Den Versuch Version 3 von SUSE zu installieren habe ich abgebrochen, als YaST sich über nicht erfüllbare Abhängigkeiten beschwerte.

Ich habe dann die Version 3 von der Horde-Homepage geladen. Am Anfang schien auch alles zu klappen, nur statt des Anmeldefensters erschien ein weißer Bildschirm und eine irre Zahl von Einträgen in der error_log. Die Meldungen hingen alle mit den Zeitzonen-Einstellungen zusammen. Zur Lösung musste ich die Datei /etc/php5/apache2/php.ini anpassen und dort die Zeitzone angeben:

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Europe/Berlin"

; http://php.net/date.default-latitude
date.default_latitude = 52.5194

; http://php.net/date.default-longitude
date.default_longitude = 13.4067

Nun läuft auch Horde3.


majordomo - approve

In den aktuellen Perl-Versionen läuft die Majordomo-Komponente approve nicht mehr. Das liegt an den Eigenschaften von split:

sub read_config {
   local($l);
   local($p);
   local($m);
   local($s);
   open(CONF, $opt_f) || die("open(CONF, \"$opt_f\"): $!");
   while (<CONF>) {
       s/\n$//;
       s/#.*//;
       if (/^$/) { next; }
       split;
       $l = $_[0];     $l =~ tr/A-Z/a-z/;      # list
       $p = $_[1];                             # password
       $m = $_[2];     $m =~ tr/A-Z/a-z/;      # majordomo@site
       split(/\@/, $m);
       $s = $_[1];     $s =~ tr/A-Z/a-z/;      # site

       $passwd{$l} = $p;
       $passwd{"$l\@$m"} = $p;
       $passwd{"$l\@$s"} = $p;
       if (defined($site{$l})) {
           # if it's already defined, there's more than one list by this name
           $site{$l} = "MULTIPLE";
       } else {
           $site{$l} = $s;
       }
   }
   close(CONF);
}

Hier wird mehrfach split in einem Void-Kontext benutzt und davon ausgegangen, dass das Ergebnis dann in @_ untergebracht wird. Das ist leider nicht mehr der Fall. Ändert man die Funktion entsprechend klappt approve auch wieder:

sub read_config {
   local($l);   
   local($p);
   local($m);
   local($s);
   open(CONF, $opt_f) || die("open(CONF, \"$opt_f\"): $!");

   while (<CONF>) {
       s/\n$//;
       s/#.*//;
       if (/^$/) { next; }
       @sp=split;
       $l = $sp[0];    $l =~ tr/A-Z/a-z/;      # list
       $p = $sp[1];                            # password
       $m = $sp[2];    $m =~ tr/A-Z/a-z/;      # majordomo@site
       @sp=split(/\@/, $m);
       $s = $sp[1];    $s =~ tr/A-Z/a-z/;      # site

       $passwd{$l} = $p;
       $passwd{"$l\@$m"} = $p;
       $passwd{"$l\@$s"} = $p;
       if (defined($site{$l})) {
           # if it's already defined, there's more than one list by this name
           $site{$l} = "MULTIPLE";
       } else {
           $site{$l} = $s;
       }
   }
   close(CONF);
}

mailman

Zuerst muss man den Mailman in der Apache-Konfiguration aktivieren:

In der Datei /etc/sysconfig/apache2 muss der Parameter MAILMAN den APACHE_SERVER_FLAGS hinzugefügt werden, zum Beispiel so:

APACHE_SERVER_FLAGS="SSL MAILMAN"

oder einfacher mittels:

a2enflag MAILMAN

damit wird der Eintrag ebenfalls erstellt. Danach den Apache neu starten.

In der Datei /usr/lib/mailman/Mailman/mm_cfg.py finden sich einige Grundeinstellungen für den Mailman, die man mit einem Texteditor vornehmen kann. Eine weitere Änderung erfolgt in der Datei /etc/postfix/main.cf dort muss die Zeile

alias_maps = hash:/etc/aliases

erweitert werden zu

alias_maps = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases

damit die Alias-Einträge vom Mailman berücksichtigt werden.

Nun legt man das Site-Kennwort fest mit

   /usr/lib/mailman/bin/mmsitepass


und legt die Standard-Mailingliste "mailman" an mittels

   /usr/lib/mailman/bin/newlist -l de mailman postmaster@myserver.tld passwort

Dann kann man den Dienst starten:

   rcmailman start

mysql

Um die Datenbanken von einem Rechner auf den anderen zu bekommen exportiere ich sie normalerweise mit mysqldump an der Kommandozeile um sie dann auf dem Zielserver wieder entsprechend einzuspeilen.

Bei einer Anwendung namens ilias klappt das aber nicht. Auf einem Rechner bekomme ich die Fehlermeldung:

mysqldump: Got error: 29: File './ilias/svy_finished_seq.MYD' not found (Errcode: 24) when using LOCK TABLES

auf dem neueren Rechner

mysqldump: Got error: 23: Out of resources when opening file './ilias/svy_inv_grp_seq.MYD' (Errcode: 24) when using LOCK TABLES

Diese Datenbank besteht aus 1846 Dateien und soviele darf mysqldump wohl nicht gleichzeitig öffnen. Eine Lösung besteht in dem Einfügen von --single_transaction

mysqldump ilias -p  --single_transaction > /tmp/ilias.sql


Joomla 1.0.x

Auf dem alten Server läuft eine Domain mit einem alten Joomla. Joomla in der Version 1.0.x arbeitet aber nicht mit PHP 5.3.x zusammen. Auf der Seite http://www.tziegler.de/cms2/component/content/article/55-anpassungen/127-joomla-1-0-15-und-php-5-3.html findet sich ein Lösungshinweis. Eine weitere, ähnliche Lösung findet sich unter http://adityo.blog.binusian.org/?p=782

Man muss in der Datei includes/Cache/Lite/Function.php ein paar Zeilen ändern (vor jedes $argument kommt noch ein & Zeilen 92, 98, 100):

               } else {
                       ob_start();
                       ob_implicit_flush(false);
                       $target = array_shift($arguments);
                       if (strstr($target, '::')) { // classname::staticMethod
                               list($class, $method) = explode('::', $target);
                               $result = call_user_func_array(array($class, $method), &$arguments);
                       } else if (strstr($target, '->')) { // object->method
                               // use a stupid name ($objet_123456789 because) of problems when the object
                               // name is the same as this var name
                               list($object_123456789, $method) = explode('->', $target);
                               global $$object_123456789;
                               $result = call_user_func_array(array($$object_123456789, $method), &$arguments);
                       } else { // function
                               $result = call_user_func_array($target, &$arguments);
                       }

Außerdem gab es Probleme mit den Umlauten, hier hilft eine Änderung in includes/database.php (ab Zeile 103):

               $this->_table_prefix = $table_prefix;
       @mysql_query("SET NAMES 'latin1'", $this->_resource);
       @mysql_query("SET CHARACTER SET 'latin1'", $this->_resource);
               $this->_ticker = 0;
               $this->_log = array();