$HOME

Schritt 0: Was wollen wir eigentlich machen?

In diesem Dokument geht es um den naechsten Schritt, der vereinfachten Verwaltung bzw. Absicherung des Servers.

Dazu werden folgende Programme installiert:
* PHP 5.1.6 (http://www.php.net) #
* Hardened-PHP 0.4.15 (http://www.hardened-php.net)
* eAccelerator 0.9.5 RC1 (http://eaccelerator.net) #
* phpMyAdmin 2.8.2.4 (http://www.phpmyadmin.net) #
* IlohaMail 0.8.14-rc3 (http://blog.ilohamail.org) #
* PureFTPd 1.0.21 (http://www.pureftpd.org) #
* mod_vhs 1.0.30 (http://www.oav.net/projects/mod_vhs) #

Und demnaechst:
* portiqus (http://www.wahlfaelschung.de) #
* samhain/filesystemcheck

Und ich erklaere, wie man ein (selbst signiertes) SSL-Zertifikat fuer den Server erstellt. #
$HOME

Schritt 1: Installation von PHP5 (inklusive Hardening-Patch)

root@box:/usr/src # tar xjf tarballs/php-5.1.6.tar.bz2
root@box:/usr/src # cd php-5.1.6/
root@box:/usr/src/php-5.1.6 # patch -p1 < ../tarballs/hardening-patch-5.1.6-0.4.15.patch

Damit PHP5 mit den angegebenen Parametern erstellt werden kann, muessen folgende Programme/Bibliotheken installiert sein:
* libxml2
* curl (libcurl) (Wird auch von ClamAV benutzt)
* gmp
* mcrypt
* mhash
* MySQL (Wird auch von Exim, DSpam und Courier benoetigt)
* libgd (Wird auch fuer DSpam bzw. dessen WebUI benoetigt)

Sind alle Voraussetzungen erfuellt, kann PHP5 mit folgenden Befehlen erstellt werden:
root@box:/usr/src # export PATH=$PATH:/usr/local/mysql-5.0.24a/bin;
root@box:/usr/src # ./configure --with-apxs2=/usr/local/httpd-2.0.59/bin/apxs --enable-safe-mode --disable-ipv6 --with-openssl --with-zlib --with-bz2 --with-curl --enable-dba --with-db4 --with-flatfile --enable-ftp --with-gd --with-gmp --enable-mbstring --with-mcrypt --with-mhash --with-mysql=/usr/local/mysql-5.0.24a/ --with-mysql-sock=/tmp/mysql --with-mysqli --enable-sysvmsg --enable-sysvsem --enable-sysvshm --with-config-file-path=/etc/php/
root@box:/usr/src # make
root@box:/usr/src # make install

Wichtig ist es, den / am Ende des "--with-config-file-path" zu setzen, da sonst die INI-Datei nicht gefunden werden kann.
Danach nur noch den Handler fuer PHP5 in die Apache-Konfiguration eingtragen:
LoadModule php5_module modules/libphp5.so
AddHandler php5-script php
Ausserdem natuerlich noch die Suchreihenfolge fuer den DirectoryIndex aendern:
Vorher:
DirectoryIndex index.html index.html.var
Danach:
DirectoryIndex index.php index.html index.html.var
$HOME

Schritt 1: Installation von des eAccelerators

Der eAccelerator funktioniert laut Suchmaschine / Mailingliste nur ab RC1 von 0.9.5, daher wird hier eine unstable-Version benutzt.
$HOME

Schritt 1: Installation von des eAccelerators

root@box:/usr/src # tar xjf tarballs/eaccelerator-0.9.5-rc1.tar.bz2
root@box:/usr/src # cd eaccelerator-0.9.5-rc1/
root@box:/usr/src # patch -p1 < ../tarballs/eaccelerator-0.9.3-hash-fix.patch
Der Patch wird einen Fehler produzieren:
patching file eaccelerator.c
Hunk #1 succeeded at 104 with fuzz 1 (offset -16 lines).
Hunk #2 FAILED at 1918.
1 out of 2 hunks FAILED -- saving rejects to file eaccelerator.c.rej
Diese Fehlermeldung ist OK, der eAccelerator funktioniert trotzdem.

root@box:/usr/src # /usr/local/bin/phpize
root@box:/usr/src # ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/bin/php-config
root@box:/usr/src # make
root@box:/usr/src # make install

Danach nur noch die Datei /etc/php/php.ini um folgende Eintraege erweitern:

zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20050922/eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

Und natuerlich den Apache Webserver neu starten.
$HOME

Schritt 2: Installation des phpMyAdmin

Vorbereitungen:
root@box:/home/apache # tar xjf /usr/src/tarballs/phpMyAdmin-2.8.2.4.tar.bz2
root@box:/home/apache # ln -s phpMyAdmin-2.8.2.4 phpMyAdmin
root@box:/home/apache # chown nobody.nogroup phpMyAdmin -R
root@box:/home/apache # cd phpMyAdmin
root@box:/home/apache/phpMyAdmin # cp -a libraries/config.default.php config.inc.php

In der Datei config.inc.php die folgende Zeile aendern:
Von:
$cfg['Servers'][$i]['auth_type'] = 'config'; // Authentication method (config, http or cookie based)?
in:
$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?

Dadurch wird beim (spaeteren) Aufruf des phpMyAdmins nach einer Authentifizierung gefragt, welche er direkt aus der Datenbank nimmt:
Login und Passwort muessen dann dem eines Datenbank-Benutzers entsprechen.
Schritt 2a: Installation des phpMyAdmin als Alias des Apache Webservers

Damit der phpMyAdmin fuer alle Webseiten (Kunden :) erreichbar ist, sollte man am besten ein Alias einrichten,
so dass er ueber http://domain/phpmyadmin aufgerufen werden kann.
Dazu muss man nur folgenden Text in die Konfiguration des Apache Webservers eintragen:
Alias /phpmyadmin /home/apache/phpMyAdmin
<Directory /home/apache/phpMyAdmin>
Order allow,deny
allow from all
DirectoryIndex index.php
</Directory>

$HOME

Schritt 3: Installation des Programmes IlohaMail

Vorbereitungen:
root@box:/usr/src # tar xzf tarballs/IlohaMail-0.8.14-rc3.tar.gz
root@box:/usr/src # cd IlohaMail-0.8.14-rc3
root@box:/usr/src/IlohaMail-0.8.14-rc3 # mv IlohaMail /home/apache
root@box:/usr/src/IlohaMail-0.8.14-rc3 # cd /home/apache
root@box:/home/apache/IlohaMail # chown nobody.nogroup IlohaMail -R
Schritt 3a: Installation des Programmes IlohaMail als Alias des Apache Webservers

Damit das Webmail-Programm fuer alle Webseiten (Kunden :) erreichbar ist, sollte man am besten ein Alias einrichten,
so dass er ueber http://domain/webmail aufgerufen werden kann.
Dazu muss man nur folgenden Text in die Konfiguration des Apache Webservers eintragen:
Alias /webmail /home/apache/IlohaMail
<Directory /home/apache/webmail>
Order allow,deny
allow from all
DirectoryIndex index.php
</Directory>

Schritt 3b: Absichern und Beschleunigen des Programmes IlohaMail

Die Konfiguration des Programes ist in der Datei /home/apache/IlohaMail/conf/conf.php abgelegt.
Folgende Aenderungen sollten dort vorgenommen werden:
$backend = "FS"; wird zu $backend = "DB";
$DATA_DIR = '../data'; wird zu $DATA_DIR = '/home/webmail/data';

Weiterhin muss die Datei /home/apache/IlohaMail/conf/login.php editiert werden:
$default_host = ""; wird zu $default_host = "localhost"; $adv_mode = 1; wird zu $adv_mode = 0;
$default_lang = "eng/"; wird zu $default_lang = "de/";
$hide_host = 0; wird zu $hide_host = 1;
$hide_protocol = 0; wird zu $hide_protocol = 1;
$hide_lang = 0; wird zu $hide_lang = 1;

Zum Schluss noch die Datei /home/apache/IlohaMail/conf/db_conf.php editieren:
$DB_HOST=""; wird zu $DB_HOST="localhost";
$DB_USER=""; wird zu $DB_USER="webmail";
$DB_PASSWORD=""; wird zu $DB_PASSWORD="webmail-password";

Nun nur noch die Verzeichnisse anpassen bzw. die Datenbank anlegen: root@box:/home/apache/IlohaMail # rm -rf data/
root@box:/home/apache/IlohaMail # cd /usr/src/IlohaMail-0.8.14-rc3
root@box:/usr/src/IlohaMail-0.8.14-rc3 # /usr/local/mysql-5.0.24a/bin/mysql -u root --password='new-password'
mysql> create database webmail;
mysql> grant all on webmail.* to webmail@localhost identified by 'webmail-password';
mysql> use webmail;
mysql> source MySQL/sql;
mysql> quit;
$HOME

Schritt 4: Installation des FTP-Servers PureFTPd

root@box:/usr/src # tar xjf tarballs/pure-ftpd-1.0.21.tar.bz2
root@box:/usr/src # cd pure-ftpd-1.0.21/
root@box:/usr/src/pure-ftpd-1.0.21 # ./configure --prefix=/usr/local/pure-ftpd-1.0.21 --sysconfdir=/etc/pure-ftpd --without-inetd --without-shadow --without-unicode --with-puredb --with-throttling --with-ratios --with-quotas --with-largefile --with-virtualhosts --with-privsep --with-mysql=/usr/local/mysql-5.0.24a --with-tls --with-certfile=/etc/cert/server.pem
root@box:/usr/src/pure-ftpd-1.0.21 # make
root@box:/usr/src/pure-ftpd-1.0.21 # make install-strip
Schritt 4a: Anlegen der noetigen Verzeichnisse

root@box:/usr/src # mkdir /etc/pure-ftpd
Schritt 4b: Editieren der Konfigurationsdateien

Da der FTP-Server die Benutzer aus der Datenbank auslesen soll, muss zum einen die Konfigurationsdatei fuer den Datenbankzugriff angelegt werden,
zum anderen benoetigt man natuerlich auch eine Tabelle mit den Benutzern und einen Datenbankbenutzer mit entsprechenden Rechten.

Die Konfigurationsdatei /etc/pure-ftpd/mysql.conf sieht bei mir wie folgt aus:
MYSQLSocket /tmp/mysql
MYSQLUser pureftpd
MYSQLPassword pureftpd-password
MYSQLDatabase vserver
MYSQLCrypt any
MYSQLGetPW SELECT password FROM ftpuser WHERE login="\L"
MYSQLGetUID SELECT uid FROM ftpuser WHERE login="\L"
MYSQLGetGID SELECT gid FROM ftpuser WHERE login="\L"
MYSQLGetDir SELECT directory FROM ftpuser WHERE login="\L"
#MySQLGetRatioUL SELECT ulratio FROM ftpuser WHERE login="\L"
#MySQLGetRatioDL SELECT dlratio FROM ftpuser WHERE login="\L"
#MySQLGetBandwidthUL SELECT ulbandwidth FROM ftpuser WHERE login="\L"
#MySQLGetBandwidthDL SELECT dlbandwidth FROM ftpuser WHERE login="\L"

Sollte eine Benutzerbasierende Beschraenkung des Ratios bzw. der Bandbreite gewuenscht sein,
so muss die Kommentierung vor den letzten vier Zeilen entfernt und die Datenbanktabelle entsprechend angepasst werden.

Da der FTP-Server die Benutzer aus der Datenbank auslesen soll, muss noch eine Datenbankbenutzer mit entsprechenden Rechten angelegt werden:
Die SQL-Datei mit den Befehlen zum Anlegen der Tabelle gibt es hier.
root@box:/usr/src # /usr/local/mysql-5.0.24a/bin/mysql -u root --password='new-password'
mysql> use vserver;
mysql> source pure-ftpd.sql;
mysql> grant select on vserver.* to pureftpd@localhost identified by 'pureftpd-password';
mysql> quit;

Natuerlich sollte das vorgeschlagene Passwort 'pureftpd-password' durch etwas sichereres ersetzt werden.
Schritt 4d: Anlegen des Start/Stop-Scriptes

Das Script traegt den Namen rc.pure-ftpd und hat den folgenden Inhalt:

#!/bin/sh

_start() {
/usr/local/pure-ftpd-1.0.21/sbin/pure-ftpd -4 -B -C 3 -D -E -g /var/run/pure-ftpd.pid -l mysql:/etc/pure-ftpd/mysql.conf -w -Y 1 -b -A
}

_stop() {
if [ -r /var/run/pure-ftpd.pid ]; then
kill `cat /var/run/pure-ftpd.pid`
else
killall exim
fi
}

_restart() {
_stop
sleep 1
_start
}

case "$1" in
'start')
_start
;;
'stop')
_stop
;;
'restart')
_restart
;;
*)
echo "usage $0 start|stop|restart"
esac

root@box:/usr/src # ls -all /etc/rc.d/rc.pure-ftpd
-rwxr--r-- 1 root root 416 2006-09-08 12:46 /etc/rc.d/rc.pure-ftpd
Schritt 4e: Nachtrag

Der FTP-Server unterstuetzt Passwoerter in den folgenden Formaten: MD5, crypt(), plaintext und password().
In meiner Konfiguration werden alle Hashfunktionen (also MD5, crypt() und password()) unterstuetzt,
ich persoenlich lege die Passwoerter aber immer als MD5-Hash in der Datenbank ab.
$HOME

Schritt 5: Installation und Konfiguration des Apache Modules mod_vhs

Bei mod_vhs handelt es sich um eine Apache Modul, das die komplette Verwaltung von namensbasierenden VHosts ueber eine Datenbank erledigt.
Vorteil: Kein Erstellen / Modifizieren der httpd.conf, kein Neustarten des Apache.
Nachteil: Ist die Datenbank weg, ist der Apache weg. Ausserdem erzeugt jede Anfrage Last auf dem Datenbankserver (auch wenn gecacht werden kann).

Im Kontext dieses Dokumentes - einem EinerFuerAlles-Server sind die Nachteile akzeptabel, da die Vorteile deutlich ueberwiegen.

Das Modul benoetigt - als Prerequisite - die Bibliothek libhome, die vermutlich nicht vorhanden sein duerfte.

Die Installation von libhome ist einfach, sie wird nur nach /usr/local installiert:
root@box:/usr/src # tar xzf tarballs/libhome-0.10.1.tar.gz
root@box:/usr/src # cd libhome-0.10.1/
root@box:/usr/src/libhome-0.10.1 # ./configure --sysconfdir=/etc --without-ldap --without-pam --with-mysql=/usr/local/mysql-5.0.24a/include/mysql --with-mysql-libdir=/usr/local/mysql-5.0.24a/lib/mysql
root@box:/usr/src/libhome-0.10.1 # make
root@box:/usr/src/libhome-0.10.1 # make install

Danach steht uns die libhome mit Support fuer MySQL zur Verfuegung und das Modul mod_vhs kann installiert werden:
root@box:/usr/src # tar xzf tarballs/mod_vhs-1.0.30.tar.gz
root@box:/usr/src # cd mod_vhs-1.0.30/

mod_vhs stellt kein configure bereit, es muss das Makefile editiert werden:
Zuerst den Pfad zum apxs-Tool von Apache setzen:
APXS = /usr/local/httpd-2.0.59/bin/apxs
Und danach (vor LDFLAGS) folgendes einfuegen:
CFLAGS += -I/usr/local/include/php/main/
Nun sollte das Modul problemlos erstellt werden koennen:

root@box:/usr/src/mod_vhs-1.0.30 # make
root@box:/usr/src/mod_vhs-1.0.30 # make install

Die Konfiguration des Apache wird automatisch angepasst, das Modul steht ab sofort zur Verfügung.
Damit der Apache fuer seine VHosts das Modul auch nutzt, muss eine Direktive eingerichtet werden:
$HOME

Schritt 7: Erstellen eines selbstsignierten Zertifikates

Aus Sicherheitsgruenden sollten alle Verbindungen im Internet verschluesselt sein, da sonst jeglicher Traffic abgehoert werden koennte.

Damit der Server (bzw. die Server: Exim, Courier, Apache und Pure-FTPd) verschluesselte Verbindungen unterstuetzt, wird ein SSL-Zertifikat benoetigt.
Um ein solches Zertifikat zu erhalten, gibt es zwei Moeglichkeiten: Entweder man kauft eins oder man erstellt ein selbstsigniertes.

Waehrend man fuer ein "echtes" Zertifikat bis zu 1000 Euro pro Jahr zahlen kann, diese dafuer aber von allen Browsern als vertrauenswuerdig eingestuft werden,
so kostet ein selbstsigniertes Zertifikat nur etwas arbeit, wird aber von keinem Browser automatisch anerkannt.
Das bedeutet nicht, dass die Verschluesselung unsicher(er) waehre, sondern nur, dass der Benutzer eine zusaetzliche Nachfrage zu Gesicht bekommt.

Um ein selbstsigniertes Zertifikat zu erstellen, benoetigt man das Paket "OpenSSL", welches bei allen Distributionen vorhanden ist.
root@box:/usr/src # mkdir /etc/cert
root@box:/usr/src # cd /etc/cert
root@box:/etc/cert # openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout server.pem -out server.pem
Nach Eingabe des letzten Befehles muessen einige Fragen beantwortet werden. Fuer einen Testserver reicht es im Normalfall,
die vorgeschlagenen Werte zu uebernehmen. Fuer einen Produktivserver sollte man natuerlich sinnvolle Angaben machen.
Nachdem das Zertifikat erstellt wurde, gibt es die Datei server.pem im aktuellen Verzeichnis:
root@box:/etc/cert # ls -all server.pem
-rw-r--r-- 1 root root 1880 2006-09-08 13:01 server.pem
Damit der Schluessel nicht kopiert werden kann, muss man die Rechte noch entsprechend anpassen:
root@box:/etc/cert # chmod 0700 server.pem
Schritt 5a: Anpassen der einzelnen Serverdieste

Damit der Mailserver Exim das neue Zertifikat benutzt und verschluesselte Verbindungen anbietet,
muessen nur die folgenden Zeilen in der Datei exim.conf eingefuegt bzw. die Kommentierung entfernt werden:
Aus:
### AENDERN ###
#tls_advertise_hosts = *
#tls_certificate = /etc/cert/server.pem
#tls_privatekey = /etc/cert/server.pem

wird:
tls_advertise_hosts = *
tls_certificate = /etc/cert/server.pem
tls_privatekey = /etc/cert/server.pem

Damit der FTP-Server das neue Zertifikat benutzt und verschluesselte Verbindungen anbietet,
muss er einfach nur neu gestartet werden, der Parameter "-Y 1" sorgt dafuer, dass sowohl unverschluesselte als auch verschluesselte Verbindungen angeboten werden.
Sollen nur noch verschluesselte Verbindungen angeboten werden, muss er auf "-Y 2" geaendert werden.

Damit der Courier-Server das neue Zertifikat benutzt und verschluesselte Verbindungen anbietet, muss in den Dateien imapd-ssl und pop3d-ssl die Zeilen IMAPDSSLSTART=NO bzw. POP3DSSLSTART=NO
auf
IMAPDSSLSTART=YES bzw. POP3DSSLSTART=YES
geaendert und die entsprechenden Dienste (mit rc.imapd-ssl bzw. rc.pop3d-ssl) gestartet werden.

Damit der Webserver das neue Zertifikat benutzt und verschluesselte Verbindungen anbietet,
muss etwas mehr Arbeit geleistet werden:
Zum einen muss die SSL-Konfigurationsdatei angepasst bzw. erstellt werden, eine Beispieldatei findet sich hier.
Zum anderen muss das Start/Stop-Script des Webservers angepasst werden:
In der Zeile /usr/local/httpd-2.0.59/bin/apachectl -k start vor das -k ein -D SSL einfuegen,
so dass dort /usr/local/httpd-2.0.59/bin/apachectl -D SSL -k start steht.
Bei den Stop bzw. Restart-Befehlen muss man das natuerlich auch eintragen.

Achtung: Auch diese Beispiel-Konfiguration erfordert noch Anpassungen: Sowohl die IP (im Beispiel 195.137.213.96),
als auch die Hostnamen (im Beispiel mas-user-services.de bzw dspam.mas-user-services.de) funktionieren natuerlich nur bei mir.
$HOME