Przejdź do głównej zawartości

Linux - RHCE - SSH - kontrola dostępu

Jeżeli w środowisku Linux udostępniamy możliwość logowania się do systemu wykorzystując SSH dobrze było by mieć wpływ na to kto i skąd może dostawać się do naszego serwera. Możemy określić którzy użytkownicy będą posiadali możliwość logowania się po ssh oraz z jakich podsieci lub też wybranych hostów taki dostęp będzie możliwy. Wykorzystamy tu możliwości jakie dają TCP Wrappers oraz konfiguracje kont użytkowników w pliku /etc/passwd. Konfigurację dostępu przeprowadzimy również za pomocą zapory systemowej IPTABLES.  Przedstawione sposoby kontroli dostępu mają również zastosowanie w przypadku innych usług gdzie zasada działania jest taka sama. Różnicę mogą dotyczyć usług jakie nie współpracują z  Tcp Wrappers np.: samba. Więcej o iptables


BLOKOWANIE DOSTĘPU SSH Z WYKORZYSTANIEM TCP WRAPPERS

Działanie TCP Wrappers polega na zastąpieniu programu usługi prostym programem o nazwie tcpd, który przekazuje połączenie do właściwej usługi dopiero po sprawdzeniu łączącego się klienta. Przy próbie połączenia TCP Wrapper może:
  • sprawdzić, czy pozycje DNS odpowiadające adresom IP zgadzają się z nazwami hostów,
  • sprawdzić czy klient ma prawo dostępu w plikach kontroli dostępu: /etc/hosts.allow i /etc/hotsts.deny,
  • użyć protokołu ident do sprawdzenia tożsamości łączącego się użytkownika,
  • zapisać odpowiednią informację do dzienników systemowych,
  • uruchomić dowolne polecenie lub skrypt,
  • przekazać sterowanie do właściwego demona sieciowego.

hosts.allow i hosts.deny

Na podstawie nazw plików możemy się domyśleć, jaką odgrywają rolę: hosts.allow zawiera listę komputerów, które mają prawo dostępu do poszczególnych usług sieciowych, a hosts.deny - tych, które nie mają prawa dostępu. Najpierw sprawdzany jest plik hosts.allow, a potem hosts.deny. Ponieważ tcpd zatrzymuje się na pierwszym pasującym wpisie, host który został odnaleziony w pierwszym pliku otrzyma prawo dostępu, nawet jeżeli znajduje się również w drugim pliku.

Format poszczególnych pozycji w obu plikach jest taki sam:

lista-usług : lista-komputerów [: polecenie]

- lista usług to oddzielona przecinkami lista nazw usług lub ALL,

- lista-komputerów to oddzielone przecinkami nazwy komputerów, nazwy domen, adresy ip, adresy sieci i grupy sieciowe, można używać ALL, EXCEPT, LOCAL (nazwy lokalne, czyli nie zawierające kropek), PARANOID (tylko w hosts.deny, oznacza wszystkie komputery, których nazwa nie odpowiada ich adresowi),

- opcjonalne polecenie jest wykonywane za każdym razem, gdy następuje dopasowanie do wzorca. 

Przykładowe polecenia:
  • spawn - wykonuje polecenie (jako nowy proces)
  • twist - wykonuje polecenie zamiast żądanej usługi
  • banners - wyświeltla u klienta tekst z pliku
  • setenv - ustawia zmienną środowiskową dla środowiska uruchomieniowego procesu

Więcej szczegółów można znaleźć w man allow.hosts i man 5 hosts_access.

Przykład : 

Jeżeli chcemy umożliwić dostęp po ssh tylko dla hosta o adresie 192.168.0.50 dodajemy odpowiednie wpisy w plikach /etc/hosts.allow oraz /etc/hosts.deny

Do pliku - hosts.allow dopisujemy : 

sshd:    192.168.0.50

Do pliku - hosts.deny dopisujemy : 

sshd:      ALL

Takie zapisy zablokują możliwość logowania się do serwera z maszyn innych niż host o adresie 192.168.0.50.

BLOKOWANIE DOSTĘPU DO SSH PRZY UŻYCIU IPTABLES 

W celu umożliwienia dostępu do usługi ssh tylko dla wybranego hosta lub podsieci możemy zastosować reguły zapory systemowej iptables. W przypadku usługi ssh chodzi o reguły dotyczące portu 22

Kto ma mieć dostęp ?

Aby umożliwić dostęp przy użyciu ssh dla wybranego hosta np.: o adresie IP 192.168.0.50 dodajemy wpis: 

iptables -I INPUT -m tcp  -p tcp --dport 22 -s 192.168.0.50 -j ACCEPT

Przełącznik -s 192.168.0.50 oznacza źródło (source) z jakiego przepuszczony zostanie ruch do serwera.

następnie zapisujemy ustawienia i restartujemy usługę zapory iptables : 

# service iptables save 

# service iptables restart 

Należy również pamiętać o usunięciu domyślnie występującej reguły : 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

Reguła ta umożliwia dostęp po ssh z dowolnego hosta. 

Kto ma nie mieć dostępu ?

Jeżeli chcemy wyeliminować dowolny host lub podsieć skąd można dostać się do serwera używając ssh możemy dodać reguły zapory w postaci: 

iptables -I INPUT -m tcp  -p tcp --dport 22 -s 192.168.0.14 -j REJECT

następnie zapisujemy ustawienia i restartujemy usługę zapory iptables :

# service iptables save 

# service iptables restart 

Zapis taki skutkuje odrzuceniem pakietów przychodzących z hosta o adresie 192.168.0.14 i uniemożliwienie mu dostanie się do serwera. Przy próbie logowania zobaczy :


# ssh 192.168.0.12
ssh: connect to host 192.168.0.12 port 22: Connection refused

Zamiast pojedynczych adresów IP możemy również podawać adresy podsieci w postaci :

-s 192.168.0.0/24


Więcej o iptables można poczytać : tutaj.

BLOKOWANIE DOSTĘPU DO SSH LOKALNEMU UŻYTKOWNIKOWI

By zablokować dostęp do powłoki systemowej wybranemu użytkownikowi wystarczy zmodyfikować jego wpis w pliku /etc/passwd


nosshuser:x:500:501::/home/nosshuser:/sbin/nologin
user1:x:501:502::/home/user1:/bin/bash


Wycinek z pliku /etc/passwd przedstawia dwóch użytkowników przy czym użytkownik "nosshuser" nie ma możliwości zalogowania się do serwera przy użyciu ssh o czym świadczy wpis :

/sbin/nologin



Komentarze

  1. Cześć,
    Wydaje mi się, że ustawienie /sbin/nologin w /etc/passwd nie jest najlepszym pomysłem, ponieważ uniemożliwia to nie tylko logowanie przez SSH, ale generalnie logowanie w ogóle. Ja użyłbym opcji AllowUsers i DenyUsers w /etc/ssh/sshd_config.
    Pozdrawiam,
    szamasz

    OdpowiedzUsuń

Prześlij komentarz

Najczęściej czytane w tym miesiącu

50 popularnych pytań dotyczących systemu Linux zadawanych na rozmowach kwalifikacyjnych. (Pytania & Odpowiedzi)

Jak dodać użytkownika w systemie Windows z poziomu konsoli CMD? (net user, net localgroup)

Generowanie testowych plików o określonej wielkości