Security für IPython-Notebooks

Risiko eines ungesicherten Servers

Ein ungesicherter IPython-Notebook-Server gleicht einer offenen Tür auf das eigene Dateiverzeichnis. Bei Computer-Systemen, die von mehreren Nutzern verwendet werden, sollten daher immer Sicherheitsmassnahmen ergriffen werden.

Vorbereitung

Die folgende Anleitung setzt Kentnisse der Betriebssystemumgebung (hier Unix) voraus, die hier kurz wiederholt werden. Vor allem ist es wichtig zu wissen, in welcher Umgebung (Unix-Shell oder IPython) man sich gerade befindet. Die Unix-Shell erhält man durch das Öffnen eines Terminals. Die IPython-Umgebung erkennt man an dem spezifischen "Prompt"

In [#]:

Das Prompt der Unix-Umgebung ist nicht so eindeutig zu erkennen und abhängig von der jeweils verwendeten "Shell" (Bash, csh, tcsh etc.). Meist enthält das Prompt den Namen des Nutzers und des Rechners, auf dem Sie sich befinden z.B.

u242023@squall3:~$

Für das Gelingen dieser Anleitung wichtig ist, dass die Befehle in der jeweils richtigen Umgebung (Unix oder IPython) ausgeführt werden. Mit der Tastenkobination CTRL + D gelangen Sie aus der IPython-Umgebung zurück zur Unix-Shell. Im folgenden wird vorausgesetzt, Sie befinden sich in der Unix-Shell, wenn nicht das Python-Prompt am Anfang steht.

Login auf dem Server Squall und Prozesssteuerung

Üblicherweise arbeiten wir an einem kleinen Display (Sun-Terminal), welches für eine Verbindung zu einem Server (z.B. lehre1) vorkonfiguriert ist. Dieser Server stellt aber nicht die neuesten Software-Versionen zur Verfügung. Für die folgende Anleitung gehen wir davon aus, dass zunächst eine Verbindung zum Server Squall3 hergestellt wurde.

ssh -X squall3

Für das Funktionieren der IPython-Notebooks wichtig ist, dass der Webbrowser auf dem gleichen Server läuft. Also starten wir zunächst den Browser Firefox im Hintergrund

firefox &

Das &-Zeichen startet den Prozess im Hintergrund und wir erhalten die Unix-Shell zurück. Ein häufiger Anfängerfehler ist, dass das &-Zeichen vergessen wird. Ist dies passiert, zeigen weitere Eingaben keinerlei Wirkung. Hat man einmal das &-Zeichen vergessen, dann kann man mit der Tastenkombination

CTRL Z

und

bg

den entsprechenden Prozess in den Hintergrund schieben.

Alte Server-Prozesse

Vergewissern Sie sich, dass nicht noch alte Instanzen (Prozesse) ungesicherter Server im Hintergrund laufen. Dies kann leicht passieren, da der Server-Prozess auch nach dem Ausloggen weiterläuft.

killall ipython

Auswahl Python-Version

Für den Betrieb des IPython-Notebook-Servers benötigen wir eine aktuelle Python-Version. Der folgende Befehl muss jedesmal nach dem Login neu ausgeführt werden.

module load python/2.7-ve3

Konfiguration eines gesichterten Servers

Die IPython-Dokumentation zeigt die notwendigen Schritte, um den IPython-Server mit einem Passwort über eine verschlüsselte Verbindung abzusichern. Folgende Schritte sind erforderlich:

  • Erzeugen eines Passwort-Hash
  • Erzeugen einer digitalen Signatur
  • Änderung der Konfigurationsdatei
  • Start des Servers im sicheren Modus

Erzeugen eines Passwort-Hash

Eine kryptologische Hashfunktion dient zum Verschleiern eines Passwortes. Bedient man sich einer sicheren Verschlüsselungsmethodik, ist es praktisch unmöglich, das Passwort aus dem Hash zu bestimmen. Es handelt sich also um eine sogenannte Einwegfunktion.

Wir starten die IPython-Shell mit

ipython

Und importieren das Modul zum Erzeugen eines Passwort-Hash

In [3]:
from IPython.lib import passwd
In [7]:
passwd()
Enter password: ········
Verify password: ········
Out[7]:
'sha1:4b5d5f28fb68:249409b53d0c421fc978f45e9466f5e72147c007'

Die Buchstabenkette 'sha1:ba26e23ef1b3:95aaf3a32200eff8d7ae0ec511e3668f2382f267' ist das Ergebnis der Hashfunktion, welche auf ein einfaches Passwort angewendet wurde. Ein potentieller Angreifer kann mit dem Passwort-Hash wenig anfangen. Durch ein Vergleich mit vielen vorhandenen Passwort-Hashs können jedoch schwache Passwörter ermittelt werden.

Nun verlassen wir wieder die IPython-Shell und kehren auf die Unix-Ebene zurück.

CTRL D



Erzeugen einer digitalen Signatur

Der folgende Befehl sollte unbedingt auf der Unix-Ebene ausgeführt werden, da die interaktive Eingabe nicht in der IPython-Shell funktioniert.

openssl req -x509 -nodes -days 3650 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem

Die Datei mycert.pem ist die digitale Signatur, die für eine verschlüsselte Verbindung (https) erforderlich ist. Da diese Signatur nicht durch eine offizielle Vergabestelle zertifiziert ist, gibt es später bei der Verbindung mit dem Webbrowser eine Warnmeldung, die wir aber ohne Einschränkung der Sicherheit ignorieren können.

Konfigurationsdatei

Um Konfigurationsdateien im (versteckten) Verzeichnis .ipython zu erzeugen führen wir auf der Unix-Ebene den folgenden Befehl aus

ipython profile create nbserver

Folgende Änderungen werden in der Datei ~/.ipython/profile_nbserver/ipython_notebook_config.py vorgenommen. Wir starten zunächst einen Editor

gedit ~/.ipython/profile_nbserver/ipython_notebook_config.py &

und fügen folgende Zeilen ein:

c = get_config()
c.NotebookApp.certfile = u"/home/zmaw/Hier Steht Ihre u-Nummer/mycert.pem"
c.NotebookApp.open_browser = False
c.NotebookApp.password = u"sha1:bcd259ccf...[hier Ihr Hash-Passwort einfügen]"

Stellen Sie sicher, dass sämtliche anderen Zeilen der Konfigurationsdatei auskommentiert oder gelöscht sind. Die Konfigurationszeilen sind Python-Code. Es muss also die Syntax von Python eingehalten werden. Dies kann dazu führen, dass Leerzeichen am Anfang der Zeile zu Fehlern führen. Vorsicht auch bei der Eingabe der Anführungszeichen. Diese sollten der Definition von Python-Strings entsprechen. Die schrägen Anführungszeichen (Akzents) erzeugen Fehler.

Start des Notebook-Servers

Nun wird der Server mit dem neuen Profil gestartet.

ipython notebook --profile=nbserver &

Der Server startet und gibt eine Reihe von Meldungen aus. Falls diese "Error" enthalten, ist irgendetwas schief gelaufen. Im Idealfall gibt die Fehlermeldung einen guten Hinweis auf das Problem!

Wir suchen in den Meldungen die Zeile

The IPython Notebook is running at: https://localhost:8888/

und kopieren die https-Adresse in das Suchfeld des Browsers. Die Portnummer, hier 8888, wird zufällig vergeben. Ist alles richtig, bekommen Sie nun zunächst Warnmeldungen bezüglich der nichtzertifizierten digitalen Signatur. Sie geben nun an, das Risiko zu vertehen und akzeptieren die Signatur. Danach werden Sie nun mit einer Passwort-Anfrage begrüßt. Gratulation!

Hatten Sie keinen Erfolg, versuchen Sie es mit dem Löschen des Verzeichnisses .ipython und gehen zurück auf Los

cd
rm -fr .ipython


Checkliste

  • Bin ich auf dem richtigen Server? $\to$ ssh -X squall3
  • Läuft kein alter IPython-Prozess im Hintergrund? $\to$ killall ipython
  • Ist die Python-Version aktuell? $\to$ module load python/2.7-ve3
  • Ist die Konfigurationsdatei korrekt? $\to$ gedit ~/.ipython/profile_nbserver/ipython_notebook_config.py &
  • Liegt die digitale Signatur im richtigen Verzeichnis wie in der Konfigurationsdatei angeben?
  • Wurde der IPython-Server mit dem richtigen Profil gestartet?
  • Läuft Firefox auf dem gleichen Server wie IPython?
  • Ist die Portnummer aktuell?
  • Ist das Passwort identisch mit dem Hash in der Konfigurationsdatei?

In [9]:
# Dieses IPython-Notebook wird durch folgenden Befehl zu einer statischen HTML-Seite verwandelt
!ipython nbconvert --to html Security.ipynb &> /dev/null