SSH-Keys erzeugen und benutzen

2. Dezember 2012 at 14:30

Ein SSH-Key erlaubt das Anmelden an einem Server, ohne das Passwort kennen zu müssen. Das ist nicht unüblich, denn in den meisten Firmen gibt es mehrere Server und mehrere Admins. Dafür zu sorgen, dass die Passwörter regelmäßig gewechselt werden, jeder Admin immer das richtige Passwort von jedem Host kennt, aber gleichzeitig darauf zu achten, dass kein Passwort in falsche Hände gerät, ist oft keine einfache Sache.

Mit dem SSH-Key ist es ganz einfach: Der Benutzer (z.B. der Admin) generiert sich einen SSH-Key welcher aus 2 Teilen besteht: Einem persönlichen Key, den er selbst behält und niemanden weitergibt. Und einem öffentlichen Key, der auf den Servern installiert wird, auf die er Zugriff hat.

So läßt sich sehr einfach regeln, welche Person auf welchen Server darf. Durch Entfernen eines Keys kann eine Person auch wieder ausgesperrt werden. Und der Admin braucht auch keine Kennwörter wissen. Der Besitz seines persönlichen Keys reicht aus, dass SSH den Zugang autorisiert.

Ein weiterer Vorteil ist die höhere Sicherheit: Übliche Passwörter (nehmen wir als Beispiel 8 Zeichen alphanumerisch) können nicht mehr als 2^10*14 Kombinationen haben, dies entspricht etwa 48 Bit. Ein SSH-Key kann problemlos 4096 Bit haben, ist also deutlich robuster gegen Angreifer.

Wie macht man das nun? Für Linux-User gibt es genug Anleitungen im Netz, daher zeige ich den Weg, den Windows-Menschen gehen müssen, um sich auf ihrem Linux Server anmelden zu können.

SSH-Key erstellen

Schritt 1: PuTTYgen und Pageant herunterladen. Die Tools gibt es auf der PuTTY Download Page: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

Schritt 2: PuTTYgen starten und unten erstmal Typ und die Länge einstellen. Ich persönlich bevorzuge 4096 Bit RSA Schlüssel, um eine hohe Sicherheit zu erreichen. SSH1 Schlüssel oder Schlüssel unter 1024 Bit würde ich heute aus Sicherheitsgründen nicht mehr empfehlen.

Schritt 3: Auf “Generate” klicken und die Maus lange genug im Programmfenster bewegen. Der Schlüssel wird nun erstellt. Danach erfolgt die Eingabe von Kommentar und Passwort:

Putty Key Generator (Screenshot)

Als Kommentar wird empfohlen, Name und E-Mail Adresse einzugeben, denn der Kommentar wird auf dem Server später zu sehen sein. So kann man die einzelnen Keys verschiedener Benutzer leicht unterscheiden und weiß auch sofort, wie man betreffende Inhaber schnell erreichen kann.

Das Passwort (Key Passphrase) ist kein Zwang, allerdings empfehlenswert. Es schützt den Key mit diesem Passwort, so dass er nicht so einfach gestohlen werden kann. Läßt man das Feld leer, so wird der Key nicht geschützt.

Schritt 4: Der öffentliche Key, der auf den Server gehört, ist oben im Feld “Public key for pasting…” zu finden. Er kann per Copy&Paste übernommen werden. Am Besten erstmal in einer Textdatei speichern, damit er nicht verloren geht.

Schritt 5: Der private Schlüssel wird über das Menü “Key – Save private key” gespeichert. Achtung, das File (z.B. dein_name.ppk) enthält den privaten Key, kein Dritter sollte diese Datei bekommen. Man sollte sich darüber im klaren sein, dass jeder, der den privaten Key hat, diesen auch nutzen könnte. Wird die Datei also weitergegeben, so wäre das, als würde man die Passwörter aller Server weitergeben, auf denen man mit diesem Key Zugang erhält.

Öffentlichen Key auf Linux-Server installieren

Zuerst mal per SSH mit dem Server verbinden. Im eigenen Home-Verzeichnis (~) muss ein Ordner namens .ssh existieren. Darin wird die Datei authorized_keys angelegt, in der alle öffentlichen Keys der Personen abgelegt werden, die Zugang zum System erhalten sollen. Jeder Key kommt dabei in eine Zeile, Kommentare mit # sind erlaubt.

Der Vorgang unter Linux könnte so aussehen:

# Verzeichnis und Datei anlegen
mkdir -m 0700 ~/.ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
# Schlüssel hinzufügen
cat >> .ssh/authorized_keys
ssh-rsa AAAAB3Nza...b30nk= Michael Butschek (2012) <michael@butschek.de>
[STRG-D]

Fertig. Ab jetzt läßt dieser Host Benutzer ohne Passwort rein, die den zum öffentlichen Key passenden privaten Key besitzen.

Benutzung des Keys in Putty

