Benutzer-Werkzeuge

Webseiten-Werkzeuge


open:it:ssh

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
open:it:ssh [2024/06/22 10:15] – Externe Bearbeitung 127.0.0.1open:it:ssh [2025/04/08 13:46] (aktuell) – [SSH-Key unter Linux generieren] Kai
Zeile 1: Zeile 1:
 ====== SSH-Verbindungen ====== ====== SSH-Verbindungen ======
 Secure Shell oder SSH bezeichnet ein kryptographisches Netzwerkprotokoll für den sicheren Betrieb von Netzwerkdiensten über ungesicherte Netzwerke. \\ Secure Shell oder SSH bezeichnet ein kryptographisches Netzwerkprotokoll für den sicheren Betrieb von Netzwerkdiensten über ungesicherte Netzwerke. \\
 +
 +Hinweise: https://wiki.ubuntuusers.de/SSH/ \\
  
 <WRAP important> <WRAP important>
-Empfehlenswert+Empfehlenswerte Einstellungen für einen Server, der über das Internet erreichbar ist (z.B. ein Webserver)
-  * Direkter Login von root  untersagen +  * Den direkten Zugang für "root" von Außen ausschließen. 
-  * Zugang nur mit Schlüssel - login ohne Schlüssel (nur Passwort) unterbinden +  * Den Zugang mit Passwort von Außen generell ausschließen. 
-  * Optional: Beschränkter Zugriff über SFTP auf definierte Bereiche+  * Zugang nur mit Schlüssel. 
 +  * Optional z.B. für Webserver: Beschränkter Zugriff über SFTP auf definierte Bereiche (HTML-Files …)
 </WRAP> </WRAP>
-Hinweise: https://wiki.ubuntuusers.de/SSH/ 
  
 ===== SSH-Schlüssel ===== ===== SSH-Schlüssel =====
-Für den Zugriff mit einem Schlüssel muss zunächst einer generiert werden. Dabei wird i.d.R. ein Schlüsselpaar generiert, das aus einem privaten und einem öffentlichen Schlüssel besteht und das miteiander agiert. Der private Schlüssel bleibt lokal und geheim, der öffentliche wird an externe Systeme verteilt.+Für den Zugriff mit einem Schlüssel muss zunächst einer generiert werden. Dabei wird i.d.R. ein Schlüsselpaar generiert, das aus einem privaten und einem öffentlichen Schlüssel besteht und das miteinander agiert. Der private Schlüssel bleibt lokal und geheim, der öffentliche wird an externe Systeme verteilt.
  
 ==== SSH-Key unter Linux generieren ==== ==== SSH-Key unter Linux generieren ====
Zeile 23: Zeile 25:
 b = Schlüssellänge (hier 4096 Bit) \\ b = Schlüssellänge (hier 4096 Bit) \\
  
-Schlüssel liegt automatisch im (versteckten) Verzeichnis ~/.ssh/ \\ +Sofern nicht anders angegeben, liegt der neue Schlüssel automatisch im (versteckten) Verzeichnis ~/.ssh/ \\ 
-Den Schlüssel ohne Passwort zu generieren, vereinfacht das Login, da dann später kein Passwort mehr angegeben werden muss. Wird der private Schlüssel aber zu anderen Systemen transferiertz.Bper E-Mail, dann birgt das Gefahren+Den Schlüssel ohne Passwort zu generieren, vereinfacht das spätere Login, da dann kein Passwort mehr angegeben werden muss. Die 2FA wird aber empfohlen.\\ 
 +Soll der private Schlüssel auf ein anderes Systeme kopiert werdenum ihn auch von dort nutzen zu können: Auf dem neuen System müssen die Zugriffsrechte genauso eingeschränkt werdenAnderfalls gibt es Verbindungsprobleme.\\ 
 +privater Schlüssel: .ssh/id_rsa -rw------- Owner & Group = User \\ 
 +öffentlSchlüssel: .ssh/id_rsa.pub -rw-r--r-- Owner & Group = User \\
  
-<WRAP alert+<WRAP important
-**Der private Schlüssel muss unbedingt vor fremdem Zugriff geschützt bleiben!**+**Der private Schlüssel muss unbedingt vor fremdem Zugriff geschützt bleiben!** \\ 
 +Das betrifft auch den Transfer der Dateien (USB-Stick, E.Mail, etc.) \\ 
 +Versand per E-Mail nur mit verschlüsselter E-Mail! \\
 </WRAP> </WRAP>
-Es werden 2 Dateien angelegt:+ 
 +Bei der Erstellung werden 2 Dateien angelegt:
   * id_rsa (privater Schlüssel)   * id_rsa (privater Schlüssel)
   * id_rsa.pub (öffentlicher Schlüssel)   * id_rsa.pub (öffentlicher Schlüssel)
