Der Dienst sshd (Secure Shell Daemon) ist Teil der OpenSSH-Implementierung für Linux, die eine authentifizierte, Ende-zu-Ende-verschlüsselte Netzwerkkommunikation bereitstellt. Beispielsweise kann sich ein Benutzer auf einem Host bei einem anderen System anmelden, ohne ein Passwort zu verwenden, da der sshd-Dienst so konfiguriert werden kann, dass er alternative Authentifizierungstechniken wie den Austausch von Shared-Key-Informationen verwendet.
OpenSSH verwendet eine Client/Server-Technologie. Ein Client, beispielsweise ein Benutzer, der das ssh-Programm ausführt, initiiert eine Verbindung zum sshd-Server auf dem Zielhost. Nachrichten im SSH-Protokoll werden ausgetauscht, um den Client gegenüber dem Zielhost zu authentifizieren, und der Fernzugriff wird dann zugelassen oder verweigert. Falls erlaubt, wird eine TCP/IP-Verbindung aufgebaut, damit der Client Befehle und Daten mit einer Anwendung austauschen kann, die vom sshd-Daemon auf dem Zielsystem erzeugt wird.
Der Vorteil der OpenSSH-Tools besteht darin, dass der gesamte Kommunikationsaustausch verschlüsselt ist. Authentifizierungsinformationen wie Benutzernamen, Passwörter und Sitzungsdaten werden niemals unverschlüsselt übertragen. Das ist anders als Alternativen wie Telnet oder FTP, die ausschließlich Klartextübertragungen verwenden.
Der openssh-Server Das RPM-Paket stellt die Datei /usr/sbin/sshd bereit Daemon und seine Konfigurationsdateien.
Es gibt zwei Versionen des SSH-Kommunikationsprotokolls, Version 1 und Version 2. Sowohl der Client, z. B. scp, als auch der sshd-Server müssen dieselbe Protokollversion verwenden. Der sshd-Server unterstützt standardmäßig beide Protokollversionen, aber jede Version wird separat konfiguriert.
Verbindungen zwischen dem Client und dem sshd-Daemon werden standardmäßig auf TCP/IP-Port 22 hergestellt, wobei entweder UDP- oder TCP-Protokolle verwendet werden. Zunächst müssen sich Client und Server auf eine Verschlüsselungsmethode einigen:Der sshd sendet eine Liste der unterstützten Chiffren und der Client wählt seine Präferenz aus. Der Server identifiziert seinen Host entweder mit dem /etc/ssh/ssh_host_key (Protokollversion 1) oder eines von /etc/ssh/ssh_host_[rd]sa_key (Protokollversion 2). Dadurch kann der Client IP-Spoofing oder Man-in-the-Middle-Angriffe erkennen. Wenn die Host-ID verifiziert ist, versucht der Client dann eine oder mehrere Authentifizierungsmethoden, um die Systemzugriffsdaten für den Benutzer einzurichten. Öffentliche Verschlüsselungsschlüssel werden zuerst ausprobiert, wobei auf herkömmliche Kennwortherausforderungen zurückgegriffen wird. Mit dem ssh-Client kann die vollständige Aushandlung angezeigt werden, indem „-v“-Schalter wie folgt hinzugefügt werden:
$ ssh -vvv myhost.example.com
Der sshd-Daemon verwendet /etc/pam.d/sshd -Datei, um die erforderlichen Authentifizierungsregeln für ihren Host zu ermitteln. Eine Standarddatei wird vom Openssh-Server-RPM-Paket bereitgestellt und ist für die meisten Sites ausreichend.
Nachdem der Benutzerzugriff authentifiziert wurde, startet der sshd(8)-Daemon das gewünschte Anwendungsprogramm des Clients mit den standardmäßigen Eingabe-/Fehler-/Ausgabedateien (stdin, stderr, stdout), die an die TCP/IP-Sitzung angehängt sind.
Die Funktionen und das Verhalten des sshd(8)-Daemons werden durch eine systemweite Konfigurationsdatei /etc/ssh/sshd_config gesteuert. Mit dem RPM-Paket wird eine Standarddatei bereitgestellt, die jedoch an lokale Anforderungen angepasst werden kann. Um zum Beispiel Root-Logins mit ssh zu verhindern, kann die Einstellung sshd_config wie in diesem Snippet geändert werden:
# vi /etc/ssh/sshd_config PermitRootLogin no
Dienststeuerung
Um den sshd-Dienst bei Bedarf zu verwalten, verwenden Sie den Befehl service oder führen Sie das Skript /etc/init.d/sshd direkt aus:
# /sbin/service sshd help Usage: /etc/init.d/sshd {start|stop|restart|reload|condrestart|status}
# /etc/init.d/sshd help Usage: /etc/init.d/sshd {start|stop|restart|reload|condrestart|status}
Die verfügbaren Befehle sind:
Befehl | Beschreibung |
---|---|
beginnen | Starten Sie den sshd-Daemon. |
Halt | Stoppen Sie den sshd-Daemon. |
Neustart | Entspricht einer Stopp- und dann einer Start-Befehlsfolge. |
neu laden | Zwingen Sie den sshd-Daemon, seine Konfigurationsdateien ohne Dienstunterbrechung erneut zu lesen. |
condrestart | Wenn der sshd-Daemon derzeit ausgeführt wird, entspricht dies einem Neustartbefehl. Wenn der Daemon nicht läuft, wird keine Aktion ausgeführt. Wird häufig bei der Installation von RPM-Paketen verwendet, um zu vermeiden, dass ein Dienst gestartet wird, der noch nicht ausgeführt wird. |
Status | Falls der sshd-Daemon läuft, melden Sie seine PID (Prozess-ID). Wenn es nicht läuft, melde es auch. |
Der sshd-Daemon wird am häufigsten vom sshd-Dienst oder vom xinetd(8)-Daemon gestartet. Das direkte Bereitstellen von Befehlszeilenargumenten ist möglich, wird aber normalerweise nicht gemacht. Stattdessen können zusätzliche Befehlszeilenargumente an den sshd(8)-Daemon geliefert werden, indem die Datei /etc/sysconfig/sshd erstellt und die Variable ${OPTIONS} definiert wird:
# Additional command line options for sshd OPTIONS="-q"
Dieses Beispiel schaltet den stillen Modus ein und verhindert, dass sshd den Beginn, die Authentifizierung und das Ende jeder Sitzung protokolliert. Konsultieren Sie die Online-Handbuchseite für sshd für Einzelheiten zu den verfügbaren Befehlszeilenoptionen.
Konfiguration
Um den sshd-Dienst beim Booten zu verwalten, verwenden Sie das chkconfig-Tool:
# /sbin/chkconfig --list sshd sshd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
# /sbin/chkconfig sshd on
# /sbin/chkconfig --list sshd sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Eine Vielzahl von Konfigurationsdateien wird verwendet, um den sshd-Daemon für den Site-abhängigen Betrieb anzupassen. Diese werden im Folgenden beschrieben:
Pfad der Konfigurationsdatei | Beschreibung |
---|---|
/etc/ssh/sshd_config | Erforderliche Konfigurationsdatei. Die meisten Standardwerte werden als Kommentare bereitgestellt. |
/etc/ssh/ssh_host_key | Enthält den für die SSH-Protokollversion 1 verwendeten Hostschlüssel. Nur erforderlich, wenn die Protokollversion 1 verwendet wird. |
/etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_dsa_key | Enthält Hostschlüssel, der für die SSH-Protokollversion 2 verwendet wird. Nur erforderlich, wenn Protokollversion 2 verwendet wird. |
/etc/motd | Nachricht der Tagesdatei, die dem ssh-Client nach erfolgreicher Anmeldung präsentiert wird. |
~/.hushlogin | Falls Datei vorhanden ist, wird die Datei /etc/motd bei erfolgreicher Anmeldung nicht von ssh angezeigt. |
/etc/nologin | Wenn eine Datei existiert, wird ihr Inhalt vom Client angezeigt und die Sitzung wird dann beendet. Wird bei Root-Anmeldungen ignoriert. |
~/.ssh/environment | Wenn die Datei existiert und der sshd_config-Parameter PermitUserEnvironment festgelegt ist, werden Shell-Umgebungsvariablen aus dieser Datei in die SSH-Sitzung exportiert. |
~/.ssh/rc /etc/ssh/sshrc | Dateien werden in der angezeigten Reihenfolge geprüft und die zuerst gefundene wird ausgeführt. Wenn beides nicht gefunden wird, wird das Dienstprogramm xauth ausgeführt. |
~/.ssh/authorized_keys | Listet die öffentlichen Schlüssel auf, die für die RSA-Sitzungsauthentifizierung verwendet werden. |
~/.ssh/known_hosts /etc/ssh/ssh_known_hosts | Enthält öffentliche Hostschlüssel für alle bekannten Hosts. Die Benutzerdatei wird automatisch verwaltet. Die optionale globale Datei wird vom Systemadministrator gepflegt. |
/etc/moduli /etc/ssh/moduli | Im Gegensatz zur Manpage wird die Datei /etc/moduli in dieser Implementierung nicht verwendet. Die Datei /etc/ssh/moduli enthält Diffie-Hellman-Gruppen, die für die Protokollaushandlung „Diffie-Hellman Group Exchange“ verwendet werden. |
/var/empty/sshd | Chroot-Verzeichnis, das während der Privilegientrennung vor Abschluss der Authentifizierungsphase verwendet wird. Dieses Verzeichnis ist im Besitz von root und nicht weltweit beschreibbar. Es enthält normalerweise nur eine etc/localtime-Datei für die Darstellung von Uhrzeit und Datum. |
/etc/hosts.allow /etc/hosts.deny | Zugriffskontrollen, die von der Einrichtung tcp_wrappers durchgesetzt werden müssen. Siehe tcpd für weitere Details. |
~/.rhosts | Wird für RSA-Authentifizierung oder hostbasierte Authentifizierung verwendet. Liste von Benutzername/Hostname-Paaren, um Anmeldungen zu identifizieren, die keinen Passwortaustausch erfordern. |
~/.shosts | Ähnlich wie ~/.rhosts, aber von den Dienstprogrammen rlogin oder rshd ignoriert. |
/etc/hosts.equiv | Liste der Hosts, bei denen keine Passwortabfrage erforderlich ist, solange der Benutzername sowohl auf dem Client- als auch auf dem Serverhost übereinstimmt. Wenn eine Zeile auch einen Benutzernamen enthält, kann sich dieser Benutzer auf dem Client-Rechner bei jedem Serverkonto anmelden, sogar beim Host-Root-Konto; Dies wird im Allgemeinen nicht empfohlen. |
/etc/shosts.equiv | Diese Datei wird genauso verarbeitet wie die /etc/hosts.equiv-Datei, wird aber von den rsh- und rshd-Daemons ignoriert. |
Konfigurationsdatei /etc/ssh/sshd_config
Unten ist eine Beispiel-Konfigurationsdatei /etc/ssh/sshd_config.
# $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $ # This is the sshd server system-wide configuration file. See # sshd_config(5) for more information. # This sshd was compiled with PATH=/usr/local/bin:/usr/bin # The strategy used for options in the default sshd_config shipped with # OpenSSH is to specify options with their default value where # possible, but leave them commented. Uncommented options override the # default value. # If you want to change the port on a SELinux system, you have to tell # SELinux about this change. # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER # #Port 22 #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress :: HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key # Ciphers and keying #RekeyLimit default none # Logging #SyslogFacility AUTH SyslogFacility AUTHPRIV #LogLevel INFO # Authentication: #LoginGraceTime 2m #PermitRootLogin yes #StrictModes yes #MaxAuthTries 6 #MaxSessions 10 #PubkeyAuthentication yes # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2 # but this is overridden so installations will only check .ssh/authorized_keys AuthorizedKeysFile .ssh/authorized_keys #AuthorizedPrincipalsFile none #AuthorizedKeysCommand none #AuthorizedKeysCommandUser nobody # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts #HostbasedAuthentication no # Change to yes if you don't trust ~/.ssh/known_hosts for # HostbasedAuthentication #IgnoreUserKnownHosts no # Don't read the user's ~/.rhosts and ~/.shosts files #IgnoreRhosts yes # To disable tunneled clear text passwords, change to no here! #PasswordAuthentication yes #PermitEmptyPasswords no PasswordAuthentication no # Change to no to disable s/key passwords #ChallengeResponseAuthentication yes ChallengeResponseAuthentication no # Kerberos options #KerberosAuthentication no #KerberosOrLocalPasswd yes #KerberosTicketCleanup yes #KerberosGetAFSToken no #KerberosUseKuserok yes # GSSAPI options GSSAPIAuthentication yes GSSAPICleanupCredentials no #GSSAPIStrictAcceptorCheck yes #GSSAPIKeyExchange no #GSSAPIEnablek5users no # Set this to 'yes' to enable PAM authentication, account processing, # and session processing. If this is enabled, PAM authentication will # be allowed through the ChallengeResponseAuthentication and # PasswordAuthentication. Depending on your PAM configuration, # PAM authentication via ChallengeResponseAuthentication may bypass # the setting of "PermitRootLogin without-password". # If you just want the PAM account and session checks to run without # PAM authentication, then enable this but set PasswordAuthentication # and ChallengeResponseAuthentication to 'no'. # WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several # problems. UsePAM yes #AllowAgentForwarding yes #AllowTcpForwarding yes #GatewayPorts no X11Forwarding yes #X11DisplayOffset 10 #X11UseLocalhost yes #PermitTTY yes #PrintMotd yes #PrintLastLog yes #TCPKeepAlive yes #UseLogin no #UsePrivilegeSeparation sandbox #PermitUserEnvironment no #Compression delayed #ClientAliveInterval 0 #ClientAliveCountMax 3 #ShowPatchLevel no #UseDNS yes #PidFile /var/run/sshd.pid #MaxStartups 10:30:100 #PermitTunnel no #ChrootDirectory none #VersionAddendum none # no default banner path #Banner none # Accept locale-related environment variables AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS # override default of no subsystems Subsystem sftp /usr/libexec/openssh/sftp-server # Example of overriding settings on a per-user basis #Match User anoncvs # X11Forwarding no # AllowTcpForwarding no # PermitTTY no # ForceCommand cvs server