Ogranicz dostęp SSH do określonych klientów według adresu IP

22

W jaki sposób pozwalamy niektórym zestawom prywatnych adresów IP na logowanie przez SSH (parę kluczy RSA) do Linux Server?

Ranjan Kumar
źródło
3
Zasady zapory są normalnym działaniem
Raman Sailopal
2
firewall lub /etc/hosts.allow, jeśli ssh kompiluje się z opakowaniami TCP lub regułami plików / etc / ssh / sshd_config.
Rui F Ribeiro
więcej niż jeden sposób, patrz linux.die.net/man/5/sshd_config który wyjaśnia wszystko/etc/ssh/sshd_config
Rona

Odpowiedzi:

42

Możesz ograniczyć, które hosty mogą się łączyć, konfigurując opakowania TCP  lub filtrując ruch sieciowy (firewall) za pomocą iptables . Jeśli chcesz używać różnych metod uwierzytelniania w zależności od adresu IP klienta, zamiast tego skonfiguruj demona SSH (opcja 3).

Opcja 1: Filtrowanie za pomocą IPTABLES

Reguły Iptables są oceniane w kolejności, aż do pierwszego dopasowania.

Na przykład, aby zezwolić na ruch z sieci 192.168.0.0/24 i w inny sposób ograniczyć ruch (do portu 22). TheDROPZasada nie jest wymagane, jeśli iptables polityka domyślna jest skonfigurowany 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

Możesz dodać więcej reguł przed regułą upuszczania, aby dopasować więcej sieci / hostów. Jeśli masz wiele sieci lub adresów hostów, powinieneś użyć modułu ipset . Jest równieżmoduł iprange , który pozwala na użycie dowolnego zakresu adresów IP.

Iptables nie są trwałe podczas ponownego uruchamiania. Musisz skonfigurować jakiś mechanizm, aby przywracał iptables podczas uruchamiania.

iptablesdotyczą tylko ruchu IPv4. W systemach, w których ssh nasłuchuje adresu IPv6, można wykonać niezbędną konfiguracjęip6tables .

Opcja 2: Korzystanie z opakowań TCP

Możesz także skonfigurować, które hosty mogą się łączyć za pomocą opakowań TCP. W przypadku opakowań TCP oprócz adresów IP można także używać nazw hostów w regułach.

Domyślnie odmawiaj wszystkim hostom.

/etc/hosts.deny:

sshd : ALL

Następnie wyświetl listę dozwolonych hostów w pliku hosts.allow. Na przykład, aby zezwolić sieci 192.168.0.0/24 i localhost .

/etc/hosts.allow:

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

Opcja 3: Konfiguracja demona SSH

Możesz skonfigurować demona ssh w sshd_config, aby używał innej metody uwierzytelniania w zależności od adresu klienta / nazwy hosta. Jeśli chcesz tylko blokować łączenie się innych hostów, powinieneś zamiast tego użyć iptables lub TCP.

Najpierw usuń domyślne metody uwierzytelniania:

PasswordAuthentication no
PubkeyAuthentication no

Następnie dodaj żądane metody uwierzytelniania po Match Addresskońcu pliku. Umieszczenie Matchna końcu pliku jest ważne, ponieważ wszystkie wiersze konfiguracji po nim są umieszczane wewnątrz bloku warunkowego do następnego Matchwiersza. Na przykład:

Match Address 127.0.0.*
    PubkeyAuthentication yes

Inni klienci nadal mogą się łączyć, ale logowanie się nie powiedzie, ponieważ nie ma dostępnych metod uwierzytelniania.

Dopasuj argumenty i dozwolone opcje konfiguracji warunkowej są udokumentowane na stronie podręcznika sshd_config . Wzorce dopasowania są udokumentowane na stronie podręcznika ssh_config .

sebasth
źródło
Co powiesz na dodanie dyrektywy ListenAddress w / etc / ssh / sshd_config?
jerome
Jest to możliwe w określonych sytuacjach (na przykład słuchanie prywatnego adresu sieciowego), w zależności od konfiguracji sieci i hostów, na które chcesz zezwolić.
sebasth
2
Dodatkowo, sshd_config może ustawiać filtrowanie za pomocą dyrektywy AlowUsers, a także klucze autoryzowane można ustawić za pomocą opcji „z adresu IP lub podsieci”, aby również filtrować.
tonioc
@tonioc Świetne rozwiązanie dla mojego przypadku użycia. Rozwiń tę sugestię na odpowiedź.
simlev
jeśli masz NIC 4 porty każdy idzie do innej sieci, to domyślnie #ListenAddress ::w /etc/ssh/sshd_configpowie serwer SSH, aby zaakceptować przychodzące z jednego z tych sieci. W przeciwnym razie wykonaj, ListenAddress <ip address>gdzie <ip address>są te porty karty sieciowej, które mają być dozwolone. Mój eth0jest 192.168.3.4zatem ListenAddress 192.168.3.4skutkuje SSH tylko pracujące w sieci 192.168.3.4, który jest na eth0; i eth1 eth2 eth3 jest odrzucany.
ron
5

Oto kilka dodatkowych konfiguracji demona SSH w celu rozszerzenia poprzedniej odpowiedzi:

  • Dodaj filtrowanie użytkowników z AllowUsersopcją w sshd_configpliku:

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

    To pozwala johndoe i admin2 tylko z 192.168.1.*adresów i otherid1 , otherid2 z dowolnego miejsca.

  • Ogranicz klucz ssh lub klucz oparty na ca do zestawu adresów w .ssh/authorized_keyspliku katalogu domowego danego użytkownika:

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

    W tym przykładzie klucz publiczny dla useralias będzie skuteczny tylko z podanych adresów.

tonioc
źródło