Debian: Webserver mit vhosts (virtuellen Webservern)

Einen Webserver unter Debian zu installieren ist nicht besonders schwer, hier eine kurze Anleitung.

Beachten Sie jedoch dringend noch folgende Ratschläge:

  • Stellen Sie ihr System so ein, das es sich automatisch aktuell hält oder halten Sie ihr System aktuell.
  • Stellen Sie ihren Server nicht direkt ins Internet, nutzen Sie eine Firewall davor und veröffentlichen Sie nur die entsprechend benötigten Dienste.
  • Wählen Sie komplexe Kennwörter.
  • Erlauben sie keinen direkten Root Zugriff.
  • Setzen Sie Richtlinien zum härten ihres Webservers um.

Los geht:

Downloaden sie die aktuelle Version (derzeit 9.3) Netzwerkinstall herunter und kopieren Sie sie in einen Datenspeicher auf dem Host.

Erstellen Sie eine VM (z.B. Version 6.5, 4 Porzessoren, 8 GB Ram, 60 GB Thin, Netzwerkkarte, CD Laufwerk mit dem entsprechenden ISO).

Starten Sie die Installation (z.B. alles abgewählt bis auf SSH Server und Systemtools).

Nach der Installation loggen Sie sich ein mit dem erstellten User und holen sich die IP mit „ip addr show“.

Verbinden Sie sich mit SSH (unter OSX oder *nix mit Terminal oder unter Windows mit z.B. Putty) und wecheln sie zu root mit „su“.

Sollten sie einen virtuellen Server verwenden (ESX oder ESXI), so sollten Sie als erstes die Open VM Tools installieren und den Server neu starten:

apt-get install open-vm-Tools
init 6

Nun werden wir dem Server eine feste IP zurordnen:

cd /etc/network/interfaces

Editieren Sie den folgenden Eintrag (z.B. mit VI oder Nano):

iface ens192 inet dhcp (Achtung, statt ens192 kann hier auch was anderes stehen wie z.B. eth0)

Ändern sie ihn wie folgt (verwenden Sie bitte natürlich ihre eigenen Daten):

iface ens192 inet static
address 192.168.123.10/24
gateway 192.168.123.254
dns-nameservers 192.168.123.254
dns-search domain.tld

Starten Sie die Installation vom Webserverteil wie folgt:

apt-get update
apt-get upgrade
apt install apache2 apache2-utils

Wenn Sie ihre Seite mit SSL sichern wollen (ich verwende mittlerweile oft ssls.com, dort bekommt man ein einfaches Zertifikat für ca. 15$ für 3 Jahre und dies erhält man in wenigen Minuten), gehen Sie wie folgt im Terminal vor:

cd /etc/ssl/private
openssl genrsa -out servername.domain.tld.key 2048
openssl req -new -key servername.domain.tld.key -out servername.domain.tld.csr -sha256

Dieses CSR verwenden Sie bitte um das Zertifikat zu beantragen. Ich hole es mir einfach in dem ich folgendes im Terminal eingebe:

cat servername.domain.tld.csr

Dieses dann rauskopieren zum beantragen.

Sollten Sie das Zertifikat haben, benötigen Sie das entsprechend auf dem Server. Dazu muss der inhalt vom servername.domain.tld.crt und servername.domain.tld.ca-bundle auf dem Server in eine Datei servername.domain.tld.crt kopiert werden – dies mache ich mit dem VI:

vi servername.domain.tld.crt

i drücken, den Inhalt aus servername.domain.tld.crt reinkopieren und in der nächsten Zeile dann den Inhalt aus servername.domain.tld.ca-bundle und das ganze dann mit „ESC“, „:wq“ speichern.

Nun die Rechte anpassen:

chown root:ssl-cert servername.domain.tld.*

Dann noch die Zertifikate in /etc/apache2/sites-available/default-site.conf ändern auf die neuen Dateien:

SSLCertificateFile /etc/ssl/private/servername.domain.tld.crt
SSLCertificateKeyFile /etc/ssl/private/servername.domain.tld.key

Nun die alte Site entladen, die neue laden und danach die Konfiguration neuladen – sollte Apache danach immer noch keine SSL Seite zeigen, noch mal den Dienst neu starten:

a2dissite default-ssl.conf

a2ensite defaultssl.conf

systemctl reload apache2

systemctl restart apache2

