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/29 15:29] – Externe Bearbeitung 127.0.0.1 | open:it:ssh [2025/04/08 13:46] (aktuell) – [SSH-Key unter Linux generieren] Kai | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== | + | ====== SSH-Verbindungen |
- | + | ||
- | ===== Firewall ===== | + | |
- | UFW = Uncomplicated Firewall \\ | + | |
- | + | ||
- | Firewall installieren | + | |
- | sudo apt install ufw | + | |
- | + | ||
- | Zugriff der Standards erlauben (unbedingt 22/ssh oder OpenSSH vor dem Start von UFW, sonst ggf. kein Zugriff mehr auf den Server!!!!) | + | |
- | Zugriff per SSH | + | |
- | sudo ufw allow OpenSSH | + | |
- | oder | + | |
- | sudo ufw allow ssh | + | |
- | + | ||
- | Weitere Freigabe-Ports | + | |
- | + | ||
- | * 22 = SSH/FTP | + | |
- | * 80 = HTTP | + | |
- | * 443 = HTTPS | + | |
- | * 445 = File-Server, | + | |
- | * 3306 = MySQL-Datenbank (i.d.R. nur als lokaler Zugriff erforderlich) | + | |
- | * 51820 = VPN, siehe [[open: | + | |
- | + | ||
- | Freigabe auch über Port-Nummer möglich, z.B.: | + | |
- | sudo ufw allow 80 | + | |
- | Firewall aktivieren | + | |
- | sudo ufw enable | + | |
- | Firewall deaktivieren | + | |
- | sudo ufw disable | + | |
- | Firewall neu starten | + | |
- | sudo ufw reload | + | |
- | Status anzeigen | + | |
- | sudo ufw status | + | |
- | numbered = durchnummeriert. Nummern werden zum Löschen einzelner Freigaben benötigt. \\ | + | |
- | sudo ufw status numbered | + | |
- | Genutzte Ports anzeigen | + | |
- | ss -nptl | + | |
- | Deaktivieren einzelner Freigaben | + | |
- | sudo ufw deny ssh | + | |
- | Löschen einzelner Freigaben | + | |
- | sudo ufw delete < | + | |
- | < | + | |
- | + | ||
- | ===== SSH ===== | + | |
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 |
Auf einem (lokalen) Linux-System das Programm open-ssh-client installieren und Schlüssel generieren. | Auf einem (lokalen) Linux-System das Programm open-ssh-client installieren und Schlüssel generieren. | ||
Zeile 65: | 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 76: | 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 85: | 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 **~/ | ||
- | === 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 107: | 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 <REMOTEHOST> hinterlegt ist: | + | 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 über Linux-Shell ==== | ||
+ | |||
+ | 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 131: | Zeile 200: | ||
ssh-keygen -f " | ssh-keygen -f " | ||
- | === Login mit PuTTY === | + | ==== Login mit PuTTY ==== |
Mit PuTTY die Verbindung wie folgt definieren: \\ | Mit PuTTY die Verbindung wie folgt definieren: \\ | ||
Zeile 147: | Zeile 216: | ||
Verbindungsart: | Verbindungsart: | ||
- | ==== SSH-Zugriff am Server konfigurieren ==== | ||
- | sudo nano / | + | ===== Dateien kopieren über SSH ===== |
- | + | ||
- | 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 ==== | + | |
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 178: | 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. 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.1693315765.txt.gz · Zuletzt geändert: (Externe Bearbeitung)