Obezbeđivanje CentOS operativnog sistema

Sigurnost jednog operativnog sistema je česta tema u današnje vreme. Vesti o padovima servera ili krađi privatnih podataka poput brojeva kreditnih kartica su veoma česti. Razlozi su mnogobrojni ali glavni mproblem leži u nekompetentnosti ljudi koji vrše podešavanja softvera ili lošem pristupu materiji. U nekim situacijama se sami korisnici  previše opuste misleći da su standardna podešavanja koja dolaze sa nekim sistemom sasvim dovoljna i da nema potrebe bilo šta menjati po tom pitnaju što je jako velika greška.

U ovom tekstu baviću se obezbeđivanjem Linux sistema, konkretno CentOS distribucije, u serverskom okruženju. Za testiranje stvari navedenih u ovom tekstu, možete koristiti već postojeću instalaciju ili podići novu u sandbox okruženju, na primer korišćenjem VirtualBox virtualizacije. Ukoliko ste korisnik neke druge distribucije, poput Ubuntua ili Debiana, sve navedeno bi trebalo bez problema da radi uz eventualne modifikacije putanja ili pojedinih komandi.

Priprema sistema

Osnovno pravilo u pripremnoj fazi glasi – sve što vam nije potrebno od servisa u okviru sistem je potrebno ugasiti, jer predstavljaju sigurnosni rizik. Takođe mnogi od servisa koji dolaze sa standardnom instalacijom sistema nemaju nikakvog smisla u serverskom okruženju (na primer, bluetooth servisi).
Za početak, potrebno je da pogledamo šta je sve instalirano od softvera po grupama:

yum grouplist

Nakon što dobijete listu, prvo je potrebno obrisati onu grupu za koju smatrate da vam neće trebati:

yum groupremove "NazivGrupe"

Sledeći korak se odnosi na same servise. Potrebno je pogasiti servise koji svakako neće biti potrebni:

chkconfig anacron off
chkconfig atd off
chkconfig auditd off
chkconfig cpuspeed off
chkconfig kudzu off
chkconfig netfs off
chkconfig ip6tables off
chkconfig smartd off
chkconfig pcscd off
chkconfig cups off
chkconfig mcstrans off
chkconfig nfslock off
chkconfig rpcgssd off
chkconfig rpcidmapd off
chkconfig portmap off
chkconfig nfs off

Imajte u vidu da  će neki od navedenih servisa možda biti potrebni na vašem serveru, tako da je poželjno da se prethodno informišete o tome čemu konkretno služe pre nego što se odlučite za njihovo gašenje. U slučaju da želite da proverite koji sve servisi se pokreću zajedno sa operativnim sistemom tokom njegovog podizanja, to je moguće uraditi korišćenjem sledeće komande:

chkconfig --list | grep :on

Lista koju ćete dobiti možda na prvi pogled neće biti najjasnija, ali svaka kolona predstavlja status servisa u odgovarajućem runlevel niovu. Servisi koje bi trebali da imate kao aktivne su:

anacron, crond, iptables, irqbalance, kudzu, mcstrans, network, readahead_early, restorecond, sshd, syslog, sysstat, yum-updatesd

Nakon gašenja servisa, preporučljivo je izvršiti update sistema i instalaciju dodatnog softvera i bibilioteka:

yum -y upgrade
yum -y install wget bzip2 unzip zip fileutils gcc gcc-c++ ncurses-devel pam-devel libxml2-devel libxslt-devel
yum -y install binutils autoconf automake libtool zlib lsof man man-pages mlocate quota yum-utils
 yum -y install sendmail rsync sysstat vixie-cron bzip2-devel m4 flex byacc wget which mailx

Potom, potrebno je pravilno podesiti sinhronizaciju vremena na samom serveru, jer loše podešeno sistemsko vreme može da izazove mnogo problema kod pojedinih servisa (kao što je to, na primer, slučaj sa servisom dovecot):

yum -y install ntp
chkconfig --levels 235 ntpd on
ntpdate 0.pool.ntp.org
/etc/init.d/ntpd start

Opciono, preporučujem promenu vednosti minimalne dužine šifre na sistemskom nivou:

sed -i s/PASS_MIN_LEN.*/PASS_MIN_LEN 8/ /etc/login.defs

Zatim, sledi zamena hostname-a:

nano -w /etc/sysconfig/network

