ssh key erstellen

Linux) (ssh) ist ein relativ sicheres Netzwerkprotokoll für verschlüsselte Netzwerkverbindung für Kommandozeile Datenübertragung per SFTP. Unter Linux) Ist 'Ssh' Als Konsolenprogramm Meist Eh Dabei, Unter Klzzwxh:0001 Kann Man Per ((P:Putty ssh genauso nutzen. Entweder man logt sic pers Passortabfrage ein oder nutzt das sicherere (=) und bequemere einloggen, bei der sich sein client mit einm Schlüssel identifiziert. {DIV(align=>left, width=>25%, float=>right, class="umijabox")}{DIV} In den folgenden Beispielen ist 'bob' der user, 'localerrechner' Ein Computer von dem man arbeitet und

Schlüssel

Man sollte nach Möglichkeit RSA Schlüssel mit einer Länge von 2048 Bit verwendet werden. Alternativ kann auch ein 1024 Bit DSA Schlüssel eingesetzt werden.

Überprüfen

Habe ich eigentlich einen Schlüssel? Diese Frage lässt sich recht einfach beantworten, dazu einfach auf dem Rechner eine Shell aufmachen und folgendes eintippen: {CODE()} bob@localerrechner:~$ ssh-keygen -l

Daraufhin wird man gefragt welche Datei verwendet werden soll, hier sollte schon das richtige Verzeichnis und die richtige Datei angegeben sein, so dass das drücken der ENTER Taste ausreicht: {CODE()} Enter file in which the key is (/home/bob/.ssh/id_rsa): {CODE} {DIV(class="cmdoutput")} 2048 a6:70:11:6b:6f:35:1c:25:9a:34:97:f1:04:dc:0f:af /home/bob/.ssh/id_rsa.pub {DIV} In der nächste Zeile erscheint dann die Information zu dem vorhandenen Schlüssel. In diesem Beispiel handelt es sich um einen Schlüssel für RSA Verschlüsselung mit einer Schlüssellänge von 2048 Bit. Weiterhin wird noch der Fingerprint des Schlüssels ausgegeben, und die Datei welche analysiert worden ist.

Hier wird der öffentliche Schlüssel untersucht, und wir nehmen an dass es zu dem öffentlichem Schlüssel auch einen privaten Schlüssel gibt. Überprüfen lässt sich das, in dem das gleiche Verzeichnis in dem sich der öffentliche Schlüssel befindet auf eine ähnliche Datei ohne des Suffix's .pub befindet: {CODE()} bob@localerrechner:~$ ls -l ~/.ssh/id_rsa {CODE} {DIV(class="cmdoutput")} -rw------- 1 bob bob 1675 9. Jun 18:21 /home/bob/.ssh/id_rsa

Da uns jetzt das Verzeichnis, in dem die Schlüssel gespeichert werden, bekannt ist, können wir es auf weitere Schlüssel untersuchen: {CODE()} bob@localerrechner:~$ ls -l ~/.ssh/ {CODE} {DIV(class="cmdoutput")} insgesamt 60 -rw-r--r-- 1 bob bob 178 31. Jul 00:01 config -rw------- 1 bob bob 672 16. Aug 12:05 id_dsa -rw-r--r-- 1 bob bob 601 16. Aug 12:05 id_dsa.pub -rw------- 1 bob bob 1675 9. Jun 18:21 id_rsa -rw-r--r-- 1 bob bob 1246 20. Jun 20:49 id_rsa.keystore -rw-r--r-- 1 bob bob 393 9. Jun 18:21 id_rsa.pub -rw------- 1 bob bob 18584 10. Aug 15:38 known_hosts -rw-r--r-- 1 bob bob 15270 6. Mai 19:29 known_hosts.old {DIV} Der aufgeführten Auflistung kann entnommen werden dass noch ein DSA Schlüssel im Verzeichnis vorhanden ist: id_dsa und id_dsa.pub. Detailierte Information zum Schlüssel lässt sich nun wie folgt herausfinden: {CODE()} bob@localerrechner:~$ ssh-keygen -l -f ~/.ssh/id_dsa.pub {CODE} {DIV(class="cmdoutput")} 1024 0e:e7:40:c9:c1:d8:d9:50:fa:9b:b5:64:66:58:b2:9b /home/bob/.ssh/id_dsa.pub {DIV} Hier handelt es sich um eine 1024 Bit langen DSA Schlüssel.

Sollten die vorherigen Schritte zu keinem Erfolg / keiner Informatin geführt haben, so wurde noch kein Schlüssel auf dem Rechner angelegt.

Schlüssel Erzeugen

Ein Schlüssel kann mit dem Programm ssh-keygen erzeugt werden. Beim Aufruf wird noch der Typ der Verschlüsselung angegeben (DSA/RSA) und anschließend mit Enter bestätigt: {CODE()} bob@localerrechner:~$ ssh-keygen -t dsa {CODE} {DIV(class="cmdoutput")} Generating public/private dsa key pair. Enter file in which to save the key (/home/bob/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/bob/.ssh/id_dsa. Your public key has been saved in /home/bob/.ssh/id_dsa.pub. The key fingerprint is: 0e:e7:40:c9:c1:d8:d9:50:fa:9b:b5:64:66:58:b2:9b bob@localerrechner {DIV} Je nachdem für welchen Zweck der Schlüssel angelegt wird, kann ein Passwort/passphrase für den Schlüssel vergeben werden. Wenn der Schlüssel für die Authentifizierung auf entfernten Rechnern verwendet werden soll, dann lassen wir das Passwort weg.

Beim erzeugen des RSA Schlüssel mit einer Länge von 2048 Bit, geht man wie folgt vor: {CODE()} bob@localerrechner:~$ ssh-keygen -t rsa -b 2048 {CODE} {DIV(class="cmdoutput")} Generating public/private rsa key pair. Enter file in which to save the key (/home/bob/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/bob/.ssh/id_rsa. Your public key has been saved in /home/bob/.ssh/id_rsa.pub. The key fingerprint is: a6:70:11:6b:6f:35:1c:25:9a:34:97:f1:04:dc:0f:af bob@localerrechner

Sicherheitslöcher

"Ich habe zwar einige Schlüssel im meinem Verzeichnis doch weiß ich leider nicht ob diese sicher sind?" -- Aufgrund eines Sicherheitslochs in der SSL Bibliothek wurden einige unsicher Schlüssel erzeugt. Debian bietet mit dem Paket openssh-blacklist eine Ansammlung von Fingerprints von betroffenen Schlüsseln. Um zu überprüfen ob die eigenen Schlüssel hiervon betrofen sind kann wie folgt vorgegangen werden: {CODE()} bob@localerrechner:~$ ssh-vulnkey -v {CODE}

/etc/ssh/ssh_host_rsa_key

/etc/ssh/ssh_host_rsa_key:1: Not blacklisted: RSA 2048 ec:96:23:44:0f:cd:7f:74:4c:52:44:2a:6d:a6:0d:94 root@localerrechner

/etc/ssh/ssh_host_dsa_key

/etc/ssh/ssh_host_dsa_key:1: Not blacklisted: DSA 1024 39:38:42:05:49:37:dd:34:46:c3:2c:d3:96:2a:1f:ba root@localerrechner

/home/bob/.ssh/id_rsa

/home/bob/.ssh/id_rsa:1: Not blacklisted: RSA 2048 a6:70:11:6b:6f:35:1c:25:9a:34:97:f1:04:dc:0f:af /home/bob/.ssh/id_rsa.pub

/home/bob/.ssh/id_dsa

/home/bob/.ssh/id_dsa:1: Not blacklisted: DSA 1024 0e:e7:40:c9:c1:d8:d9:50:fa:9b:b5:64:66:58:b2:9b /home/bob/.ssh/id_dsa.pub e {DIV} Wenn nichts zurück gegeben wird oder der Dateiname mit dem Zusatz "Not blacklisted", so ist nichts über die Verwundbarkeit dieser Schlüssel bekannt. Wie der Ausgabe im vorherigen Listing zu sehen ist, wurden auch die Systemschlüssel überprüft. Sollte hier eine Meldung mit dem Status "COMPROMISED" oder "Unknown (blacklist file not installed)" so fehlt entweder die benötigte Blacklistdatei oder aber der Schlüssel ist verwundbar und sollte schnellstmöglich neu generiert werden.

known_hosts

Wie finde ich heraus ob ich unsicheren Rechnern vertraue? Die Vertrauenswürdigkeit eines Systems wird durch die Ablage des Schlüssels in die ~/.ssh/known_hosts Datei hergestellt. Wenn der Schlüssel dort eingetragen ist, wird keine Warnung mehr von SSH herausgegeben falls eine Verbindung mit dem System hergestellt wird. Es kann durchaus passieren dass die Datei known_hosts alte Einträge Enthält welche mittlerweile als unsicher gelten. Dies lässt sich wie folgt herausfinden: {CODE()} bob@localerrechner:~$ cat ./.ssh/known_hosts | ssh-vulnkey -v - {CODE} {DIV(class="cmdoutput")} -:1: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:2: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:3: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:4: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:5: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:6: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:7: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:8: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:9: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:10: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:11: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:12: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:13: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:14: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:15: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:16: COMPROMISED: RSA 2048 e7:ab:03:c9:1a:ee:72:43:29:6a:c6:d9:67:1f:38:0e - -:17: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:18: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:19: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:20: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:21: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:22: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:23: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:24: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:25: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:26: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:27: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:28: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:29: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:30: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:31: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:32: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:33: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:34: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:35: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:36: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:37: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:38: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:39: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:40: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:41: Not blacklisted: RSA 1024 a4:c0:99:fb:1c:fb:88:2c:13:36:cd:a2:d3:1a:b7:5d - -:42: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:43: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:44: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:45: COMPROMISED: RSA 2048 f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 - -:46: Not blacklisted: RSA 1024 a7:28:65:88:78:cb:40:5c:ae:57:60:dc:1d:c1:ba:54 - -:47: Not blacklisted: RSA 1024 a7:28:65:88:78:cb:40:5c:ae:57:60:dc:1d:c1:ba:54 - -:48: Not blacklisted: RSA 1024 a7:28:65:88:78:cb:40:5c:ae:57:60:dc:1d:c1:ba:54 - -:49: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:50: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:51: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:52: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:53: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:54: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:55: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:56: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:57: Not blacklisted: RSA 1024 df:db:e5:3a:bc:83:70:e7:ea:ee:ad:07:64:78:01:06 - -:58: Not blacklisted: RSA 2048 42:2e:26:b7:b7:d5:65:7d:be:d4:03:2f:3c:60:4e:87 - {DIV} Es sind einige Fingerprints zu sehen welche als unsicher eingestufft werden. Diese Einträge sollten aus der Datei entfernt werden. Wie das am einfachsten geht weiß ich noch nicht. Man kann sich allerdings die Info auch in komprimierter Form anzeigen lassen. Zeige alle unsicheren Fingerprints der Datei known_hosts: {CODE()} bob@localerrechner:~$ cat ./.ssh/known_hosts | ssh-vulnkey -v - | grep COMPROMISED |cut -f5 -d " " | uniq {CODE} {DIV(class="cmdoutput")} f8:e4:a7:49:7b:cc:72:03:f7:c0:47:51:de:c7:88:52 e7:ab:03:c9:1a:ee:72:43:29:6a:c6:d9:67:1f:38:0e {DIV} Jetzt weiß ich auch wie man diese Schlüssel auch automatisch entfernt. ACHTUNG die nachfolgende CODE Zeile entfernt Vertraunswürdige Hosteinträge in der known_hosts Datei. Für die richtigkeit des Codes kann ich keine Garantie übernehmen. {CODE()} bob@localerrechner:~$ for i in cat ~/.ssh/known_hosts | ssh-vulnkey -v - | grep COMPROMISED |cut -f2 -d ":" | uniq ; do sed -i "$i d" ~/.ssh/known_hosts; done

Danke auch an Caspar Clemens Mierau mit seinem Blog-Post known_hosts mit SED korrigieren.

SSH Versionen

Eine Übersicht über die SSH Versionen.

und das alles wie immer auch für Encrypt:Ssh

Schlüsselwirrwarr

Jetzt hat zwar jeder seinen Schlüssel erzeugt, jedoch will jedes Tool unterschiedliche Formate der Schlüssel haben. Man könnte zwar immer wieder ein neues Schlüsselpaar erzeugen führt aber aus meiner Sicht nicht zum Ziel. Ich möchte lieber einen Schlüssel in unterschiedlichen Formaten haben. Die nachfolgenden zwei Zeilen convertieren den privaten RSA SSH Schlüssel in das PEM Format. Anschließend wird aus dem privaten PEM Schlüssel der öffentliche PEM Schlüssel erzeugt. {CODE()} bob@localerrechner:~$ openssl rsa -in ./id_rsa -outform pem > id_rsa.pem bob@localerrechner:~$ openssl rsa -in id_rsa.pem -out id_rsa_pub.pem -outform PEM -pubout

Verschlüsseln:

{CODE()} bob@localerrechner:~$ openssl rsautl -encrypt -inkey id_rsa_pub.pem -pubin -in TEST.txt -out TEST.rsa

Entschlüsseln:

{CODE()} bob@localerrechner:~$ openssl rsautl -decrypt -inkey id_rsa.pem -in TEST.rsa -out decrypted.txt

key-forwarding

Mit ssh-agent-forwarding auf unix (auch mac) und windows kann man mit seinem lokalen key auch auf einem entfernten server arbeiten (zB git pull und push etc).