5 veiksmingi patarimai, kaip sustiprinti SSH serverį Ubuntu


Šiame įraše pasidalinsiu 5 patarimais, kuriuos galite naudoti norėdami apsaugoti SSH viešajame Ubuntu serveryje. SSH reiškia Secure SHell. Tai pagrindinis būdas administratoriams prisijungti prie nuotolinių „Unix“/„Linux“ serverių, taip pat vienas iš pagrindinių blogiukų atakų vektorių. Svarbu, kad mes jį kuo labiau apsaugotume.

SSH serverio žurnalo tikrinimas

Prieš taikydami mano patarimus, galite peržiūrėti savo SSH žurnalą išduodami šią komandą. Žyma -u nurodo, kad norime matyti tik žurnalus, priklausančius ssh paslaugų vienetui.

sudo journalctl -u ssh

Paspauskite J, kad slinktumėte žemyn, K, kad slinktumėte aukštyn. Paspauskite F, kad slinktumėte vienu per visą ekraną žemyn, B, kad slinktumėte vienu visu ekranu aukštyn. Norėdami išeiti, paspauskite Q. Jei norite eiti tiesiai į rąsto galą, bėkite

sudo journalctl -eu ssh

Pamatysite, kad blogi vaikinai nuolat bando gauti prieigą prie jūsų SSH serverio, kaip nurodyta toliau pateiktuose pranešimuose.

Apr 23 18:58:33 sshd[14505]: Failed password for root from 42.7.26.60 port 60148 ssh2
Apr 23 18:58:35 sshd[14505]: Failed password for root from 42.7.26.60 port 60148 ssh2
Apr 23 18:58:38 sshd[14507]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=58.218.198.170 user=root
Apr 23 18:58:38 sshd[14505]: Failed password for root from 42.7.26.60 port 60148 ssh2
Apr 23 18:58:40 sshd[14507]: Failed password for root from 58.218.198.170 port 63586 ssh2
Apr 23 18:58:41 sshd[14505]: Failed password for root from 42.7.26.60 port 60148 ssh2
Apr 23 18:58:42 sshd[14507]: Failed password for root from 58.218.198.170 port 63586 ssh2
Apr 23 18:58:44 sshd[14505]: Failed password for root from 42.7.26.60 port 60148 ssh2
Apr 23 18:58:45 sshd[14507]: Failed password for root from 58.218.198.170 port 63586 ssh2

1 patarimas: išjunkite pagrindinį SSH prisijungimą

Blogi vaikinai turi žinoti vartotojo vardą, kad galėtų prisijungti prie jūsų serverio. Kiekviena Linux sistema turi root vartotojo abonementą, todėl bloga idėja leisti root vartotojui prisijungti per SSH. Galime sukurti kitą vartotoją, turintį galimybę prisijungti prie SSH ir išjungti root SSH prisijungimą. Taigi, užpuolikas turi išsiaiškinti vartotojo vardą, prieš bandydamas brutaliomis jėgomis įvesti slaptažodį. Galite sukurti vartotoją Ubuntu vykdydami šią komandą. Pakeiskite naudotojo vardą pageidaujamu naudotojo vardu. Venkite įprastų naudotojų vardų, pvz., admin.

sudo adduser username

Jūsų bus paprašyta nustatyti naujo vartotojo slaptažodį. Tada pridėkite šį vartotoją prie sudo grupės, kad šis vartotojas galėtų valdyti serverį naudodamas sudo.

sudo adduser username sudo

Patikrinkite, ar šis naujas vartotojas gali prisijungti per SSH ir gali naudoti sudo. Tada redaguokite SSH demono konfigūracijos failą.

sudo nano /etc/ssh/sshd_config

Raskite šią eilutę:

#PermitRootLogin yes

Pašalinkite simbolį # ir pakeiskite taip į ne, kad išjungtumėte pagrindinį SSH prisijungimą.

PermitRootLogin no

Išsaugokite ir uždarykite šį failą. Tada iš naujo paleiskite SSH paslaugą, kad pakeitimai įsigaliotų.

sudo systemctl restart ssh

Dažniausiai nenaudoju root paskyros, todėl mėgstu nustatyti ilgą, sudėtingą root slaptažodį, kurio net aš neprisimenu. Nes nenoriu pasilikti numatytojo slaptažodžio, kurį sugeneravo mano prieglobos paslaugų teikėjas. Ką daryti, jei jūsų prieglobos paslaugų teikėjo paskyra buvo nulaužta, o blogas veikėjas gali naudoti numatytąjį root slaptažodį, kad pasiektų jūsų serverį per VNC konsolę?

Naudoju šią komandą 32 simbolių ilgio atsitiktiniam slaptažodžiui sugeneruoti.

