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:
- Ubuntu: Zertifikate
- T3N: Schritt für Schritt zur sicheren Web-App: So funktioniert Transportverschlüsselung mit TLS
- HowtoForge: Linux Basics: How to Create an Apache SSL Certificate on Ubuntu
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.