Appearance
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.