Habt ihr nun den Namen des Servers schon im DNS oder mindestens in der Hosts eingerichtet, so könnt ihr schon den Server aufrufen. Vergesst auch bitte nicht in der Firewall den Port forzuwarden (Port 80 und 443).

Möchte man später mehrere virtuelle Webserver auf dem Server installieren empfiehlt es sich schon jetzt die Verzeichnisse entsprechend anzupassen:

cd /var/www

mkdir ordnername

chown -R www-data:www-data ordnername

chmod -R 755 ordnername

Dann noch die Ordnerpfade und eigene Adminemailadresse anpassen in der /etc/apache2/sites-available/000-default-site.conf und default-ssl.conf und wieder die Sites neulade sowie den Apache:

a2dissite 000-default.conf

a2dissite default-ssl.conf

a2ensite 000-default.conf

a2ensite default-ssl.conf

systemctl reload apache2

Nun kommt die PHP Installation:

apt install php7.0 libapache2-mod-php7.0 php7.0-mysql php-common php7.0-cli php7.0-common php7.0-json php7.0-opcache php7.0-readline

a2enmod php7.0

a2enmod rewrite

systemctl restart apache2

Kontrolliert nun ob PHP funktioniert – erstellt z.B. in dem Ordner oben eine Datei index.php mit dem folgenden Inhalt:

<?php
phpinfo();
?>

Sollten Sie nun auch ihre Seite nur noch über HTTPS aufrufen wollen, dann können sie in dem Verzeichnis eine Datei .htaccess erstellen mit folgenden Inhalt:

<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </IfModule>

Anschließend noch mal die Rechte anpassen:

chown -R www-data:www-data ordnername

chmod -R 755 ordnername

Weiterhin muss noch /etc/apache2/sites-available/000-default.conf erweitert werden (unterhalb von Documentroot) mit dem folgendem Eintrag:

<Directory /var/www/servicecenter>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
</Directory>

Weiterhin muss noch /etc/apache2/sites-available/000-default.conf erweitert werden (unterhalb von Documentroot) mit dem folgendem Eintrag:

<Directory /var/www/servicecenter>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
</Directory>
<FilesMatch "\.(cgi|shtml|phtml|php)$">
 SSLOptions +StdEnvVars
</FilesMatch>

Anschließend müssen natürlich wieder die Konfigurationen neu geladen werden:

a2dissite 000-default.conf

a2dissite default-ssl.conf

a2ensite 000-default.conf

a2ensite default-ssl.conf

systemctl reload apache2

Rufen Sie die Seite auf und kontrollieren Sie bitte ob die Seite erreichbar ist und auch PHP funktioniert. Löschen Sie bitte jedoch nach der erfolgreichen Installation wieder die Datei index.php oder ändern sie den Inhalt , da sie viele Informationen über ihr System preisgibt.

Nun installieren wir den SQL Server, statt MySQL wird jedoch mittlerweile MariaDB verwendet, welches kompatibel ist jedoch Open Source und somit frei zur Nutzung. Mit dem weiteren Befehl machen wir MariDB zum Standard und anschließend kontrollieren wir ob der Server gestartet ist. Starten Sie dazu wieder im Terminal wie folgt:

apt install mariadb-server mariadb-client

apt install mysql-server mysql-client

systemctl status mariadb

Nachdem der Server läuft, kommen die Nacharbeiten (Autostart einrichten und Security härten):

systemctl enable mariadb

mysql_secure_installation

Wollte ihr mehrere Seiten auf dem Server hosten, erstellt bitte pro Seite einen Ordner:

cd /var/www
mkdir ordnername
chown -R www-data:www-data ordnername
chmod -R 755 ordnername

Passt wieder in /etc/apache2/sites-available die Dateien wie folgt an:

