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/06/21 12:41] – [Remote-Desktop] Kai | open:it:ssh [2025/04/08 13:46] (aktuell) – [SSH-Key unter Linux generieren] Kai | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ===== Fernzugang über SSH einrichten | + | ====== SSH-Verbindungen ====== |
- | OS: Debian 11 | + | Secure Shell oder SSH bezeichnet ein kryptographisches Netzwerkprotokoll für den sicheren Betrieb von Netzwerkdiensten über ungesicherte Netzwerke. \\ |
- | Über SSH ist es möglich eine sichere Verbindung zu einem entfernten System aufzubauen, um Befehle abzusetzen oder Daten auszutauschen. Zugriff auf einen entfernten Server (< | + | Hinweise: https:// |
- | Empfehlenswert: | + | <WRAP important> |
- | * Direkter Login von root | + | Empfehlenswerte Einstellungen für einen Server, der über das Internet erreichbar ist (z.B. ein Webserver): |
- | * Zugang nur mit Schlüssel | + | * Den direkten Zugang für "root" von Außen ausschließen. |
- | * Optional: Beschränkter Zugriff über SFTP auf definierte Bereiche | + | * Den Zugang mit Passwort von Außen generell ausschließen. |
+ | * Zugang nur mit Schlüssel. | ||
+ | * Optional | ||
+ | </ | ||
- | Hinweise: https:// | + | ===== 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-Schlüssel | + | ==== SSH-Key unter Linux generieren |
- | Für den Zugriff mit einem Schlüssel muss zunächst einer generiert werden. Dabei wird i.d.R. ein Schlüsselpaar generiert, | + | Auf einem (lokalen) Linux-System |
- | === SSH-Key unter Linux generieren === | + | sudo apt install openssh-client |
- | Auf einem lokalen Linux-System das Programm open-ssh-client | + | |
- | | + | ssh-keygen -t rsa -b 4096 |
- | + | ||
- | $ ssh-keygen -t rsa -b 4096 | + | |
t = Typ (hier rsa) \\ | t = Typ (hier rsa) \\ | ||
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 35: | 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 < |
Ersetzen: < | Ersetzen: < | ||
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 **~/ | ||
- | === SSH-Key mit Putty generieren === | + | ==== SSH-Key mit Putty generieren |
Alternativ ist es möglich, mit dem Programm [[https:// | Alternativ ist es möglich, mit dem Programm [[https:// | ||
Zeile 66: | Zeile 75: | ||
- Save private key >> jetzt mit Endung .ppk | - Save private key >> jetzt mit Endung .ppk | ||
- | ==== Login ==== | + | ===== Server konfigurieren ===== |
- | === Login über Linux-Shell === | + | ==== SSH-Zugriffe |
+ | Ggf. vorher Installieren | ||
+ | sudo apt-get install openssh-server | ||
- | Login mit Passwort oder wenn der key im < | + | sudo nano / |
- | | + | |
+ | ClientAliveCountMax 3 | ||
+ | |||
+ | PermitRootLogin no | ||
+ | PasswordAuthentication no | ||
+ | Subsystem sftp internal-sftp | ||
- | <USER>@ kann weggelassen werden, wenn < | + | <WRAP important> |
+ | Um sich nicht selber auszusperren: | ||
+ | PermitRootLogin nur deaktivieren, sofern ein anderer User Zugriff hat und PasswordAuthentication nur abschalten, sofern der Zugriff | ||
- | 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. Entweder wie oben beschrieben mit (ssh-copy-id ...) oder mit folgender Methode: | + | Möglicherweise gibt es Parameter in einem Unterordner, die die Regeln überschreiben. Möglich, dass dort in einer *.conf-Datei, \\ |
+ | z.B. /etc/ssh/ | ||
+ | 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:// | ||
- | * ~/.ssh/id_rsa | + | 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 = /var/ | ||
+ | maxretry | ||
+ | |||
+ | Ü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 | ||
+ | | ||
+ | |||
+ | 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 über Linux-Shell ==== | ||
+ | |||
+ | Login mit Passwort: | ||
+ | |||
+ | ssh < | ||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | Login mit Key wenn der key im < | ||
+ | |||
+ | ssh -i < | ||
+ | |||
+ | < | ||
+ | Standardpfad für den Key ist: .ssh/id_rsa wenn er dort liegt, kann "-i < | ||
+ | i = identity_file \\ | ||
+ | |||
+ | 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. | ||
+ | |||
+ | ssh-copy-id < | ||
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, | ||
- | | + | ssh-keygen -f " |
- | === Login mit PuTTY === | + | ==== Login mit PuTTY ==== |
Mit PuTTY die Verbindung wie folgt definieren: \\ | Mit PuTTY die Verbindung wie folgt definieren: \\ | ||
Zeile 106: | Zeile 216: | ||
Verbindungsart: | Verbindungsart: | ||
- | ==== SSH-Zugriff am Server konfigurieren ==== | ||
- | $ sudo nano / | + | ===== Dateien kopieren über SSH ===== |
- | + | ||
- | ClientAliveInterval 1200 | + | |
- | ClientAliveCountMax 3 | + | |
- | + | ||
- | PermitRootLogin no #root-login von Außen verbieten | + | |
- | PasswordAuthentication no # | + | |
- | Subsystem sftp internal-sftp | + | |
- | Match group ftpuser | + | |
- | X11Forwarding no | + | |
- | AllowTcpForwarding no | + | |
- | ChrootDirectory / | + | |
- | ForceCommand internal-sftp | + | |
- | PasswordAuthentication yes # | + | |
- | + | ||
- | 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 ==== | + | |
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. | ||
Kopieren der Datei “foobar.txt” von einem entfernten Rechner auf den lokalen Rechner. | Kopieren der Datei “foobar.txt” von einem entfernten Rechner auf den lokalen Rechner. | ||
- | $ scp < | + | |
Kopieren der Datei “foobar.txt” vom lokalen Rechner auf einen entfernten Rechner. | Kopieren der Datei “foobar.txt” vom lokalen Rechner auf einen entfernten Rechner. | ||
- | $ scp foobar.txt < | + | |
Kopieren der Datei “foobar.txt” vom Remote-Host “< | Kopieren der Datei “foobar.txt” vom Remote-Host “< | ||
- | $ scp < | + | |
Einzelne Verzeichnisse kopieren. \\ | Einzelne Verzeichnisse kopieren. \\ | ||
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 < | + | |
Quelle: https:// | Quelle: https:// | ||
- | ==== Remote-Desktop ==== | ||
- | |||
- | Auf dem lokalen Rechner aktivieren. Firewall ufw 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.1687344112.txt.gz · Zuletzt geändert: (Externe Bearbeitung)