openssl rand -base64 32

Norėdami pakeisti pagrindinį slaptažodį, paleiskite

sudo passwd root

Jei man reikia naudoti root paskyrą, tiesiog perjungiu į root naudodami šią komandą. Man nereikia pateikti root slaptažodžio. Man tereikia įvesti savo vartotojo paskyros sudo slaptažodį.

sudo su -

Jei užpuolikas bandys prisijungti kaip vartotojas su išjungtu SSH (pvz., root), SSH žurnale pamatysite šią eilutę.

Failed password for invalid user root

Čia netinkamas reiškia, kad vartotojo sistemoje nėra arba jis neturi SSH prisijungimo leidimo. Jei vartotojas, turintis SSH prisijungimo leidimą, įvedė neteisingą slaptažodį, pamatysite tokią eilutę:

Failed password for username

2 patarimas: naudokite viešojo rakto autentifikavimą ir išjunkite slaptažodžio autentifikavimą

Slaptažodžiai yra silpnoji saugumo vieta, o žmonės sukuria blogus slaptažodžius. Geresnis autentifikavimo būdas yra autentifikavimas viešuoju raktu: įkeliate savo viešąjį raktą į serverį ir tik privatus raktas gali būti naudojamas prisijungimui. Kai kurie žmonės tai vadina prisijungimu be slaptažodžio.

Norėdami įjungti autentifikavimą viešuoju raktu ir išjungti slaptažodžio autentifikavimą, žr. šią mokymo programą:

  • 2 paprasti žingsniai, kaip nustatyti SSH prisijungimą be slaptažodžio Ubuntu

3 patarimas: įgalinkite dviejų veiksnių autentifikavimą (2FA)

Paprastai norint nuotoliniu būdu prisijungti prie Ubuntu serverio, tereikia įvesti slaptažodį arba naudoti SSH raktą. Dviejų veiksnių autentifikavimui (2FA) reikia pateikti dvi informacijos dalis, kad galėtumėte prisijungti, o tai gali labai padidinti jūsų OpenSSH serverio saugumą. Šiomis dienomis daugelis svetainių ir paslaugų („Facebook“, „Google“, „Twitter“ ir t. t.) leidžia vartotojui nustatyti 2FA, kad apsaugotų savo paskyras. Taip pat verta įjungti 2FA savo SSH serveryje.

Norėdami įjungti dviejų veiksnių autentifikavimą OpenSSH serveriui Ubuntu, patikrinkite šią pamoką.

  • Kaip nustatyti SSH dviejų veiksnių autentifikavimą Ubuntu 18.04, 18.10 serveryje

4 patarimas: naudokite Fail2ban, kad užblokuotumėte pasikartojančius pažeidėjus

Fail2ban yra serverio ir kliento programų rinkinys, skirtas apriboti brutalios jėgos autentifikavimo bandymus. Įdiekite jį iš numatytosios Ubuntu saugyklos.

sudo apt install fail2ban

Įdiegus jis bus automatiškai paleistas, kaip matyti iš:

sudo systemctl status fail2ban

Programa fail2ban-server, įtraukta į fail2ban, stebi žurnalo failus ir išduoda uždraudimo/panaikinimo komandą. Pagal numatytuosius nustatymus kliento IP adresas būtų uždraustas 10 minučių, jei klientas slaptažodžio nesugebėjo 5 kartus. Draudimas atliekamas pridedant iptables ugniasienės taisykles. Galite patikrinti iptables taisykles vykdydami šią komandą.

sudo iptables -L

Žemiau esančioje ekrano kopijoje nuotolinis klientas 54.ip-37-187-225.eu yra uždraustas mano serveryje. 10 minučių bus atsisakyta prisijungti prie 22 prievado. (Jis gali prisijungti prie kitų atidarytų serverio prievadų.)

Fail2ban taisyklių failas yra /etc/fail2ban/jail.conf. Nereikia jo redaguoti, nes numatytųjų nustatymų turėtų pakakti, kad būtų išvengta SSH brute force atakos. Jei norite pakeisti numatytuosius nustatymus, turėtumėte pridėti pakeitimus į failą /etc/fail2ban/jail.local.

Pavyzdžiui, į failą jail.local galite pridėti šias eilutes.

[sshd]
enabled = true
maxretry = 3
bantime = 24h
ignoreip = 127.0.0.1/8 ::1/128 12.34.56.78

Kur:

  • maxretry: gedimų, kurie turi įvykti per pastarąsias 10 minučių, skaičius, norint uždrausti IP.
  • bantime: veiksminga draudimo trukmė. Atminkite, kad fail2ban versija Ubuntu 16.04 nepalaiko h (valandos) laiko vieneto, todėl turite naudoti numatytąjį s (antrą) laiko vienetą.
  • ignoreip: nedraudžiamų IP sąrašas