Pronađite liniju koja počinje sa “HOSTNAME=” i dodajte nešto po vašem izboru. Nakon toga je vreme i za prvi restart servera.

Podešavanje SSHD servisa

SSH je izuzetno bitan servis jer omogućava administratoru da konzolno pristupi udaljenom serveru i da obavi odgovarajući posao. Samim tim je vrlo važno pravilno obezbediti SSHD servris kako bi se maksmalno smanjila bilo kakva šansa za upad.

Prvi korak u tom smeru je pravljenje novog korisnika:

adduser sshkorisnik && passwd sshkorisnik

Bekapujte postojeću konfiguraciju:

mv /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

a onda je i otvorite u editoru:

/etc/ssh/sshd_config

Konfiguracija bi trebala da izgleda ovako:

## Change to other port is recommended, etc 2488
Port 3550

## Sets listening address on server. default=0.0.0.0
#ListenAddress 192.168.0.1

## Enforcing SSH Protocol 2 only
Protocol 2

## Disable direct root login, with no you need to login with admin user, then "su -" you into root
PermitRootLogin no

## Authentication:
LoginGraceTime 2m
PermitRootLogin no
StrictModes yes
MaxAuthTries 2

RSAAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitEmptyPasswords no
PasswordAuthentication no

##
UsePrivilegeSeparation yes

##
AllowTcpForwarding no

## Disables X11Forwarding
X11Forwarding no

## Checks users on their home directority and rhosts, that they arent world-writable
StrictModes yes

## The option IgnoreRhosts specifies whether rhosts or shosts files should not be used in authentication
IgnoreRhosts yes

##
HostbasedAuthentication no

## RhostsAuthentication specifies whether sshd can try to use rhosts based authentication.
RhostsRSAAuthentication no

## Adds a login banner that the user can see
Banner /etc/motd

## Enable / Disable sftp server
#Subsystem sftp /usr/libexec/openssh/sftp-server

## Add users that are allowed to log in
AllowUsers sshkorisnik

Ova konfiguracija u odnosu na standardnu se razlikuje u velikom broju parametara. Za početak, umesto standardnog porta 22 koji se koristi za SSH, promenjen je na 3550. Vrednost može da bude proizvoljna, ali je bitno da neki drugi servis ne koristi taj port (recimo, MySQL).

Pored promene porta, zabranjena je autentifikacija putem šifre, ali i mogučnost da se root korisnik loguje putem SSH. Umesto šifre, potrebno je koristiti odgovarajući ključ a umesto root korisnika, putem SSH će moći da se loguje samo korisnik kojeg smo napravili u prethodnom koraku.

Vreme je da generišemo ključ za login:

su sshkorisnik
ssh-keygen -t rsa

Na sva pitanja odgovorite pritiskajući taster ENTER. Opciono, možete podesiti šifru ključa što je preporučljivo, jer dodatno smanjuje mogućnost upada u sistem, čak i ako ključ padne u pogrešne ruke.

Sledeći korak je kopiranje tog ključa i restart SSHD servisa:

cd /home/sshkorisnik/.ssh
cp id_rsa_pub authorized_keys
service sshd restart

U okviru direktorijuma .ssh nalazi se i fajl id_rsa koji je neophodno da iskopirate na svoj računar jer je on neophodan za autentifikaciju.

Nakon što ga iskopirate, potrebno je da testirate novu konfiguraciju ali je vrlo važno da trenutnu sesiju ne prekinete jer u slučaju da konfiguracija nije dobra (na primer, ključ nije dobar ili je port zatvoren), postoji realna opasnost da budete odsečeni od sistema. Zato savetujem da otvorite novi tab ako koristite Linux terminal ili da pokrenete novu instancu PUTTY-ja, ako koristite Windows.

Imajte na umu da u slučaju da koristite PUTTY, neophodno je prvo konvertovati ključ u format koji PUTTY ume da koristi korišćenjem aplikacije putty-gen.

Linux korisnici mogu da testiraju konfiguraciju na sledeći način:

ssh IP_ADRESA_SERVERA -p PORT -i NAZIV_KLJUCA -l sshkorisnik

Ukoliko ostvarite konekciju i uspete da se ulgoujete, sve je u redu i možete nastaviti dalje.

Obezbeđivanje /tmp

Sledeći korak je obezbeđivanje tmp direktorijuma.

Za početak, bekapujte svoj fstab fajl:

cp /etc/fstab /etc/fstab.bak

