Skip to content
On this page

Versuch SSH

SSH

Im Versuch: Setup haben wir bereits ssh kennengelernt. Im folgenden gehen wir näher auf SSH und dessen Features ein.

Die serielle Schnittstelle zu dem Target ermöglicht direkten Zugriff auf ein Terminal, unabhängig davon, ob eine gültige Netzwerk-Konfiguration vorhanden ist. Nachteile davon sind aber unter anderem die begrenzte Datenrate für Konsolenoutput (z.B. beim Anzeigen grosser Files).

Eine alternative bietet SSH (Secure Shell), welche über eine TCP Verbindung Funktionalität für Portforwarding, Tunneling von Streams (GUI) oder auch einem Terminal zur Verfügung stellt. Ein weiteres Feature von SSH ist die verschlüsselte Verbindung zwischen host und target.

Aufgabe: SSH man page

Studieren Sie die man Page von ssh auf dem Target.

Um SSH verwenden zu können brauchen Sie eine Client- und eine Serverkomponente. Auf Ihrem Windows host verwenden Sie Putty oder neu ssh der Git BASH als Clientkomponente. Auf dem Target bereits vorinstalliert finden Sie openssh-server als Serverkomponente.

Aufgabe: SSH Server man page

Studieren Sie die man Page von sshd auf dem Target.

SSH, mit username und passwort einloggen

Der ssh-server auf dem Target ist standardmässig ausgeschaltet. Mit folgendem Command können Sie diesen aktivieren:

bash
sudo systemctl enable ssh

ssh File auf der Boot Partition

Alternativ können Sie in der boot Partition des Targets ein File ssh erstellen. Dieses wird den sshd Serverdienst beim nächsten Boot aktivieren.

Es lohnt sich aus sicherheitstechnischen Gründen das Standardpasswort für den user des Targets zu ändern.

bash
sudo passwd pi

Passwort

Merken Sie sich Ihr Passwort, falls Sie es ändern

Starten Sie den sshd Service.

bash
sudo /etc/init.d/ssh start

SSH ohne Passwort

Im letzten Versuch haben Sie auf dem Windows Host eine BASH-Shell installiert, welche auch über SSH verfügt.

Bis jetzt haben Sie sich auf dem target via SSH mittels Eingabe eines Passworts eingelogt. Längerfristig sicherer und weniger aufwändig ist das einloggen per SSH Public Key.

Auf dem Host verwendet SSH bereits ein Keypair um verschlüsselt zu kommunizieren. Mit dem hinterlegen des öffentlichen Keys, können Sie sich beim Target auch ohne Passwort einloggen.

Key mit Git BASH erstellen

Überprüfen Sie auf Ihrem Hostystem, ob im Homeverzeichnis C:\Users\username\.ssh breits ein Public Key (Endung .pub) vorhanden ist.

Falls nicht, generieren Sie ein Keypair auf dem Hostsystem.

bash
ssh-keygen -t rsa

Privater Schlüssel

Den privaten Key (ida_rsa) sollten Sie nie teilen, da er Zugriff zum Target gewährt.

SSH Public Key auf dem Target hinterlegen

  • Kopieren Sie den Inhalt des öffentlichen Schlüssels beim Target in das File ~/.ssh/authorized_keys.

.ssh existiert nicht

Erstellen Sie das .ssh Directory mit mkdir .ssh.

  • Schauen Sie sich das File /etc/ssh/sshd_config an und ...
    • ... enterfernen Sie die Option sich via Passwort einzuloggen.
    • ... fügen Sie die Option hinzu sich mit Public Key einzuloggen.
  • starten Sie den sshd neu.
  • Loggen Sie sich jetzt mit dem Host auf das Target via SSH ein. Benötigen Sie jetzt noch ein Passwort? Wenn nein, warum nicht?

Access Denied (public key)

Falls Sie eine Fehlermeldung unter Windows erhalten, kann es sein, dass Ihr System den private key nicht findet. Hierzu können Sie diesen explizit mit der Option -i angeben.

bash
ssh pi@192.168.50.1 -i .ssh/id_rsa

ps

Verifizieren Sie, dass der SSH-Daemon läuft:

bash
# detailliert
ps aux

# kurz (keine kernel threads)
ps --ppid 2 -p 2 --deselect

    1 ?        00:00:05 systemd
  101 ?        00:00:00 systemd-journal
  128 ?        00:00:00 systemd-udevd
  268 ?        00:00:00 systemd-timesyn
  283 ?        00:00:00 avahi-daemon
  286 ?        00:00:00 thd
  291 ?        00:00:00 cron
  292 ?        00:00:00 rsyslogd
  302 ?        00:00:01 dbus-daemon
  324 ?        00:00:00 avahi-daemon
  329 ?        00:00:00 wpa_supplicant
  330 ?        00:00:00 systemd-logind
  435 ?        00:00:00 hciattach
  442 ?        00:00:00 bluetoothd
  490 tty1     00:00:00 agetty
  491 ttyS0    00:00:00 login
  498 ?        00:00:00 sshd
  507 ?        00:00:00 dnsmasq
  575 ?        00:00:00 systemd
  579 ?        00:00:00 (sd-pam)
  584 ttyS0    00:00:00 bash
  810 ttyS0    00:00:00 ps

Prozesse anzeigen: "ps"

Mit ps zeigen Sie momentan laufende Prozesse an. Tools wie htop oder top verfügen über die gleiche Information, sind aber interaktiv. Die Optionen --ppid 2 -p 2 --deselect verbergen die zahlreichen, aber oftmals uninteressanten Kernel threads.

netstat

Mit dem command netstat können Sie aktuelle Verbindungen und offene Ports anzeigen lassen.

bash
netstat

Viele Ports sind bereits für "well known" Services reserviert, so auch SSH auf Port 22. Schauen Sie sich das File /etc/services an um zu sehen, welche Ports für welche Services reserviert sind.

bash
less /etc/services

Uns interessiert ob sshd auf Port 22 am hören ist.

bash
# t: nur tcp
# l: listening
netstat -l -t

# kurz

netstat -lt

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:domain          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
tcp6       0      0 [::]:domain             [::]:*                  LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN

# numerische ports (keine Auflösung der services)

netstat -ltn

Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp6       0      0 :::53                   :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN

# nur ipv4 anzeigen
netstat -ltn4

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN

# eselsbrücke, NATEL

netstat -n4tel

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode     
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      0          14361     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          15374

# welcher prozess hat den port offen?!

netstat -n4telp

Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name    
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      0          14361      -                   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          15374      -  

# scheint für unseren user nicht sichtbar zu sein
# darum `-`

sudo netstat -n4telp

Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name    
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      0          14361      507/dnsmasq         
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          15374      498/sshd 

# A-HA! Also doch, sshd hält Port 22 wie erwartet offen
# 

Port 22 scheint also offen zu sein.