====== Secure Shell (SSH) ======
* [[https://vimeo.com/54505525|The Black Magic Of SSH / SSH Can Do That?]]
* [[https://www.golem.de/news/kryptographie-der-debian-bug-im-openssl-zufallszahlengenerator-1805-134355.html|Der Debian-Bug im OpenSSL-Zufallszahlengenerator]]
* [[https://superuser.com/questions/232373/how-to-tell-git-which-private-key-to-use|How to tell git which private key to use?]]
**Standard:**
* https://datatracker.ietf.org/doc/html/rfc4251 -- (SSH) Protocol Architecture
* https://datatracker.ietf.org/doc/html/rfc4253 -- (SSH) Transport Layer Protocol
* https://datatracker.ietf.org/doc/html/rfc4252 -- (SSH) Authentication Protocol
===== SSH-Client =====
==== Private Key-Pair generieren ====
$ ssh-keygen -t rsa
**''id_rsa''**(private key) in **''~/.ssh''** speichern
=== Passphrase für Private Key ändern ===
$ ssh-keygen -p -f ~/.ssh/id_rsa
==== Permissions ====
:!: Achtung: Permissions müssen restriktiv gesetzt sein (700) für ./ssh Verzeichnis und (600) für die darin enthaltenen Keys!
$ chmod 700 .ssh && chmod 600 .ssh/*
* [[https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement|Key-based authentication in OpenSSH for Windows]]
* https://help.ubuntu.com/community/SSH/OpenSSH/Keys
* https://www.howtoforge.de/anleitung/key-basierte-ssh-logins-mit-putty/
==== Verbindung mit Tunnel für VNC herstellen ====
**Portforwarding, z.B. für eine VNC-Verbindung:**
$ ssh -L 5920:localhost:5920 user@example.com
* http://blog.trackets.com/2014/05/17/ssh-tunnel-local-and-remote-port-forwarding-explained-with-examples.html
**Socks-Proxy um Remote zu surfen:**
$ ssh -N -D2000 user@example.com
# Im Browser muss noch der Port 2000 als Socks-Proxy angegeben werden.
* http://blogs.uni-due.de/zim/2014/01/30/es-muss-nicht-immer-vpn-sein-ein-ssh-tunnel-realisiert-einen-socks-proxy-fur-nat-umgebungen-oder-ipv6-only-angebundene-unitymedia-kunden/
**Forward local:4567 port via remote Port:8080**
ssh -R *:8080:localhost:4567
* https://linuxize.com/post/how-to-setup-ssh-tunneling/
===== SSH-Server =====
Den generierten Public Key **''id_rsa.public''** in **''~/.ssh/authorized_keys''** einfügen
:!: Achtung: Permissions müssen restriktiv gesetzt sein (700) für ./ssh Verzeichnis und (600) für die darin enthaltenen Keys!
chmod 700 ~/.ssh && chmod 600 ~/.ssh/*
Danach muss ggf. in **''/etc/ssh/sshd_config''** der entsprechende Nutzernamen im Abschnitt **AllowUsers** oder der Gruppenname in **AllowGroups** eintragen und der ssh-Daemon neu gestartet werden.
==== Troubleshooting: ====
- Berechtigungen für Verzeichnis und Dateien richtig gesetzt?
- Richtiger Username (nicht root, sondern Benutzername des jeweiligen Nutzers)?
- Public Key muss als 1 Zeile in ''~/.ssh/authorized_keys'' eingefügt sein, evtl. vorhandene Zeilenumbrüche entfernen!
==== Alternativ: ssh-copy-id ====
Funktioniert z.B. vom existierenden FreeBSD-Server zu einem neu aufgesetzten Linux-System mit Passwort-Authentisierung
$ ssh-copy-id -i ~/.ssh/authorized_keys user@example.com
===== SSH-Demon konfigurieren: =====
$ vim /etc/ssh/sshd_config
$ man sshd_config
**Passwort Authentisierung ausschalten:**
#PasswordAuthentication yes
ändern zu:
PasswordAuthentication no
Überprüfen der Syntax vor dem Start des SSH-Demons:
$ sshd -t
===== Firewall Konfiguration (iptables) =====
-A INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -m recent --set --name sshattack --rsource
-A INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -m recent --rcheck --seconds 300 --hitcount 3 --name sshattack --rsource -j LOG --log-prefix "SSH Drop: "
-A INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,RST,ACK SYN -m recent --rcheck --seconds 300 --hitcount 3 --name sshattack --rsource -j REJECT --reject-with tcp-reset
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT