====== 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