Andreas Bruns

Softwareentwicklung für Oldenburg und Bremen

Ein LAMP-Server (Linux, Apache, MySQL, PHP) mit dem Banana Pi

Der Banana Pi ist ein etwas leistungsstärkerer Kleincomputer als der Raspberry Pi und lässt sich sehr gut als kleiner Server im eigenen Haushalt einsetzen. Für eigene Projekte bietet ein LAMP-Server (Linux, Apache-Server, PHP, MySQL) dabei eine hervorragende Basis. Zunächst einmal müssen wir uns dafür die aktuellste Bananian-Version herunterladen und auf eine SD-Karte installieren. Auf einem Unix-System sieht das etwa so aus (ähnlich wie bei der Installation für den Raspberry Pi):

bruno$ wget http://dl.bananian.org/releases/bananian-latest.zip
bruno$ shasum -a 256 bananian-latest.zip
80c773649eb4d99639c1859da4c0027b68383af8a2d3347b61994878992f0355  bananian-latest.zip
bruno$ unzip bananian-latest.zip
bruno$ diskutil list
bruno$ diskutil unmountDisk /dev/diskX
Unmount of all volumes on diskX was successful
bruno$ sudo dd if=bananian-1501.img of=/dev/diskX bs=1m
1938+1 records in
1938+1 records out
2032664576 bytes transferred in 289.809616 secs (7013793 bytes/sec)
bruno$ diskutil eject /dev/diskX

Nach dem Start des Banana Pi mit der SD-Karte sollten wir uns einloggen (root/pi) und die ersten Einstellungen vornehmen: Passwort, Tastatur-Layout, volle Nutzung der SD-Karte, System aktualisieren

root@herkules ~ # bananian-config
root@herkules ~ # bananian-update
root@herkules ~ # apt-get upgrade

Als Nächstes wollen wir unser System in einen echten LAMP-Server verwandeln, also unser Linux-System mit Apache-Server, PHP und MySQL ausstatten. Zunächst passen wir dafür den Server-Namen mit ‚bananian-config‘ oder direkt in der Datei ‚/etc/hostname‘ an, beispielsweise zu ‚herkules‘. Anschließend installieren wir die genannten Software-Pakete, was in den Artikeln des Bananapi-Forums gut beschrieben ist: Apache, PHP5, MySQL, PHPMyAdmin installieren. In der Apache-Konfigurationsdatei ‚nano /etc/apache2/apache2.conf‚ sollten wir unten noch den Servernamen ergänzen ‚ServerName herkules‚, damit der Apache-Server beim Start keine Warnung bezüglich seines Servernamens ausgibt.

Damit sollte beispielsweise die PHPMyAdmin-Installation erreichbar sein: http://herkules/phpmyadmin

Wenn wir später aus der Ferne auf unsere privaten Daten unseres Servers zugreifen wollen, dann sollten wir die Übertragung der Daten gegen ein unbefugtes Mitlesen schützen. Wir wollen also unseren Server nur über eine gesicherte verschlüsselte Verbindung ansprechen. Daher müssen wir den Zugriff per HTTPS-Protokoll aktivieren und anschließend alle ungesicherten Zugriffe per HTTP-Protokoll auf das HTTPS-Protokoll umleiten.

Es gibt viele Anleitungen, wie man Zertifikate für seinen Server erstellt und HTTPS bei einem Apache-Server aktiviert. Ich fand die folgenden ganz gut:

Ich habe mir die passenden Befehle aus den unterschiedlichen Artikeln herausgesucht und habe mich für den Debian-Weg entschieden. Bei Debian-Linux (darauf beruhen Ubuntu, Rasbian und Bananian) gibt es für Testzwecke das vorgefertigte Zertifikat ‚Snakeoil‘, das man mit dem Paket ’ssl-cert‘ installiert. Dabei wird das Zertifikat für den aktuellen Hostname herkules erstellt, den man auch mit hostname -f herausfindet. Anschließend muss SSL aktiviert und VirtualHost aktiviert werden. Der folgende Auszug zeigt die entsprechenden Befehle mit den relevanten Änderungen:

root@herkules ~ # cat /etc/apache2/ports.conf
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default
# This is also true if you have upgraded from before 2.2.9-3 (i.e. from
# Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
# README.Debian.gz

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

