Ich habe einen Server in einem internen Netzwerk (Anmeldung dort über VPN), von dem aus ich mich über SSH mit OpenSSH Public/Private Key-Authentifizierung am Server anmelde. Aus Sicherheitsgründen möchte ich die MAC-Adressen meiner drei verwendeten Clients über den Server binden, iptables
damit sich nur diese Clients damit anmelden können.
iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT
iptables -A INPUT -p tcp --destination-port 22 -j DROP
Ist es dennoch empfehlenswert, dies auf diese Weise zu tun? Welche anderen (besseren) Methoden kann ich verwenden, um den SSH-Login an die verwendeten Clients zu binden?
(Wenn jemand 2FA anfordern möchte, ist 2FA als mögliche Lösung leider nicht möglich.)
Danke.
Antwort1
Ich nehme an, Sie möchten verhindern, dass Ihr SSH-Server Verbindungen von nicht vertrauenswürdigen Hosts akzeptiert, auch wenn diese gültige Benutzeranmeldeinformationen liefern. Ist das richtig?
Eine mögliche Lösung, um die Public-Key-Authentifizierung von Benutzern an ausgewählte Client-Hosts zu binden, ist die hostbasierte Authentifizierung. Richten Sie die hostbasierte Authentifizierung ein und definieren Sie AuthenticationMethods
Parameter in /etc/ssh/sshd_config
einer der folgenden Optionen:
AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
Oder:
AuthenticationMethods hostbased,publickey
Dadurch wird der SSH-Daemon angewiesen, Clients aufzufordern, die Hosts zu authentifizieren, von denen aus sie eine Verbindung herstellen, bevor die Schlüssel oder Passwörter der Benutzer überprüft werden. Die erste Alternative ermöglicht eine passwortbasierte Authentifizierung, während die zweite sie nur auf öffentliche Schlüssel beschränkt. Da die hostbasierte Authentifizierung auf Schlüsselpaaren basiert, kann der SSH-Server Clients mit dynamischen IP-Adressen authentifizieren.
Hier folgen vollständige Anweisungen. Die Dokumentation, wie SSH die hostbasierte Authentifizierung durchführt, finden Sie inssh(1)
man-Seite. Beachten Sie, wie SSH Benutzer identifiziert und prüfen Sie, ob dies in Ihrem Fall zutrifft.
Die hostbasierte Authentifizierung funktioniert folgendermaßen: Wenn der Rechner, von dem aus sich der Benutzer anmeldet, in
/etc/hosts.equiv
oder/etc/ssh/shosts.equiv
auf dem Remote-Rechner aufgeführt ist unddie Benutzernamen auf beiden Seiten gleich sindoder wenn die Dateien im Home-Verzeichnis des Benutzers auf dem Remote-Rechner vorhanden sind~/.rhosts
und~/.shosts
enthält eine Zeile mit dem Namen des Client-Rechners und dem Namen des Benutzers auf diesem Rechner, wird der Benutzer für die Anmeldung berücksichtigt. Darüber hinaus muss der Server den Hostschlüssel des Clients überprüfen können, damit die Anmeldung zulässig ist. Diese Authentifizierungsmethode schließt Sicherheitslücken durch IP-Spoofing, DNS-Spoofing und Routing-Spoofing. [Hinweis für den Administrator:/etc/hosts.equiv
,~/.rhosts
, und das rlogin/rsh-Protokoll im Allgemeinen sind von Natur aus unsicher und sollten deaktiviert werden, wenn Sicherheit gewünscht wird.]
So aktivieren Sie die hostbasierte Authentifizierung in OpenSSH:
- Stellen Sie die folgenden Parameterwerte ein in
/etc/ssh/sshd_config
:
# /etc/ssh/sshd_config
HostbasedAuthentication yes
IgnoreUserKnownHosts yes
IgnoreRhosts yes
# AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
AuthenticationMethods hostbased,publickey
- Um eine hostbasierte Authentifizierung durchzuführen, können Sie den von den Clients bereitgestellten Hostnameninformationen vertrauen, indem Sie Folgendes festlegen
HostbasedUsesNameFromPacketOnly yes
:/etc/ssh/sshd_config
:
# /etc/ssh/sshd_config
HostbasedUsesNameFromPacketOnly yes
- Alternativ können Sie den SSH-Daemon auch so konfigurieren, dass Hostnamen durch Auflösung der IP-Adressen der Clients mithilfe von in
/etc/hosts
Dateien oder PTR-Einträgen auf dem DNS-Server des Netzwerks gespeicherten Informationen identifiziert werden:
# /etc/ssh/sshd_config
HostbasedUsesNameFromPacketOnly no
UseDNS yes
- Listet die Hostnamen der autorisierten Clients in
/etc/ssh/shosts.equiv
der Datei auf. Erstellt sie manuell, falls sie nicht existiert. Die Syntax der Datei ist fast identisch mit der inman host.equiv(5), JedochDer SSH-Daemon akzeptiert keine leeren Hostnamen.
# /etc/ssh/shosts.equiv
ssh-client-alpha
ssh-client-bravo
ssh-client-charlie
- Listen Sie die öffentlichen Schlüssel der autorisierten Hosts in
/etc/ssh/ssh_known_hosts
einer Datei auf. Eine bequeme Möglichkeit hierfür ist überssh-keyscan
:
[root@ssh-server ~]# ssh-keyscan ssh-client-alpha >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-bravo >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-charlie >> /etc/ssh/ssh_known_hosts
Nachdem der OpenSSH-Server so konfiguriert wurde, dass er hostbasierte Authentifizierungsanforderungen akzeptiert, müssen auch die Clients so konfiguriert werden, dass sie eine hostbasierte Authentifizierung anfordern:
- Stellen Sie die folgenden Parameterwerte ein in
/etc/ssh/ssh_config
:
# /etc/ssh/ssh_config
Host *
HostbasedAuthentication yes
EnableSSHKeySign yes
- Stellen Sie sicher, dass SUID/SGID Bits in
ssh-keysign
ausführbare Datei erteilt Leseberechtigung für die privaten Schlüsseldateien des Hosts:
[root@ssh-client-alpha ~]# find /usr -name ssh-keysign -ls
16517300 616 -r-xr-sr-x 1 root ssh_keys 630344 Feb 4 16:01 /usr/libexec/openssh/ssh-keysign
[root@ssh-client-alpha ~]# ls -l /etc/ssh/ssh_host_*key
-rw-r----- 1 root ssh_keys 480 Apr 13 06:51 /etc/ssh/ssh_host_ecdsa_key
-rw-r----- 1 root ssh_keys 387 Apr 13 06:51 /etc/ssh/ssh_host_ed25519_key
-rw-r----- 1 root ssh_keys 2578 Apr 13 06:51 /etc/ssh/ssh_host_rsa_key