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.