Заштита SSH приступа серверима

Обрадићемо неке дифолт радње које ви као админ треба да одрадите кад је у питању заштита даљинског приступа Линукс серверу путем SSH.

SSH (Secure Shell) је мрежни протокол који корисницима омогућава успостављање сигурног комуникацијског канала између два рачунара путем несигурне рачунарске мреже. Више о SSH прочитајте на домаћој Википедији. Серверу ћемо приступати са Виндовс машине преко програма који се зове PuTTY јер је, на основу мог искуства и оног што ми админи веле – то главни приступ Линукс машинама.

Промена подразумеваног SSH порта на серверу

Подразумевани порт за логовање на сервер путем SSH протокола је 22 и уљези који би да добију приступ вашем серверу већином случајева прво скенирају па касније и брутфорсују (bruteforce) тај порт и зато је једна од првих радњи гашење тог порта и отварање неког безвезе порта за приступ.

У овом случају отворићемо порт 53535 – и то је уједно моја препорука…да сви ти „custom“ портови буду у опсегу 50000-65535 како би се додатно отежао посао малициозним корисницима јер ће тад изгубити додатно време за скенирање отворених портова nmap-ом.

Такође, сама промена подразумеваног SSH порта уз добру firewall заштиту (коју ћемо обрадити у неком наредном тексту) јесте индикатор малициозним корисницима да је сервер највероватније обезбеђен од стране стручног лица па их и то може одбити од даље акције.

За промене подразумеваног порта улогујте се на сервер као root корисник и одрадите следеће команде:

# Измена закоментарисане вредности #Port 22 у Port 53535 у фајлу /etc/ssh/sshd_config
sed -i s/"#Port 22"/"Port 53535"/g /etc/ssh/sshd_config

# Наравно, на firewall-у не заборавите да отворите тај порт
iptables -I INPUT 1 -p tcp --dport 53535 -j ACCEPT
service iptables save
service iptables restart
# Рестарт sshd-а
service sshd restart

Сад покушајте да се улогујете на сервер, али са тим новим портом…

PuTTY - промењен ssh порт

Логовање искључиво путем SSH кључева

Ово је уједно и препоручени начин логовања на продукционе сервере – одјебаус лозинкама, само кључ мајка мара – заштићен неком зајебаном фразом и то је то. По некима, уз овај вид логовања чак није ни потребно користити неке SSH брутфорс заштите типа „fail2ban“ и слично јер нападач даље од уноса корисничког имена и не може да оде, тј не стиже до уноса лозинке – јер лозинке и нема, хехе.

Једина мана оваквог приступа логовању је та – да ако изгубите SSH кључ, можете се јебат’ ако немате физички приступ серверу, тако да је препорука да и ове кључеве чувате на сигурном месту, рецимо тамо где чувате и лозинке – кажем на сигурном мислим на KeePass Password Safe наравно.

# Креирање кључа за неког од корисника (у овом случају корисник 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+=.     |
|          =      |
|         . .     |
|                 |
|                 |
+-----------------+

# Креирана су два кључа id_rsa (приватни) и id_rsa.pub (јавни).
# Додати јавни у ауторизоване кључеве и поставити исправне привилегије
[draza@centos6 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[draza@centos6 ~]$ chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh/

Потом путем програма који се зове WinSCP-a (може и FileZilla) идите на, у овом случају фолдер /home/draza/.ssh/ и прекопирајте код себе приватни кључ…који се зове (у овом случају) id_rsa

Садржај тог приватно кључа је отприлике овакав:

Приватни кључ

Кад сте прекопирали код себе тај фајл (тј кључ), треба да га преведете у неки формат који може да прочита PuTTY…a то се ради помоћу програма који се зове PuTTYgen.

Пошто сте приватни кључ пребацили у PuTTY кључ и сачували код себе, сад треба да забраните логовање путем лозинки а то ћете урадити тако што ћете у фајлу /etc/ssh/sshd_config преправити ове линије да имају следеће вредности:

vim /etc/ssh/sshd_config

ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no

Па рестартујте sshd сервис

service sshd restart

Препорука је кад ово завршите обришете и приватни и јавни кључ са сервера (фолдер ~/.ssh)

Забрана логовања путем SSH за root корисника

Зашто? Root (рут) корисник је татко на систем, има приступ свему и свима и може да ради шта му срцу мило и драго, што ће рећи да може да уништи цео сервер без капи зноја – а и root корисник увек има корисничко име root (мада се може и ово скарабуџити али није препоручљиво)…чиме је пола посла око проваљивања приступа завршено – остаје још само лозинка да се убоде и то је то (под условом да нисте додали и ssh кључ у целу причу).

# Ако немате неког другог корисника на серверу додајте га и дајте му лозинку
useradd draza
passwd draza

# Измена линије #PermitRootLogin yes --> PermitRootLogin no 
sed -i s/"#PermitRootLogin yes"/"PermitRootLogin no"/g /etc/ssh/sshd_config

# Restart ssh servisa
service sshd restart

fail2ban

Fail2ban је један од програмчића које водим под „дифолт“ а служи да убије на неко време IP адресу са које је неуспешно покушавано логовање више пута било преко SSH или FTP-а или неког другог сервиса попут рецимо Вордпресa а који користи неки вид аутентификације – дакле, основна намена овог програма јесте заштита од брутфорса на серверу. У овом тексту ћемо га инсталирати и исконфигурисати само за заштиту од брутфорсовања ssh

# Инсталација fail2ban на ЦентОС 6 (под претпоставком да нисте гасили 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

Потом у vi едитору отворите фајл /etc/fail2ban/jail.local и додајте, испод линије [sshd] линију enabled = true као и порт који ssh користи, дакле да изгледа отприлике овако:

vim /etc/fail2ban/jail.local

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

…па рестартујте сервис fail2ban

service fail2ban restart

Проверите само да ли је креирано ново iptables правило командом: iptables -L | grep -i f2b
Треба да буде отприлике овако некакав aутпут

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

Да бисте били обавештени путем имејла о акцијама, бановањима и слично, измените у фајлу

vim /etc/fail2ban/jail.local

destemail = vas.mail@mail.com

# И линију: action = %(action_)s ----> action = %(action_mwl)s

У конфигурационом фајлу /etc/fail2ban/jail.local уз инсталацију и стартовање неких додатних сервиса (sendmail, whois…) можете поставити да добијете имејл нотификацију о томе која је IP блокирана, њене „whois“ податке, да промените колико је пута максимално дозвољена погрешна аутентификцаија, на колико временски IP адреса треба да буде заблокирана и слично. У овом тексту смо се дотакли најосновније могуће поставке за заштиту од ssh брутсорсовања – која ради, и нисмо ништа додатно буџили

Да резимирамо:

  1. Променити подразумевани SSH порт са 22 на неки безвезе
  2. Забранити root кориснику логовање преко SSH јер је он један велики господин
  3. Поставити брутфорс заштиту за ssh (не мора ако се логујете помоћу кључева и без лозинки)
  4. Омогућити логовање само помоћу SSH кључева

Са овим сте прошли кроз најосновнију заштиту логовања путем SSH и на овај начин сте се већ довољно заштитили од разних будала. Наравно, има ту и додатних заштита, рецимо – дозвола логовања само са одређених IP адреса, омогућавање логовања само одређених корисника, DenyHosts програм, постављање засебне IP адресе за SSH логин и свашта нешто, али за почетак – и ово описано у тексту је довољно.