Obradićemo neke default radnje koje vi kao admin treba da odradite kad je u pitanju zaštita remote pristupa Linux 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 Wikipediji.

Serveru ćemo pristupati sa Windows mašine preko programa koji se zove PuTTY jer je, na osnovu mog iskustva i onog što mi admini vele – to default pristup Linux mašinama.

Promena default SSH porta na serveru

Default 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 taj port i zato je jedna od default radnji gašenje tog porta i otvaranje nekog wtf 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 default 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 default porta ulogujte se na server kao root 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 firewallu 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 bruteforce 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 🙂

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.

# Keiranje kljuca za nekog od korisnika (u ovom slucaju 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 kljuca id_rsa (privatni) i id_rsa.pub (javni). 
# Dodati javni u autorizovane kljuceve 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_kljuc

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čivali 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 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 username 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 (ovo mozete raditi i rucno preko vi editora).
sed -i s/"#PermitRootLogin yes"/"PermitRootLogin no"/g /etc/ssh/sshd_config

# Restart ssh servisa
service sshd restart

fail2ban

Fail to ban je jedan od programčića koje vodim pod „default“ 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 WordPress-a a koji koristi neki vid autentifikacije – dakle, osnovna namena ovog programa jeste zaštita od bruteforce-a na serveru. U ovom tekstu ćemo ga instalirati i iskonfigurisati samo za zaštitu od brutforsovanja ssh

# Instalacija fail2ban na CentOS 6-tici (po d 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 output

[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 emaila 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 email 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 bruteforce-a – koja radi, i nismo ništa dodatno budžili

Da rezimiramo:

  1. Promeniti default SSH port sa 22 na neki bezveze
  2. Zabraniti root korisniku logovanje preko SSH jer je on jedan veliki gospodin
  3. Postaviti bruteforce 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 odredjenih 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.