In Putty im Menü “Connection – SSH – Auth” kann ein “Private Key file” angegeben werden. Hier den privaten Key benutzen (pkk-Datei). Der Zugang zum Host, auf dem der öffentliche Key liegt, ist nun ohne Passwort möglich. Die Auth-Einstellung läßt sich natürlich auch direkt im Profil eines Hosts speichern, so ist es nicht nötig, jedesmal den Key neu anzugeben.

Was vielleicht störend bei der täglichen Arbeit wird: PuTTY möchte das Passwort des Keys jedesmal wissen, wenn er benutzt wird. Wenn man auf vielen Maschinen unterwegs ist, kann das ganz schön aufhalten. Dafür gibt es SSH-Agents, die den Key einmal beim Start laden (und auch nur einmal das Passwort abfragen). Putty kann dann auf den Agent zugreifen und sich den Key von dort holen. So kann man sich beliebig oft ohne Passwort anmelden, ohne auf den Schutz eines Passwortes im Key zu verzichten.

Installation Putty Agent

Der für Putty passende SSH Agent heißt Putty Agent. Das passende Tool Pageant haben wir weiter oben schon heruntergeladen. Es wird denkbar einfach bedient: Man startet die .exe Datei und übergibt den Pfad zum privaten Schlüssel als Parameter. Das Tool fragt nun einmal nach dem Passwort. Danach verschwindet das Tool im System Tray und Putty kann den Key ohne weitere Passwortabfrage nutzen.

Da das Starten von Programmen mit Kommandozeilenparametern unter Windows nicht so einfach ist, empfiehlt sich folgende Methode: Zuerst erzeugt man eine Verknüpfung zu Pageant.exe und öffnet dann die Eigenschaften dieser Verknüpfung.

Im Tab “Verknüpfung” findet man das Feld “Ziel”, in der der Pfad zur Exe-Datei steht. Dahinter setzt man dann (mit einem Leerzeichen getrennt) noch den vollständigen Pfad zu seinem privaten Key.

Putty Agent (Screenshot der Verknüpfung)

Durch einen Doppelklick auf die Verknüpfung wird der Agent nun gestartet und fragt das Passwort ab. Hat alles geklappt, findet sich der Agent danach im System Tray.

Möchte man den Agent gleich beim Systemstart öffnen, kann man zuletzt einfach noch die eben erstellte Verknüpfung in den Autostart-Ordner schieben. Damit wird man sofort beim Systemstart nach dem Passwort für den Agent gefragt und kann dann Zugriff per SSH auf jedes seiner Systeme nehmen, ohne erneut ein Passwort zu benötigen.

Viel Spaß beim Nutzen der SSH-Keys.

ISO-Datum in Windows Batch-Files

3. Juni 2010 at 22:52

Wer unter Windows mit Batch-Files Scriptet, dürfte die Variablen %time% und %DATE% kennen, die die Uhrzeit sowie das aktuelle Datum im lokalen Format “dd.mm.yyyy” zurückgeben.

Manchmal möchte man Dateien oder Verzeichnisse nach dem aktuellen Datum benennen, z.B. Logfiles, Zip-Dateien oder ein Backup-Verzeichnis für das tägliche Backup.

set dirname="C:Backup-%DATE%"
mkdir %dirname%

Einen großen Nachteil hat dieser Weg: Beim alphabetischen Anordnen im Windows-Explorer ist der 20. Mai vor dem 31. Januar. Der einfachte Weg ist die Verwendung des ISO-Formats JJJJ-MM-TT, also zuerst Jahr, dann Monat, dann Tag. So wird immer erst nach dem Größten (Jahr), zum Ende nach dem Kleinsten (Tag) sortiert.

Leider bietet die Windows Commandline ein solches Format nicht an, das läßt sich aber leicht korrigieren: Wir nehmen einfach aus %DATE% die nötigen Stellen heraus und basteln ein eigenes Format:

set TAG=%date:~-10,2%
set MONAT=%date:~-7,2%
set JAHR=%date:~-4%
set ISODATE=%JAHR%-%MONAT%-%TAG%

Fertig ist unser neues Datum %ISODATE%, das wir nun statt %DATE% verwenden:

set dirname="C:Backup-%ISODATE%"
mkdir %dirname%

OpenVPN einrichten

1. Februar 2010 at 10:00

Im Artikel SSH-Tunnel: Proxy über SSH habe ich bereits über die Möglichkeit eines “Pseudo-VPNs” berichtet. Nun will ich zeigen, wie man mit der Software OpenVPN ein einfaches Point-to-Point VPN einrichten kann.

Ziel soll es sein, auf einem Server OpenVPN so zu installieren, dass es auf einem UDP-Port eine verschlüsselte Verbindung entgegennimmt. Als Client benutze ich dazu unter Windows die Software OpenVPN-Portable, da diese gleich die GUI mit dabei hat und darüberhinaus auch auf dem USB-Stick mitgenommen werden kann.

