Ta strona wygląda najlepiej z włączoną obsługą JavaScript
Serwer SSH
· ☕ 11 min czytania
· 🐧 sysadmin
Ćwiczenia do wykonania:
Wygeneruj parę kluczy RSA za pomocą ssh-keygen
Wyeksportuj klucz publiczny z klienta do serwera za pomocą ssh-copy-id
Zaloguj się za pomocą hasła poprzez ssh do serwera i przełącz na konto root za pomocą komendy sudo - su lub sudo -i
Włącz logowanie kluczami i wyłącz logowanie hasłem. Zapisz zmiany i zrestartuj usługę ssh.
Nie zamykaj bieżącej sesji. Otwórz nową sesję ssh i zaloguj się do serwera za pomocą klucza prywatnego.
Jeśli udało ci się zalogować, zabezpiecz serwer korzystając z poniższych informacji a następnie zrestartuj usługę ssh na drugiej sesji.
Pamiętaj, by pierwszą sesję ssh cały czas mieć otwartą, by w razie potrzeby móc cofnąć zmiany.
Zrestartuj usługę ssh i sprawdź, czy możesz zalogować się za pomocą trzeciej sesji do serwera. Jeśli tak, udało ci się poprawnie skonfigurować serwer ssh.
Dla chętnych napisz skrypt z użyciem sed lub awk, który dokona zmian po stronie serwera w pliku sshd_config, aby nie trzeba było ręcznie nanosić zmian.
OpenSSH : KeyBoard-Intereractive Auth
OpenSSH jest już domyślnie zainstalowany, więc nie ma potrzeby instalowania nowych pakietów. Domyślnie możesz logować się za pomocą KeyBoard-Interactive Authentication, ale zmień niektóre ustawienia dla bezpieczeństwa jak poniżej.
Jeśli OpenSSH jednak nie jest jeszcze zainstalowany możesz go zainstalować za pomocą następującego polecenia:
SLES
Aby zainstalować OpenSSH wpisz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# odśwież repozytoria sudo zypper ref
# zainstaluj OpenSSH sudo zypper -n in openssh
# włącz OpenSSH podczas boot-owania sudo systemctl enable sshd
# wystartuj openSSH sudo systemctl start sshd
# włącz regułę w firewalld dla ssh sudo firewall-cmd --permanent --add-service=ssh
success
# Przeładuj reguły firewalld sudo firewall-cmd --reload
success
Połącz się z serwerem SSH za pomocą zwykłego użytkownika.
1
2
3
4
5
6
7
8
# ssh [login_user@hostname_or_IP_address]adrian@client:~> ssh adrian@example.com
The authenticity of host 'example.com (10.0.0.50)' can't be established.
ECDSA key fingerprint is SHA256:h0QhlXgCZ860UjM8sAjY6Wmrr2EqSIY5UADBi0wAFV4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'example.com,10.0.0.50' (ECDSA) to the list of known hosts.
Password: # login user's password
adrian@example.com:~> # just logined
Uwierzytelnianie parą kluczy SSH
Skonfiguruj serwer SSH do logowania za pomocą Key-Pair Authentication. Utwórz klucz prywatny dla klienta i klucz publiczny dla serwera, aby to zrobić.
Utwórz Key-Pair dla każdego użytkownika, więc zaloguj się wspólnym użytkownikiem na SSH Server Host i pracuj jak poniżej.
# utwórz parę kluczy na klienciessh-keygen -t rsa -b 4096 -C "imię i nazwisko"Generating public/private rsa key pair.
Enter file in which to save the key (/home/adrian/.ssh/id_rsa): /home/adrian/.ssh/p-tech
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/adrian/.ssh/p-tech
Your public key has been saved in /home/adrian/.ssh/p-tech.pub
The key fingerprint is:
SHA256:IPtApVZ/8o6mCY3lKSvcfEtkD6wzHJ0LzKeHFm3qbxs adrian@G02PLXN05963
The key's randomart image is:
+---[RSA 4096]----+
| o || + . ||= . o . ||= * o + || O % S . || . ^ = o || . o& E + . ||oooOo=|| .o+*o |+----[SHA256]-----+
Aby wygenerować passphrase możesz użyć następującego polecenia w osobnym oknie CLI
1
hexdump -vn16 -e'4/4 "%08X" 1 "\n"' /dev/urandom
Wylistuj parę kluczy
1
2
3
adrian@linux:~> ll ~/.ssh/p-tech*
-rw------- 1 adrian adrian 3.4K Apr 1 16:44 /home/adrian/.ssh/p-tech
-rw-r--r-- 1 adrian adrian 745 Apr 1 16:44 /home/adrian/.ssh/p-tech.pub
Dodaj poniższe wpisy do pliku .bashrc lub .zshrc znajdującego się w katalogu /home/user. Pierwszy wpis uruchamia agenta ssh, a drugi ładuje do niego Twój klucz prywatny. Jeśli ustawiłeś passphrase na swoim kluczu, agent zapyta o jego wpisanie. Możesz dodać więcej niż jeden klucz. Należy pamiętać, że za każdym razem, gdy Bash lub Zsh uruchomi proces restartu lub rozruchu systemu operacyjnego, w CLI poprosi o podanie passphrase.
# odkomentujteliniei zmień na [no]PasswordAuthenticationnoChallengeResponseAuthenticationno# Wyłącz puste hasła# Musiszzapobieczdalnymlogowaniomzkontzpustymi hasłami dla zwiększenia bezpieczeństwa.PermitEmptyPasswordsno# Ograniczenie dostępu użytkowników doSSH# Aby zapewnić kolejną warstwę bezpieczeństwa, powinieneś ograniczyć logowaniedoSSH# tylkodo niektórych użytkowników, którzy potrzebują zdalnego dostępu.# Wten sposób zminimalizujesz wpływ posiadania użytkownika ze słabym hasłem.# Dodaj linię "AllowUsers",a następnie listę nazw użytkowników ioddzielje spacją:AllowUsersstudentadrian# Wyłączanie logowaniaroota# Jedną znajbardziejniebezpiecznychdziurwzabezpieczeniach,# jakie możesz mieć wswoimsystemiejest umożliwienie bezpośredniego logowania się # dorootaprzezSSH. Wten sposób hakerzy próbujący złamać hasło roota mogą# hipotetycznie uzyskać dostęp dosystemu; a jeśli się nadtym zastanowić,# root może wyrządzić dużo więcej szkód namaszynie niż zwykły użytkownik.# Aby wyłączyć logowanieprzezSSHjakoroot, zmień linię na taką:PermitRootLoginno# Ostatecznie możesz pozwolić rootowinalogowanie się przezSSHprzy użyciu parykluczy.# Zrób totylko jeśli serwerniejestwDMZ(niema dostępu zInternetu)PermitRootLoginprohibit-password# DodajProtocol2# SSHposiadadwa protokoły, których może używać. Protokół 1jeststarszyimniejbezpieczny.# Protokół 2jesttym,czego powinieneś używać,aby wzmocnić swoje bezpieczeństwo.# Jeśli chcesz,aby Twój serwer był zgodnyzPCI,musisz wyłączyć protokół 1.Protocol2# Protocol# Określa wersje protokołu, które obsługuje sshd(8). Możliwe.# wartości to'1'i'2'. Wielewersjimusi być oddzielonychprzecinkami.# Domyślnie jestto'2'. Protokół 1cierpinaszereg# słabości kryptograficznychiniepowinien być używany.# Jestoferowanytylkowceluwsparciastarszych urządzeń.# Przykład: Protocol2,1# Użyj innegoportu# Jedną z głównych korzyści zezmianyportui użycia niestandardowegoportu# jest uniknięcie byciawidzianymprzezprzypadkoweskanowanie. Zdecydowana większość hakerów# szukających otwartych serwerów SSH będzie szukała portu22, ponieważ domyślnie,# SSH nasłuchuje połączeń przychodzących natymporcie.# Jeśli trudniejjest zeskanować Twój serwerSSH,to zmniejszają się Twojeszansenaatak.# UruchomSSHnaniestandardowymporcie powyżej portu1024.Port2025# Możesz wybrać dowolny nieużywany port,oileniejeston używany przez inną usługę.# Wiele osób może wybrać 222lub2222jako swój port, ponieważ# jestto dość łatwe do zapamiętania,ale właśnie ztegopowodu,hakerzy skanujący port22# prawdopodobnie będą również próbować portów 222i2222. Spróbuj wybrać numerportu# który niejestjeszcze używany, podążaj zatymlinkiem,aby uzyskać listę numerów portów iichznanych usług.# Jeśli StrictModesjestustawionynatak,towymagane są poniższe uprawnienia.# sudochmod700~/.ssh# sudochmod600~/.ssh/authorized_keysStrictModesyes# Konfiguracja interwału czasu bezczynnościClientAliveInterval360ClientAliveCountMax1# ClientAliveInterval-Ustawia interwał czasowywsekundach,po którym, jeśli nieotrzymano żadnych danychodklienta,# sshd wyśle wiadomość przez kanał szyfrowany,aby zażądać odpowiedziodklienta. Domyślnie jestto0,cooznacza,# że te wiadomości nie będą wysyłane doklienta. Opcjadotyczytylko protokołu wwersji2.# ClientAliveCountMax- Wartość domyślna to3. Jeśli ClientAliveIntervalustawionyjestna15,aClientAliveCountMax# na wartość domyślną,to niereagujący klienciSSH będą rozłączani po około 45sekundach. # Opcjadotyczytylko protokołu wwersji2.# Wartość timeoutjestobliczanaprzez pomnożenie# ClientAliveIntervaliClientAliveCountMax.# timeoutinterval=ClientAliveInterval * ClientAliveCountMax# OpcjeOpenSSHClientAliveIntervaliClientAliveCountMax# nie są używane do rozłączania nieaktywnychsesji.# W rzeczywistości zapobiegają one zamknięciu połączenia,# nawetnanieaktywnychsesjach,tak długo jakklienti łącze sieciowejest żywe.# Jestto wewnętrzny mechanizmssh, który wysyła pakiet"null# wewnątrz ustanowionegotunelu,iczekana odpowiedź odklienta.# Wtymprzypadku wysyła jedenpakietco360sekund,i rozłącza się po1 brakującej odpowiedzi.# Chociaż teopcje są pomocnewwykrywaniuiczyszczeniu rozłączonych sesji klientów,# nie zabiją onesesji klientów, którzy nadal są połączeni,nawet jeśli są nieaktywni.# Chyba, że ichklientnieodpowienapakietnull.
Aby odłączyć nieaktywnych klientów, jeśli używasz bash jako powłoki, możesz ustawić wartość TMOUT w ogólnosystemowym profilu domyślnym lub na użytkownika:
# TMOUT Jeśli ustawionena wartość większą odzera,# TMOUTtraktowanejestjako domyślny limitczasu(tiomeout)# dlawbudowanegoodczytu(read).## Polecenieselect kończy pracę jeśli nieotrzymadanychna wejściu # zterminalapoTMOUTsekund.## W powłoce interaktywnej, wartość tainterpretowanajestjakoliczba# sekundoczekiwanianawiersz wejścia powydaniu głównej zachęty.## Bash kończy pracę poodczekaniutejliczbysekund# jeśli nienadejdzie pełny wiersz wejścia.# Na przykład,dodanie następującej liniido `/etc/.bashrc`.# zamkniesesjebashowenieaktywnego użytkownika po5minutach,# aleprzeczytaj następujące ostrzeżenie przed włączeniem tego:`exportTMOUT=300`# Ostrzeżenie: jakocodzienny użytkownik powłoki, często pozwalam,# aby jakiś terminal był otwartypodczas wielozadaniowości.# Osobiście uznałbym tenmechanizmTMOUTzabardzo denerwujący,# jeśli byłby ustawionyna niską wartość (nawet10minut).# Niepolecamtego,chyba że jestprzynajmniejustawiony# nabardzo wysoką wartość (conajmniej1 godzinę -3600sekund).# Mojaopiniajesttaka, że opcjeOpenSSH `ClientAliveInterval` i `ClientAliveCountMax`# (lub `ServerAliveInterval` i `ServerAliveCountMax`,ustawianepostronieserwera),# wystarczą,aby pozbyć się zombie/rozłączonych klientów.# Używając ich,masz już gwarancję, że aktywnasesjanaserwerze# odpowiadaotwartemuterminalowina podłączonym kliencie.## Tojest wybór użytkownika,aby utrzymać swój terminalotwarty,# podczasgdyrozumiem. że chcesz zamknąć rozłączonych klientów.# Nie widzę sensuzamykaniasesjiodlegalnych użytkowników.
Bezpieczna konfiguracja szyfrów/MAC/Kex dostępnych w SSH