Es gibt mittlerweile viele Wege um einen Webserver aufzusetzen und ihn anschließend optimal zu konfigurieren. Ich zeige euch heute eine der leichtesten und zugleich effektivsten.
Die meisten Admins versuchen das Problem mit den Sicherheitsfeatures von PHP zu erschlagen, und spielen mit Konfigurationen wie open_basedir oder safe_mode rum, andere versuchen PHP - mit Hilfe des Paketes suphp - als den jeweiligen User auszuführen.
Meine Methode geht direkt auf den Apache los, dort wo es wohl am schlauesten ist. Mit dem Paket apache2-mpm-itk von Ubuntu bzw. Debian ist es möglich jeden VHost als einen separaten User auszuführen.
Ich habe mich momentan für den Ubuntu 10.04 LTS Server entschieden, da hier alle benötigten Pakete in einer aktuellen Version vorhanden sind. Für die Installation benötigt ihr folgende Befehle:
# Superuser rechte erlangen
sudo su
# Apache / PHP / Mysql / PureFTPD
aptitude install apache2-mpm-itk
aptitude install php5 php5-curl php5-gd php5-imagick php5-imap php5-mcrypt php5-mysql
aptitude install mysql-server
aptitude install pure-ftpd
# Editor
aptitude install vim-nox
Falls bei eurer Installation kein aptitude vorhanden ist müsst ihr es vorher mit "apt-get install aptitude" installieren.
Konfiguration des FTP-Servers:
PureFTPD ist sehr sicher und leicht zu konfigurieren. Für einen reibungslosen Betrieb Schlage ich folgende Parameter vor:
cd /etc/pure-ftpd/conf
echo yes > BrokenClientsCompatibility
echo yes > ChrootEveryone
echo yes > DontResolve
echo 4 > MaxClientsPerIP
echo 50 > MaxClientsNumber
danach müsst ihr den FTP Server neustarten "/etc/init.d/pure-ftpd restart"
Da PureFTPD und apache2-mpm-itk auf Unixbenutzer geht, müssen wir normale Benutzer anlegen. Natürlich wollen wir nicht dass diese Benutzer einen Shell-Zugang auf unseren Server bekommen. Deshalb fügen wir /dev/null zu den shells hinzu - was dazu führt, dass User den FTP-Dienst benutzen können, jedoch keine Shell auf dem Server aufrufen dürfen.
Mithilfe von "echo /dev/null >> /etc/shells" fügt ihr /dev/null an das Ende der Datei hinzu.
Einen Benutzer anlegen:
mkdir /var/www/www.example.com
mkdir /var/www/www.example.com/www
useradd -d /var/www/www.example.com/ -s /dev/null user1
passwd user1
chown user1.user1 /var/www/www.example.com -R
mkdir /var/www/www.example.com/logs
Es ist gewollt, dass der Ordner logs als User root angelegt wird - der ftp-Nutzer sollte keine Erlaubnis haben Log-Dateien zu löschen, sondern nur anzusehen.
An diesem Punkt könnt ihr euch zum ersten mal auf eurem Server via ftp einloggen.
Konfiguration von Apache:
In der Standardkonfiguration ist das rewrite modul, welches von vielen cms'en wie Joomla oder Typo3 gerne verwendet wird deaktiviert. Mit dem Befehl "a2enmod rewrite" könnt ihr dieses Modul aktivieren. Nach jeder Änderung müsst ihr den Webserver neustarten "/etc/init.d/apache2 restart"
Der restliche Zauber findet in der VHost datei statt. Hier ein Beispiel wie sie bei mir aussieht:
vi /etc/apache2/sites-available/www.example.com
<VirtualHost *:80>
ServerAdmin me@example.com
ServerName www.example.com
ServerAlias example.com
php_admin_value open_basedir "/var/www/www.example.com:/tmp"
DocumentRoot /var/www/www.example.com/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/www.example.com/www/>
Options FollowSymLinks MultiViews -Indexes
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/www/www.example.com/logs/error.log
LogLevel warn
CustomLog /var/www/www.example.com/logs/access.log combined
<IfModule mpm_itk_module>
AssignUserId user1 user1
</IfModule>
</VirtualHost>
Zum Schluss die default Seite deaktivieren und die neu erstellte Seite aktivieren und anschließend den Webserver reloaden.
a2dissite default
a2ensite www.example.com
/etc/init.d/apache2 reload
Logrotate konfigurieren:
Ich habe zusätzlich noch Logrotate so konfiguriert, dass die Apache Logs ein Jahr aufgehalten werden. Eine neue Datei "
vi /etc/logrotate.d/www.example.com" mit folgendem Inhalt anlegen:
/var/www/www.example.com/logs/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
/etc/init.d/apache2 reload > /dev/null
fi
endscript
}
Der Server sollte somit fertig sein. Falls ihr Anregungen bzw Verbesserungsvorschläge habt, würde ich mich freuen wenn ihr mir eine Nachricht hinterlasst.