Zaštita SSH pristupa serverima

Obradićemo neke difolt radnje koje vi kao admin treba da odradite kad je u pitanju zaštita daljinskog pristupa Linuks serveru putem SSH.

SSH (Secure Shell) je mrežni protokol koji korisnicima omogućava uspostavljanje sigurnog komunikacijskog kanala između dva računara putem nesigurne računarske mreže. Više o SSH pročitajte na domaćoj Vikipediji. Serveru ćemo pristupati sa Vindovs mašine preko programa koji se zove PuTTY jer je, na osnovu mog iskustva i onog što mi admini vele – to glavni pristup Linuks mašinama.

Promena podrazumevanog SSH porta na serveru

Podrazumevani port za logovanje na server putem SSH protokola je 22 i uljezi koji bi da dobiju pristup vašem serveru većinom slučajeva prvo skeniraju pa kasnije i brutforsuju (bruteforce) taj port i zato je jedna od prvih radnji gašenje tog porta i otvaranje nekog bezveze porta za pristup.

U ovom slučaju otvorićemo port 53535 – i to je ujedno moja preporuka…da svi ti „custom“ portovi budu u opsegu 50000-65535 kako bi se dodatno otežao posao malicioznim korisnicima jer će tad izgubiti dodatno vreme za skeniranje otvorenih portova nmap-om.

Takođe, sama promena podrazumevanog SSH porta uz dobru firewall zaštitu (koju ćemo obraditi u nekom narednom tekstu) jeste indikator malicioznim korisnicima da je server najverovatnije obezbeđen od strane stručnog lica pa ih i to može odbiti od dalje akcije.

Za promene podrazumevanog porta ulogujte se na server kao root korisnik i odradite sledeće komande:

# Izmena zakomentarisane vrednosti #Port 22 u Port 53535 u fajlu /etc/ssh/sshd_config
sed -i s/"#Port 22"/"Port 53535"/g /etc/ssh/sshd_config

# Naravno, na firewall-u ne zaboravite da otvorite taj port
iptables -I INPUT 1 -p tcp --dport 53535 -j ACCEPT
service iptables save
service iptables restart
# Restart sshd-a
service sshd restart

Sad pokušajte da se ulogujete na server, ali sa tim novim portom…

PuTTY - promenjen ssh port

Logovanje isključivo putem SSH ključeva

Ovo je ujedno i preporučeni način logovanja na produkcione servere – odjebaus lozinkama, samo ključ majka mara – zaštićen nekom zajebanom frazom i to je to. Po nekima, uz ovaj vid logovanja čak nije ni potrebno koristiti neke SSH brutfors zaštite tipa „fail2ban“ i slično jer napadač dalje od unosa korisničkog imena i ne može da ode, tj ne stiže do unosa lozinke – jer lozinke i nema, hehe.

Jedina mana ovakvog pristupa logovanju je ta – da ako izgubite SSH ključ, možete se jebat’ ako nemate fizički pristup serveru, tako da je preporuka da i ove ključeve čuvate na sigurnom mestu, recimo tamo gde čuvate i lozinke – kažem na sigurnom mislim na KeePass Password Safe naravno.

# Kreiranje ključa za nekog od korisnika (u ovom slučaju korisnik draza)
[root@centos6 ~]# su - draza
[draza@centos6 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/draza/.ssh/id_rsa):
Created directory '/home/draza/.ssh'.
Enter passphrase (empty for no passphrase): unesite_neku_lozinku_ovde
Enter same passphrase again: unesite_neku_lozinku_ovde
Your identification has been saved in /home/draza/.ssh/id_rsa.
Your public key has been saved in /home/draza/.ssh/id_rsa.pub.
The key fingerprint is:
cd:4c:30:34:cc:d7:c2:bb:c0:3f:06:51:0e:15:eb:45 draza@centos6.kompjuteras.com
The key's randomart image is:
+--[ RSA 2048]----+
|       +*++oE    |
|        +*+o.    |
|       . o+o.    |
|        +*..     |
|        S+=.     |
|          =      |
|         . .     |
|                 |
|                 |
+-----------------+

