Očvršćenje GNU/Linux baziranih poslužitelja
Josip Mlakar
Sadržaj |
Ažuriranje
Ažuriranje operacijskog sustava je jedna od najvažnijih radnji vezanih za sigurnost. Redovito se otkrivaju nove slabosti sustava koje se ispravljaju ažuriranjem. Sustav koji se redovito ne ažurira ostaje izložen slabostima i s vremenom ga je sve lakše probiti. Ažuriranje Linux servera (Ubuntu distribucija )se može provesti naredbama:
sudo apt-get update sudo apt-get dist-upgrade
Konfiguriranje vatrozida
Vatrozid služi kao barijera između servera i ostatka interneta. vatrozid analizira promet koji ulazi ili izlazi sa servera te ovisno o definiranim pravilima odlučuje hoće li propustiti taj promet. Postoji nekoliko rješenja za upravljanje vatrozidom.
- UFW
- IPTables
- IP6Tables
- NFTables
Konfiguriranje SSH
SSH (secure shell) je kriptirani protokol za komunikaciju sa serverom. On omogućuje udaljeno upravljanje serverm što čini administriranje znatno fleksibilnije, ali i nesigurnije. Korisnik servera se tako može povezati sa serverom neovisno gdje se on nalazio ako ima korisničke podatke,tj. ne treba fizički biti povezan. Mogućnost udaljenog povezivanja omogućava potencijalnom napadaću da napadne server i pokuša dobiti korisničke podatke pa je potrebno pravilno konigurirati SSH.
Osnovne postavke
SSH možemo konfigurirati u datoteci sshd_config. Kako bi ju mijenjali potrebne su nam administratorske ovlasti, a nalazi se na putanji:
/etc/ssh/sshd_config
Preporuća se onemogućavanje spajanja preko root računa jer osim što root račun ima apsolutno sve ovlasti na serveru, njegovo korisničko ime je poznato (root) što olakšava brute force napade. Puno je teže pogoditi i korisničko ime i lozinku nego samo lozinku. Onemogućavanje spajanja preko root računa radimo tako što liniju
PermitRootLogin yes
mijenjamo u
PermitRootLogin no
Također dobro je promijeniti port preko kojeg se spajamo na server pomoću SSH. Standardno se spaja preko porta 22, a kako bi ga promijenili potrebno je izmjeniti liniju
Port 22
u bilo koji broj u rasponu od 1025 i 65536. Na primjer
Port 9000
Konfiguriranje autentikacije pomoću ključa
Lozinke za pristupanju korisničkom računu se šalju sigurnim kanalima, ali često nisu dovoljno komplicirani i dugački da bi spriječili potencijalne napadače. Stoga je preporučljivo koristiti autentikaciju preko ključa. SSH par ključeva su dva kriptografska ključaj. Privatni ključ posjeduje korisnik i on mora biti tajan, dok je javan ključ pohranjen na serveru i njegovo otkrivanje ne kompromitira sigurnost servera. Na serveru se javni ključ pohranjuje na lokaciji
~/.ssh/authorized_keys
Kreiranje para ključeva vrši se na korisnikovom računalu. Ključevi se generiraju naredbom
ssh-keygen
Korisnika se tada pita za lokaciju gdje će biti spremljeni ključevi. najbolje je samo pritisnuti enter i koristiti unaprijed postavljenu lokaciju. To je zato da SSH klijent može automatski pronaći SSH ključeve prilikom autentikacije. Ako se ostavi unaprijed postavljena lokacija, javni ključ se sprema na
/home/korisničko_ime/.ssh/id_rsa
a privatni na
/home/korisničko_ime/.ssh/id_rsa.pub
Od korisnika će se zatim zatražiti da unese lozinku za kriptiranje privatnog ključa. To nije obavezno i može se preskočiti pritiskom tipke enter.
Kopiranje javnog ključa na server
Kopiranje se može izvesti na više načina.
- kopiranje pomoću SSH-Copy-ID
- najlakši način
- na lokalnom računalu upisati naredbu ssh-copy-id korisničko_ime@adresa_servera
- kopiranje pomoću SSH
- na lokalnom računalu unesti naredbu cat ~/.ssh/id_rsa.pub | ssh korisničko_ime@adresa_servera "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
- ručno kopiranje
- dobiti javni ključ na lokalnom računalu sa naredbom cat ~/.ssh/id_rsa.pub
- na serveru kreairati mapu .ssh naredbom mkdir -p ~/.ssh
- spremiti ključ sa echo javni_ključ >> ~/.ssh/authorized_keys
- javni_kljuc predstavlja javni ključ dobiven prvim korakom
Zabrana autentikacije preko lozinke
Kako bi onemogućili prijavu preko lozinke tako da se korisnik može spojiti samo preko ključa, potrebno je malo izmjeniti sshd_config. Potrebno je promijeniti
PasswordAuthentication yes
u
PasswordAuthentication no
Password Aging
Redovita promjena lozinke čini korisnički račun sigurnijim. Nažalost korisnici nemaju uvijek naviku redovito mijenjati svoju lozinku do te mjere da čak ostave početnu lozinku koju im je dodjelio administrator. Tome problemu se može priskočiti tako da se korisnika prisili na redovito mijenjanje lozinke. To se može napraviti pomoću naredbe chage. opcije naredbe chage su sljedeće:
- -m označava minimalni broj dana od posljednjeg postavljanja lozinke koji mora proći kako bi se ponovno mogla promjeniti lozinka
- -M označava "trajanje" lozinke, tj. koliko dana od zadnjeg postavljanja je lozinka valjana
- -d označava broj dana od 1.1.1970 do kad je lozinka promjenjena
- -E označava datum od kojega korisnički račun više neće biti dostupan
- -I označava broj neaktivnih dana nakon što istekne password. Nakon toga korisnički račun više nije dostupan
- -W označava koliko dana prije isteka lozinke će se prikazivati poruka upozorenja
Primjer korištenja chage naredbe:
chage -M 60 -m 10 -W 5 korisnik
U primjeru je postavljeno da lozinka vrijedi 60 dana, da se može promijeniti nakon 10 dana i da će se poruka upozorenja prikazivati 5 dana prije isteak lozinke.
Sigurnosne kopije
Ukoliko se na server pohranjuju važni podaci, vrlo je važna izrada njihove sigurnosne kopije. Sigurnosna kopija omogućava povrat podataka koji bi inaće bili izgubljeni ukoliko bi došlo do kvara servera. Postoji više alata za izradu sigurnosne kopije na Linux serverima, neki od njih su:
- fwbackups
- Bacula
- Rsync
- Mondorescue
- Simple Backup Solution
Rsync
Rsync je jedan od najčešće korištenih alata za kopiranje i sinkroniziranje podataka. Omogućava sigurnosno kopiranje i lokalno i globalno. Osnovna sintaksa:
rsync opcije izvor odrediste
Osnovne opcije Rsync-a:
- -v opširnost informacija koje se dobijavaju prilikom prijenosa
- -r kopiranje datoteka i njima pripadajučih pod-datoteka (bez očuvanja vremenskih oznaka i dozvola)
- -a kopiranje datoteka i njima pripadajučih pod-datoteka s očuvanjem veza, dozvola i vremenskih oznaka
- -z sažimanje podataka
- -h izlazni brojevi u čitljivom formatu
Lokalno sigurnosno kopiranje
rsync -opcije izvorna_datoteka/folder odredišna_datoteka/folder
Sigurnosno kopiranje na server
rsync -opcije lokalna_datoteka/folder korisničko_ime@adresa_servera:/putanja
Kopiranje sa servera ima istu sintaksu samo se zamjene izvor i odredište.
Sigurnosno kopiranje preko SSH
rsync opcije -e ssh 'korisničko_ime'@'adresa_servera':izvorisna_datoteka/folder odredišni_folder
Ukoliko se preko SSH ne spaja na standardni port (22) potrebno je izmjeniti naredbu:
rsync opcije -e "ssh -p broj_porta" 'korisničko_ime'@'adresa_servera':izvorisna_datoteka/folder odredišni_folder
Upravljanje paketima i servisima
Svaki instalirani servis znači dodatnu potencijalnu ranjivost servera. Zato je bitno voditi računa o instaliranim paketima i koristiti samo one servise koji su nužni za rad.
Paketi
Kako bi vidjeli listu instaliranih paketa možemo koristiti naredbu
dpkg --get-selections
Za filtriranje liste paketa možemo koristiti grep pa tako ako želimo vidjeti sve python pakete možemo upisati:
dpkg --get-selections | grep python
Ako želimo vidjeti lokacije svih datoteka određenog paketa možemo koristiti -L. Primjer:
dpkg -L python3.4
Brisanje paketa vršimo naredbom:
apt-get remove ime_paketa
Servisi
Kako bi izlistali sve servise koristimo naredbu:
service --status-all
- + znači da je servis trenutno upaljen
- - znači da je servis trenutno ugašen
- ? znači da je nepoznato trenutno stanje servisa
Servise gasimo naredbom:
service ime_servisa stop
Servise palimo naredbom:
service ime_servisa start
Servise resetiramo naredbom:
service ime_servisa restart
Kako bi dobili trenutni status servisa koristimo:
service ime_servisa status
Kriptiranje
Datoteke koje su osjetljive i vrlo bitne možemo dodatno zaštiti tako da ih kriptiramo.
encfs
Encfs je vrlo jednostavna aplikacija za kriptiranje mapa. Instalira se naredbom:
apt-get install encfs
Kako bi kreirali mapu u koju želimo spremati osjetljive podatke koristimo sintaksu:
encfs 'putanja_do_kriptirane_mape' 'putanja_do_mape_koju_želimo_kriptirati'
Aplikacija nas tada pita za ključ kojim ćemo kasnije moći dekriptirati podatke. Kada spremimo sve željene podatke u mapu koju želimo kriptirati koristimo naredbu:
fusermount -u ~/'putanja_do_mape_koju_želimo_kriptirati'
Tada će se u kriptiranu mapu pohraniti kriptirani podaci, a podaci iz mape kou želimo kriptirati će nestati. Kako bi vratili podatke ponovno unosimo naredbu kao i za kreiranje mapa. Aplikacija će nas zatim tražiti za ključ. Ukoliko je ključ ispravan, mapa sa podacima koje smo htjeli kriptirati će opet sadržavati čitljive podatke.
Sustavi za detekciju upada
Implementacija sustava za detekciju upada je jedna od najvažnijih stvari vezanih za sigurnost servera. Pomoću njih možemo vrlo lako pratiti promjene u konfiguraciji ili ostalim podacima na serveru kako bi što lakše mogli otkriti i sankcionirati neovlaštene upade i štetu na serveru. Postoji nekoliko sustava za detekciju upada za Linux sustave. Neki od njih su:
- Tripwire
- Aide
- Psad
- Bro
- RKHunter
AIDE
Aide radi tako da kreira bazu sa stanjem sustava u tom trenutku i onda kasnije uspoređuje te podatke sa trenutnim stanjem sustava. Ukoliko je došlo do promijena Aide ispisuje izvještaj o svim promjenama između trenutnog i početnog stanja. Ukoliko je na serveru postavljen e-mail server Aide se može postaviti tako da šalje izvještaje na e-mail. Aide se može instalirati naredbom:
apt-get install aide
Porebno je prvo kreirati bazu sa početnim stanjem. Bazu kreiramo naredbom:
sudo aide -c /etc/aide/aide.conf --init
Novokreirana baza se nalazi na lokaciji
/var/lib/aide/aide.db.new
Poželjno je preimenovati bazu tako da nova baza ne prepiše ovu, tada već staru bazu.
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
Ako želimo provjeriti jesu li se u međuvremenu dogodile kakve promjene, koristimo naredbu:
aide -c /etc/aide/aide.conf -u
-u nam služi da opet generiramo novu bazu koja sadrži podatke u trenutku provjere. Poželjno je nakon toga ponovno preimenovati bazu, kako bi mogli ponoviti postupak.
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
Konfiguriranje Aide
Konfiguraciju mapa koje će Aide uzimati u obzir možemo definirati u datoteci aide.conf koja se nalazi na lokaciji:
/etc/aide/aide.conf
Kako bi odredili koje mape ulaze u obzir u datoteku jednostavno dodamo željenu putanju i pravila. Na primjer:
/etc p+u+g
- p označava dozvole nad datotekom/mapom
- u označava vlasnika datoteke/mape
- g označava grupu vlasnika datoteke/mape
Ukoliko želimo da na Aide šalje e-mail sa izvještajem, e-mail adresu možemo definirati u datoteci aide koja se nalazi na lokaciji:
/etc/default/aide
Ovdje promijenimo vrijednost
MAILTO=root
u
MAILTO=željena_e-mail_adresa
Analiza log datoteka
Log datoteke su uglavnom tekstualne datoteke u kojima se nalaze podaci o aktivnostima na serveru. Log datoteke su vrlo iscrpne i potrebno je dosta vremena kako bi se ručno analizirale. Kako bi se olakšao posao analiziranja log datoteka postoje aplikacije koje iz log datoteka izvlače podatke potrebne administratoru i prikazuju ih u obliku izvještaja.
Logwatch
Logwatch je jedan od takvih alata. Možemo ga instalirati naredbom:
apt-get install logwatch
Logwatch možemo konfigurirati u datoteci logwatch.conf koja se nalazi na lokaciji:
/usr/share/logwatch/default.conf/logwatch.conf
Ukoliko želimo da nam izvještaji dolaze na e-mail moramo promijeiti liniju
MailTo = root
u
MailTo = željena_email_adresa
Izvještaji se mogu dobivati za jučerašnje stanje, današnje stanje ili za stanje od instalacije aplikacije. To definiramo u liniji:
Range = Today
Izvještaji mogu dolaziti u više razina detalja, ovisno o tome koliko želimo da nam bude iscrpan. Postoje tri razine iscrpnosti, Low, Medium i High. TRazinu iscrpnosti možemo definirati u liniji:
Detal = Medium
Za određivanje servisa koji će se analizirati dodajemo linije:
Service = [ime]
ili ako želimo obuhvatiti sve usluge:
Service = all
Logwatch se pokreće dnevno i šalje izvještaje na e-mail. Ako ga želimo pokrenuti ručno koristimo sintaksu:
logwatch [--detail level ] [--logfile log-file-group ] [--service service-name ] [--print] [--mailto address ] [--archives] [--range range ] [--debug level ] [--save file-name ] [--logdir directory ] [--hostname hostname ] [--splithosts] [--multiemail] [--output output- type ] [--numeric] [--no-oldfiles-log] [--version] [--help|--usage]
Primjer:
logwatch --detail Medium --service all --range today
Fail2Ban
Fail2ban je servis koji automatski mijenja pravila vatrozida ovisno o predefiniranom broju neuspjelih prijava na server preko SSH protokola. To znači da je glavna uloga Fail2Ban servisa zabraniti pristup onim ip adresama koje pokušavaju brute-force metodom doći do korisničkih podataka korisnika na serveru. Na taj način se mogu spriječiti zloćudne aktivnosti na serveru bez da intervenira čovjek. Fail2Ban se može instalirati naredbom:
sudo apt-get install fail2ban
Konfiguracija Fail2Ban servisa se vrši u datoteci jail.conf. Postoji mogućnost da ažuriranje nekog paketa modificira jail.conf pa je poželjno napraviti kopiju i raditi na njoj.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Od bitnijih stvari koje se mogu konfigurirati je ignoreip. Njime zadajemo koje ip adrese neće biti blokirane iako prekrše definirana pravila.
ignoreip = željena_adresa
Parametar bantime označuje vrijeme u sekundama koje će ip adresa biti blokirana.
bantime = vrijeme_u_sekundama
Parametar maxretry označuje koliko se puta mogu unesti pogrešni podaci prije nego se blokira ip.
maxretry = 3
Parametar findtime označuje vremenski okvir u sekundama unutar kojeg se broje neuspjeli pokušaji. Na primjer ako je zadano
findtime = 100 maxretry = 3
ip se blokira ako je s te ip adrese bilo tri neuspjela pokušaja prijave unutar 100 sekundi.
Parametar destemail označuje na koju e-mail adresu se trebaju slati izvještaji, a parametar mta koji mail servis će se koristiti za slanje maila.
destemail = e-mail_adresa mta = e-mail_servis
Parametar action definira radnju koju će Fail2Ban poduzeti kada otkrije zloćudnu radnju. Vrijednost action_ znači da će se konfigurirati vatrozid tako da odbija promet sa sumnjivog ip-a. Vrijednost action_mw znači sve što i action_ osim što se šalje i e-mail sa obavijesti. Vrijednost action_mwl u mailu šalje i log.
action = $(action_)s
Literatura
https://www.ibm.com/developerworks/linux/tutorials/l-harden-server/
http://www.tecmint.com/rsync-local-remote-file-synchronization-commands/
https://help.ubuntu.com/community/FolderEncryption
http://www.tecmint.com/linux-server-hardening-security-tips/
http://www.cyberciti.biz/tips/linux-security.html
https://www.digitalocean.com/community/tutorials/an-introduction-to-securing-your-linux-vps
http://www.howtoforge.com/linux-security-notes-aide-file-integrity
http://www.cs.tut.fi/~rammer/aide/manual.html
http://pka.engr.ccny.cuny.edu/~jmao/node/30
https://www.digitalocean.com/community/tutorials/how-to-install-aide-on-a-digitalocean-vps
https://pelanne.com/blog/get-daily-server-overview-email-logwatch/
http://www.debianhelp.co.uk/logwatch1.htm
http://linux.die.net/man/8/logwatch
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-fail2ban-on-ubuntu-14-04