Beschränken Sie den SSH-Zugriff auf bestimmte Clients anhand der IP-Adresse

22

Wie können bestimmte private IP-Adressen über die SSH-Anmeldung (RSA-Schlüsselpaar) in Linux Server eingegeben werden?

Ranjan Kumar
quelle
3
Firewall-Regeln sind eine normale Vorgehensweise
Raman Sailopal
2
Firewall oder /etc/hosts.allow, wenn ssh w / TCP-Wrapper oder / etc / ssh / sshd_config-Dateiregeln kompiliert.
Rui F Ribeiro
mehr als eine Art und Weise beziehen sich auf zu tun, linux.die.net/man/5/sshd_config , die alles in erklärt/etc/ssh/sshd_config
ron

Antworten:

42

Sie können einschränken, welche Hosts eine Verbindung herstellen können, indem Sie TCP-Wrapper konfigurieren  oder den Netzwerkverkehr (Firewalling) mithilfe von iptables filtern . Wenn Sie abhängig von der Client-IP-Adresse unterschiedliche Authentifizierungsmethoden verwenden möchten, konfigurieren Sie stattdessen den SSH-Dämon (Option 3).

Option 1: Filtern mit IPTABLES

Iptables-Regeln werden bis zur ersten Übereinstimmung nacheinander ausgewertet.

Zum Beispiel, um Datenverkehr vom Netzwerk 192.168.0.0/24 zuzulassen und andernfalls den Datenverkehr zu löschen (an Port 22). Die DROPRegel ist nicht erforderlich, wenn Ihre iptables-Standardrichtlinie auf konfiguriert ist DROP.

iptables -A INPUT -p tcp --dport 22 --source 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

Sie können vor der Drop-Regel weitere Regeln hinzufügen, um mehr Netzwerken / Hosts zu entsprechen. Wenn Sie viele Netzwerke oder Hostadressen haben , sollten Sie das ipset- Modul verwenden. Es gibt auch ein iprange- Modul, das die Verwendung eines beliebigen IP-Adressbereichs ermöglicht.

Iptables sind bei Neustarts nicht persistent. Sie müssen einen Mechanismus konfigurieren, um iptables beim Booten wiederherzustellen.

iptablesgilt nur für IPv4-Verkehr. Systeme, bei denen ssh IPv6-Adressen abhört, können die erforderliche Konfiguration vornehmen ip6tables.

Option 2: Verwenden von TCP-Wrappern

Sie können auch konfigurieren, welche Hosts mithilfe von TCP-Wrappern eine Verbindung herstellen können. Mit TCP-Wrappern können Sie neben IP-Adressen auch Hostnamen in Regeln verwenden.

Verweigern Sie standardmäßig alle Hosts.

/etc/hosts.deny:

sshd : ALL

Dann liste erlaubte Hosts in hosts.allow auf. Zum Beispiel, um das Netzwerk 192.168.0.0/24 und localhost zuzulassen .

/etc/hosts.allow:

sshd : 192.168.0.0/24
sshd : 127.0.0.1
sshd : [::1]

Option 3: Konfiguration des SSH-Dämons

Sie können den ssh-Daemon in sshd_config so konfigurieren, dass abhängig von der Clientadresse / dem Hostnamen unterschiedliche Authentifizierungsmethoden verwendet werden. Wenn Sie nur verhindern möchten, dass andere Hosts eine Verbindung herstellen, sollten Sie stattdessen iptables oder TCP-Wrapper verwenden.

Entfernen Sie zuerst die Standardauthentifizierungsmethoden:

PasswordAuthentication no
PubkeyAuthentication no

Fügen Sie dann nach a Match Addressam Ende der Datei die gewünschten Authentifizierungsmethoden hinzu . Das Platzieren Matcham Ende der Datei ist wichtig, da alle darauf folgenden Konfigurationszeilen bis zur nächsten MatchZeile im bedingten Block stehen . Beispielsweise:

Match Address 127.0.0.*
    PubkeyAuthentication yes

Andere Clients können weiterhin eine Verbindung herstellen, die Anmeldung schlägt jedoch fehl, da keine Authentifizierungsmethoden verfügbar sind.

Übereinstimmungsargumente und zulässige bedingte Konfigurationsoptionen sind in der Manpage sshd_config dokumentiert . Übereinstimmungsmuster sind in der Manpage ssh_config dokumentiert .

sebasth
quelle
Was ist mit dem Hinzufügen einer ListenAddress-Direktive in / etc / ssh / sshd_config?
Jerome
In bestimmten Situationen (z. B. beim Abhören der privaten Netzwerkadresse) ist dies abhängig von Ihrer Netzwerkkonfiguration und den Hosts, die Sie zulassen möchten.
27.
2
Darüber hinaus kann sshd_config Filterungen mit der AlowUsers-Direktive festlegen, und außerdem können die authorized_keys mit "from IP or subnet" festgelegt werden, um auch zu filtern.
tonioc
@tonioc Tolle Lösung für meinen Anwendungsfall. Bitte erweitern Sie diesen Vorschlag zu einer Antwort.
Simlev
Wenn Sie eine Netzwerkkarte mit 4 Ports haben, die jeweils zu einem anderen Netzwerk wechseln, weist die Standardeinstellung #ListenAddress ::in /etc/ssh/sshd_configden SSH-Server an, eingehende Daten von einem dieser Netzwerke zu akzeptieren. Ansonsten tu ListenAddress <ip address>wo <ip address>ist das von den NIC Ports die du haben willst erlaubt. Meine eth0ist 192.168.3.4daher ListenAddress 192.168.3.4ergibt SSH nur auf Netzwerk 192.168.3.4 arbeiten , die auf eth0 ist; und eth1 eth2 eth3 wird verweigert.
Ron
5

Hier eine zusätzliche Konfiguration für den SSH-Daemon, um die vorherige Antwort zu erweitern:

  • Benutzerfilterung mit AllowUsersOption in sshd_configDatei hinzufügen:

    AllowUsers [email protected].* [email protected].* otherid1 otherid2
    

    Dies erlaubt johndoe und admin2 nur von 192.168.1.*Adressen und otherid1 , otherid2 von überall.

  • Beschränken Sie einen ssh-Schlüssel oder einen ca-basierten Schlüssel auf eine Reihe von Adressen in der .ssh/authorized_keysDatei des Basisverzeichnisses eines bestimmten Benutzers:

    from="192.168.1.*,192.168.2.*" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABA...etc...mnMo7n1DD useralias
    

    In diesem Beispiel ist der öffentliche Schlüssel für Useralias nur ab angegebenen Adressen wirksam.

tonioc
quelle