Norėdami nustatyti numatytąsias visų kalėjimų vertes, įdėkite parametrą į [DEFAULT], o ne į [sshd]. Pavyzdžiui, galite įdėti ignoreip adresus į [Numatytasis].

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1/128 12.34.56.78

Dabar galite pašalinti parametrą ignoreip[sshd] kalėjimo, taigi, jei į baltąjį sąrašą įtrauksite daugiau IP adresų, galėsite juos įtraukti į [DEFAULT] . Jei yra 2 tie patys parametrai, esantis [sshd] nepaisys kito [DEFAULT].

Išsaugokite ir uždarykite failą. Tada iš naujo įkelkite fail2ban, kad pakeitimai įsigaliotų.

sudo systemctl reload fail2ban

Fail2ban prisijungimą galite patikrinti faile /var/log/fail2ban.log. Daugiau informacijos apie fail2ban kalėjimo konfigūraciją rasite vadovo puslapyje.

man jail.conf

5 patarimas: IP adresų įtraukimas į baltąjį sąrašą

Naudoti fail2ban gali nepakakti OpenSSH serveriui sustiprinti. Ką daryti, jei patį fail2ban galima išnaudoti, kad būtų galima nuotoliniu būdu vykdyti kodą? Galite pašalinti nereikalingas atakas prieš serverį naudodami ugniasienės taisykles, todėl blogi veikėjai net negalės prijungti jūsų SSH prievado.

Jei tik pačiam reikia prisijungti prie serverio, kam leisti prisijungti kitu IP adresu? Galite apriboti SSH prisijungimą iki savo IP adreso ir uždrausti visus kitus IP adresus. Mano namų IP adresas yra dinamiškas, bet aš turiu savo VPN serverį, kuris veikia duomenų centre, todėl naudodamas VPN turiu statinį IP adresą. Jūs netgi galite nustatyti VPN serverį tame pačiame pagrindiniame kompiuteryje, kad galėtumėte prisijungti prie OpenSSH serverio iš to serverio IP adreso.

OpenSSH serveris gali naudoti TCP Wrappers, kad nustatytų baltąjį ir juodąjį sąrašą. Jei norite leisti savo IP adresu prisijungti per SSH, redaguokite failą /etc/hosts.allow.

sudo nano /etc/hosts.allow

Pridėkite leistiną IP adresą, kaip nurodyta toliau. Jei IP adresai nėra tame pačiame diapazone, turite pridėti eilutę kiekvienam pagrindiniam kompiuteriui atskirai.

sshd:192.168.0.0/24
sshd:127.0.0.1
sshd:12.34.56.78

Išsaugokite ir uždarykite failą. Tada redaguokite failą /etc/hosts.deny. Galite neleisti visų kitų prieglobų pridėdami šią eilutę.

sshd:ALL

Išsaugokite ir uždarykite failą. Jums nereikia iš naujo įkelti jokios paslaugos. Pakeitimai įsigalioja, kai failai išsaugomi.

Atminkite, kad pirmiausia svarbu redaguoti failą /etc/hosts.allow, nes priešingu atveju galite būti užblokuoti savo serveryje.

Po kurio laiko galite patikrinti SSH žurnalus.

sudo journalctl -eu ssh

Pamatysite toliau nurodytus pranešimus, nurodančius, kad TCP Wrappers uždraudė šiems IP adresams prisijungti prie SSH demono.

Dec 26 07:57:42 sshd[5962]: refused connect from 37.187.92.192 (37.187.92.192)
Dec 26 07:57:55 sshd[5979]: refused connect from 178.128.71.114 (178.128.71.114)
Dec 26 07:58:00 sshd[5985]: refused connect from 188.120.235.20 (188.120.235.20)
Dec 26 07:58:05 sshd[5991]: refused connect from 181.49.150.45 (181.49.150.45)

IPtables ugniasienės naudojimas IP adresui apriboti

Kai kuriuose „Linux“ paskirstymuose, pvz., „Arch Linux“, pagal numatytuosius nustatymus nėra TCP paketų. Tokiu atveju galite naudoti iptables užkardą, kad sukurtumėte baltąjį IP adresų sąrašą, galintį prijungti prievadą prie SSH prievado. Užkardos baltajame sąraše atrodo, kad SSH prievadas jūsų serveryje yra uždarytas, o tai man labiau patinka.

Kad dabartiniai SSH ryšiai nenutrūktų, turime leisti užmegztus seansus naudodami šią iptables komandą.

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Tada leiskite savo IP adresui prisijungti prie SSH prievado naudodami toliau pateiktą komandą. Pakeiskite savo IP adresą tikruoju IP adresu, pvz., 74.125.128.103.

