18 Nisan 2016

Apache Log Ayarları

Apache http server çok kapsamlı ve esnek loglama imkanı sunmaktadır. Bu makalede saldırı tespiti için logların konfigürasyonu ve içeriğinin anlaşılması üzerinde durulacaktır. Logların istenilen şekilde oluşturulması için yapılacak konfigürasyonda, Apache log yapısını bilmekte fayda olduğu için öncelikle bu yapı anlatılmıştır. Apache tarafından üretilen iki ayrı log çeşiti vardır bunlar: Access log ve Error log'larıdır. 
NOT! : Apache serverın logları yazdığı dizine ulaşabilen herhangi biri serveri başlatan kullanıcı kimliğine (genellikle root) ulaşabilir. O yüzden logların yazıldığı dizine hiç kimseye yazma izni verilmemesi gerekir.

Error Logları

İsmi ve lokasyonu ErrorLog yönergesi tarafından belirlenen önemli log dosyasıdır. Diagnostic bilgilerinin ve işlenen isteklerde meydana gelen hatalarla ilgili bilgiler tutulur. Server başlatılırken veya çalışırken bir sorunla karşılaşıldığında neyin yanlış gittiğini anlamak için bakılacak yer burasıdır. Hatta bu loglar çoğunlukla sorunun nasıl düzeltileceğine dair notlar da içerir. Örnek bir error log satırı:

[Tue Jan 19 15:28:57.687859 2016] [core:info] [pid 6561] [client 192.168.56.1:60187] AH00128: File does not exist: /var/www/html/favicon.ico

Bu girdinin ilk ögesi tarih ve saati, ikinci öğe önem derecesini belirtmektedir. Hata türlerinin önem seviyesini belirlemek için LogLevel yönergesi kullanılabilir. Apache konfigürasyon dosyası '/etc/apache2/apache.conf' içerisinde LogLevel satırında bu değer belirtilmektedir. Verilebilecek değerler arasında emerg, alert, crit, error, warn, notice, info ve debug seviyeleri bulunmaktadır.

Acces Logları

Sunucu tarafından işleme alınan tüm istekleri kaydeder. Bu logların kayıt olacağı yer ve içeriği CustomLog yönergesi tarafından belirlenir. LogFormat yönergesi ile de log içeriğini formatı istenildiği şekilde belirlenebilir. CustomLog formatı için kullanılabilecek ifadeler aşağıda listelenmiştir:
  • %a: Remote IP-address
  • %A: Local IP-address
  • %B: http başlıkları hariç, yanıtın bayt cinsinden uzunluğu
  • %b: %B ile aynı, CLF format
  • %{FOOBAR}e: FOOBAR değişkeninin içeriği
  • %f: Dosya ismi
  • %h: Remote host
  • %H Request protocol
  • %{Foobar}i:     İstekle birlikte sunuya gönderilen FOOBAR başlıklı satırların içeriği
  • %l: Remote kullanıcı kimliği(eğer identd tarafından geldiyse)
  • %m İstek Metod
  • %{Foobar}n:    Diğer modüldeki FOOBAR bilgisinin içeriği.
  • %{Foobar}o:    Yanıtta FOOBAR başlıklı satırların içeriği
  • %p: canonical Port of the server serving the request
  • %P: process ID of the child that serviced the request.
  • %q: query string
  • %r: İsteğin ilk satırı
  • %s: Durum. İsteğin son durumu için %>s kullanılır
  • %t: Tarih ve saat.(standart ingiliz biçemi)
  • %{format}t:      Formatlı Tarih ve saat(yerelleştirme için)
  • %T: Saniye cinsinden, isteği sunmak için harcanan zaman.
  • %u: Remote user
  • %U: İstenen URL yolu.
  • %v: ServerName
  • %X: Yanıt tamamlandığında bağlantı durumu
