Dla każdego prawdziwego admina kwestia bezpieczeństwa jest nadrzędnym priorytetem szczególnie w tak krytycznych sytuacjach jak autoryzacja poprzez SSH ( Secure Shell ) w kontekście roota. Pomimo, że takie połączenie jest szyfrowane, to należy uwzględnić inne opcje podnoszące bezpieczeństwo dostępu do serwera. Poniżej zaprezentuję porady jak najbardziej zabezpieczyć serwer przed nieautoryzowanym dostępem.
Jak wiadomo samo połączenie pomiędzy klientem a serwerem jest szyfrowane w przeciwieństwie do protokołu Telnet. Istnieją dwie możliwości logowania się na serwer dla użytkownika, mianowicie standardowe logowanie poprzez podanie loginu i hasła lub poprzez autoryzację z wykorzystaniem kluczy RSA ( logowanie bez podawania hasła ).
W przypadku autoryzacji kluczami RSA, proces polega na odpowiednim procesie porównawczym sum kontrolnych wygenerowanych na podstawie obu kluczy. Konfiguracja autoryzacji za pomocą kluczy RSA opisania jest tutaj: Autoryzacja SSH bez hasła
Uwaga: nie polecam zmiany portu 22 dla serwera SSH na port powyżej 1024, gdyż porty powyżej 1024 są ogólnodostępne – nie wymagają uprawnień super użytkownika.
Maksymalizacja Bezpieczeństwa
Poniżej założenia, które zwiększą bezpieczeństwo w kontekście nieautoryzowanego dostępu do serwera poprzez protokół SSH:
- Blokada logowania się jako root ( ewentualnie autoryzacja tylko przez klucze RSA )
- Użytkownik [USER_1] z dostępem do shella ( autoryzacja RSA i logowanie z „trudnym” hasłem )
- Użytkownik [USER_2] z dostępem do shella ( brak dostępu poprzez ssh + uprawnienia dla sudo )
Konfiguracja
Opcje dotyczące konfiguracji serwera SSH znajdują się w pliku: /etc/ssh/sshd_config
Uprawnienia do uruchamiania programów innych użytkowników a także roota w kontekście polecenia sudo ustawiamy w pliku konfiguracyjnym: /etc/sudoers
Może się zdarzyć, że nie mamy na swoim serwerze zainstalowanych pakietów: sudo i serwera ssh.
Instalacja sudo:
apt-get install sudo
Instalacja serwera SSH:
apt-get install openssh-server
+ Wyłączenie logowania przez SSH dla roota
Ustawiamy poniższą opcję w /etc/ssh/sshd_config na without-password:
PermitRootLogin without-password
Opcja ta: without-password blokuje możliwość zalogowania się na konto roota za pośrednictwem loginu i hasła – oczywiście blokada logowania dotyczy tylko SSH. Natomiast nie blokuje możliwości autoryzacji poprzez klucze RSA. Dzięki temu nie stracimy możliwości wykonywania pewnych operacji, chociażby zdalnie wykonywania skryptów wymagających uprawnień roota ( przy akceptacji autoryzacji kluczami RSA ). Jeśli zmienimy opcję without-password na no zablokujemy całkowicie możliwość dostępu do konta root poprzez SSH !
+ Konto dla użytkownika roboczego
Ten użytkownik powinien mieć ustawione jak najbardziej skomplikowane hasło, nie będziemy wykorzystywać tego użytkownika w kontekście polecenia sudo właśnie z uwagi na długość i stopień skomplikowania hasła. Do tego celu będziemy mieli innego użytkownika. W razie czego jak zgubimy klucz RSA dla roota to te konto będzie także pełnić funkcję konta awaryjnego a także do przelogowania się na innych użytkowników nie mających dostępu poprzez SSH.
+ Konto dla użytkownika z sudo
Ten użytkownik bezwzględnie nie może mieć dostępu do serwera poprzez SSH, dostęp do tego konta może być możliwy tylko z konta roota lub użytkownika „roboczego” o którym wspomniałem powyżej.
Użytkownik ten może mieć już łatwe do zapamiętania hasła, tak więc możemy przydzielić mu uprawnienia do wykonywania poleceń innych użytkowników jak i roota w kontekście polecenia sudo
Na początku blokujemy dostęp do konta użytkownika za pośrednictwem SSH dodając poniższą dyrektywę w pliku konfiguracyjnym: /etc/ssh/sshd_config
DenyUsers [UZYTKOWNIK Z UPRAWNIENIAMI SUDO]
Następnie przedzielamy użytkownikowi prawa w kontekście polecenia sudo dodając poniższą opcję w pliku konfiguracyjnym: /etc/sudoers. Aby edytować plik konfiguracyjny wpisz:
visudo
Następnie dopisz dyrektywę wpisując odpowiednią nazwę użytkownika:
[USER] ALL=(ALL:ALL) ALL
Podsumowanie
Logowanie na serwer za pośrednictwem SSH wykonujemy poprzez użytkownika „roboczego” i z niego logujemy się w razie potrzeby na roota lub przechodzimy na użytkownika z większymi uprawnieniami ( sudo ). Do zmiany bieżącego użytkownika wykorzystujemy polecenie su. W takiej sytuacji zarówno root jak i user z sudo może mieć łatwe do zapamiętania hasła dostępowe. Aby zwiększyć jeszcze bardziej poziom bezpieczeństwa możemy wykorzystać oprogramowanie fail2ban. Takie rozwiązanie znacznie zwiększa poziom bezpieczeństwa jak i efektywność pracy ( proste hasła dla usera z sudo ).
Słowa kluczowe: bezpieczeństwo SSH, bezpieczne logowanie, logowanie bez hasła, blokada logowania roota, zmiana portu 22, su, sudo