Bezpečné pripojenie cez SSH

Administrátori, ktorí spravujú jeden, alebo viacero serverov sa na terminál pripájajú pomocou SSH (Secure SHell) protokolu. V dávnej minulosti sa na pripájanie k serveru používal protokol telnet a z bezpečnostného hľadiska tento protokol predstavoval veľké riziko, pretože heslo sa posielalo v textovej podobe nezašifrované. Ak na linke medzi klientom a serverom (MiTM) číhal nejaký bot, tak heslo mohol ľahko odchytiť. SSH je protokol šifrovaný, takže odchytenie hesla je nemožné.

Toto je pokračovanie k článku ako ďalej po inštalácii Centos 8 na KVM. Tieto postupy by mali fungovať na OS Fedora/Centos/Red Hat

Administrátori sa pripájajú k serverom najčastejšie v práci a vtedy sú zvyčajne na rovnakej LAN, takže útok z vonka nehrozí (útok môže prísť aj z vnútra siete, ale to je málo pravdepodobné) a predpokladá sa, že SSH port 22 je z vonka zavretý. V dnešnom virtualizovanom IT svete, kde si firmy prenajímajú virtuálne servery, cloudy, atď. sa admin určite musí na SSH pripájať cez verejnú sieť internet. Ak sa chceme pripojiť k nášmu serveru, tak si otvorime lokálny terminál (ak používame OS MS Windows, tak spustíme napr. Putty) a zadáme príkaz

ssh meno@ip_adresa_alebo_hostname

Ako sa teda pripojiť bezpečne?

Silné heslo

Na začiatok je vhodné zvoliť silné heslo. Takéto heslo by malo mať minimálne 8 znakov (odporúčam 16 znakov) a malo by byť zložené okrem malých/veľkých písmem aj z číslic a ďalších nealfanumerických znakov. Heslo si môžeme vymyslieť, alebo na internete existuje mnoho generátorov silných hesiel. Celkom dobrý generátor je aj password-generator. Ak by sa nejaký bot dostal na náš SSH a chcel by prelomiť naše silné heslo, tak sa mu to nepodarí ani za tisíce rokov. Ak však použijeme jednoduché heslo, ktoré sa skladá z 6 alfanumerických znakov, tak heslo bude prelomené do niekoľkých hodín.

Neprihlasovať sa ako root

Na SSH by sme sa nemali nikdy prihlasovať ako root, ale vždy by sme mali použiť obyčajného užívateľa. Čiže ďalšie odporúčanie je vypnúť prihlasovanie roota. To sa nastavuje v konfiguračnom súbore /etc/ssh/sshd_config. Takže na terminál sa prihlásime ako obyčajný užívateľ a zadáme nasledujúci príkaz

sudo nano  /etc/ssh/sshd_config

Vyhľadáme direktívu PermitRootLogin, ktorá je pravdepodobne nastavená na yes a zmeníme ju na no

PermitRootLogin no

súbor zatvoríme a reštartujeme ssh službu

sudo service sshd restart

Ak sa budeme chcieť prihlásiť na SSH ako root, tak server nás odmietne

Použitie neštandardného portu

SSH štandardne počúva na TCP porte 22. Boti skenuje na verejných IP adresách okrem iných aj port 22. Odporúča sa zmeniť tento port na nejaký vyšší , ideálne nad 1024. Môžeme to nastaviť napr. na port 6789. Znovu otvoríme konfiguračný súbor na editovanie a nájdeme riadok s direktívou port ktorého parameter prepíšeme (odkomentujeme) a následne reštartujeme ssh službu

sudo nano  /etc/ssh/sshd_config
Port 6789
sudo service sshd restart

Po reštarte ssh služby uvidíme nasledujúci výstup

Job for sshd.service failed because the control process exited with error code.
 See "systemctl status sshd.service" and "journalctl -xe" for details.

Poznámka: V OS linux kde je SELinux defaultne vypnutý by sme už mali hotovo. Avšak v OS Linux, kde je SELinux defaultne zapnutý (napr. v Centos) musíme pokračovať inak.

Pozrieme sa na

journalctl -xe

a z výstupu je vidieť, že ssh sa nespustilo s novým portom kvoli selinuxovým oprávneniam

-- Unit sshd.service has begun starting up.
 okt 21 20:06:38 localhost.localdomain sshd[5407]: error: Bind to port 6789 on 0.0.0.0 failed: Permission denied.
 okt 21 20:06:38 localhost.localdomain sshd[5407]: error: Bind to port 6789 on :: failed: Permission denied.
 okt 21 20:06:38 localhost.localdomain sshd[5407]: fatal: Cannot bind any address.
 okt 21 20:06:38 localhost.localdomain systemd[1]: sshd.service: Main process exited, code=exited, status=255/n/a
 okt 21 20:06:38 localhost.localdomain systemd[1]: sshd.service: Failed with result 'exit-code'.
 okt 21 20:06:38 localhost.localdomain systemd[1]: Failed to start OpenSSH server daemon.
 -- Subject: Unit sshd.service has failed

Máme 2 možnosti:

  • SELinux vypneme
  • SELinuxu oznámime, že meníme SSH port

Vypnutie SELinuxu

Vypnutie je jednoduché. Najprv zistíme v akom stave je SELinux

sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31

Z výstupu je vidieľ, že SELinux je enabled a Mode from config file je nastavený na enforcing. Otvoríme si konfiguračný súbor a zmenime parameter SELINUX na disabled

