Articlename: Secure SSH Tutorial Part 2: Identity/Pubkey Authentifizierung Keywords: SSH, secure, OpenSSH, Identity/Pubkey Authentifizierung, identity, pubkey, authentication Date: 08.03.2007, 00:42 Views: 12066 Categoryname: Security ---------------------------------------- Vorwort ------------------ Im ersten Teil dieser Tutorialserie (http://www.online-tutorials.net/security/secure-ssh-tut orial-part1-host-key/tutorials-t-69-201.html) ging es um die sichere Verwaltung des Host-Schlüssels, dieser Teil beschäftigt sich mit Identity/Pubkey Authentifizierung unter SSH. Tutorials in dieser Artikelserie ------------------ - Tutorial Part 1: Host Key (http://www.online-tutorials.net/security/secure-ssh-tutorial-pa rt-1-host-key/tutorials-t-69-201.html) - Tutorial Part 2: Identity/Pubkey Authentifizierung (http://www.online-tutorials.net/securi ty/secure-ssh-tutorial-part-2-identity-pubkey-authentifizierung/tutorials-t-69-202.html) - Tutorial Part 3: Usage (http://www.online-tutorials.net/security/secure-ssh-tutorial-part- 3-usage/tutorials-t-69-205.html) - Tutorial Part 4: Security & ssh-agent (http://www.online-tutorials.net/security/secure-ssh -tutorial-part-4-security-ssh-agent/tutorials-t-69-206.html) Einführung ------------------ OpenSSH - wenn ich in diesem Tutorial den Begriff SSH verwende meine ich eigentlich immer OpenSSH - unterstützt einige nützliche Dinge zur Authentifizierung der Benutzer. Wir schauen uns jetzt die "Identity/Pubkey Authentifizierung" an. Bei dieser Methode ersetzen wir die normale Vorgehensweise, statische Passwörter zu benutzen, die mit einem keylogger abgehört werden können. Alles was wir brauchen ist ein Schlüsselpaar auf der Festplatte, mit dem wir uns authentifizieren. Der SSH-Server hat die Identities/Pubkeys, welchen er vertraut, in einer Liste. Vorteile: - Ein keylogger reicht nicht mehr, da der private key, und die passphrase benötigt wird - Bruteforce -und Directoryhacks funktionieren nicht mehr Identity/Pubkey erstellen ------------------ Wie schon im ersten Teil erwähnt, gibt es drei Typen von Protokollen die wir verwenden können: ------- Code ------- - RSA1 Parameter: -t rsa1 Standarddateiname: identity Protokoll: SSH 1 - RSA Parameter: -t rsa Standarddateiname: id_rsa Protokoll: SSH 2 - DSA Parameter: -t dsa Standarddateiname: id_dsa Protokoll: SSH 2 ------- End-Code ------- Wir erstellen das Schlüsselpaar wie gewohnt mit [I]ssh-keygen[/I]: ------- Code ------- workstation:/home/simon# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/simon/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/simon/.ssh/id_rsa. Your public key has been saved in /home/simon/.ssh/id_rsa.pub. The key fingerprint is: 01:4a:69:4a:81:16:f2:b9:aa:41:da:55:af:dd:34:ce simon@workstation workstation: workstation:/home/simon# cd $HOME/.ssh/ workstation:~/.ssh# ls id_rsa id_rsa.pub ------- End-Code ------- Jetzt sehen wir die zwei Dateien, die ssh-keygen erstellt hat: id_rsa, und id_rsa.pub. Die erste Datei ist der private key, die mit der passphrase geschützt ist, die zweite Datei (.pub) ist der public key. Identity/Pubkey zum Server hochladen ------------------ Jetzt schicken wir den public key dem Server, dazu verwenden wir scp, ein Tool von SSH, welches für filetransfer gedacht ist: ------- Code ------- workstation:/# cd $HOME/.ssh/ workstation:/home/simon/.ssh# scp id_rsa.pub simon@ssh-server:id_rsa_workstation.pub Password: workstation:/home/simon/.ssh# ssh ssh-server -L simon Password: ssh-server:/ cd $HOME ssh-server:/home/simon# mkdir .ssh && chmod 700 .ssh && cd .ssh #Jetzt fügen wir die Datei hinzu, die wir hochgeladen haben ssh-server:/home/simon/.ssh# cat ../id_rsa_workstation.pub >> authorized_keys ssh-server:/home/simon/.ssh# chmod 600 authorized_keys ssh-server:/home/simon/.ssh# rm ../id_rsa_workstation.pub && exit ------- End-Code ------- Identity/Pubkey Authentifizierung auf dem Server einstellen ------------------ Jetzt wollen wir auf dem SSH-Server einstellen, dass der Server Identity/Pubkey erlaubt. Dazu editieren wir die sshd_config ------- Note: sshd_config ------- #SSH version 1 Identity Authentifizierung RSAAuthentication yes #SSH version 2 Pubkey Authentifizierung PubkeyAuthentication yes #Der Aufbewahrungsort der Schlüssel, ohne Slash am anfang bedeutet im Home-Verzeichnis. AuthorizedKeysFile .ssh/authorized_keys ------- End-Note ------- Nach einem Neustart des Servers sollte der SSH-Server Identity/Pubkey Authentifizierung erlauben. Jetzt können wir noch normale Passwort-Authentifizierung abschalten: ------- Note: sshd_config ------- PasswordAuthentication no UsePAM no ------- End-Note ------- Nachdem wir jetzt alles vorbereitet haben, können wir den unterschied ausprobieren: ------- Code ------- workstation:/# ssh ssh-server Enter passphrase for key '/home/simon/.ssh/id_rsa': ------- End-Code ------- Mit dem Parameter -v können wir übrigens sehen, was passiert wenn wir uns mit einem ssh-server verbinden. Schlüsselpaar auswählen ------------------ Mit dem Parameter -I können wir den Schlüssel auswählen, der für die Identity/Pubkey Authentifizierung verwendet wird: ------- Code ------- workstation:/# ssh -i ~/.ssh/ssh_key ssh-server Enter passphrase for key '/home/simon/.ssh/ssh_key': ------- End-Code ------- Standardmässig lasst sich das in der Datei ~/.ssh/config eintragen: ------- Code ------- Host ssh-server IdentityFile ~/.ssh/special_ssh_key ------- End-Code ------- Ratschläge ------------------ Der angelegte Schlüssel sollte eine passphrase benutzen, damit der Schlüssel geschützt ist, die passphrase wird zum entschlüsseln des Schlüssels benutzt, ohne diese passphrase hat jeder, der an den private key kommt vollständigen Zugriff auf den SSH-Server. Wie man sich bei einem SSH-Server mit einer passphrase einloggen kann, ohne ein Passwort eintippen zu müssen wird wahrscheinlich im nächsten, oder übernächsten Artikel gezeigt. Bei älteren Versionen von ssh, kann es vorkommen das authorized_keys für SSHv1 und authorized_keys2 für SSHv2 benutzt wird, ein Hardlink, der mit ln authorized_keys authorized_keys2 erzeugt wird, löst dieses Problem.