root@herkules ~ # ll /etc/apache2/sites-available/*
-rw-r--r-- 1 root root  692 Dec 22 20:59 /etc/apache2/sites-available/default
-rw-r--r-- 1 root root 7251 Dec 22 20:59 /etc/apache2/sites-available/default-ssl
root@herkules ~ # ll /etc/apache2/sites-enabled/* 
lrwxrwxrwx 1 root root 26 Feb 24 21:55 /etc/apache2/sites-enabled/000-default -> ../sites-available/default
root@herkules ~ # ll /etc/ssl/certs/s*
lrwxrwxrwx 1 root root 54 Aug  9  2014 /etc/ssl/certs/spi-ca-2003.pem -> /usr/share/ca-certificates/spi-inc.org/spi-ca-2003.crt
lrwxrwxrwx 1 root root 58 Aug  9  2014 /etc/ssl/certs/spi-cacert-2008.pem -> /usr/share/ca-certificates/spi-inc.org/spi-cacert-2008.crt
root@herkules ~ # ll /etc/ssl/private/*
ls: cannot access /etc/ssl/private/*: No such file or directory
root@herkules ~ # apt-get install ssl-cert
root@herkules ~ # a2enmod ssl # SSL aktivieren
Enabling module ssl.
See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  service apache2 restart
root@herkules ~ #  service apache2 restart
root@herkules ~ #  a2ensite default-ssl # VirtualHost aktivieren
Enabling site default-ssl.
To activate the new configuration, you need to run:
  service apache2 reload
root@herkules ~ #  service apache2 reload
root@herkules ~ # ll /etc/apache2/sites-available/*
-rw-r--r-- 1 root root  692 Dec 22 20:59 /etc/apache2/sites-available/default
-rw-r--r-- 1 root root 7251 Dec 22 20:59 /etc/apache2/sites-available/default-ssl
root@herkules ~ # ll /etc/apache2/sites-enabled/* 
lrwxrwxrwx 1 root root 26 Feb 24 21:55 /etc/apache2/sites-enabled/000-default -> ../sites-available/default
lrwxrwxrwx 1 root root 30 Feb 24 23:27 /etc/apache2/sites-enabled/default-ssl -> ../sites-available/default-ssl
root@herkules ~ # ll /etc/ssl/certs/s*
lrwxrwxrwx 1 root root  54 Aug  9  2014 /etc/ssl/certs/spi-ca-2003.pem -> /usr/share/ca-certificates/spi-inc.org/spi-ca-2003.crt
lrwxrwxrwx 1 root root  58 Aug  9  2014 /etc/ssl/certs/spi-cacert-2008.pem -> /usr/share/ca-certificates/spi-inc.org/spi-cacert-2008.crt
-rw-r--r-- 1 root root 997 Feb 24 23:25 /etc/ssl/certs/ssl-cert-snakeoil.pem
root@herkules ~ # ll /etc/ssl/private/*
-rw-r----- 1 root ssl-cert 1708 Feb 24 23:25 /etc/ssl/private/ssl-cert-snakeoil.key
root@herkules ~ # 

Damit ist der Server per HTTPS erreichbar: https://herkules/, allerdings müssen wir das Snakeoil-Testzertifikat noch gegen ein eigenes austauschen. Da es sich bei dem Server in dieser Anleitung nicht um einen öffentlichen Server handelt, genügt ein selbst-signiertes Zertifikat und wir brauchen keine Zertifikatsregistrierungsanforderung (Certificate Signing Request, CSR). Ansonsten sollten wir unser Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle (certificate authority, CA) mit einer CSR zertifizieren lassen. So ist beispielsweise eine einfache Zertifizierung (Class 1) kostenlos bei StartSSL möglich.

Die benötigten Dateien habe ich mit dem folgenden Befehl generiert und in der Konfiguration die Snakeoil-Einträge nano /etc/apache2/sites-available/default-ssl ersetzt.

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout herkules.key -out herkules.crt 

Die gesamten Befehle mit den zugehörigen Ausgaben:

root@herkules ~ # mkdir tls-files     
root@herkules ~ # cd tls-files     
127 root@jupiter ~/tls-files # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout herkules.key -out herkules.crt     
Generating a 2048 bit RSA private key
...................................................................................+++
....................+++
writing new private key to 'herkules.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Niedersachsen
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:herkules
Email Address []:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout herkules.key -out  5.48s user 0.01s system 20% cpu 26.883 total
root@herkules ~/tls-files # 
root@herkules ~/tls-files # ll
total 8
-rw-r--r-- 1 root root 1322 Apr  3 10:32 herkules.crt
-rw-r--r-- 1 root root 1704 Apr  3 10:32 herkules.key
root@herkules ~/tls-files # cp herkules.crt /etc/ssl/certs
root@herkules ~/tls-files # cp herkules.key /etc/ssl/private
root@herkules ~/tls-files # chmod 640 /etc/ssl/private/herkules.key
root@herkules ~/tls-files # ls -Al /etc/ssl/private                
total 8
-rw-r----- 1 root root     1704 Apr  3 10:41 herkules.key
-rw-r----- 1 root ssl-cert 1708 Feb 24 23:25 ssl-cert-snakeoil.key
root@herkules ~/tls-files # nano /etc/apache2/sites-available/default-ssl  
root@herkules ~/tls-files # cat  /etc/apache2/sites-available/default-ssl | grep SSLCertificate
	#  SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
	#  SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
        SSLCertificateFile    /etc/ssl/certs/herkules.crt
        SSLCertificateKeyFile /etc/ssl/private/herkules.key
root@herkules ~/tls-files # service apache2 restart
Restarting web server: apache2 ... waiting .

Mit den passenden Werkzeugen, wie sslscan oder openssl, können wir unsere HTTPS-Verschlüsselung dann testen:

sslscan hercules:443
openssl s_client -crlf -connect hercules:443

Abschließend müssen wir noch dafür sorgen, dass ungesicherte Zugriffe über das HTTP-Protokoll auf das HTTPS-Protokoll umgeleitet werden. Dafür gibt es viele Möglichkeiten, beispielsweise durch Einträge in der .htaccess-Datei oder einem passenden Redirect in der Konfigurationsdatei ‚nano /etc/apache2/sites-available/default-ssl‚:

Redirect permanent / https://192.XXX.XXX.XXX/

Jetzt kann der Spaß mit dem gesicherten LAMP-Server folgen. Viele Anleitungen für den Banana Pi gibt es übrigens hier.

Kommentare sind geschlossen.