sudo nano /etc/selinux/config
SELINUX=disabled

Po tejto zmene sa vyžaduje reštart celého stroja

sudo shutdown -r now

A tak isto musíme pridať pravidlo do firewallu a následne reload firewallu

sudo firewall-cmd --add-port=6789/tcp --permananet
sudo firewall-cmd --reload

Teraz sa môžeme spokojne prihlásiť na neštandardnom porte.

ssh -p 6789 meno@ip_adresa

SELinuxu oznámime, že meníme SSH port

Ak SELinux z nejakého dôvodu nemôžeme vypnúť, tak musíme oznámiť, že na SSH budeme používať iný port ako 22. Na to však potrebujeme balík, ktorý obsahuje semanage. Aby sme zistili, ktorý balík máme nainštalovať spustíme jeden z týchto príkazov

yum whatprovides /usr/sbin/semanage
yum provides /usr/sbin/semanage

ktorých výstup vyzerá nejak takto

policycoreutils-python-utils-2.8-16.1.el8.noarch : SELinux policy core python utilities
 Repozitár   : BaseOS
 Matched from:
 Názov súboru: /usr/sbin/semanage

Z toho výpisu je vidieť, že semanage je obsiahnutý v balíčku policycoreutils-python-utils-2.8-16.1.el8.noarch, takže ho nainštalujeme

sudo yum install policycoreutils-python-utils

Teraz zmeníme port v konfiguračnom súbore

sudo nano  /etc/ssh/sshd_config
Port 6789

a následne môžeme selinuxu povedať, že na SSH budeme používať iný port ako je štandardný 22. Ak dobehne príkaz, pridame do firewallu pravidlo a reloadneme firewall. Nakoniec reštartujeme SSH službu.

sudo semanage port -a -t ssh_port_t -p tcp 6789
sudo firewall-cmd --add-port=6789/tcp --permanent
sudo firewall-cmd --reload
sudo service sshd restart

Teraz zmeníme prihlasovanie na SSH tak, že pridáme aj náš nový port

ssh -p 6789 meno@ip_adresa

Prihlásenie súkromným kľúčom

Ďalší veľmi bezpečný spôsob prihlasovania sa na server je použitie privátneho a verejného kľúča. Na lokálnom stroji (nie na servery na ktorý sa chceme pripojiť) si vygenerujeme pár kľúčov pomocou príkazu

ssh-keygen -t rsa 

výsledok generovania

Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:IiUSSY52x38BQgCQnjnZoSktaX2fFnGtgHPwKPBwpR4 username@host
The key's randomart image is:
+---[RSA 2048]----+
|=+**+o o         |
|o*+*= o o        |
|*+E++*.. .       |
|*@=+ooo   .      |
|..oo.o..S.       |
|    +. ..        |
|   .             |
|                 |
|                 |
+----[SHA256]-----+

je pár kľúčov, kde jeden je súkromný id_rsa a jeden verejný id_rsa.pub. Verejný nahráme na všetky servery, na ktoré sa chceme prihlasovať a súkromný máme bezpečne uloženy vo svojom domovskom adresári. Prístup k nemu mame len mi. Ak by nám ho niekto ukradol, tak sa dostane na naše všetky servery. Ešte uvediem príkaz ako nahráme verejný kľúč na server/y. Pokiaľ máme na lokálnom stroji nainštalovaný ssh-copy-id, tak nám stači použiť (ak nie je port 22, tak použijeme aj parameter -p s čislom portu (u mňa napr. 6789)).

ssh-copy-id ip_adresa_servera -p 6789

zadáme prihlasovacie heslo a to je všetko. Ak sa budeme chcieť prihlásiť nabudúce, tak od nás nebude vyžadované žiadne heslo. Ak ssh-copy-id nemáme nainštalované, tak použijeme tento príkaz (netestoval som)

cat ~/.ssh/id_rsa.pub | ssh -p 6789 username@ip_adresa_servera "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"


Ak máme nastavené prihlasovanie cez kľúče, tak sa odporúča vypnúť prihlasovanie heslom. V tomto prípade ešte zmeníme konfiguračný súbor pre SSH a reštartujeme službu SSH

sudo nano /etc/ssh/sshd_config

a zmeníme tieto parametre na NO (ak nie sú tak ich odkomentujeme)

PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
sudo service sshd restart

Záver

Samozrejme, že ešte existuje viacero spôsobov ako skomplikovať hackerovy prístup na náš server cez SSH. Avšak tento blog by sa stále rozširoval, tak som sa rozhodol, že tu vložím len odkazy aké sú ďalšie možnosti. Veľmi pekný článok je na root.cz ohľadom Port Knockingu. A ešte ďalší článok, ktorý pojednáva o službe Fail2Ban. Len upozorním, že články sú staršieho dáta, takže môžu obsahovať zastaralé informácie, ktoré dnes nemusia platiť. Skôr som chcel poukázať ako tieto 2 „démony“ pracujú a aký je princíp ich využitia.

Ako sme sa v dnešnom článku dozvedeli, tak nastaviť ochranu pre SSH nie je nič zložité. Trocha nám to skomplikoval spustený SELinux, kde sme museli pri zmene portu vykonať nejaké nastavenia navyše. Avšak myslím si, že celkom by stačilo použiť prihlasovanie cez kľúče a vypnúť prihlasovanie cez heslo.

Leave a Reply

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *