Root-Server mit Ubuntu 18.04

Aus LT42-Wiki
Zur Navigation springenZur Suche springen

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>