Nakon toga, potrebno je napraviti novi fajl koji će služiti kao prostor za buduću tmp particiju:

dd if=/dev/zero of=/var/tempFS bs=1024 count=10240000
mkfs.ext3 /var/tempFS

U ovom primeru veličina iznosi 10 GB i predlažem da je definišite prema vašim potrebama. Bekapujte postojeći tmp folder:

cp -Rpf /tmp /tmpbackup

Nakon toga, mount-ujte novi tmp:

mount -o loop,noexec,nosuid,rw /var/tempFS /tmp
chmod 1777 /tmp

i vratite podatke nazad:

cp -Rpf /tmpbackup/* /tmp/

Ukoliko dobijete poruku:

cp: cannot stat `/tmp.bak/*’: No such file or directory

to znači da je /tmp bio prazan pre nego što smo krenuli u celu ovu proceduru tako da nema razloga za brigu. Za sam kraj, potrebno je napraviti dodatne izmene u okviru fstab fajla:

nano -w /etc/fstab
/var/tempFS /tmp ext3 loop,nosuid,noexec,rw 0 0

Upamtite izmene, a onda proverite da li je sve u redu:

mount -o remount /tmp
df -h

Izlaz bi trebao da izgleda nešto poput ovoga:

/var/tempFS 212M 18M 956M 1% /tmp

Obezbeđivanje /var/tmp i /dev/shm

Nakon što je /tmp obezbeđen, sledeći na redu je /var/tmp:

mv /var/tmp /var/vartmp
ln -s /tmp /var/tmp
cp /var/vartmp/* /tmp/

I time je posao završen. Sledeći na listi je /dev/shm . Za početak je potrebno da izvršite izmenu okviru fstab fajla. Pronađite liniju:

/dev/shm tmpfs defaults,rw 0 0

i izmenite je u:

/dev/shm tmpfs defaults,nosuid,noexec,rw 0 0

Nakon toga izvršite remount koristeći komandu:

mount -o remount /dev/shm

Instalacija LES

Dodatni korak u obezbeđivanju vašeg sistema predstavlja instalacija LES (Linux Environment Security). Odgovor na pitanje šta je LES i čemu služi možete dobiti na sajtu proizvođača softvera:

Linux Environment Security is intended as a facility to quickly & easily secure RedHat/RPM based environments. It does such by enforcing root-only permissions on system binaries (binaries that have no place being executed by normal users), enforcing root-only path traversal on system paths, enforcing immutable bit on essential rpm package contents (i.e: coreutils), and enforcing immutable bit on shell profile scripts.

Iako izuzetno koristan, LES može praviti probleme sa popularnim hosting panel rešenjima poput cPanel-a pa, ako se odlučite da ga koristite, moguće je da će biti potreba dodatna podešavanja kako bi sve funkcionisalo kako valja.

Proces instalacije je vrlo jednostavan. Za početak je potrebno skinuti poslednju verziju i pokrenuti instalacioni skript:

cd /usr/local/src
wget http://www.r-fx.ca/downloads/les-current.tar.gz
tar -zxvf les-current.tar.gz
cd les-0.*
./install.sh
rm -Rf /usr/local/src/les*

Ukoliko sve prođe kako treba, predlažem da izlistate sve moguće opcije koje LES nudi:

/usr/local/sbin/les

Options:
-da | --disable-all Disable all options
-ea | --enable-all Enable all options
-sb | --secure-bin Set root only execution of critical binaries
-sp | --secure-path Set root only traversal of critical paths
-sr | --secure-rpmpkg Set immutable on core rpm package binaries
-so | --secure-prof Set immutable on interactive login profiles
-sd | --secure-devel Set access to devel utils for group deva & root

Ukoliko niste sigurni šta da izaberete, preporučujem enable-all opciju:

/usr/local/sbin/les -ea

Instalacija PRM

PRM (Process Resource Monitor) predstavlja sistem koji vrši nadgledanje svih sistemski procesa i upoređuje njihov ID sa potrošnjom sistemskih resursa, a koji su definisani samom konfiguracijom. U zavisnosti od podešavanja, PRM može da vrši različit broj operacija, počev od običnog logovanja do ubijanja problematičnog procesa i obaveštavanja administratora putem e-maila o dešavanjima na sistemu.

Proces instalacije je vrlo jednostavan:

cd /usr/local/src
wget http://www.rfxn.com/downloads/prm-current.tar.gz
tar -zxvf prm-current.tar.gz
cd prm-0.*
./install.sh
rm -Rf /usr/local/src/prm* && cd

Nakon instalacije, potrebno je konfigurisati PRM:

nano /usr/local/prm/conf.prm

i uneti odgovarajuće izmene:

Promenite USR_ALERT="0" u USR_ALERT="1"
Promenite  USR_ADDR="root" u USR_ADDR="[email protected]"

Ukoliko postoje neki procesi koje želite da zaštitite tj. ignorišete, potrebno je da ih navedete u okviru ignore fajla:

nano /usr/local/prm/ignore

PRM se automatski pokreće svaka 4 minuta sem ako nije drugačije definisano (pogledajte  /etc/cron.d/prm). Log fajlovi se nalaze na:

/usr/local/prm/prm_log
/usr/local/prm/killed/

Instalacija CHKROOTKIT

CHKROOTKIT služi za skeniranje sistema u potrazi za rootkit skriptama. Iako noviji rootkit-ovi mogu lako kompromitovati sve sisteme detekcije, može jako dobro poslužiti u prevenciji totalne katastrofe koja može da se desi u slučaju preuzimanja kompletnog sistema od strane neautorizovanog lica.

Ja preferiram da ga instaliram na svim serverima i pokrećem putem cron-a jednom dnevno, a sve izveštaje da dobijam na e-mail. Sam chkrootkit nije preterano zahtevan niti će dovesti do gušenja servera pa ga najtoplije preporučujem.

Proces instalacije je krajnje jednostavan i moguće ju je izvršiti korišćenjem CentOS package managera ili kompajliranjem iz sorsa:

cd /usr/local/src
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
wget wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.md5
md5sum -c chkrootkit.md5
tar -zxvf chkrootkit.tar.gz
mkdir /usr/local/chkrootkit
mv /usr/local/src/chkrootkit*/* /usr/local/chkrootkit
cd /usr/local/chkrootkit
make sense

