Root-Server mit Ubuntu 18.04
Mein alter Server läuft noch mit Ubuntu 16.04. Das ist erstmal kein Problem, der Support läuft noch, allerdings wird die aktuellste PHP-Version nicht unterstützt. Das macht bei einigen Anwendungen nun schon Probleme. Daher habe ich einen zweiten Server in der Serverbörse geordert. Die Rechner sind teurer geworden. Der Rechner ist vergleichbar mit dem alten, kostet aber 6€ mehr. Positiv ist, dass ich dadurch eine Ausfallsicherheit erreichen kann. Ich werde den neuen Server einrichten und anschließend den alten aktualisieren.
Der neue Rechner hat folgende Daten:
- Intel Core i7-2600 8x 3.40GHz (8x 6823.66 Bogomips)
- 16 GB Arbeitsspeicher
- 2x 3 TB im RAID1-Verbund Festplattenspeicher
Der Rechner kostet 30€/Monat.
Installation
Hetzner liefert die Geräte im Rescue-Modus aus. Das ist ein Minimal-Linux mit Tools zur Rettung und dem Skript installimage, mit dem eine Betriebssystem-Installation vorgenommen werden kann. Das ist schon mal ein großer Unterschied zu Strato, die die Rechner selber installieren und dann zur Verfügung stellen.
Der Robot (Kundencenter) von Hetzner bietet allerlei Möglichkeiten, so kann der Rechner bequem mit einem Strg + Alt + Entf-Befehl gefüttert werden oder per ACPI neugestartet werden. Zudem bietet Hetzner die Möglichkeit eines Weckens über LAN (WOL) und man kann bequem eigene Monitoring-Dienste für den Rechner anlegen, sodass man bei Unregelmäßigkeiten per Mail informiert wird.
Die Installation des Rechners erfolgt dann über den Befehl installimage
. Nach einer Auswahl des Betriebssystems kann man über eine Textdatei die RAID-Einstellungen, Festplattenpartitionierung und den Hostnamen konfigurieren. Das macht es besonders einfach, mehrere Rechner zu installieren oder sich die Konfiguration noch einmal abzuspeichern.
Nach dem Verlassen des Editors installiert der Rechner dann das Grundsystem, während man zugucken kann:
Hetzner Online GmbH - installimage Your server will be installed now, this will take some minutes You can abort at any time with CTRL+C ... : Reading configuration done : Loading image file variables done : Loading ubuntu specific functions done 1/16 : Deleting partitions done 2/16 : Test partition size done 3/16 : Creating partitions and /etc/fstab done 4/16 : Creating software RAID level 1 done 5/16 : Formatting partitions : formatting /dev/md/0 with swap done : formatting /dev/md/1 with ext2 done : formatting /dev/md/2 with ext4 done : formatting /dev/md/3 with xfs done : formatting /dev/md/4 with ext4 done : formatting /dev/md/5 with ext4 done 6/16 : Mounting partitions done 7/16 : Sync time via ntp done : Importing public key for image validation done 8/16 : Validating image before starting extraction done 9/16 : Extracting image (local) done 10/16 : Setting up network config done 11/16 : Executing additional commands : Setting hostname done : Generating new SSH keys done : Generating mdadm config done : Generating ramdisk done : Generating ntp config done 12/16 : Setting up miscellaneous files done 13/16 : Configuring authentication : Fetching SSH keys done : Disabling root password done : Disabling SSH root login without password done : Copying SSH keys done 14/16 : Installing bootloader grub done 15/16 : Running some ubuntu specific functions done 16/16 : Clearing log files done INSTALLATION COMPLETE You can now reboot and log in to your new system with the same password as you logged in to the rescue system. root@rescue ~ # reboot
Nach dem Neustart steht dann das neue System zur Verfügung. Die Installation hat letztlich mit Lektüre etwa 7 Minuten gedauert. Das ist ein enormer Fortschritt zu anderen Providern.
Grundlegendes
Die Installationsimages sind nicht unbedingt tagesaktuell, daher aktualisieren wir nach der Anmeldung als root erstmal die Software:
apt-get update apt-get dist-upgrade
Und ein paar Tools:
apt-get install vim htop whois aptitude
Firewall
Als Firewall lässt sich ufw nutzen. Das Paket muss nachinstalliert werden:
apt-get install ufw
und lässt sich dann einfach konfigurieren. ufw kann mit Softwarepaketen und einzelnen Ports umgehen:
ufw allow 22 ufw allow OpenSSH
Obiges zu setzen bevor die Firewall aktiviert wird, ist wichtig, da man sich sonst aus dem System aussperrt. Nach einer Aktivierung mittels
ufw enable
zeigt die Firewall auch automatisch Wirkung.
Überprüfen lässt sich der Status mit
ufw status
bzw.
ufw status numbered
So können auch Regeln gelöscht werden:
ufw delete 1
Hetzner bietet in der KonsoleH ebenfalls Möglichkeiten zur Firewallkonfiguration. Vielleicht kann man so sogar noch Last vom Rechner abwenden. Ich probiere das mal aus.
Damit nicht die syslog mit Firewall-Messages überläuft, deaktivieren wir das Logging in /etc/rsyslog.d/20-ufw.conf, letzte Zeile:
& stop
Webserver Apache2
Zur Bereitstellung von Webseiten nutze ich Apache als Webserver mit PHP. Da der Server unter mehreren Namen 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 php php-mysql php-pear
Neben Apache gibt es ein paar Tools, Doku und neben PHP schon die Anbindung für MySQL und Apache. Apache kommt in der Version 2.4.29, bei PHP wird Version 7.2 installiert.
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. Die Ordner erstellen wir nun einmal. Dazu kopieren wir auch die Standard-Seite in das entsprechende Verzeichnis:
mkdir /var/www/htdocs mkdir /var/www/vhosts mkdir /var/www/vhosts/default mv /var/www/html /var/www/vhosts/default/htdocs
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 cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.org
Dann noch einige Apache-Module aktivieren:
a2enmod ssl headers
/etc/apache2/sites-available/000-default.conf
ServerName default ServerAdmin webmaster@example.org ServerTokens Prod DocumentRoot /var/www/htdocs <Directory /var/www/htdocs/> Options SymLinksIfOwnerMatch MultiViews AllowOverride None Order allow,deny allow from all </Directory> Alias /webmail /var/www/htdocs/roundcube Alias /roundcube /var/www/htdocs/roundcube Alias /pma /var/www/htdocs/pma Alias /webftp /var/www/htdocs/webftp <VirtualHost *:80> ServerName default ServerAdmin webmaster@example.org DocumentRoot /var/www/vhosts/default/htdocs <Directory /var/www/> Options -Indexes +SymLinksIfOwnerMatch +MultiViews AllowOverride None Order allow,deny allow from all </Directory> # Verhindern des Zugriffs auf die CGI-Skripte <Directory "/var/www/cgi-bin/"> AllowOverride None Options None Order allow,deny Deny from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined Alias /cgi-bin /var/www/htdocs/dummy Alias /roundcube /var/www/htdocs/dummy Alias /webmail /var/www/htdocs/dummy Alias /pma /var/www/htdocs/dummy Alias /webftp /var/www/htdocs/dummy </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
SSL
Die zentrale Konfiguration von SSL nehmen wir in der /etc/mods-available/ssl.conf vor. Hier besonders:
SSLCipherSuite SSLCipherSuite EECDH+AESGCM+AES256:EECDH+AES256 SSLCompression Off SSLProtocol TLSv1.2 SSLHonorCipherOrder On
/etc/apache2/sites-available/000-default-ssl.conf
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@example.org DocumentRoot /var/www/htdocs <Directory /var/www/> Options -Indexes +SymLinksIfOwnerMatch +MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined # Blocken der Anfragen an eingerichtete Dienste Alias /webmail /var/www/htdocs/dummy Alias /roundcube /var/www/htdocs/dummy Alias /pma /var/www/htdocs/dummy Alias /webftp /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> Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews SymLinksIfOwnerMatch AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key # Add six earth month HSTS header for all users... Header add Strict-Transport-Security "max-age=15768000" </VirtualHost> </IfModule>
Verzeichnisse
Anschließend verlinken wir beide Dateien:
ln -s /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled/000-default.conf ln -s /etc/apache2/sites-available/000-default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf
Anschließend müssen die Verzeichnisse anlegt werden:
mkdir /var/www/htdocs/ mkdir /var/www/vhosts/ mkdir /var/www/vhosts/default mkdir /var/www/vhosts/default/htdocs
Und übertragen:
chown -R www-data.www-data /var/www/htdocs chown -R www-data.www-data /var/www/vhosts
Configtest:
apache2ctl configtest
Neustart:
service apache2 restart
Firewall:
ufw allow 'Apache Full'
Damit läuft Apache, man kann jetzt testweise eine index.html in /var/www/vhosts/default/htdocs legen und sollte sie beim Aufruf der Serveradresse (IP oder Hostname) sehen.
VHosts
Für jede Domain, unter der der Webserver erreichbar sein soll, erstellen wir einen VirtualHost. Dafür stehen zwei Konfigurationsdateien zur Verfügung (reines HTTP und HTTP/HTTPS-Mix). Zur Generierung von Zertifikaten mittels Let's Encrypt nutzen wir den ersten Dummy und ersetzen ihn danach mit dem zweiten. In beiden Dateien muss jeweils der Platzhalter mit der Domain ersetzt werden (in vim: %s/dummy.domain/example.org).
Die Problematik von SymLinks, die einem nicht gehören, habe ich von Jonas Pasche übernommen.
HTTP-Dummy
<VirtualHost *:80> ServerAdmin webmaster@dummy.domain ServerName dummy.domain ServerAlias www.dummy.domain dummy.domain.example.org DocumentRoot /var/www/vhosts/dummy.domain/htdocs <Directory /var/www/vhosts/dummy.domain/htdocs/> Options SymLinksIfOwnerMatch MultiViews AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch Order allow,deny allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined </VirtualHost>
HTTPS-Dummy
<VirtualHost *:80> ServerAdmin webmaster@dummy.domain ServerName dummy.domain ServerAlias www.dummy.domain dummy.domain.example.org DocumentRoot /var/www/vhosts/dummy.domain/htdocs Redirect permanent / https://www.dummy.domain/ # Setze Alias, um die Generierung von Zertifikaten unabhängig vom bisherigen Zertifikat möglich zu machen Alias /.well-known /var/www/vhosts/dummy.domain/htdocs/.well-known ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined </VirtualHost> <VirtualHost *:443> ServerAdmin webmaster@dummy.domain ServerName dummy.domain ServerAlias www.dummy.domain dummy.domain.lt42.de SSLEngine on SSLCertificateFile /etc/letsencrypt/live/dummy.domain/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/dummy.domain/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/dummy.domain/chain.pem DocumentRoot /var/www/vhosts/dummy.domain/htdocs <Directory /var/www/vhosts/dummy.domain/htdocs/> Options SymLinksIfOwnerMatch MultiViews AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch Order allow,deny allow from all </Directory> # Add six earth month HSTS header for all users... Header add Strict-Transport-Security "max-age=15768000" ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined </VirtualHost>