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
# 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
Cześć,
OdpowiedzUsuń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