open:it:ssh
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
open:it:ssh [2023/08/30 10:58] – [Remote-Desktop] Kai | open:it:ssh [2025/04/08 13:46] (aktuell) – [SSH-Key unter Linux generieren] Kai | ||
---|---|---|---|
Zeile 2: | Zeile 2: | ||
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. \\ | ||
- | Empfehlenswert: | + | Hinweise: https:// |
- | * Direkter Login von root untersagen | + | |
- | * Zugang nur mit Schlüssel - login ohne Schlüssel (nur Passwort) unterbinden | + | |
- | * Optional: Beschränkter Zugriff über SFTP auf definierte Bereiche | + | |
- | Hinweise: https:// | + | <WRAP important> |
+ | Empfehlenswerte Einstellungen für einen Server, der über das Internet erreichbar ist (z.B. ein Webserver): | ||
+ | * Den direkten Zugang für " | ||
+ | * Den Zugang mit Passwort von Außen generell ausschließen. | ||
+ | * Zugang nur mit Schlüssel. | ||
+ | * Optional z.B. für Webserver: Beschränkter Zugriff über SFTP auf definierte Bereiche (HTML-Files …) | ||
+ | </WRAP> | ||
===== 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 | + | 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 |
==== SSH-Key unter Linux generieren ==== | ==== SSH-Key unter Linux generieren ==== | ||
Zeile 22: | Zeile 25: | ||
b = Schlüssellänge (hier 4096 Bit) \\ | b = Schlüssellänge (hier 4096 Bit) \\ | ||
- | Schlüssel | + | Sofern nicht anders angegeben, |
- | Den Schlüssel ohne Passwort zu generieren, vereinfacht das Login, da dann später | + | Den Schlüssel ohne Passwort zu generieren, vereinfacht das spätere |
+ | Soll der private Schlüssel | ||
+ | privater Schlüssel: .ssh/ | ||
+ | öffentl. Schlüssel: .ssh/ | ||
- | **Der private Schlüssel muss unbedingt vor fremdem Zugriff geschützt bleiben!** | + | <WRAP important> |
+ | **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! \\ | ||
+ | </ | ||
- | Es werden 2 Dateien angelegt: | + | Bei der Erstellung |
* id_rsa (privater Schlüssel) | * id_rsa (privater Schlüssel) | ||
* id_rsa.pub (öffentlicher Schlüssel) | * id_rsa.pub (öffentlicher Schlüssel) | ||
Zeile 33: | Zeile 43: | ||
Der öffentliche Schlüssel wird auf das entfernte System übertragen, | Der öffentliche Schlüssel wird auf das entfernte System übertragen, | ||
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. | + | Zur Übertragung auf einen Server muss der User bereits dort angelegt sein und der Zugriff ohne Schlüssel (mit Passwort) |
- | 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 < | ssh-copy-id < | ||
Zeile 42: | Zeile 53: | ||
Das Passwort vom < | Das Passwort vom < | ||
- | Im < | + | Im < |
Parallel wird auf dem lokalen (Linux-)Rechner der (neue) entfernte Host in der Datei **~/ | Parallel wird auf dem lokalen (Linux-)Rechner der (neue) entfernte Host in der Datei **~/ | ||
Zeile 63: | 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 / | ||
+ | |||
+ | ClientAliveInterval 1200 | ||
+ | ClientAliveCountMax 3 | ||
+ | | ||
+ | PermitRootLogin no | ||
+ | PasswordAuthentication no | ||
+ | Subsystem sftp internal-sftp | ||
+ | |||
+ | <WRAP important> | ||
+ | Um sich nicht selber auszusperren: | ||
+ | PermitRootLogin nur deaktivieren, | ||
+ | |||
+ | Möglicherweise gibt es Parameter in einem Unterordner, | ||
+ | z.B. / | ||
+ | Das muss dann angepasst werden. | ||
+ | </ | ||
+ | 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:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | |||
+ | fail2ban installieren | ||
+ | sudo apt update | ||
+ | |||
+ | sudo apt install fail2ban | ||
+ | |||
+ | Conf-Dateien kopieren | ||
+ | sudo cp / | ||
+ | |||
+ | sudo cp / | ||
+ | |||
+ | nur die .local-Dateien bearbeiten | ||
+ | sudo nano / | ||
+ | |||
+ | Ändern (nach [sshd]) suchen: \\ | ||
+ | [sshd] | ||
+ | backend=systemd | ||
+ | enabled = true | ||
+ | port = ssh | ||
+ | filter = sshd | ||
+ | logpath = / | ||
+ | maxretry = 3 | ||
+ | |||
+ | Über die Zeit-Parameter in der Datei / | ||
+ | # " | ||
+ | # Beispiel: Sperrung(banned) für 1 Stunde, wenn maxrtry innerhalb findtime erreicht wurde \\ | ||
+ | **bantime = 3600** \\ | ||
+ | # A host is banned if it has generated " | ||
+ | # Beispiel: Zeit (hier 3 Minuten). \\ | ||
+ | **findtime = 180** \\ | ||
+ | # " | ||
+ | **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 ' | ||
+ | |||
+ | ==== Verbindungs-Protokolle ==== | ||
+ | Quelle: https:// | ||
+ | |||
+ | 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 " | ||
+ | |||
+ | 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 | + | Login mit Passwort: |
ssh < | ssh < | ||
- | < | + | < |
+ | < | ||
- | Beim ersten | + | Login mit Key wenn der key im < |
- | ssh -i ~/ | + | ssh -i < |
+ | |||
+ | < | ||
+ | Standardpfad für den Key ist: .ssh/id_rsa wenn er dort liegt, kann "-i < | ||
+ | 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. |
- | | + | |
+ | | ||
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 **~/ | + | Beim ersten Login werden die dann bekannten Hosts lokal in **~/ |
Wurde der Schlüssel am Server geändert, oder der Server neu eingerichtet, | Wurde der Schlüssel am Server geändert, oder der Server neu eingerichtet, | ||
Zeile 104: | Zeile 216: | ||
Verbindungsart: | Verbindungsart: | ||
- | ===== SSH-Zugriff am Server konfigurieren ===== | ||
- | sudo nano / | ||
- | |||
- | ClientAliveInterval 1200 | ||
- | ClientAliveCountMax 3 | ||
- | | ||
- | PermitRootLogin no | ||
- | PasswordAuthentication no | ||
- | Subsystem sftp internal-sftp | ||
- | |||
- | PermitRootLogin nur deaktivieren, | ||
- | 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 135: | 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 < | scp -r foo < | ||
+ | |||
Quelle: https:// | Quelle: https:// | ||
- | ===== Remote-Desktop ===== | ||
- | |||
- | Auf dem lokalen Rechner aktivieren. [[open: | ||
- | |||
- | 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.1693385916.txt.gz · Zuletzt geändert: (Externe Bearbeitung)