Eine einfache Steuerung von Serverdiensten ohne die Dienste dabei frei im Internet erreichbar zu haben, wie es Maxe im SSH-Tunnel Thema ansprach, ist damit sehr einfach möglich.

Zuerst installieren wir den Server, was unter Debian oder Ubuntu mit einem einfachen `apt-get install openvpn` geschieht. Danach in /etc/openvpn alle Beispiele löschen und im gleichen Verzeichnis mit `openvpn –genkey –secret server.key` eine Keydatei anlegen, die künftig als Passwort zum VPN dient. Vor dem Neustart des Servers (/etc/init.d/openvpn restart) sollte mit `modprobe tun` noch das Tunnel-Device unter Linux angelegt werden.

Nun ist noch die Server-Konfiguration zu erstellen. Hier schlage ich folgenden Inhalt für die server.conf vor:

mode p2p                          # Connection Mode: Point-2-Point
dev tun                           # Device: Tunnel

proto udp                         # Protocol (udp/tcp-server/tcp-client)
port 1194                         # Listen port

secret server.key                 # Secred "password" file

ifconfig 10.1.75.1 10.1.75.2      # local ip <-> remote ip

ping 10                           # Keepalive ping every 10 seconds
ping-restart 60                   # Reconnect after 60 seconds of no answer
ping-timer-rem                    # Restart ping only if we have a remote ip
persist-key                       # Don't re-read key files across ping-restart
persist-tun                       # Don't reopen TUN/TAP across ping-restart

user root                         # Systemuser
group nogroup                     # Systemgroup

verb 3                            # Give some more informations (default: 1)
log-append /var/log/openvpn.log   # Logfile

Auf der Client-Seite (Windows) ist OpenVPN Portable von der Sourceforge Projektseite (http://sourceforge.net/projects/ovpnp/) herunterzuladen und zu entpacken. Im Ordner data/config ist dann das Keyfile vom Server (und zwar genau das gleiche!) sowie die Konfiguration abzulegen. Diese ender unter Windows mit .ovpn, als Dateiname empfielt sich den Namen des Servers zu wählen, also z.B. meinserver.opvn. Das File könnte so aussehen:

mode p2p                          # Connection Mode: Point-2-Point
dev tun                           # Device: Tunnel

proto udp                         # Protocol (udp/tcp-server/tcp-client)
remote meinserver.de 1194         # Server address and port
nobind                            # Do not bind any fixed port

secret hostname.key               # Secred "password" file

ifconfig 10.1.75.2 10.1.75.1      # local ip <-> remote ip

ping 10                           # Keepalive ping every 10 seconds
ping-restart 60                   # Reconnect after 60 seconds of no answer
ping-timer-rem                    # Restart ping only if we have a remote ip
persist-key                       # Don't re-read key files across ping-restart
persist-tun                       # Don't reopen TUN/TAP across ping-restart

# Use this only if you want to change your default routes!
# redirect-gateway def1             # change default gateway
# dhcp-option DNS 8.8.8.8           # set DNS resolver in the new network

# When having problems with vista use this options:
# route-method exe
# route-delay 2

Damit haben wir alles Konfiguriert. Startet man OpenVPN Portable nun und erlaubt die Installation der Tunnel-Netzwerktreiber, so kann das VPN zum Server sofort gestartet werden. Nach dem Start findet man ein neues Netzwerk-Interface mit der Adresse 10.1.75.2, welcher auf der Seite des Servers endet. Der Server kann nun direkt über die VPN-Adresse 10.1.75.1 angesprochen werden.

Sollte das nicht klappen könnte eventuell noch eine lokale Firewall schuld sein. Wir sollten erstmal Pakete zum OpenVPN-Server sowie Pakete vom tun-Interface durchlassen:

iptables -A INPUT -m udp -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tun+ -j ACCEPT

Wenn alles klappt kann man sich überlegen, ob man mit der Verbindung nur den Server erreichen will oder auch gleich alle Routen darüber schicken möchte, um z.B. mit der IP-Adresse des Servers online zu sein.

Um alle Routen beim Verbindung umzubiegen sind in der Client-Config die beiden auskommentierten Zeilen redirect-gateway sowie die dhcp-option einzufügen. Ausserdem muss dem Server klargemacht werden, dass er nun für das Routing zuständig ist und die privaten IP-Adressen auch gleich per NAT auf seine eigene umschreiben soll:

# Routing & Masquerade aktivieren
sysctl -w net/ipv4/ip_forward=1
iptables -t nat -A POSTROUTING -s 10.1.75.0/24 -o eth0 -j MASQUERADE

Nach dem Neuverbinden sollte man nun über den Server und mit dessen IP-Adresse im Internet hängen. Mit dem Link http://www.butschek.de/tools/ip/ kann man das schnell und einfach prüfen.