Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung Nächste ÜberarbeitungBeide Seiten der Revision | ||
netzwerke:ssh [2018/06/25 13:26] – [DSA-keys erlauben] st | netzwerke:ssh [2022/12/31 22:47] – [SSH-Passphrase hinzufügen / ändern] st | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== SSH (Secure Shell) ====== | ||
+ | SSH bietet einen sicheren (da verschlüsselten) Zugang zu einem entfernten Rechner/ | ||
+ | Somit kann weder mitgelesen werden, noch kann sich jemand (unbemerkt) in die Mitte setzen '' | ||
+ | |||
+ | Mit SSH lassen sich Dateien austauschen (mit sftp, scp) und Tunnel für unverschlüsselte Protokolle einrichten. Die Daten können auf Wunsch komprimiert übertragen werden und man kann Bildschirminhalte grafischer Programme (vom [[linux: | ||
+ | |||
+ | |||
+ | **Syntax:** | ||
+ | Ein minimaler Aufruf folgt dem Schema | ||
+ | ssh SERVER | ||
+ | dabei ist die Angabe des Benutzers (-l Benutzer) optional, wenn keiner angegeben wurde, wird der aktuelle Benutzername genommen. | ||
+ | ssh -l Benutzer SERVER | ||
+ | |||
+ | Bei langen Befehlszeilen lässt sich Zeit durch vorher festgelegte Optionen in Konfigurationsdateien oder über Aliase sparen. | ||
+ | |||
+ | |||
+ | ===== Dateiaustausch über SSH ===== | ||
+ | |||
+ | **Dateien austauschen: | ||
+ | sftp | ||
+ | eignet sich gut für einzelne und mehrere Dateien (Eingabe '' | ||
+ | * Für das übertragen kompletter verzeichnis-struktionen taugt der Befehl '' | ||
+ | |||
+ | **download: | ||
+ | scp benutzer@entfernterRechner:/ | ||
+ | **upload:** | ||
+ | scp / | ||
+ | |||
+ | :!: Mit der Option -r lassen sich rekursiv ganze Verzeichnisse übertragen. | ||
+ | |||
+ | |||
+ | ===== SSH Portweiterleitung (forwarding) ===== | ||
+ | Eine sehr nützliche Eigenschaft von SSH ist die Möglichkeit (unverschlüsselte) Protokolle durch den verschlüsselten SSH-Tunnel zu schicken (" | ||
+ | |||
+ | ssh user@remote.host -L 8080: | ||
+ | |||
+ | Dafür gibt man den lokalen Port an (hier 8080) und nach dem Doppelpunkt die Adresse an die es geleitet werden soll (hier wird " | ||
+ | Der Parameter " | ||
+ | |||
+ | Manche Programm (wie Vinagre siehe Screenshot) bieten dies als Funktion an. | ||
+ | {{: | ||
+ | |||
+ | |||
+ | ===== SSH VPN ===== | ||
+ | |||
+ | Es gibt auch die Möglichekeit mit OpenSSH 4.3 eine Art [[security: | ||
+ | |||
+ | |||
+ | ===== X-Server über SSH ===== | ||
+ | Programmfenster grafischer (X-)Programme können auch über SSH übertragen werden. Dazu ruft man ssh zusätzlich mit der Option '' | ||
+ | |||
+ | Also normalerweise | ||
+ | ssh -X SERVER | ||
+ | oder mit slogin: | ||
+ | slogin -X SERVER | ||
+ | |||
+ | Die Variable wird dann auf dem Host gleich korrekt gesetzt. In der SSH-Konfiguration muss X11Forwarding aktiviert sein (standard). | ||
+ | < | ||
+ | X11Forwarding yes | ||
+ | X11DisplayOffset 10 | ||
+ | </ | ||
+ | '' | ||
+ | |||
+ | :!: Auf dem Server dessen grafisches Programm übertragen werden soll müssen einige Bibliotheken des Xserver installiert sein. Bei [[debian: | ||
+ | |||
+ | |||
+ | ===== Links ===== | ||
+ | |||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | Teil 1: Grundlagen]] ( [[http:// | ||
+ | * [[http:// | ||
+ | * **[[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | |||
+ | ===== SSH Client- und Serversoftware ===== | ||
+ | |||
+ | ==== *nix-kompatible ==== | ||
+ | |||
+ | === Clients === | ||
+ | * OpenSSH-Client | ||
+ | * Kssh: [[linux: | ||
+ | * lsh-client | ||
+ | * putty für X | ||
+ | * secpanel | ||
+ | |||
+ | === Server === | ||
+ | |||
+ | * OpenSSH-Server: | ||
+ | * [[https:// | ||
+ | * lsh-server | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ==== SSH unter Windows ==== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | === Clients === | ||
+ | |||
+ | * Windows 10 | ||
+ | * Version 0.0.1.0< | ||
+ | * aktuelle Version finden< | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[wp> | ||
+ | |||
+ | === Server === | ||
+ | |||
+ | * Cygwin bzw. der [[http:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | === Befehle von Windows aus unter Linux ausführen === | ||
+ | |||
+ | |||
+ | - putty key generator -> " | ||
+ | - "load existing private key file": | ||
+ | - Dateipfad angeben | ||
+ | - als ppk-Datei speichern | ||
+ | - Key im Zielsystem hinterlegen: | ||
+ | - interaktiv mit winscp einloggen | ||
+ | - Verzeichnis /root/.ssh anlegen | ||
+ | - den öffentlichen Schlüssel simpel umbenannt als " | ||
+ | - in der Batchdatei alle Systeme mit jeweils einem Befehl eintragen: | ||
+ | - Kommando ((Befehl " | ||
+ | |||
+ | |||
+ | ===== Authentifizierungsarten ===== | ||
+ | |||
+ | Zum besseren Verständnis vorher die **Authentifizierung des Servers**: | ||
+ | |||
+ | Oft bekommt man beim (ersten) verbinden auf einen Server folgende Meldung: | ||
+ | < | ||
+ | user@hostname: | ||
+ | The authenticity of host ' | ||
+ | RSA key fingerprint is 06: | ||
+ | Are you sure you want to continue connecting (yes/no)? | ||
+ | </ | ||
+ | Das bedeutet, dass er den Host bisher (unter dieser IP) nicht kennt und nicht gewähleistet werden kann, das dies auch wirklich der Server ist, zu dem man wollte. Daher sollte man nur in (gut) geschützten Netzwerken " | ||
+ | |||
+ | Wenn man " | ||
+ | < | ||
+ | Warning: Permanently added ' | ||
+ | </ | ||
+ | D.h. er fragt in Zukunft nicht mehr, da er in einer Liste von bekannten Server (in der Datei '' | ||
+ | |||
+ | :!: Bei Änderungen des Schlüssels auf dem Server (oder schlimmer: wenn ein Angreifer so tut als ob er der Server ist) wird der Verbindungsaufbau verweigert: | ||
+ | < | ||
+ | $ ssh SERVER | ||
+ | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | ||
+ | @ | ||
+ | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | ||
+ | The RSA host key for SERVER has changed, | ||
+ | and the key for the according IP address SERVER-IP | ||
+ | is unknown. This could either mean that | ||
+ | DNS SPOOFING is happening or the IP address for the host | ||
+ | and its host key have changed at the same time. | ||
+ | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | ||
+ | @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! | ||
+ | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | ||
+ | IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! | ||
+ | Someone could be eavesdropping on you right now (man-in-the-middle attack)! | ||
+ | It is also possible that the RSA host key has just been changed. | ||
+ | The fingerprint for the RSA key sent by the remote host is | ||
+ | 01: | ||
+ | Please contact your system administrator. | ||
+ | Add correct host key in / | ||
+ | Offending key in / | ||
+ | RSA host key for SERVER has changed and you have requested strict checking. | ||
+ | Host key verification failed. | ||
+ | </ | ||
+ | Wenn man sicher ist, dass die Änderung rechtens ist (z.B. weil man sie selber veranlasst hat ;-)), löscht man aus seiner .ssh/ | ||
+ | |||
+ | Die verantwortliche Option '' | ||
+ | |||
+ | |||
+ | ==== Passwortauthentifizierung ==== | ||
+ | Es ist das Standardverhalten. | ||
+ | |||
+ | Der Server authentifiziert sich über seinen " | ||
+ | |||
+ | |||
+ | ==== Public-Key-Authentifizierung ==== | ||
+ | |||
+ | Was aber wenn ich nicht ständig mein Passwort (wenn auch verschlüsselt) durch das Netz schicken will? | ||
+ | |||
+ | Das Konzept in Kurzform: Der Benutzer erzeugt ein Schlüsselpaar (einen öffentlichen, | ||
+ | |||
+ | Der entfernte Rechner authentifiziert sich auch selbst: gleiches Prinzip - öffentlicher Schlüssel bei uns, privater Schlüssel auf entferntem Rechner. | ||
+ | |||
+ | Die Einstellung '' | ||
+ | |||
+ | Der Client kann übrigens mit der Einstellung " | ||
+ | |||
+ | < | ||
+ | Host server.tld | ||
+ | | ||
+ | </ | ||
+ | |||
+ | :!: **Achtung: | ||
+ | |||
+ | === Vorgehensweise === | ||
+ | |||
+ | == ssh-copy-id == | ||
+ | Das Werkzeug ssh-copy-id nimmt alle Schritte (vom Client aus) automatisch vor. | ||
+ | |||
+ | - man legt ggf. einen eigenen Benutzer an | ||
+ | - RSA-Schlüssel erzeugen (dsa-keys sind unsicher; Standard sind 2048 Bit, hier auf 3072 Bit erhöht) <code bash> | ||
+ | ssh-keygen -t rsa -b 3072 | ||
+ | Generating public/ | ||
+ | Enter file in which to save the key (/ | ||
+ | Enter passphrase (empty for no passphrase): | ||
+ | Enter same passphrase again: | ||
+ | Your identification has been saved in id_rsa. | ||
+ | Your public key has been saved in id_rsa.pub. | ||
+ | The key fingerprint is: | ||
+ | SHA256: | ||
+ | The key's randomart image is: | ||
+ | +---[RSA 3072]----+ | ||
+ | | | ||
+ | | o..o+O %+. . | | ||
+ | | .+oo= ooo+. | | ||
+ | | | ||
+ | | . o S. o | | ||
+ | | . = o | | ||
+ | | * . | | ||
+ | | | ||
+ | | | | ||
+ | +----[SHA256]-----+ | ||
+ | </ | ||
+ | - nun kopieren wir den/die Schlüssel auf den Server: man ruft < | ||
+ | |||
+ | |||
+ | == manuell == | ||
+ | |||
+ | * Auf dem Host | ||
+ | - man legt ggf. einen eigenen Benutzer an | ||
+ | - man ruft '' | ||
+ | $ ssh-keygen -d | ||
+ | Generating public/ | ||
+ | Enter file in which to save the key (/ | ||
+ | Created directory '/ | ||
+ | Enter passphrase (empty for no passphrase): | ||
+ | Enter same passphrase again: | ||
+ | Your identification has been saved in / | ||
+ | Your public key has been saved in / | ||
+ | The key fingerprint is: | ||
+ | 01: | ||
+ | </ | ||
+ | - man kopiert ''/ | ||
+ | - | ||
+ | * auf den Clients: | ||
+ | - den öffentlichen Schlüssel an die authorized_keys anhängen:< | ||
+ | |||
+ | :!: Das Verzeichnis ~/.ssh und die Datei ~/ | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | |||
+ | == Konvertierung von SSH2 zu OpenSSH Format == | ||
+ | |||
+ | < | ||
+ | ---- BEGIN SSH2 PUBLIC KEY ---- | ||
+ | Comment: " | ||
+ | AAAAB3NzaC1yc2EAAAABJQAAAIBmhLUTJiP[und so weiter]== | ||
+ | ---- END SSH2 PUBLIC KEY ---- | ||
+ | </ | ||
+ | zu | ||
+ | < | ||
+ | |||
+ | Das erledigt dieser folgende Befehl: '' | ||
+ | |||
+ | ==== ForwardAgent / ProxyCommand ==== | ||
+ | |||
+ | Im Normlfall meldet man sich direkt an einem Server mit seinem SSH-Schlüssel an. | ||
+ | Manchmal sind jedoch interne Server nicht direkt erreichbar sondern müssen über einen Gateway/ | ||
+ | |||
+ | Für diesen Fall ist der ForwardAgent gedacht, er kann global bzw. besser für bestimmte Hosts aktiviert werden: | ||
+ | |||
+ | <code bash> | ||
+ | | ||
+ | |||
+ | Diese Methode hat jedoch einen **gravierenden Sicherheitsnachteil**: | ||
+ | |||
+ | Das Risiko ist jedoch gar nicht nötig, mit ProxyCommand lässt sich eine vergleichbare Funktionalität ohne Abstriche bei der Sicherheit bewerkstelligen. | ||
+ | |||
+ | <code bash> | ||
+ | Host jumphost | ||
+ | Hostname jumphost.domain.tld | ||
+ | |||
+ | Host intern | ||
+ | Hostname intern.domain.tld | ||
+ | Port 2222 | ||
+ | ProxyCommand ssh -W %h:%p jumphost.domain.tld | ||
+ | </ | ||
+ | |||
+ | Somit ist nun intern.domain.tld mittels pubkey über den jumphost erreichbar <code bash>ssh intern</ | ||
+ | |||
+ | |||
+ | ==== Hostbased ==== | ||
+ | Die Authentifizierung erfolgt anhand des Hostnamens und dem Benutzer, i. d. R. ohne weitere Passwortabfrage. | ||
+ | |||
+ | |||
+ | ==== Keyboard-Interactive ==== | ||
+ | FIXME incl. PAM | ||
+ | |||
+ | |||
+ | ==== Kerberos/ | ||
+ | |||
+ | Die Authentifizierung wird durch ein [[netzwerke: | ||
+ | |||
+ | ==== Smartcards ==== | ||
+ | Man kann die privaten Schlüssel auf Smartcards speichern. OpenSSH unterstützt Cyberflex-Smartcards sowie [[http:// | ||
+ | |||
+ | |||
+ | ===== Konfiguration ===== | ||
+ | Bei OpenSSH werden Einstellungen | ||
+ | * für den (openssh-) Server: In der Datei ''/ | ||
+ | * für (openssh-) Client: Systemweit in den Dateien ''/ | ||
+ | vorgenommen. | ||
+ | |||
+ | Dokumentation findet sich auch mit dem Befehl <code bash>man 5 ssh_config</ | ||
+ | ==== wichtige Dateien von SSH ==== | ||
+ | |||
+ | Die folgenden Dateien werden von SSH (und darauf basierenden Programmen wie scp) benutzt. | ||
+ | |||
+ | ^ Systemweite Einstellungen | ||
+ | ^ Pfad ^ Funktion ^ | ||
+ | | / | ||
+ | | / | ||
+ | | / | ||
+ | | / | ||
+ | | / | ||
+ | | / | ||
+ | | / | ||
+ | |||
+ | |||
+ | ^ Benutzerspezifische Einstellungen | ||
+ | ^ Pfad ^ Funktion ^ | ||
+ | | ~/ | ||
+ | | ~/ | ||
+ | | ~/ | ||
+ | | ~/ | ||
+ | | ~/.ssh/rc | wie ''/ | ||
+ | | ~/ | ||
+ | |||
+ | ^ Schlüssel der Benutzer | ||
+ | ^ private Schlüssel | ||
+ | | ~/ | ||
+ | | ~/ | ||
+ | | ~/ | ||
+ | |||
+ | :!: Die privaten Schlüssel dürfen nur vom Benutzer lesbar sein, sonst werden diese ignoriert. | ||
+ | |||
+ | ^ öffentliche Schlüssel^^ | ||
+ | | ~/ | ||
+ | | ~/ | ||
+ | | ~/ | ||
+ | |||
+ | |||
+ | ^ rhost-Authentifizierung (veraltet, unsicher) | ||
+ | | / | ||
+ | | / | ||
+ | | ~/.rhosts | enthält Rechnernamen / Benutzer, darf nicht für andere lesbar sein | | ||
+ | | ~/.shosts | wie ''/ | ||
+ | |||
+ | :!: Anmerkung: ~ steht für das Homeverzeichnis. | ||
+ | |||
+ | ==== SSH-Keys für den SSH-Dienst neu erzeugen ==== | ||
+ | |||
+ | <code bash> | ||
+ | ssh-keygen -t ed25519 -f / | ||
+ | ssh-keygen -t rsa -b 2048 -f / | ||
+ | ssh-keygen -t ecdsa -b 521 -f / | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== SSH-Passphrase hinzufügen / ändern ==== | ||
+ | |||
+ | Der private Schlüssel sollte mit einem Passwort bzw. einer Passphrase geschützt werden. | ||
+ | |||
+ | Überprüfen ob Passphrase gesetzt (wenn ja, dann Fehlermeldung " | ||
+ | |||
+ | Änderungen der Passphrase geht einfach mit '' | ||
+ | |||
+ | <code bash> | ||
+ | |||
+ | bzw. bei einem RSA-Schlüssel: | ||
+ | |||
+ | <code bash> | ||
+ | |||
+ | |||
+ | pkcs# | ||
+ | ==== SSH-Passphrase entfernen ==== | ||
+ | |||
+ | RSA: <code bash> | ||
+ | ECDSA: ? | ||
+ | ED25519:? | ||
+ | ==== Verbindungsabbrüche verhindern ==== | ||
+ | |||
+ | Bei häufigen **Verbindungsabbrüchen** kann man ClientAliveInterval (seit OpenSSH 3.8 auch ServerAliveInterval) statt TCPKeepAlive setzen. Das standardmäßige "'' | ||
+ | |||
+ | **Server**-config (systemweit: | ||
+ | < | ||
+ | TCPKeepAlive no | ||
+ | ClientAliveInterval 180 | ||
+ | </ | ||
+ | |||
+ | **Client**-config (systemweit: | ||
+ | < | ||
+ | TCPKeepAlive no | ||
+ | ServerAliveInterval 180 | ||
+ | </ | ||
+ | Anmerkung: ServerAliveInterval ist seit OpenSSH 3.8 dabei. | ||
+ | |||
+ | ==== Einstellungen lokal abspeichern ==== | ||
+ | Lange Parameterlisten kann man vermeiden indem man in Konfigurationsdateien Einstellungen hinterlegt. Diese werden Systemweit in den Dateien ''/ | ||
+ | |||
+ | < | ||
+ | Host *.domain.de | ||
+ | Port 12345 | ||
+ | User ich | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Somit reicht der Aufruf von ssh subdomain.domain.de ohne die o.g. Einstellungen noch extra zu übergeben. | ||
+ | |||
+ | Auch Hostname+Domain kann man schon vorgeben, somit verkürzt sich die Kommandozeile auf '' | ||
+ | < | ||
+ | host RECHNER | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ==== Rechner mit externen Tools verwalten ==== | ||
+ | Alternativ zur Konfiguration der einzelnen Hosts kann man spezialisierte Tools benutzen. Dann wird der Aufruf über " | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ==== SSH absichern ==== | ||
+ | Als Minimum würde ich die folgenden Einstellungen in der Datei ''/ | ||
+ | |||
+ | - **nur Protokollversion 2** benutzen < | ||
+ | - **keine root-logins** zulassen < | ||
+ | - **Distributionsbanner** abschalten (Beispiel: SSH-2.0-OpenSSH_5.9p1 // | ||
+ | - [[ubuntu: | ||
+ | - RHEL: < | ||
+ | - **nur bestimmten Benutzern den Login erlauben**: < | ||
+ | - **nur bestimmten Gruppen den Login erlauben**: < | ||
+ | - **bestimmten Benutzern den Login verbieten**: | ||
+ | - maximale **Anzahl der Loginversuche** begrenzen: Nur 3 Versuche (pro Verbindung) zulassen | ||
+ | |||
+ | === verwendeten Pubkey loggen === | ||
+ | |||
+ | Vorbereitung: | ||
+ | |||
+ | < | ||
+ | |||
+ | In der Datei ''/ | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | if [ " | ||
+ | logger -pauth.info "Login by unknown user as \" | ||
+ | else | ||
+ | logger -pauth.info "Login by \" | ||
+ | fi | ||
+ | </ | ||
+ | === chroot SSH === | ||
+ | |||
+ | Wer ganz sicher gehen will, sperrt SSH in einen Käfig (chroot von change root). Damit kann der eingesperrte Benutzer nur innerhalb seiner Ordner navigieren. Allerdings bietet bisher keine Distribution diese Funktionen von Haus aus an, also muss man selber eine gepatchte Version kompilieren und installieren. | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | === Port-Knocking === | ||
+ | Durch [[http:// | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== Brute-force-Attacken auf SSH ==== | ||
+ | Wenn man SSH auf den Standard-Port betreibt, sieht man in den Log-Dateien eine Vielzahl von (fehlgeschlagenen) Login-Versuchen. Meist werden Standardbenutzer wie root und Standardpasswörter probiert. | ||
+ | |||
+ | Zur Abwehr kann man [[ids: | ||
+ | |||
+ | Sauberer ist meist eine spezielle Firewallregel. Damit spart man sich die möglichen Sicherheitslücken durch das parsen der Log-Dateien die die Tools zwangsläufig durchführen müssen. Der Programmcode der im Bereich des Kernels angesiedelten Firewalls ist besser auf Sicherheitslücken überprüft. | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | :!: Evtl. ist es sinnvoll **auf einen hohen Port wechseln** (wenn das für die Benutzer ok ist, hier im Beispiel auf 54321): < | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ==== Authentifizierung nur per Public-key ==== | ||
+ | |||
+ | Authentifizierung per Passwort abschalten? Dann aber vorher den pub-key generieren + auf den SSH-Server kopieren (ssh-copy)! | ||
+ | |||
+ | <code bash> | ||
+ | echo " | ||
+ | echo " | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== SSH-Sitzungen auf Befehle und Hosts einschränken ==== | ||
+ | |||
+ | Die Datei '' | ||
+ | * Den Login auf eine IP oder einen DNS-Namen zu begrenzen (hier backup.server.tld mit " | ||
+ | * Benutzer auf bestimmte Befehle festzulegen (hier den Befehl date mit command=date). Durch die Variable $SSH_ORIGINAL_COMMAND könnte ein Skript den ursprünglich übergebenen Befehl auswerten. | ||
+ | |||
+ | < | ||
+ | from=" | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== upload-Benutzer auf SFTP beschränken ==== | ||
+ | |||
+ | addgroup sftponly | ||
+ | -> Benutzer zur Gruppe hinzufügen | ||
+ | |||
+ | SSHD-Config: | ||
+ | |||
+ | < | ||
+ | Subsystem sftp internal-sftp | ||
+ | Match Group sftponly | ||
+ | ChrootDirectory ~ | ||
+ | ForceCommand internal-sftp -l INFO | ||
+ | AllowTcpForwarding no | ||
+ | </ | ||
+ | |||
+ | Ergebnis: | ||
+ | |||
+ | <code bash>ssh webuser@HOST</ | ||
+ | < | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/sh | ||
+ | # | ||
+ | # erstellt einen sftponly-Benutzer, | ||
+ | # $home darf nicht vom Benutzer beschreibbar sein (wg. chroot), Unterordner schon! | ||
+ | # | ||
+ | if [ -z $1 ]; then | ||
+ | echo " | ||
+ | exit 1 | ||
+ | fi | ||
+ | |||
+ | if [ "`id -u`" -ne 0 ]; then | ||
+ | echo " | ||
+ | fi | ||
+ | |||
+ | user=" | ||
+ | home="/ | ||
+ | |||
+ | if [ -d " | ||
+ | echo " | ||
+ | exit 1 | ||
+ | fi | ||
+ | |||
+ | useradd -d " | ||
+ | # adduser --home " | ||
+ | if [ $? -ne 0 ] ; then | ||
+ | echo " | ||
+ | exit 1 | ||
+ | fi | ||
+ | |||
+ | if [ ! -d " | ||
+ | mkdir " | ||
+ | if [ $? -ne 0 ]; then | ||
+ | echo " | ||
+ | exit 1 | ||
+ | fi | ||
+ | fi | ||
+ | chown root " | ||
+ | chgrp " | ||
+ | chmod 750 " | ||
+ | |||
+ | # ssh: | ||
+ | ssh_config_dir=" | ||
+ | ssh_authorized_keys=" | ||
+ | ssh_austausch_dir=" | ||
+ | |||
+ | mkdir " | ||
+ | chown root " | ||
+ | chgrp " | ||
+ | chmod 750 " | ||
+ | |||
+ | # Sonderanforderung: | ||
+ | touch " | ||
+ | chmod 640 " | ||
+ | chown root " | ||
+ | chgrp " | ||
+ | |||
+ | echo " | ||
+ | |||
+ | # austausch-Ordner | ||
+ | mkdir " | ||
+ | chmod 750 " | ||
+ | chown " | ||
+ | chgrp " | ||
+ | chmod g+w " | ||
+ | </ | ||
+ | |||
+ | ==== SFTP-Benutzung ==== | ||
+ | |||
+ | einzelne Datei: | ||
+ | * download: sftp {user}@{host}: | ||
+ | * upload: sftp {user}@{host}: | ||
+ | |||
+ | https:// | ||
+ | https:// | ||
+ | ==== schnellerer Verbindungsaufbau (ControlMaster) ==== | ||
+ | [[http:// | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ==== DSA-keys erlauben ==== | ||
+ | |||
+ | OpenSSH 7.0 deaktivert dsa-Schlüssel standardmäßig (weil diese unsicher sind ((Schlüssellänge 1024Bit fix und ein schwacher Zufallszahlengenerator führt zur Möglichkeit den privaten Schlüssel nur durch passives Mitschneiden des Verkehrs zu erlangen)): | ||
+ | < | ||
+ | ===== spezielle Anwendungen ===== | ||
+ | |||
+ | ==== sshfs ==== | ||
+ | Mit [[wpde> | ||
+ | |||
+ | [[http:// | ||
+ | |||
+ | === Links === | ||
+ | |||
+ | * [[https:// | ||
+ | |||
+ | === mounten === | ||
+ | |||
+ | sshfs ssh-konto@ssh-server: | ||
+ | |||
+ | Für den Befehl muss unter Ubuntu das Paket sshfs mit < | ||
+ | |||
+ | Nützlich können sich die Optionen (Parameter -o) und dann die folgenden Schlüsselwörter: | ||
+ | * '' | ||
+ | * transform_symlinks und follow_symlinks verbessern das Verhalten bei Symlinks | ||
+ | * '' | ||
+ | |||
+ | Beispielaufruf: | ||
+ | <code bash> | ||
+ | |||
+ | Ein permanenter Eintrag in der /etc/fstab erleichtert das mounten enorm: | ||
+ | < | ||
+ | sshfs# | ||
+ | </ | ||
+ | |||
+ | Die oben genannten Optionen können hier ebenfalls angegeben werden (('' | ||
+ | < | ||
+ | sshfs# | ||
+ | </ | ||
+ | |||
+ | Anschließend reicht ein einfaches '' | ||
+ | |||
+ | |||
+ | === unmount === | ||
+ | |||
+ | fusermount -u mount-point | ||
+ | |||
+ | Beim Eintrag in der /etc/fstab reicht '' | ||
+ | |||
+ | ==== Dateiübertragung über eine existierende SSH-Verbindung ==== | ||
+ | Wenn man nicht eine zweite SSH-Verbindung aufbauen will (gerade bei Sprüngen über mehrere Systeme kann das nervig sein), braucht man '' | ||
+ | |||
+ | Man muss es nur auf der lokalen Computer installieren ('' | ||
+ | |||
+ | Eventuell erzeugt man sich einen Alias in der '' | ||
+ | alias ssh=zssh | ||
+ | damit wird bei der Eingabe von '' | ||
+ | |||
+ | Auf dem verbundenen Rechner/ | ||
+ | |||
+ | Um eine Datei zu senden gibt man | ||
+ | sz -e < | ||
+ | ein. Der Parameter " | ||
+ | |||
+ | |||
+ | ==== SSH-Shells ==== | ||
+ | SSH ist als sichere Variante zu ftp(s) beim Upload von Dateien nützlich. Dennoch muss man dafür dem Benutzer auch einen Login geben der es dem Benutzer emöglicht Programme und andere Tätigkeiten auszuführen die evtl. sicherheitskritisch sind. Spezielle Shells (technisch meist genauer " | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== Fingerprint nicht überprüfen ==== | ||
+ | |||
+ | Bei der ersten Verbindung zu einem neuen SSH-Server fragt SSH nach ob der Fingerprint stimmt and speichert ihn in '' | ||
+ | Wenn dies der Fall ist wird die Verbindung abgebrochen und der (fehlerhafte? | ||
+ | |||
+ | Ein geänderter Schlüssel hat diese Ursachen: | ||
+ | - Der SSH-dienst oder der Rechner wurde neu installiert ohne den alten Schlüssel zu übertragen | ||
+ | - der Schlüssel wurde ausgetauscht | ||
+ | - der DNS-Name zeigt nun auf einen anderen Rechner | ||
+ | - ein Angreifer (man-in-the-middle) versucht sich zwischen Server und Client zu schmuggeln | ||
+ | |||
+ | In manchen Fällen kann dies störend sein (häufig wechselnde Testsysteme) und der Sicherheitsverlust (kein Überprüfung des Servers!) mag nicht relevant sein. | ||
+ | |||
+ | Eine Umgehung des Sicherheitschecks ist einerseits durch StrictHostKeyChecking no und der Umstellung von UserKnownHostsFile auf /dev/null (was immer eine leere Antwort gibt) möglich: | ||
+ | |||
+ | < | ||
+ | Host 192.168.0.* | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Für Produktivsysteme oder im Internet sind diese Einstellungen absolut nicht empfohlen, da damit ein grundlegender Sicherheitsmechanismus ausgehebelt wird. Ggf. sollte eher über eine Verteilung geänderter Fingerprints nachgedacht werden. | ||
+ | |||
+ | |||
+ | |||
+ | ==== Fingerprint aktualisieren ==== | ||
+ | |||
+ | Wer viele SSH-Server zu verwalten hat möchte man mit Automatisierungsprogrammen wie dsh nicht drüber gehen wenn bei jedem Aufruf erstmal gefragt wird ob der unbekannte SSH-Fingerprint vertrauenswürdig ist. Statt StrictHostKeyChecking abzuschalten könnte man sich auch vorher die aktuelle Liste der Fingerprint aktualisieren und damit spätere Nachfragen vermeiden. Das Programm ssh-keyscan erledigt diese Aufgabe komfortabel. | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/sh | ||
+ | keytype=" | ||
+ | # | ||
+ | # keytype: specifies the type of the key to fetch from the scanned hosts. | ||
+ | # | ||
+ | |||
+ | hostfile=" | ||
+ | |||
+ | # kann natürlich auch per Variable gefüllt werden: | ||
+ | # for h in $SERVER_LIST; | ||
+ | for h in $(cat " | ||
+ | ip=$(dig +short $h) | ||
+ | ssh-keyscan -t $keytype $ip >> ~/ | ||
+ | ssh-keyscan -t $keytype $h >> ~/ | ||
+ | done | ||
+ | </ |