sudo iptables -A INPUT -p tcp --dport 22 -s your-ip-address -j ACCEPT

Kur:

  • -A INPUT naudojama aukščiau nurodytai taisyklei pridėti prie INPUT grandinės, kuri susijusi su gaunamu srautu.
  • -p tcp nurodo, kad protokolas yra TCP, nes SSH demonas klausosi TCP prievado.
  • --dport 22 nurodo paskirties prievadą 22, kuris yra numatytasis SSH prievadas. Jei pakeitėte SSH prievadą, čia taip pat turite pakoreguoti prievadą.
  • -s your-ip-address nurodo šaltinio IP adresą.
  • -j ACCEPT reiškia perėjimą prie ACCEPT tikslo, kuris leis prisijungti prie SSH.

Galite pridėti kelias ugniasienės taisykles, kad būtų galima naudoti kelis IP adresus. Tai atlikę, paleiskite šią komandą, kad atmestumėte visus kitus IP adresus, kad galėtumėte prisijungti prie SSH serverio. Mes nenurodome šaltinio IP adreso, o tai reiškia, kad visi kiti IP adresai bus neleidžiami.

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

Patikrinkite iptables ugniasienės taisykles naudodami toliau pateiktą komandą.

sudo iptables -L

Jei vėliau į baltąjį sąrašą norite įtraukti naują IP adresą, turite įterpti naują taisyklę.

sudo iptables -I INPUT -p tcp --dport 22 -s your-ip-address -j ACCEPT

Parinktis -I naudojama aukščiau nurodytai ugniasienės taisyklei įterpti į INPUT grandinę. Pagal numatytuosius nustatymus ji įterps pirmiau nurodytą taisyklę kaip pirmąją INPUT grandinės taisyklę. Atminkite, kad jei INPUT grandinės apačioje pridėsime naują taisyklę (-A), ši taisyklė neturės jokios įtakos, nes ji ateina po taisyklės „atmesti visus kitus IP“.

Jei naudojate iptables sąsają, pvz., UFW, žr. šią pamoką, kaip sukurti baltąjį sąrašą.

  • Darbo su UFW ugniasienės pradžia Debian, Ubuntu, Linux Mint Server

Tikrinamas paskutinio prisijungimo IP adresas

PrintLastLog naudojamas norint pasakyti, kada įvyko paskutinis prisijungimas ir iš kokio IP adreso. Tai galite pamatyti po to, kai SSH įeisite į savo serverį. Tai atrodo maždaug taip:

Last login: Thu Jun  2 04:10:08 2016 from 12.34.56.78

Jei neatpažįstate IP adreso, žinote, kad kažkas ne taip. Norėdami įjungti PrintLastLog, redaguokite SSH demono konfigūracijos failą.

sudo nano /etc/ssh/sshd_config

Ir nustatykite „PrintLastLog“ į „taip“.

PrintLastLog yes

Išsaugokite failą ir iš naujo paleiskite SSH paslaugą.

Ką daryti, jei esate užblokuotas?

Kai kurie žmonės mano, kad taikydami visus aukščiau pateiktus patarimus galite netyčia būti užblokuoti.

Tačiau jei galite fiziškai pasiekti serverį, jums nereikia SSH prisijungti. Net jei jūsų serveris yra debesyje, visada galite prisijungti prie serverio naudodami VNC konsolę. Pavyzdžiui, aš naudoju savo pašto serverį „ScalaHosting“. „ScalaHosting“ paskyros valdymo skydelyje teikia žiniatinklio VNC konsolę. Šiam VNC ryšiui SSH įtakos neturi.

„DigitalOcean“ taip pat teikia saugią žiniatinklio VNC konsolę.

Taip pat ir Vultras.

Visada galite prisijungti per VNC, kai SSH nepasiekiamas.

Kitas žingsnis

Tikiuosi, kad ši pamoka padėjo jums sustiprinti OpenSSH serverį Ubuntu. Tai yra vienas saugos mokymo programų serijos straipsnis. Taip pat galbūt norėsite peržiūrėti kitus straipsnius, kad sustiprintumėte savo serverį.

  • Nustatykite automatinį saugos naujinimą (neprižiūrimus atnaujinimus) Ubuntu
  • „Canonical Livepatch“ paslauga: pataisykite „Linux“ branduolį „Ubuntu“ be perkrovimo
  • Kaip naudoti UFW ugniasienę Debian, Ubuntu, Linux Mint

Kaip visada, jei šis įrašas buvo naudingas, užsiprenumeruokite mūsų nemokamą informacinį biuletenį, kad gautumėte daugiau patarimų ir gudrybių. Rūpinkitės 🙂