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 [2024/12/22 00:13] – [Schutz vor Angriffen mit fail2ban] Kai | open: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:// | ||
<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 | + | * Den direkten Zugang für "root" von Außen ausschließen. |
- | * Zugang nur mit Schlüssel | + | * Den Zugang mit Passwort von Außen generell ausschließen. |
- | * Optional z.B. für Webserver: Beschränkter Zugriff über SFTP auf definierten Bereich | + | * Zugang nur mit Schlüssel. |
+ | * Optional z.B. für Webserver: Beschränkter Zugriff über SFTP auf definierte Bereiche | ||
</ | </ | ||
- | Hinweise: https:// | ||
- | ===== Schutz vor Angriffen mit fail2ban | + | ===== 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 miteinander agiert. Der private Schlüssel bleibt lokal und geheim, der öffentliche wird an externe Systeme verteilt. | ||
+ | |||
+ | ==== SSH-Key unter Linux generieren ==== | ||
+ | Auf einem (lokalen) Linux-System das Programm open-ssh-client installieren und Schlüssel generieren. | ||
+ | |||
+ | sudo apt install openssh-client | ||
+ | |||
+ | ssh-keygen -t rsa -b 4096 | ||
+ | |||
+ | t = Typ (hier rsa) \\ | ||
+ | b = Schlüssellänge (hier 4096 Bit) \\ | ||
+ | |||
+ | Sofern nicht anders angegeben, liegt der neue Schlüssel automatisch im (versteckten) Verzeichnis ~/.ssh/ \\ | ||
+ | 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 werden, um ihn auch von dort nutzen zu können: Auf dem neuen System müssen die Zugriffsrechte genauso eingeschränkt werden. Anderfalls gibt es Verbindungsprobleme.\\ | ||
+ | privater Schlüssel: .ssh/id_rsa -rw------- Owner & Group = User \\ | ||
+ | öffentl. Schlüssel: .ssh/ | ||
+ | |||
+ | <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! \\ | ||
+ | </ | ||
+ | |||
+ | Bei der Erstellung werden 2 Dateien angelegt: | ||
+ | * id_rsa (privater Schlüssel) | ||
+ | * id_rsa.pub (öffentlicher Schlüssel) | ||
+ | |||
+ | 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.\\ | ||
+ | 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 (mit Passwort) muss temporär freigegeben werden. \\ | ||
+ | Den öffentlichen Schlüssel (id_rsa.pub) wie folgt auf den Server übertragen: | ||
+ | |||
+ | ssh-copy-id < | ||
+ | |||
+ | Ersetzen: < | ||
+ | Das Passwort vom < | ||
+ | |||
+ | Im < | ||
+ | Parallel wird auf dem lokalen (Linux-)Rechner der (neue) entfernte Host in der Datei **~/ | ||
+ | |||
+ | ==== SSH-Key mit Putty generieren ==== | ||
+ | Alternativ ist es möglich, mit dem Programm [[https:// | ||
+ | |||
+ | Die Datei hat folgende Struktur (alles hintereinander): | ||
+ | |||
+ | * ssh-rsa | ||
+ | * rsa-pub-key << der eigentliche Schlüssel aus Puttygen \\ | ||
+ | * Key Kommentar << Im Textblock von puttygen bereits enthalten\\ | ||
+ | |||
+ | Liegt bereits ein SSH-Key vor (z.B. erstellt wie oben beschrieben), | ||
+ | Programm PuTTYgen: Private-key importieren und als PuTTY-private-key speichern. \\ | ||
+ | |||
+ | Schlüssel von PuTTY können von diversen Systemen (FileZilla, etc.) genutzt werden, sofern der Public-Key im entfernten Server hinterlegt ist. Da dieser Schlüssel kopier- und übertragbar ist, sollte er immer zusätzlich mit einem Passwort geschützt sein. | ||
+ | |||
+ | Für Konvertierung Programm **PuTTYgen** aufrufen. | ||
+ | |||
+ | - Load an existing private key file | ||
+ | - 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:// | ||
Zeile 37: | Zeile 131: | ||
logpath = / | logpath = / | ||
maxretry = 3 | 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 | Installieren | ||
Zeile 49: | Zeile 153: | ||
sudo zgrep ' | sudo zgrep ' | ||
- | ===== Verbindungs-Protokolle | + | ==== Verbindungs-Protokolle ==== |
Quelle: https:// | Quelle: https:// | ||
Zeile 65: | Zeile 169: | ||
Use Ctrl-C to exit out of the log monitor. | Use Ctrl-C to exit out of the log monitor. | ||
- | |||
- | ===== 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 miteinander agiert. Der private Schlüssel bleibt lokal und geheim, der öffentliche wird an externe Systeme verteilt. | ||
- | |||
- | ==== SSH-Key unter Linux generieren ==== | ||
- | Auf einem (lokalen) Linux-System das Programm open-ssh-client installieren und Schlüssel generieren. | ||
- | |||
- | sudo apt install openssh-client | ||
- | |||
- | ssh-keygen -t rsa -b 4096 | ||
- | |||
- | t = Typ (hier rsa) \\ | ||
- | b = Schlüssellänge (hier 4096 Bit) \\ | ||
- | |||
- | Schlüssel liegt 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 zu einem anderen System transferiert, | ||
- | |||
- | <WRAP important> | ||
- | **Der private Schlüssel muss unbedingt vor fremdem Zugriff geschützt bleiben!** | ||
- | </ | ||
- | Es werden 2 Dateien angelegt: | ||
- | * id_rsa (privater Schlüssel) | ||
- | * id_rsa.pub (öffentlicher Schlüssel) | ||
- | |||
- | 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.\\ | ||
- | |||
- | 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: | ||
- | |||
- | ssh-copy-id < | ||
- | |||
- | Ersetzen: < | ||
- | Das Passwort vom < | ||
- | |||
- | Im < | ||
- | Parallel wird auf dem lokalen (Linux-)Rechner der (neue) entfernte Host in der Datei **~/ | ||
- | |||
- | ==== SSH-Key mit Putty generieren ==== | ||
- | Alternativ ist es möglich, mit dem Programm [[https:// | ||
- | |||
- | Die Datei hat folgende Struktur (alles hintereinander): | ||
- | |||
- | * ssh-rsa | ||
- | * rsa-pub-key << der eigentliche Schlüssel aus Puttygen \\ | ||
- | * Key Kommentar << Im Textblock von puttygen bereits enthalten\\ | ||
- | |||
- | Liegt bereits ein SSH-Key vor (z.B. erstellt wie oben beschrieben), | ||
- | Programm PuTTYgen: Private-key importieren und als PuTTY-private-key speichern. \\ | ||
- | |||
- | Schlüssel von PuTTY können von diversen Systemen (FileZilla, etc.) genutzt werden, sofern der Public-Key im entfernten Server hinterlegt ist. Da dieser Schlüssel kopier- und übertragbar ist, sollte er immer zusätzlich mit einem Passwort geschützt sein. | ||
- | |||
- | Für Konvertierung Programm **PuTTYgen** aufrufen. | ||
- | |||
- | - Load an existing private key file | ||
- | - Save private key >> jetzt mit Endung .ppk | ||
===== 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 162: | Zeile 216: | ||
Verbindungsart: | Verbindungsart: | ||
- | ===== SSH-Zugriff am Server konfigurieren ===== | ||
- | 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 | ||
===== 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 202: | 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:// | ||
- | |||
open/it/ssh.1734822833.txt.gz · Zuletzt geändert: 2024/12/22 00:13 von Kai