Değiştiriciler(Modifiers): Belli öğelerin sadece belli durum kodlarıyla ilgili yanıtlarda kayıt edilmesi istenidiğinde, bu durum kodları % iminden hemen sonra virgülle ayrılmış olarak yazılabilir. Örneğin, “%400,501{user-agent}i” belirteci, User-agent başlığının sadece 400 ve 501 hatalarında log kayderer. Diğer durum kodları için loglarda “-” yazılır. Durum kodlarının olumsuzunu belirtmek için “!” kullanılır.
Apache tarafından deteklenen log formatlarından bazıları: 

Common Log Format (CLF)
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/acces_log common
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

Combined Log Format
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog log/access_log combined
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
"http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"

Referer başlığını içeren log formatı
"%{Referer}i -> %U"

User-agent başlığını içeren log formatı
"%{User-agent}i

Multiple Acces Logs: Birden çok CustomLog yönergesi belirterek oluşturulur
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i

Apache logları incelenirken muhtemel tehditleri aramak için bakılacak bazı şeyler şunlardır :
  • Çalıştırılabilir dosya istekleri, ör: /system32/cmd.exe?c+dir
  • Önemli dosyalara yapılan erişim denemeleri, ör: /var/log veya /etc/shadow
  • SQL Injection atakları, ör: or 1=1-- veya SELECT
  • Fazla miktarda giriş denemeleri
  • Web sitesi üzerinde kısıtlanmış bölgelere yapılan erişim denemeleri
  • TRACE veya OPTIONS gibi istek metodları
  • Fazla miktardaki 404 ve 500 hata kodları... vb.
İhtiyacımıza göre log formatını belirlemeli ve yapılan saldırı analizlerinde ihtiyaç duyacağımız bilgileri formata dahil etmeliyiz. Örneğin aşağıdaki şekilde bir log formatı belirlemek önerilir.
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" detailed
CustomLog logs/access.log detailed

Apache Loglarını Syslog Server'a Yönlendirilmesi
  • Lokal sistem üzerinde tutulan apache logları:
    • Access Logs : /var/log/apache2/access.log
    • Error Logs : /var/log/apache2/error.log
  • Bu dizinlerin rsyslog servisi tarafından gözlenmesi için konfigurasyon yapılması gereklidir. Syslog tarafından dizin belirterek belirli bir log dosyasını almak için 'imfile' modulü kullanılır.
    • Konfigurasyon Dosyası : /etc/rsyslog.conf
  • Bu konfigurasyon dosyasının en altına aşağıdaki komutlar eklenmeli :
$MODLOAD IMFILE 
$INPUTFILEPOLLINTERVAL 10 
$PRIVDROPTOGROUP ADM
$WORKDIRECTORY /VAR/SPOOL/RSYSLOG

# APACHE ACCESS FILE:
$INPUTFILENAME /VAR/LOG/APACHE2/ACCESS.LOG
$INPUTFILETAG APACHE-ACCESS:
$INPUTFILESTATEFILE STAT-APACHE-ACCESS
$INPUTFILESEVERITY INFO
$INPUTFILEFACILITY local5
$INPUTRUNFILEMONITOR

#APACHE ERROR FILE: 
$INPUTFILENAME /VAR/LOG/APACHE2/ERROR.LOG
$INPUTFILETAG APACHE-ERROR:
$INPUTFILESTATEFILE STAT-APACHE-ERROR
$INPUTFILESEVERITY ERROR
$INPUTFILEFACILITY local5
$INPUTRUNFILEMONITOR

  • Daha sonra bir alt satırda logların yönlendirileceği Remote Server Adresi yazılır. Boş olan facility'lerden birisi seçilebilir. Biz yukarıda local5 facility'sini seçmiştik. Yönlendirme işlemi için en sona aşağıdaki komut da eklenir.
    • local5.* @192.168.56.101:514
  • Apache'yi local5'e aldığımız ve onu yönlendirdiğimiz için sadece apache logları gider. Sistemdeki tüm logları göndermek için '*.*' yazılır.
    • Örneğin : *.* @192.168.56.101:514

Bu makale İstanbul Teknik Üniversitesi Bilgisayar Mühendisliği Bölümü öğrencisi stajyerimiz Cemal Türkoğlu tarafından geliştirilmiştir.