# Kreirana su dva ključa id_rsa (privatni) i id_rsa.pub (javni).
# Dodati javni u autorizovane ključeve i postaviti ispravne privilegije
[draza@centos6 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[draza@centos6 ~]$ chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh/

Potom putem programa koji se zove WinSCP-a (može i FileZilla) idite na, u ovom slučaju folder /home/draza/.ssh/ i prekopirajte kod sebe privatni ključ…koji se zove (u ovom slučaju) id_rsa

Sadržaj tog privatno ključa je otprilike ovakav:

Privatni ključ

Kad ste prekopirali kod sebe taj fajl (tj ključ), treba da ga prevedete u neki format koji može da pročita PuTTY…a to se radi pomoću programa koji se zove PuTTYgen.

Pošto ste privatni ključ prebacili u PuTTY ključ i sačuvali kod sebe, sad treba da zabranite logovanje putem lozinki a to ćete uraditi tako što ćete u fajlu /etc/ssh/sshd_config prepraviti ove linije da imaju sledeće vrednosti:

vim /etc/ssh/sshd_config

ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no

Pa restartujte sshd servis

service sshd restart

Preporuka je kad ovo završite obrišete i privatni i javni ključ sa servera (folder ~/.ssh)

Zabrana logovanja putem SSH za root korisnika

Zašto? Root (rut) korisnik je tatko na sistem, ima pristup svemu i svima i može da radi šta mu srcu milo i drago, što će reći da može da uništi ceo server bez kapi znoja – a i root korisnik uvek ima korisničko ime root (mada se može i ovo skarabudžiti ali nije preporučljivo)…čime je pola posla oko provaljivanja pristupa završeno – ostaje još samo lozinka da se ubode i to je to (pod uslovom da niste dodali i ssh ključ u celu priču).

# Ako nemate nekog drugog korisnika na serveru dodajte ga i dajte mu lozinku
useradd draza
passwd draza

# Izmena linije #PermitRootLogin yes --> PermitRootLogin no 
sed -i s/"#PermitRootLogin yes"/"PermitRootLogin no"/g /etc/ssh/sshd_config

# Restart ssh servisa
service sshd restart

fail2ban

Fail2ban je jedan od programčića koje vodim pod „difolt“ a služi da ubije na neko vreme IP adresu sa koje je neuspešno pokušavano logovanje više puta bilo preko SSH ili FTP-a ili nekog drugog servisa poput recimo Vordpresa a koji koristi neki vid autentifikacije – dakle, osnovna namena ovog programa jeste zaštita od brutforsa na serveru. U ovom tekstu ćemo ga instalirati i iskonfigurisati samo za zaštitu od brutforsovanja ssh

# Instalacija fail2ban na CentOS 6 (pod pretpostavkom da niste gasili firewall)
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install fail2ban vim -y
chkconfig fail2ban on
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Potom u vi editoru otvorite fajl /etc/fail2ban/jail.local i dodajte, ispod linije [sshd] liniju enabled = true kao i port koji ssh koristi, dakle da izgleda otprilike ovako:

vim /etc/fail2ban/jail.local

[sshd]
enabled = true
port = 53535
logpath = %(sshd_log)s

…pa restartujte servis fail2ban

service fail2ban restart

Proverite samo da li je kreirano novo iptables pravilo komandom: iptables -L | grep -i f2b
Treba da bude otprilike ovako nekakav autput

[root@centos6 ~]# iptables -L | grep -i f2b
f2b-sshd   tcp  --  anywhere             anywhere            multiport dports 53535
Chain f2b-sshd (1 references)

Da biste bili obavešteni putem imejla o akcijama, banovanjima i slično, izmenite u fajlu

vim /etc/fail2ban/jail.local

destemail = vas.mail@mail.com

# I liniju: action = %(action_)s ----> action = %(action_mwl)s

U konfiguracionom fajlu /etc/fail2ban/jail.local uz instalaciju i startovanje nekih dodatnih servisa (sendmail, whois…) možete postaviti da dobijete imejl notifikaciju o tome koja je IP blokirana, njene „whois“ podatke, da promenite koliko je puta maksimalno dozvoljena pogrešna autentifikcaija, na koliko vremenski IP adresa treba da bude zablokirana i slično. U ovom tekstu smo se dotakli najosnovnije moguće postavke za zaštitu od ssh brutsorsovanja – koja radi, i nismo ništa dodatno budžili

Da rezimiramo:

  1. Promeniti podrazumevani SSH port sa 22 na neki bezveze
  2. Zabraniti root korisniku logovanje preko SSH jer je on jedan veliki gospodin
  3. Postaviti brutfors zaštitu za ssh (ne mora ako se logujete pomoću ključeva i bez lozinki)
  4. Omogućiti logovanje samo pomoću SSH ključeva

Sa ovim ste prošli kroz najosnovniju zaštitu logovanja putem SSH i na ovaj način ste se već dovoljno zaštitili od raznih budala. Naravno, ima tu i dodatnih zaštita, recimo – dozvola logovanja samo sa određenih IP adresa, omogućavanje logovanja samo određenih korisnika, DenyHosts program, postavljanje zasebne IP adrese za SSH login i svašta nešto, ali za početak – i ovo opisano u tekstu je dovoljno.