Varnostne nastavitve strežnika SSH

Linux Branje: 4 min

Na vrata SSH strežnika, povezanega z internetom, v nekaj minutah po postavitvi prispejo prvi samodejni poskusi prijave. Ta članek po vrsti pregleda najpomembnejše korake zaščite in tudi, kako preveriš, ali nastavitev res velja. O osnovah SSH govori članek Linux Secure Shell (SSH).

Korake smo preizkusili v sistemih AlmaLinux 10.2, Ubuntu 24.04 in Debian 12, na navideznih računalnikih, nameščenih iz lastnih cloud image distribucij. Ukaze zaganjaj kot uporabnik root ali s sudo.

Preden karkoli spremeniš

  • Pusti odprto delujočo povezavo SSH, dokler nove nastavitve ne preizkusiš v novi povezavi. Ponovni zagon sshd že vzpostavljenih povezav ne prekine, zato lahko iz nje popraviš, če gre kaj narobe.
  • Pred vsakim ponovnim zagonom preveri sintakso: sudo sshd -t. Če ni izpisa, je datoteka v redu.
  • Vedi, kako strežnik dosežeš brez SSH (na VPS konzola nadzorne plošče), za primer, da bi se vseeno zaklenil ven.

Kam vpisati nastavitve?

Glavna konfiguracijska datoteka je /etc/ssh/sshd_config, vendar je na vseh treh testnih sistemih na njenem začetku vrstica Include /etc/ssh/sshd_config.d/*.conf. sshd pri nastavitvi upošteva prvo pojavitev, zato datoteke v imeniku prepišejo glavno datoteko.

To lahko preseneti: na računalnikih, nameščenih iz cloud image, cloud-init sem postavi datoteko 50-cloud-init.conf, na primer z vrstico PasswordAuthentication no. V preizkusu je PasswordAuthentication yes, vpisan na konec glavnega sshd_config, ostal brez učinka, ker ga je datoteka drop-in nastavila prej.

Zato svoje nastavitve postavi v ločeno datoteko v imeniku, z imenom, ki se razvrsti pred datoteko cloud-init, na primer:

sudo nano /etc/ssh/sshd_config.d/10-biztonsag.conf

Kaj na koncu velja, ni treba ugibati iz datotek: sshd -T izpiše dejansko uporabljene vrednosti.

sudo sshd -T | grep -E '^(port|permitrootlogin|passwordauthentication|pubkeyauthentication) '

V preizkusu so bile osnovne vrednosti v AlmaLinux 10 in Ubuntu 24.04: port 22, permitrootlogin without-password (root se lahko prijavi le s ključem), passwordauthentication no (to je nastavil cloud-init).

1. Prijava s ključem, prepoved gesla

Najpomembnejši korak: namesto z geslom se prijavljaj s ključem, prijavo z geslom pa prepovej. Na svojem računalniku:

ssh-keygen -t ed25519
ssh-copy-id felhasznalo@szervercime

V novem terminalu preizkusi, ali se prijaviš brez gesla. Če se, na strežniku v datoteko 10-biztonsag.conf:

PasswordAuthentication no
KbdInteractiveAuthentication no

Nato:

sudo sshd -t && sudo systemctl restart sshd     # Ubuntu, Debian: ssh

Na poskus z geslom strežnik nato odgovori: Permission denied (publickey…). O upravljanju ključev tudi iz Windows piše vodnik za povezavo SSH z VPS.

2. Prepoved prijave root

Najprej ustvari lastnega uporabnika s pravicami sudo in z njim preizkusi prijavo (glej: Ustvarjanje uporabnika in dodelitev pravic sudo). Nato:

PermitRootLogin no

V preizkusu je sshd -T po vrstici, vpisani v datoteko 10-biztonsag.conf, že kazal vrednost permitrootlogin no. Če namesto prepovedi prijave root želiš izključiti le prijavo root z geslom, je pravi PermitRootLogin prohibit-password (drugače without-password), kar je tudi osnovna vrednost testnih sistemov.

3. Sprememba vrat SSH

Sprememba vrat šibkega gesla ne naredi varnejšega, v dnevnikih pa bo veliko manj samodejnih poskusov. Nova vrata vpiši v datoteko drop-in in, dokler jih ne preizkusiš, pusti tudi vrata 22:

Port 22
Port 2255

Nadaljnji koraki se razlikujejo po distribucijah.

AlmaLinux, Rocky Linux: SELinux in firewalld

SELinux sshd dovoli poslušati le na vratih tipa ssh_port_t. Če to izpustiš, se sshd zažene, a na novih vratih ne posluša; v dnevniku je Bind to port 2255 … failed: Permission denied. Ukaz semanage je v paketu policycoreutils-python-utils, ki na cloud image ni bil nameščen:

sudo dnf install policycoreutils-python-utils
sudo semanage port -a -t ssh_port_t -p tcp 2255
sudo systemctl restart sshd

Sprememba vrat SSH v sistemu AlmaLinux 10: po journalctl je bind na vratih 2255 spodletel z napako Permission denied, ss kaže le vrata 22; po ukazu semanage port -a in ponovnem zagonu sshd posluša na vratih 22 in 2255

Če teče firewalld (sudo firewall-cmd --state), dovoli tudi nova vrata:

sudo firewall-cmd --permanent --add-port=2255/tcp
sudo firewall-cmd --reload

Ubuntu 24.04: aktivacija prek vtičnice

V Ubuntu 24.04 na vratih 22 ne posluša storitev ssh, temveč ssh.socket. V preizkusu je bil systemctl restart ssh po spremembi vrat brez učinka, še vedno so bila živa le vrata 22. Vrata se spremenijo po daemon-reload in ponovnem zagonu vtičnice:

sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

Če je ufw vklopljen (v preizkusu privzeto ni bil), dovoli vrata: sudo ufw allow 2255/tcp.

Debian

V Debianu zadošča ponovni zagon: sudo systemctl restart ssh.

Preverjanje

sudo ss -tlnp | grep sshd

Iz novega terminala se poveži na nova vrata (ssh -p 2255 felhasznalo@szervercime). Če deluje, lahko vrstico Port 22 izbrišeš in vrata 22 zapreš tudi v požarnem zidu.

4. Omejevanje poskusov

Fail2ban spremlja dnevnike in naslove IP, ki pošiljajo veliko napačnih prijav, za nekaj časa blokira v požarnem zidu. Njegovo namestitev in pasti (na primer da mora v AlmaLinux teči firewalld, sicer blokada ne učinkuje) opisuje članek Namestitev in nastavitev Fail2ban. Na strežniku cPanel isto opravljata cPHulk in CSF/LFD.

Število poskusov znotraj ene povezave omejuje MaxAuthTries (njegova osnovna vrednost je bila v preizkusu 6), na primer MaxAuthTries 3.

5. Posodobitve

Varnostni popravki OpenSSH pridejo s sistemskimi posodobitvami (v preizkusu je bil v AlmaLinux 10 OpenSSH 9.9, v Ubuntu 24.04 pa 9.6). Vklopi samodejne varnostne posodobitve, glej: Posodabljanje sistema: dnf, apt in samodejne posodobitve.

Strežniki aWh

Na KVM VPS so vse zgornje nastavitve v tvojih rokah. Na našem gostovanju cPanel SSH teče na vratih 4231, prijava pa je mogoča le s ključem; o nalaganju ključa govori članek Ustvarjanje ali nalaganje ključa SSH na strežnik cPanel.

Nazaj: Linux – članki (76)