Zeile 35: Zeile 43:
 Der öffentliche Schlüssel wird auf das entfernte System übertragen, auf das zugegriffen werden soll. \\ Der öffentliche Schlüssel wird auf das entfernte System übertragen, auf das zugegriffen werden soll. \\
 Der private Schlüssel bleibt auf dem lokal System, auf dem er generiert wurde. Für jedes weitere (lokale) System sollte jeweils ein eigener Schlüssel generiert werden.\\ Der private Schlüssel bleibt auf dem lokal System, auf dem er generiert wurde. Für jedes weitere (lokale) System sollte jeweils ein eigener Schlüssel generiert werden.\\
 +Werden privater und öffentllicher Schlüssel auf einen anderen PC kopiert, kann auch von dort aus auf die Server zugegriffen werden - ohne das der öffentliche Schlüssel neu auf diese Server übertragen werden muss. \\
  
-Zur Übertragung auf einen Server muss der User bereits dort angelegt sein und der Zugriff ohne Schlüssel (i.d.R. mit Passwort) sollte temporär freigegeben sein. \\ +Zur Übertragung auf einen Server muss der User bereits dort angelegt sein und der Zugriff ohne Schlüssel (mit Passwort) muss temporär freigegeben werden. \\ 
-Den öffentlichen Schlüssel(id_rsa.pub) wie folgt auf den Server übertragen:+Den öffentlichen Schlüssel (id_rsa.pub) wie folgt auf den Server übertragen:
  
   ssh-copy-id <USER>@<REMOTEHOST>   ssh-copy-id <USER>@<REMOTEHOST>
Zeile 44: Zeile 53:
 Das Passwort vom <REMOTEHOST> wird abgefragt. \\ Das Passwort vom <REMOTEHOST> wird abgefragt. \\
  
-Im <REMOTEHOST>-Home-Verzeichnis vom <USER> liegt die Datei **~/.ssh/authorized_keys**. In diese Datei werden die gültigen Public-Keys (automatisch) eingetragen. Das Verzeichnis ist i.d.R. versteckt.\\+Im <REMOTEHOST>-Home-Verzeichnis vom <USER> liegt die Datei **~/.ssh/authorized_keys**. In diese Datei werden die gültigen Public-Keys (automatisch) eingetragen. Das Verzeichnis ist versteckt.\\
 Parallel wird auf dem lokalen (Linux-)Rechner der (neue) entfernte Host in der Datei **~/.ssh/known_hosts** aufgenommen. Ist der Host dort bereits enthalten, ggf. mit anderem Schlüssel, muss er zunächst aus dieser Datei entfertn werden -> Siehe Fehlermeldung und Hinweise. Parallel wird auf dem lokalen (Linux-)Rechner der (neue) entfernte Host in der Datei **~/.ssh/known_hosts** aufgenommen. Ist der Host dort bereits enthalten, ggf. mit anderem Schlüssel, muss er zunächst aus dieser Datei entfertn werden -> Siehe Fehlermeldung und Hinweise.
  