Naredni korak je pravljenje cron job-a:

/etc/cron.daily/chkrootkit.sh

u koji treba dodati sledeće:

#!/bin/sh
(
/usr/local/chkrootkit/chkrootkit
) | /bin/mail -s 'CHROOTKIT dnevni izveštaj (NAZIVSERVERA)' vaš@email.ovde

Ne zaboravite da izmenite e-mail adresu. Nakon toga, chmoddujte cron:

chmod 700 /etc/cron.daily/chkrootkit.sh

Instalacija RKHUNTER

RKHUNTER predstavlja još jedan rootkit/backdoor i exploit skener. Detekcija se vrši na osnovu upoređivanja MD5 suma najvažnijih sistemskih fajlova i biblioteka, ali i potragom za najčešće korišćenim skrivenim direktorijumima koje rootkit-ovi prave, sumnjivim kernel modulima i tako dalje. Kao i CHKROOTKIT, i RKHUNTER može da se instalira korišćenjem yum package managera, ali i iz sorsa:

cd /usr/local/src
wget http://dfn.dl.sourceforge.net/sourceforge/rkhunter/rkhunter-1.4.0.tar.gz
cd rkhunter-1.4.0
./installer.sh --layout default --install
/usr/local/bin/rkhunter --update
/usr/local/bin/rkhunter --propupd
rm -Rf /usr/local/src/rkhunter*
cd

Naredni korak je pravljenje cron job-a:

/etc/cron.daily/rkhunter.sh

u koji treba upisati sledeće:

#!/bin/sh
(
/usr/local/bin/rkhunter --versioncheck
/usr/local/bin/rkhunter --update
/usr/local/bin/rkhunter --cronjob --report-warnings-only
) | /bin/mail -s 'rkhunter Dnevni Izveštaj (NAZIVSERVERA)' vaš@email.ovde

chmod 700 /etc/cron.daily/rkhunter.sh

U slučaju da izvršite update sistemskog softvera, može se dogoditi da vam RKHUNTER prijavi gomilu grešaka tj. da vas upozori na to da su sistemski fajlovi menjani. Iako ova poruka može delovati vrlo zabrinjavajuće, problem je u tome što se usled promene izvršnih fajlova menjaju i njihove MD5 sume pa je to glavni razlog za ovakav izveštaj. U tom slučaju je neophodno da osvežite MD5 bazu RKHUNTERA:

/usr/local/bin/rkhunter --propupdate

Instalacija firewalla