Default-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
 SSLEngine on
 SSLCertificateFile /etc/ssl/private/seite1.crt
 SSLCertificateKeyFile /etc/ssl/private/seite1.key

 Servername "www.seite1.de"
 ServerAlias "seite1.de"
 DocumentRoot "/var/www/seite1"
 ServerAdmin admin@seite1.de
 ErrorLog ${APACHE_LOG_DIR}/ssl-error.log
 CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined
 <Directory /var/www/seite1>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
 </Directory>
 <FilesMatch "\.(cgi|shtml|phtml|php)$">
 SSLOptions +StdEnvVars
 </FilesMatch>
 <Directory /usr/lib/cgi-bin>
 SSLOptions +StdEnvVars
 </Directory>
 BrowserMatch "MSIE [2-6]" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
 </VirtualHost>

 <VirtualHost *:443>
 SSLEngine on
 SSLCertificateFile /etc/ssl/private/seite2.crt
 SSLCertificateKeyFile /etc/ssl/private/seite2.key

 Servername "www.seite2.de"
 ServerAlias "seite2.de"
 DocumentRoot "/var/www/seite2"
 ServerAdmin admin@seite2.de
 ErrorLog ${APACHE_LOG_DIR}/seite2-ssl-error.log
 CustomLog ${APACHE_LOG_DIR}/seite2-ssl-access.log combined
 <Directory /var/www/seite2>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
 </Directory>
 <FilesMatch "\.(cgi|shtml|phtml|php)$">
 SSLOptions +StdEnvVars
 </FilesMatch>
 <Directory /usr/lib/cgi-bin>
 SSLOptions +StdEnvVars
 </Directory>
 BrowserMatch "MSIE [2-6]" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
 </VirtualHost>
</IfModule>

000-default.conf

<VirtualHost *:80>
 ServerName www.seite1.de
 ServerAlias seite1.de
 ServerAdmin admin@seite1.de
 DocumentRoot /var/www/seite1/
 <Directory />
 Options FollowSymLinks
 AllowOverride None
 </Directory>
 <Directory /var/www/seite1>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
 </Directory> ErrorLog /var/log/apache2/error.log
 LogLevel warn
 CustomLog /var/log/apache2/access.log combined
</VirtualHost>
<VirtualHost *:80>
 ServerName www.seite2.de
 ServerAlias seite2.de
 ServerAdmin admin@seite2.de
 DocumentRoot /var/www/seite2/
 <Directory /var/www/seite2>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
 </Directory>
 ErrorLog /var/log/apache2/seite2-error.log
 LogLevel warn
 CustomLog /var/log/apache2/seite2-access.log combined
 ServerSignature On
</VirtualHost>

Danach natürlich wie immer alles entladen und neuladen:

a2dissite 000-default.conf

a2dissite default-ssl.conf

a2ensite 000-default.conf

a2ensite default-ssl.conf

systemctl reload apache2

Widmen wir uns nun dem Teil der Datenübertragung – dies realisieren wir mit ProFTP. Da der Server in der DMZ steht und nur meine eigenen Seiten gehostet werden sowie nur über VPN Zugegriffen wird werde ich das Documentroot auf /var/www/ stellen, da ich dort alle Seiten anlege und kein TLS verwenden. Der Server übers Internet nur über HTTP und HTTPS veröffentlicht. SSH, FTP und SQL wird nur über verschlüsseltes VPN genutzt.

apt-get install proftp

Datei /etc/proftpd/conf.d/custom.conf erstellen (bei benutzername bitte den Namen des Zugriffkontos eintragen, nicht root):

<Global>
 RequireValidShell off
</Global>
# If desired turn off IPv6
UseIPv6 off
# Default directory is ftpusers home
DefaultRoot /var/www benutzername
# Limit login to the ftpuser group
<Limit LOGIN>
 DenyGroup !ftpuser
</Limit>

Gruppe ftpuser und www-data hinzufügen, Benutzer hinzufügen und Dienst neustarten:

addgroup ftpuser

usermod -a -G ftpuser benutzername

usermod -a -G www-data benutzername

systemctl restart proftpd

Solltet ihr Dateien nicht löschen oder ändern können, so kontrolliert bitte die Rechte und passt diese gegebenenfalls an mit:

chown -R benutzername /var/www/ordnername

chmod -R 755 /etc/www/ordnername

Somit ist der Server bereitgestellt und einsatzbereit.

Erweiterung: Python installation

Kontrollieren Sie ob Python installiert ist und in welcher Version:

python3 --version

Installieren Sie noch PIP und binden Sie Python in Apache ein:

apt-get install python3-pip

pip3 install mod_wsgi

apt-get install libapache2-mod-python

Nun muss noch der Publisher Handler eingerichtet werden – diese werden wieder in den Sitekonfigurationen erstellt – erweitert dazu die 000-default.conf und default-ssl.conf unterhalb des bestehenden der:

<Directory /var/www/seite1>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug On
</Directory>

Anschließend wieder die Sites und Apache neu laden:

a2dissite 000-default.conf

a2dissite default-ssl.conf

a2ensite 000-default.conf

a2ensite default-ssl.conf

systemctl reload apache2

Weitere Schritte folgen noch …

 

 

Tags: , , , , , , , , , , ,