OpenSSH Public Key Authentifizierung
Dieser Artikel zeigt, wie ein SSH-Zugang für eine Authentifizierung mittels Public-Key-Verfahren konfiguriert wird. Dazu wird am Client ein Schlüsselpaar erstellt, der öffentliche Teil der Schlüssel auf den Server übertragen und anschließend der Server für die Schlüssel-Authentifizierung eingerichtet. Der Benutzer kann sich dadurch ohne Login-Passwort am Server anmelden, es wird ausschließlich das Passwort zum Schutz des privaten Schlüssels benötigt. Die verwendeten Betriebssysteme in diesem Artikel sind einerseits ein Ubuntu 12.10 am Client und andererseits ein Ubuntu 12.04 am Server.
Express Setup
- Client (the one who wants to ssh without password)
1:
# ssh-keygen -t rsa -b 4096
2:
ssh-copy-id ip-or-name
Am Client
Schlüsselpaar generieren
Im ersten Schritt wird am Client ein Schlüsselpaar mit ssh-keygen
erstellt. Für die RSA-Schlüssel wird eine Bitlänge von 4096 Bit ausgewählt:
:~$ ssh-keygen -b 4096 Generating public/private rsa key pair. Enter file in which to save the key (/home/gschoenb/.ssh/id_rsa): /home/gschoenb/.ssh/key_rsa Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/gschoenb/.ssh/key_rsa. Your public key has been saved in /home/gschoenb/.ssh/key_rsa.pub. The key fingerprint is: 20:69:c5:c3:e2:2d:a8:09:49:b9:d9:ee:ca:f9:45:5e gschoenb@gschoenb-X220 The key's randomart image is: +--[ RSA 4096]----+ | . o. | | o .o+ | |..+o+o.. | |oo.oo... | |.o. o ES | |o .o . | | . o | |. ... | | +o. | +-----------------+ :~$ ls .ssh/ id_rsa id_rsa.pub key_rsa key_rsa.pub known_hosts known_hosts.old
Achtung: Es wird aus sicherheitstechnischen Gründen empfohlen, den Schlüssel auf jeden Fall mit einer Passphrase zu schützen. Dadurch liegt der Schlüssel nicht im Klartext vor, sondern ist AES-CBC verschlüsselt:
:~$ cat .ssh/key_rsa -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-128-CBC,426FD49B9F6277AC00D62B08547D5FDE [...]
Sollte der private Schlüssel von einem Angreifer gestohlen werden, muss dieser, um mit dem Schlüssel auf den Server zugreifen zu können, noch das Passwort des Schlüssels herausfinden. Beim einem Schlüssel, der im Klartext vorliegt, kann ein Angreifer mit einem gestohlenen Schlüssel direkt auf den Server zugreifen.
Öffentl. Schlüssel auf Server übertragen
Für das Übertragen des öffentlichen Schlüssels auf den Server wird im ersten Schritt noch die SSH-Verbindung mittels Passwort-Authentifizierung genutzt. Das Werkzeug ssh-copy-id
kopiert das entsprechende Idendity-File auf den Server:
:~$ ssh-copy-id -i .ssh/key_rsa.pub tktest@192.168.56.101 tktest@192.168.56.101's password: Now try logging into the machine, with "ssh 'tktest@192.168.56.101'", and check in: ~/.ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.
Das oben genannte Prozedere hat am Server in der Datei /home/tktest/.ssh/authorized_keys
folgenden Eintrag erstellt:
:~$ cat .ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC7qmegDxzv1omqG2cWM+i+qaEGzCoSBwqCeXyGUU93sTqtNYYHJVGj6YZqXeXEGzJtKm2A/uo59Y+WmqhJgW7HcT2Hqvo80NfbIRhqE9TJETyBe GiiC8qpiYgPC2zigCNvTsRXh0CH5FJ1qy4QEBjztQDWOqSrsoOSJEEWCJiKJizTiXDmlGdiKE409GBo8lvlbMRWbrMj3iX825WTqy/T0Pio1kqANDotLnPA0sRXUPVyzc/ghzqRHzFetzP9j7C0nh EvjiJphiuYvhbgix79FrCQG0lXBGcAWzsWUeAoT/d3kQu79+UTWxm+z4pnJ7gkKVMejqrWys560SdAqD264dc5UBRGI9j6XxVKdraSaEitDneONrSAt2tE/RwRxh2ASxqQfdF88zyDI8/ma608tHc FROaNsn5hF+/wzjRK9akdhp5WjA5HXhg2OlkwKvSMhGlSgotRj5pr4Ebxjegysy1mEWRFN/vh/oNq4uHQy8adpfogaVELkI/Z2nuAdQk+uMy6D1hrKhUWubmBPxTbG00IWF25Tyuz8hnFRP9+gB/P NRlF59/EHy27a72nirvuOyfxKnx/Mn+FD9Ah59OSLhWuo3sN9Im8yc2cliecwMz+DmTtE7TwzNw9v2zfxU9JDQwyLtppULiGpmKFOLHjz+SVGxSbVsWS//IyNK1GrQ== gschoenb@gschoenb-X220
Testen der Key-Authentifizierung
Nachdem sich nun der öffentlich. Schlüssel am Server befindet, kann vom Client aus die Verbindung getestet werden. Wichtig ist dabei, dass nicht nach dem Passwort des Benutzers am Server gefragt wird, sondern die Passphrase, mit der der Schlüssel geschützt ist, verlangt wird!
:~$ ssh -i .ssh/key_rsa tktest@192.168.56.101
Daraufhin erscheint bei GUI-basierten Systemen die folgende Dialog-Box: center|500px Nach Eingabe des Passworts, mit dem der Schlüssel beim Erstellen geschützt wurde, ist man am System authentifiziert:
:~$ ssh -i .ssh/key_rsa tktest@192.168.56.101 Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-23-generic x86_64) * Documentation: https://help.ubuntu.com/ System information as of Thu Jan 17 13:51:19 CET 2013 [...]
Am Server
sshd-Konfiguration
Grundsätzlich genügt es unter Ubuntu, das oben angeführte Prozedere für die Public-Key-Authentifizierung durchzuführen. In manchen Situationen macht es dann auch Sinn, Passwort-Authentifizierung komplett zu deaktivieren.
Achtung: Nach Änderung der folgenden Einstellung, ist es nicht mehr möglich, sich mit einem Passwort über ssh anzumelden: PasswordAuthentication no
.
:~$ sudo diff /etc/ssh/sshd_config /etc/ssh/sshd_config.orig 51c51 < PasswordAuthentication no --- > #PasswordAuthentication yes
Vom Client aus wird die Verbindung ein weiteres Mal getestet:
:~$ ssh -i .ssh/key_rsa tktest@192.168.56.101 Agent admitted failure to sign using the key. Permission denied (publickey).
Im oben genannten Beispiel wurde der Dialog zum Eingeben des Schlüssel-Passworts abgebrochen. Da das Anmelden via Passwort deaktiviert wurde, war die Anmeldung am System nicht möglich.
Passwort-Authentifizierung nur für einen User verbieten
Eine weitere Möglichkeit, bei der Passwort-Authentifizierung nicht komplett deaktiviert wird, ist die Passwort-Anmeldung für spezielle User zu deaktivieren. Dadurch kann sich z.B. einem User, der am Server keine sudo-Rechte besitzt am Server anmelden. Um root-Rechte zu erlangen muss daraufhin zumindest ein weiteres Passwort eine Users mit sudo-Rechten herausgefunden werden. Außerdem gibt es die Möglichkeit, User komplett von ssh auszunehmen:
:~$ sudo diff /etc/ssh/sshd_config /etc/ssh/sshd_config.orig 88,91d87 < < DenyUsers test < Match User tktest < PasswordAuthentication no
Dieses Beispiel:
- Verbietet den SSH-Zugang für den User
test
- Deaktiviert die Passwort-Authentifizierung für den User
tktest
- Für alle anderen User bleibt die Passwort-Authentifizierung erhalten.