Instalacija firewalla je bitan i nezaobilazan korak u obezbeđivanju jednog operativnog sistema. U našem slučaju, postoje dva izbora: CSF ili APF. Ja lično preferiram CSF jer pruža više raličitih tipova instalacije, ali i plugin za WHM koji može biti izuzetno koristan ukoliko držite hosting servere.

CSF je vrlo bogat opcijama i poseduje jako velik broj podešavanja pa će čak i oni koji traže maksimalnu bezbednost biti poprilično zadovoljni. Bitna komponenta u okviru CSF-a je LFD iliti Login Failure Daemon koji radi ono što mu ime kaže – nadgleda i beleži neuspele pokušaje autentifikacije na raznim servisima (.htacces autentifikacija, POP3/SMTP, cPanel itd.) i na osnovu učestalosti vrši privremeno ili trajno blokiranje odgovarajuće IP adrese.

Instalacija CSF-a je izuzetno jednostavna:

rm -fv csf.tgz
wget http://www.configserver.com/free/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh

Ukoliko imate instaliran WHM/cPanel na vašem serveru, potrebno je da pokrenete install.cpanel.sh skript. Nakon završene instalacije, CSF će biti pokrenut u takozvanom test modu koji vam daje mogućnost da pogrešite – u slučaju da uradite nešto što vas gotovo sigurno odseca od servera, test mode automatski nakon odgovarajućeg vremenskog intervala briše sva firewall pravila.

Konfiguracioni fajl se nalazi na lokaciji /etc/csf/csf.conf i nakon što završite sa podešavanjem neophodno je da iskljušite test mod i da restartujete CSF.

Više informacija o CSF-u kao i dostupnim konfiguracionim opcijama možete pronaći na ovom linku.

Alati za nadgledanje sistema

Iako možda ne pospešuju bezbednost sistema, alati za njegov konstantan monitoring su jako korisni jer pružaju uvid u raspodelu sistemskih resursa u odgovarajućem vremenskom periodu.

Monit

Monit je Open Source  alat koji nudi mogućnost nadgledanja velikog broja stavki u okviru jednog sistema, počev od zauzeća procesora, memorije, I/O operacija preko opterećenja dostupnih networking interfejsa do nadgledanja broja kverija i opterećenja MySQL-a, PostgreSQL-a, opterećenja aplikativnog softvera poput Apache-a, nginx-a i tako dalje.  Monit je izuzetno koristan alat i može vam značajno pomoći u identifikovanju problema u domenu performansi i iskorišćenosti sistemskih resursa.

Više informacija o Monitu možete pronaći ovde.

IFtop

IFtop je jednostavan alat za nadgledanje saobraćaja na odgovarajućem mrežnom portu i predstavlja pandan popularnoj sistemskoj alatki top. U slučaju da želite da vidite koliko koji proces ili korisnik troše protoka, iftop je adekvatan alat koji može dati odgovor na to pitanje.

Proces instalacije se sastoji iz dva koraka. Prvo je potrebno instalirati libpcap:

cd /usr/local/src
wget ftp://ftp.port80.se/gentoo/distfiles/libpcap-0.9.8.tar.gz
tar -zxvf libpcap-0.9.8.tar.gz
cd libpcap-0.9.8
./configure
make && make install

a nakon toga i sam iftop:

cd /usr/local/src
wget http://www.ex-parrot.com/~pdw/iftop/download/iftop-0.17.tar.gz
tar -zxvf iftop-0.17.tar.gz
cd iftop-0.17
./configure
make && make install

Nakon što završite proces instalacije, nadgledanje odgovarajućeg mrežnog porta se vrši komandom:

iftop -i eth0

gde je eth0 mrežni port koji želite da pratite.

Zaključak

Iskreno se nadam da je ovaj kratak, ali sadržajan tekst o osnovama obezbeđivanja jednog operativnog sistema na serveru bio koristan. Da li nakon svega ovoga možete prosto da zaboravite na vaš server – ne baš. Sve navedene izmene i sav softver koji ste instalirali mogu samo da smanje šansu da nešto krene po zlu, ali je vaše prisustvo kao administratora neophodno na svakodnevnom nivou. Svi ovi alati su tu da vam olakšaju posao, ali ne mogu baš sve da urade umesto vas i ukoliko ne pratite šta se dešava, vrlo lako možete da se desi da vaš servis padne ili da vaš klijent ima ozbiljan problem zbog toga što ste stvar prepustili slučaju.