===== Sažetak =====
Održavanje log datoteka je važan dio Apache web poslužitelja. Apache log datoteke sadrže zapise kojima upravlja Apache poslužitelj, odgovore koje šalje Apache poslužitelj, radnje unutar Apache poslužitelja i zapise koji uključuju zahtjeve s drugih računala. Svi uspješni klijentski zahtjevi bilježe se u log datoteku pristupa, a svi zapisi grešaka bilježe se u log datoteku pogrešaka. Većina zadanih postavki se mogu mijenjati kroz konfiguracijsku datoteku. Lokacije log datoteka se mogu mijenjati, a poželjno je da se datoteke s vremenom i rotiraju na pravilan način, kako ne bi ponestalo mjesta za zapise i kako bi se zadržale dobre performanse za pisanje zapisa u log datoteke i njihovo čitanje. Osim lokacije moguće je mijenjati format zapisa log datoteke i razine zapisivanja koje određuju koje vrste zapisa je potrebno zabilježiti. Log datoteke igraju ključnu ulogu pri rješavanju problema s web aplikacijama zato je važno očuvati njihov integritet. Apache nudi razne module zapisivanja za dobivanje bogatijih zapisa, a jedan od njih je mod_log_forensic koji pruža forenzičko zapisivanje zahtjeva klijenata.
===== Uvod =====
Rastom internet mreže i broja korisnika na internetu raste i broj napada, stoga potreba za bilježenjem događaja je sve veća. Apache sustav zapisivanja događaja omogućuje jednostavno i pouzdano zapisivanje u log datoteke. Programerima pruža način stvaranja i kontrole zapisa, omogućavajući im da vide što se događa s izvršavanjem koda, a korisnicima da učinkovito pregledaju svoje zapisnike. Apache usluge zapisivanja omogućuju pristup zapisima na način koji je ljudima jednostavan za čitanje. Zapisi se mogu koristiti za testiranje, podešavanje performansi, administraciju sustava pa čak i sigurnosnu analizu. U nastavku slijedi objašnjenje ključnih pojmova za razumijevanje procesa zapisivanja u log datoteke, koje su to datoteke, gdje se nalaze, na koji način su formatirane, kako s njima upravljati te kako mijenjati zadane postavke zapisivanja.
===== Tipovi Apache log datoteka =====
Postoje dvije vrste Apache log datoteka: log datoteka pristupa i log datoteka grešaka.
==== Log datoteka pristupa ====
Log datoteka pristupa sadrži informacije o zahtjevima koji dolaze na Apache poslužitelj.
Jedan zapis log datoteke pristupa sastoji se od sljedećih informacija:
* **IP adresa klijenta**
* **Vrijeme zahtjeva**
* **Traženi izvor**
* **Informacija o operacijskom sustavu i pregledniku klijenta**
* **HTTP kod odgovora koji je vraćen**
* **Broj bajtova vraćenih klijentu**
Primjer jednog zapisa u log datoteci pristupa:
162.185.238.6 - - [09/Jan/2015:19:12:06 +0000] "GET/inventoryService/inventory/purchaseItem?
userId=20253471&itemId=23434300 HTTP/1.1" 500 17 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15"
==== Log datoteka grešaka ====
Log datoteka grešaka sadrži informacije o greškama na koje je Apache poslužitelj naišao prilikom pokretanja ili rada. Zapisi mogu sadržavati dijagnostičke informacije o samom poslužitelju.
Jedan zapis greške koja se dogodila prilikom obrade zahtjeva sastoji se od sljedećih informacija:
* **IP adresa klijenta**
* **Vrijeme zahtjeva**
* **Vrsta poruke**
* **Poruka**
Primjer jednog zapisa u log datoteci grešaka:
[Thu Mar 13 19:04:13 2014 +0000] [error] [client 50.0.134.125] File does not exist: /var/www/favicon.ico
===== Konfiguracija Apache log datoteka=====
Postoji nekoliko naredbi koje se mogu koristiti za promjenu ponašanja zapisivanja u log datoteke. Promjene se obavljaju u konfiguracijskoj datoteci. Neke od uobičajenih naredbi su naredbe log razine i log formata.
==== Konfiguracija log razine ====
Naredba __LogLevel__ predstavlja vrstu poruka, odnosno minimalnu razinu ozbiljnosti događaja koji se bilježe u log datoteku pogrešaka. Razina ozbiljnosti predstavlja važnost događaja i može varirati od najviše razine "//emerg//" do najniže razine "//debug//", pri čemu "//emerg//" predstavlja događaje koji potencijalno mogu dovesti do nestabilnosti, a "//debug//" predstavlja poruke na razini traga. Naredbama log razine se mijenja skup vrsta poruka koje se zapisuju u log datoteku pogrešaka. Što je postavljena niža razina ozbiljnosti na razini log datoteke, to će poslužitelj više tipova poruka zapisivati u log datoteku, npr. postavljanjem razine ozbiljnosti na "//debug//", osim događaja te razine u log datoteku će se bilježiti i svi događaji veće razine ozbiljnosti.
Moguće log razine:
* **debug** (najniža razina ozbiljnosti)
* **info**
* **notice**
* **warn** (zadana postavka)
* **error**
* **crit**
* **alert**
* **emerg** (najviša razina ozbiljnosti)
Podešavanje razine ozbiljnosti događaja na nižu razinu može pružiti više informacija o problemu, ali će također otežati pronalaženje onoga što se traži.
==== Konfiguracija formata log zapisa ====
Naredbom __LogFormat__ se definira formatiranje zapisa u log datoteci. Apache prema zadanim postavkama koristi //common// format zapisa, ali se može navesti vlastiti niz formata kako bi se promijenila polja ili redoslijed polja koji su uključeni u zapis. Još jedan često korišten formata naziva se //combined// format zapisa. //Combined// format zapisa sličan je //common// formatu zapisa, osim što ima dva dodatna polja: __Referrer__ i __User-Agent__.
Primjer //combined// formata zapisa:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Primjer common formata zapisa:
LogFormat "%h %l %u %t \"%r\" %>s %b" common
Ispred naziva polja nalazi se simbol %. Neka od važnih polja u zapisu log datoteke pristupa zapisani su u tablici (Tablica 1).
^ Simbol polja ^ Naziv polja ^
|%>s| HTTP konačni statusni kod vraćen od strane poslužitelja|
|%s| HTTP izvorni statusni kod vraćen od strane poslužitelja|
|%U| zahtijevani URL|
|%h| IP adresa klijenta koji podnosi zahtjev|
|%T| vrijeme potrebno za obradu zahtjeva u sekundama|
|%D| vrijeme potrebno za obradu zahtjeva u mikrosekundama|
|%{UNIQUE_ID}e| ID zahtjeva|
|%t| Vremenska oznaka kada je zahtjev primljen|
|%r| vrsta HTTP zahtjeva|
|%b| Broj prenesenih bajtova|
Tablica 1: simboli i nazivi polja za definiranje formata zapisa log datoteke pristupa
Koristeći osnovne definicije polja, mogu se jednostavno identificirati ključne informacije iz log datoteke pristupa. Format zapisa log datoteke pristupa je moguće promijeniti navođenjem naredbe **CustomLog** u Apache konfiguracijskoj datoteci.
Primjer postavljanja //common// formata zapisivanja:
CustomLog "/var/log/httpd2/access_log" common
Format zapisa log datoteke grešaka je moguće promijeniti navođenjem naredbe **ErrorLogFormat** u Apache konfiguracijskoj datoteci.
Primjer mijenjanja formata zapisa log datoteke grešaka:
ErrorLogFormat "[%t] [%l] [pid %P] %F: %M"
Sljedeća tablica prikazuje neka od važnih polja u zapisu grešaka (Tablica 2):
^ Simbol polja ^ Naziv polja ^
|%l| Vrsta poruke, razina ozbiljnosti|
|%P| ID procesa koji je uzrokovao pogrešku|
|%F| Datoteka izvornog koda i broj retka modula koji je uzrokovao pogrešku|
|%M| Poruka|
Tablica 2: simboli i nazivi polja za definiranje formata zapisa log datoteke grešaka
===== Lokacije log i konfiguracijskih datoteka =====
Prema zadanim postavkama, koje se mogu promijeniti, Apache pohranjuje zapise pristupa i grešaka u zasebne datoteke na poslužitelju, kao i pripadajuće konfiguracijske datoteke. Točna lokacija ovisi o operacijskom sustavu. Zadana lokacija odnosno direktorij na Linux operacijskom sustavu je /var/log/apache2. Uz zadane postavke, zapise pristupa možemo pronaći u datoteci /var/log/apache2/access.log, dok zapise grešaka možemo pronaći u datoteci /var/log/apache2/error.log. Na tablici (Tablica 3) možemo vidjeti lokacije od odabranih konfiguracijskih datoteka.
^ Postavka ^ Konfiguracijska datoteka ^
| Log pristupa | /etc/apache2/sites-available/000-default.conf |
| Log razina | /etc/apache2/apache2.conf |
| Log grešaka | /etc/apache2/apache2.confwarn |
| Format loga | /etc/apache2/apache2.conf |
Tablica 3: Lokacije konfiguracijskih datoteka vezane za određene postavke zapisa na Linux operacijskom sustavu
===== Rotacija log datoteka =====
Rotacija log datoteka je tehnika upravljanja zapisima u kojoj se log datoteke starije od određenog vremena ili veće od određene veličine brišu, premještaju, preimenuju ili komprimiraju. Bez rotacije se nastavlja koristiti ista log datoteka te bi s vremenom Apache poslužitelju moglo ponestati prostora na disku. Također, budući da log datoteke s vremenom postaju vrlo velike, to stvara uska grla u performansama prilikom čitanja ili pisanja u log datoteke.
Linux **logrotate** je program koji se može koristiti kao jedan od načina za konfiguriranje rotacije log datoteka za Apache poslužitelj. Potrebno je postaviti pravilna pravila zadržavanja log datoteka kako bi se starije log datoteke mogle izbrisati ili premjestiti na drugu lokaciju. U sustavu s više Apache web poslužitelja, najbolje je poslati sve zapise u središnji sustav za upravljanje zapisima.
Primjer postavljanja rotacije log datoteke s logrotate:
/var/log/apache2/* {
daily
rotate 7
size 100M
compress
delaycompress
}
Ova konfiguracija će omogućiti svakodnevno rotiranje datoteka koje zadovoljavaju zadane uvjete i koje se nalaze u direktoriju /var/log/apache2. Apache će rotirati log datoteke u navedenom direktoriju kada dosegnu veličinu od 100 MB i zadržat će samo zadnjih sedam rotiranih datoteka. Sve rotirane datoteke dnevnika će biti automatski komprimirane.
===== Moduli zapisivanja =====
Apache koristi module za proširenje funkcionalnosti osnovnog zapisivanja u log datoteke. Moduli zapisivanja koriste se za poboljšanje mogućnosti zapisivanja Apache-a. Neki od uobičajenih modula za zapisivanje su **mod_log_config**, **mod_log_debug** i **mod_log_forensic**.
mod_log_forensic pruža forenzičko zapisivanje zahtjeva klijenata. Zapisivanje se radi prije i nakon obrade određenog zahtjeva klijenta, stoga forenzički dnevnik za svaki zahtjev sadrži dva zapisa u log dnevniku. Kako bi se identificirao svaki zahtjev, dodjeljuje se jedinstveni ID zahtjeva, što pomaže u sortiranju svih problema i povezivanju događaja.
Prema zadanim postavkama, ovaj modul nije omogućen, ali za Ubuntu to možete učiniti dodavanjem sljedećih naredbi u Apache konfiguracijsku datoteku:
LoadModule log_forensic_module /usr/lib/apache2/modules/mod_log_forensic.so
ForensicLog ${APACHE_LOG_DIR}/forensic_log
===== Nadzor integriteta log datoteke =====
Praćenje integriteta datoteke važan je dio upravljanja log datotekama kako bi se onemogućilo zlonamjernim korisnicima da modificiraju log datoteke ili da ih izbrišu. Praćenje integriteta log datoteka omogućuje uvid u korisnike koji pristupaju log datotekama i sistemske pozive koje pozivaju nad datotekama.
Linux **auditd** omogućuje nadzor integriteta datoteka. U nastavku je prikazan primjer naredbe koja dodaje auditd za praćenje promjena u /var/log/apache2 direktoriju i dodaje ključ pod nazivom apache_watch. Ključ olakšava pretraživanje auditd dnevnika za kršenjem pravila integriteta nad datotekama sadržanim u /var/log/apache2 direktoriju.
auditctl -w /var/log/apache2/ -k apache_watch
Primjer auditd log datoteke:
===============================================
# date time file syscall success exe auid event
===============================================
1. 05/24/2022 08:20:46 /var/log/apache2/ openat yes /usr/bin/bash centos 7479
2. 05/24/2022 08:20:47 /var/log/apache2/a openat yes /usr/bin/touch centos 7480
3. 05/24/2022 08:21:14 /var/log/apache2/ openat yes /usr/bin/bash centos 7482
4. 05/24/2022 08:21:15 /var/log/apache2/ openat yes /usr/bin/bash centos 7483
5. 05/24/2022 08:21:17 /var/log/apache2/access openat yes /usr/bin/vi centos 7484
6. 05/24/2022 08:21:17 /var/log/apache2/access readlink no /usr/bin/vi centos 7485
Auditd log datoteka može poslužiti da se pronađe tko je pristupao log datotekama, tko je obrisao pojedinu log datoteku ili pak tko je promijenio sadržaj pojedine log datoteke.
===== Zaključak =====
Potrebno je analizirati log datoteku grešaka Apache poslužitelja jer ona pruža detaljne informacije o svim greškama koje su se dogodile na poslužitelju. Razine zapisivanja se mogu podesiti u Apache konfiguracijskoj datoteci kako bi se odredilo koja se vrsta grešaka bilježi. Podešavanje razine ozbiljnosti događaja na nižu razinu može pružiti više informacija o problemu, ali će također otežati pronalaženje onoga što se traži. Osim log datoteke grešaka, Apache također nudi log datoteku pristupa koja bilježe sve zahtjeve koje poslužitelj obradi. Ovi zapisi također mogu dati dodatna objašnjenja o tome što je moglo uzrokovati problem i također mogu nadopuniti informacije pronađene u zapisima grešaka. Za što bolju forenzičku analizu log datoteka potrebno je uključiti modul zapisivanja mod_log_forensic. Preporučuje se korištenje Linux auditd ili nekog sličnog programa kako bi se uspostavio nadzor integriteta log datoteka.
===== Literatura =====
[1] [[https://httpd.apache.org/docs/2.4/logs.html | Apache - Log Files]]
[2] [[https://httpd.apache.org/docs/trunk/mod/mod_log_forensic.html | Apache - Module mod_log_forensic]]
[3] [[https://www.crowdstrike.com/guides/apache-logging/ | Arfan Sharif: Apache Logging Guide - The Basics]]
[4] [[https://www.loggly.com/ultimate-guide/apache-logging-basics/ | Apache Logging Basics]]
[5] [[https://www.crowdstrike.com/guides/apache-logging/advanced-concepts/ | Arfan Sharif: Apache Logging Guide -
Advanced Concepts]]
[6] [[https://www.acunetix.com/blog/articles/apache-http-server-logs/ | Troubleshooting tips for Apache, Part 2 – Apache HTTP Server logs]]
[7] [[https://cloudlytics.com/basics-of-apache-logging-a-definitive-guide/ | Abhijeet Chinchole: Basics of Apache Logging - A Definitive Guide]]