Zeile 65: Zeile 74:
   - Load an existing private key file   - Load an existing private key file
   - Save private key >> jetzt mit Endung .ppk   - Save private key >> jetzt mit Endung .ppk
 +
 +===== Server konfigurieren =====
 +==== SSH-Zugriffe ====
 +Ggf. vorher Installieren
 +  sudo apt-get install openssh-server
 +
 +  sudo nano /etc/ssh/sshd_config
 +
 +  ClientAliveInterval 1200
 +  ClientAliveCountMax 3
 +  
 +  PermitRootLogin no
 +  PasswordAuthentication no
 +  Subsystem sftp internal-sftp
 +
 +<WRAP important>
 +Um sich nicht selber auszusperren: \\
 +PermitRootLogin nur deaktivieren, sofern ein anderer User Zugriff hat und PasswordAuthentication nur abschalten, sofern der Zugriff mit dem Key-File auch klappt! \\
 +
 +Möglicherweise gibt es Parameter in einem Unterordner, die die Regeln überschreiben. Möglich, dass dort in einer *.conf-Datei, \\
 +z.B. /etc/ssh/sshd_config.d/50-cloud-init.conf, hinterlegt ist: **PasswordAuthentication yes** \\
 +Das muss dann angepasst werden.
 +</WRAP>
 +The **ClientAliveInterval** parameter specifies the time in seconds that the server will wait before sending a null packet to the client system to keep the connection alive. \\
 +The **ClientAliveCountMax** parameter defines the number of client alive messages which are sent without getting any messages from the client. \\
 +Timeout value = ClientAliveInterval * ClientAliveCountMax \\
 +Beispiel: 1200 x 3 = 3600 ~ 1 Stunde. \\
 +Nach Änderungen muss der SSH-Service neu gestartet werden.
 +  sudo systemctl reload ssh
 +
 +==== Schutz vor Angriffen mit fail2ban ====
 +[[https://schroederdennis.de/tutorial-howto/ssh-login-schuetzen-mit-fail2ban-server-absichern-anleitung-brute-force/|SSH Login schützen mit fail2ban]] \\
 +[[https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-debian-11|How To Protect SSH with Fail2Ban on Debian 11]] \\
 +[[https://www.howtoforge.de/anleitung/installation-und-verwendung-von-fail2ban-unter-debian-12/|Installation und Verwendung von Fail2ban unter Debian 12]] \\
 +[[https://wiki.ubuntuusers.de/fail2ban/|fail2ban bei Ubuntu-Users]] \\
 +
 +fail2ban installieren
 +  sudo apt update
 +
 +  sudo apt install fail2ban
 +
 +Conf-Dateien kopieren
 +  sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
 +
 +  sudo cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local
 +
 +nur die .local-Dateien bearbeiten
 +  sudo nano /etc/fail2ban/jail.local
 +
 +Ändern (nach [sshd]) suchen: \\
 +[sshd]
 +  backend=systemd
 +  enabled = true
 +  port = ssh
 +  filter = sshd
 +  logpath = /var/log/auth.log
 +  maxretry = 3
 +
 +Über die Zeit-Parameter in der Datei /etc/fail2ban/jail.local lässt es sich steuern: \\
 +# "bantime" is the number of seconds that a host is banned. \\
 +# Beispiel: Sperrung(banned) für 1 Stunde, wenn maxrtry innerhalb findtime erreicht wurde \\
 +**bantime = 3600** \\
 +# A host is banned if it has generated "maxretry" during the last "findtime" \\
 +# Beispiel: Zeit (hier 3 Minuten). \\
 +**findtime = 180** \\
 +# "maxretry" is the number of failures before a host get banned. \\
 +**maxretry = 5** \\
 +
 +Installieren
 +  sudo apt install python3-systemd
 +
 +fail2ban neu starten
 +  sudo systemctl restart fail2ban
 +Autostart mit System
 +  sudo systemctl enable fail2ban
 +
 +Protokoll der (temporär) verbanten IP-Adressen
 +  sudo zgrep 'Ban' /var/log/fail2ban.log*
 +
 +==== Verbindungs-Protokolle ====
 +Quelle: https://www.strongdm.com/blog/view-ssh-logs \\
 +
 +If you want to view ssh logs from a specific time range, you can use the since and until flags. Some examples:
 +  sudo journalctl -u ssh --since yesterday
 +
 +  sudo journalctl -u ssh --since -3d --until -2d # logs from three days ago
 +
 +  sudo journalctl -u ssh --since -1h # logs from the last hour
 +
 +  sudo journalctl -u ssh --until "2024-12-20 07:00:00"
 +
 +To watch the ssh logs in realtime, use the follow flag:
 +  sudo journalctl -fu ssh
 +
 +Use Ctrl-C to exit out of the log monitor.
  
 ===== Login ===== ===== Login =====
 ==== Login über Linux-Shell ==== ==== Login über Linux-Shell ====
  
-Login mit Passwort oder wenn der key im <REMOTEHOST> hinterlegt ist:+Login mit Passwort:
  
   ssh <USER>@<REMOTEHOST>   ssh <USER>@<REMOTEHOST>
  
-<USER>@ kann weggelassen werden, wenn <USER> mit dem lokalen User übereinstimmt.+<USER>: Benutzername auf Remote-Host. <USER>@ kann weggelassen werden, wenn entfernter <USER> mit dem lokalen Usernamen übereinstimmt. \\ 
 +<REMOTEHOST>: IP-Adresse des Remote-Host
  
-Beim ersten Loginwenn der public-key noch nicht auf dem Server ist oder dieser sich geändert hat, muss dieser im Remote-Server registriert werden. Entweder wie oben beschrieben mit (ssh-copy-id ...) oder mit folgender Methode:+Login mit Key wenn der key im <REMOTEHOST> bereits hinterlegt ist:
  
-  ssh -i ~/.ssh/id_rsa <USER>@<REMOTEHOST>+  ssh -i <KEY_PFAD> <USER>@<REMOTEHOST> 
 +   
 +<KEY_PFAD> z.B.: .ssh/id_rsa \\ 
 +Standardpfad für den Key ist: .ssh/id_rsa wenn er dort liegt, kann "-i <KEY_PFAD>" weggelassen werden. \\  
 +i = identity_file \\
  
-  * ~/.ssh/id_rsa = (relativer) Pfad und Name privater Schlüssel +Beim ersten Login, wenn der public-key noch nicht auf dem Server ist oder dieser sich geändert hat, muss dieser im Remote-Server registriert werden 
-  <USER>@<REMOTEHOST> = User und IP# des entfernten Systems+ 
 +  ssh-copy-id <USER>@<REMOTEHOST>
  
 Beim ersten Login erfolgt eine Validierung mit dem Passwort des Systems. Bei Folgeaufrufen nur noch mit dem PW des SSH-Keys bzw. wenn keines vergeben wurde, ohne PW. \\ Beim ersten Login erfolgt eine Validierung mit dem Passwort des Systems. Bei Folgeaufrufen nur noch mit dem PW des SSH-Keys bzw. wenn keines vergeben wurde, ohne PW. \\
  
-Beim ersten Login werden die dann bekannten Hosts lokal in **~/.ssh/known_hosts** gespeichert. Gibt es Änderungen an einem Host und ggf. damit verbundene Probleme, dann kann der Host daraus, oder die ganze Datei, gelöscht werden. Wird dann beim nächsten Aufruf neu generiert.+Beim ersten Login werden die dann bekannten Hosts lokal in **~/.ssh/known_hosts** gespeichert. Gibt es Änderungen an einem Host und ggf. damit verbundene Probleme, dann kann der Host daraus, oder die ganze Datei, gelöscht werden. Wird dann beim nächsten Aufruf neu generiert. Auf dem server wird der "neue" Key eines Users eintgetragen in der Datei .ssh/authorized_keys. Für jeden User des Server-Systems werden die Schlüssel separat in seinem Home-Verzeichnis verwaltet.
  
 Wurde der Schlüssel am Server geändert, oder der Server neu eingerichtet, muss er aus der lokalen Datei ~/.ssh/known_hosts ausgetragen werden. Händisch oder mit dem Befehl (IP des betroffenen Servers): Wurde der Schlüssel am Server geändert, oder der Server neu eingerichtet, muss er aus der lokalen Datei ~/.ssh/known_hosts ausgetragen werden. Händisch oder mit dem Befehl (IP des betroffenen Servers):
Zeile 106: Zeile 216:
 Verbindungsart: **Schlüsseldatei**. Verbindungsart: **Schlüsseldatei**.
  
-===== SSH-Zugriff am Server konfigurieren ===== 
  
-  sudo nano /etc/ssh/sshd_config 
- 
-  ClientAliveInterval 1200 
-  ClientAliveCountMax 3 
-   
-  PermitRootLogin no 
-  PasswordAuthentication no 
-  Subsystem sftp internal-sftp 
- 
-PermitRootLogin nur deaktivieren, sofern ein anderer User Zugriff hat und PasswordAuthentication nur abschalten, sofern der Zugriff mit dem Key-File auch klappt! \\ 
-The **ClientAliveInterval** parameter specifies the time in seconds that the server will wait before sending a null packet to the client system to keep the connection alive. \\ 
-The **ClientAliveCountMax** parameter defines the number of client alive messages which are sent without getting any messages from the client. \\ 
-Timeout value = ClientAliveInterval * ClientAliveCountMax \\ 
-Beispiel: 1200 x 3 = 3600 ~ 1 Stunde. \\ 
-Nach Änderungen muss der SSH-Service neu gestartet werden. 
- 
-  sudo systemctl reload ssh 
 ===== Dateien kopieren über SSH ===== ===== Dateien kopieren über SSH =====
 Dafür __nicht__ vorab auf dem Remote-Server einloggen, sondern vom lokalen Rechner ausführen. Dafür __nicht__ vorab auf dem Remote-Server einloggen, sondern vom lokalen Rechner ausführen.
Zeile 137: Zeile 229:
 Kopieren des Verzeichnisses “foo” vom lokalen Rechner in das Verzeichnis “bar” eines entfernten Rechners. Kopieren des Verzeichnisses “foo” vom lokalen Rechner in das Verzeichnis “bar” eines entfernten Rechners.
   scp -r foo <USER>@<REMOTEHOST>:/some/remote/directory/bar   scp -r foo <USER>@<REMOTEHOST>:/some/remote/directory/bar
 +
 Quelle: https://www.davidkehr.com/linux-kopieren-von-und-zu-einem-computer-per-scp-ssh/ Quelle: https://www.davidkehr.com/linux-kopieren-von-und-zu-einem-computer-per-scp-ssh/
-===== Remote-Desktop ===== 
- 
-Auf dem lokalen Rechner aktivieren. [[open:it:firewall|Firewall]] zuvor installieren bzw. aktivieren. 
- 
-  sudo apt install xrdp 
-  sudo systemctl enable --now xrdp 
- 
-ggf. dieser Befehl 
- 
-  sudo ufw allow from any to any port 3389 proto tcp 
- 
-Dann Zugriff auch über Window-Remote-Desktop. 
- 
-~~DISCUSSION~~ 
- 
  
open/it/ssh.1719044136.txt.gz · Zuletzt geändert: von 127.0.0.1