İçeriğe atla
0 XP 0
15 dkderinleşmeyle 17 dk55 XP8 etkinlik

Zaman damgası ve saat dilimi tuzakları

Bu derste
  • nginx, Windows ve epoch zaman damgalarını UTC'ye çevir. Saat dilimi ve yaz saati farklarını kontrol et. Kaydın geç gelmesi ile cihaz saatinin sapmasını ayırt et.
  • Bu derste üç farklı kaynağın zaman damgasını tek eksene çekeceksin: nginx +0300, Windows UTC, güvenlik duvarı epoch.
  • Zaman kayması, kayıt gecikmesi ve saat sapması arasındaki farkı ayırt edeceksin.

Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +55 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.

Zaman çizelgesi kurmak olay müdahalesinin bel kemiğidir. Hangi olay önce oldu? Cevap sırayı, sıra da neden sonuç ilişkisini belirler.

Tek bir yanlış saat, saldırganın giriş kapısını tamamen kaçırmana yol açar. Bu derste web01'in nginx kaydını, dc01'in Windows olaylarını ve güvenlik duvarının epoch damgalarını tek eksene çekeceksin.

Önce her kaynağın zamanı nasıl yazdığını göreceksin. Sonra dönüştürme komutlarını, Türkiye'ye özgü saat tuzaklarını, olay zamanı ile alınma zamanı farkını ve saat sapmasını öğreneceksin. En sonda çok kaynaklı bir çizelgeyi doğru sırayla kuracak ve saatleri koruyan ayarları göreceksin.

Her kaynak zamanı başka yazar

Sorun şudur: her kaynak zamanı kendi biçiminde yazar. Klasik syslog (RFC 3164) ay, gün ve saat yazar; yıl da saat dilimi de yoktur. RFC 5424 ise RFC 3339 biçimini kullanır ve ofseti ekler.

Nginx $time_local ile yerel saati ofsetle, $time_iso8601 ile aynı bilgiyi ISO 8601 biçiminde verir. Windows EVTX kaydında SystemTime UTC'dir, ama Event Viewer onu yerel saate çevirip gösterir. Sysmon UtcTime alanını adından da anlaşılacağı gibi UTC yazar.

Zeek ağ kayıtlarında ts alanı ondalıklı epoch saniyesidir. journald ise -o short-iso ile yerel saati ofsetle, --utc ile UTC olarak basar. Aynı an bu kaynaklarda altı ayrı görünüm alır.

Kaynak             Alan ya da biçim            Aynı an
syslog (RFC 3164)  Mmm dd hh:mm:ss             Sep 14 03:02:11
syslog (RFC 5424)  RFC 3339, ofsetli           2026-09-14T03:02:11+03:00
nginx              $time_local                 14/Sep/2026:03:02:11 +0300
nginx              $time_iso8601               2026-09-14T03:02:11+03:00
Windows EVTX       SystemTime (UTC)            2026-09-14T00:02:11.0000000Z
Sysmon             UtcTime                     2026-09-14 00:02:11.482
Zeek               ts (epoch, ondalıklı)       1789344131.482913
journald           -o short-iso                2026-09-14T03:02:11+03:00

nginx     : [14/Sep/2026:03:02:11 +0300]      -> 2026-09-14T00:02:11Z
windows   : 2026-09-14 00:12:51Z (UTC)        -> 2026-09-14T00:12:51Z
firewall  : 1789344131                        -> 2026-09-14T00:02:11Z
TR yerel  : UTC + 3 saat (2016'dan beri yaz kış değişmez)
Üstte aynı an sekiz kaynakta; yalnız ilk satır yıl ve saat dilimi taşımaz. Altta üç kaynaktan üç damganın UTC karşılığı. Karşılaştırmayı her zaman UTC üzerinde yap, rapora yerel saati de ekle.

Ofset yönünü karıştırmak en sık yapılan hatadır. +0300 ifadesi, yerel saatin UTC'den üç saat ileride olduğunu söyler. UTC'ye dönmek için saatten üç saat çıkarırsın, eklemezsin. Tersini yaparsan olayı gerçek zamanından altı saat uzağa taşırsın ve çizelge baştan yanlış kurulur. Eksi ofset tersini yapar: -0500 yazan bir damgaya beş saat eklersin.

Kural tek cümledir: yerel saatten ofseti çıkar, UTC'yi bulursun. Ofset işaretini kendisi taşıdığı için kural hiç değişmez. Yön hatasını fark edene kadar saatlerce yanlış izi sürebilirsin. Bu yüzden her dönüşümden sonra bilinen bir olayla sağlama yap.

Araçlar da zamanı sessizce çevirir. Get-WinEvent çıktısındaki TimeCreated değeri, kayıttaki UTC anın makinenin yerel saatine çevrilmiş hâlidir. PowerShell'de .ToUniversalTime() ile UTC'ye döndürürsün. Tablolama programları da benzer davranır.

ISO biçimli bir damgayı açınca onu tarih sanıp kendi saat dilimine göre gösterebilir ya da ofseti atabilir. Başka bir ülkedeki ekip arkadaşın aynı dosyayı açtığında farklı bir saat görür. Güvenli yol, zaman alanını metin olarak tutmak ve UTC olduğunu alan adına yazmaktır: zaman_utc gibi. Kullandığın aracın varsayılanını bilinen bir olayla bir kez sına.

Etkinlik 1 / 8

Nginx logundaki [14/Sep/2026:03:02:11 +0300] damgasının UTC karşılığı saat kaçtır? (SS:DD:ss)

Tek eksene çevirmek

Dönüştürmeyi elle yapmazsın, araca yaptırırsın. GNU date epoch değerini @ işaretiyle alır ve -u ile UTC basar. Aynı komut ofsetli bir yerel saati de UTC'ye çevirir.

macOS ve BSD'deki date farklı çalışır; orada epoch için -r seçeneği kullanılır. Windows'ta PowerShell DateTimeOffset sınıfıyla, her yerde de Python'un datetime modülüyle aynı sonucu alırsın. Epoch değerinin uzunluğuna dikkat et.

Günümüz tarihlerinde on haneli bir değer saniyedir. On üç haneli bir değer milisaniyedir ve bine bölünmeden çevrilirse binlerce yıl ötesine düşer. Bazı araçlar on altı haneli mikrosaniye de yazar. Önce haneyi say, sonra birimi seç.

$ date -u -d @1789344131 +%FT%TZ
2026-09-14T00:02:11Z

$ date -u -d '2026-09-14 03:02:11 +0300' +%FT%TZ
2026-09-14T00:02:11Z

$ date -u -r 1789344131                      # macOS ve BSD
Mon Sep 14 00:02:11 UTC 2026

PS> [DateTimeOffset]::FromUnixTimeSeconds(1789344131).UtcDateTime
14 Eylül 2026 Pazartesi 00:02:11

$ python3 -c 'import datetime as d; print(d.datetime.fromtimestamp(1789344131, d.timezone.utc))'
2026-09-14 00:02:11+00:00
Aynı epoch değeri dört araçta. Hepsi 2026-09-14 00:02:11 UTC anına denk gelir.

Tek tek çevirmek yerine bütün kaynağı bir kerede normalleştirirsin. Aşağıdaki gawk betiği nginx damgasını parçalarına ayırır ve mktime ile epoch'a çevirir.

mktime tarihi makinenin saat dilimine göre yorumlar; bu yüzden betik TZ=UTC ile çalışır ve ofset elle düşülür. Sonuç, her satırın başına eklenen ISO biçimli bir UTC alanıdır. Üç kaynağı da aynı biçime getirdikten sonra sort -m ile birleştirirsin. -m seçeneği zaten sıralı dosyaları yeniden sıralamadan birleştirir.

Ham damgayı satırda bırak. Dönüşümde hata bulursan ham değer elinde durduğu için işi baştan alırsın. Kaynağın adını da satıra yaz; tartışmalı bir satırın aslına saniyeler içinde dönersin.

$ TZ=UTC gawk '{
    split(substr($4, 2), p, /[\/:]/)
    ay = (index("JanFebMarAprMayJunJulAugSepOctNovDec", p[2]) + 2) / 3
    t = mktime(p[3] " " ay " " p[1] " " p[4] " " p[5] " " p[6])
    s = (substr($5, 1, 1) == "-") ? -1 : 1
    o = s * (substr($5, 2, 2) * 3600 + substr($5, 4, 2) * 60)
    print strftime("%Y-%m-%dT%H:%M:%SZ", t - o, 1), $0
  }' access.log > nginx.utc

$ sort -m nginx.utc windows.utc firewall.utc | head -5
2026-09-14T00:02:11Z 198.51.100.77 - - [14/Sep/2026:03:02:11 +0300] "GET /admin HTTP/1.1" 404 162 ...
2026-09-14T00:02:11Z firewall 198.51.100.77 -> 10.20.30.10:443 izin
2026-09-14T00:04:55Z 198.51.100.77 - - [14/Sep/2026:03:04:55 +0300] "POST /uploads/up.php HTTP/1.1" 200 34 ...
2026-09-14T00:12:51Z dc01 4624 mkaya LogonType=10 198.51.100.77
2026-09-14T00:15:02Z dc01 7045 AltayUpdateSvc C:\Users\Public\svc.exe
Üstte nginx damgasını UTC'ye çeviren betik, altta üç kaynağın birleşmiş çizelgesi. İlk iki satır aynı saniyeyi paylaşır.

Etkinlik 2 / 8

Üç kaynaktan gelen olayları gerçek zaman sırasına diz. (Hepsini UTC'ye çevirerek düşün.)

Sürükleyip doğru sıraya koy.

Bir öğeye odaklan, yukarı ve aşağı ok tuşlarıyla taşı. Home tuşu en üste, End tuşu en alta alır.

  • 1windows 2026-09-14 00:15:02Z: EventID 7045, yeni hizmet kuruldu
  • 2windows 2026-09-14 00:12:51Z: EventID 4624, mkaya hesabı girdi
  • 3nginx [14/Sep/2026:03:04:55 +0300]: POST /uploads/up.php isteği 200 döndü
  • 4firewall 1789344131: 198.51.100.77 adresinden 443 portuna bağlantı
  • 5nginx [14/Sep/2026:03:02:11 +0300]: GET /admin isteği 404 döndü

Etkinlik 3 / 8

Windows olay günlüğü UTC tutuyor, nginx ise +0300 yazıyor. Aynı olayı iki kaynakta yan yana koyarsan aradaki görünür fark kaç saat olur?

Tahminini kaydır, sonra gönder.

012

Türkiye saati, yaz saati ve eksik yıl

Türkiye 7 Eylül 2016'dan beri sabit UTC+3 kullanır ve yaz saati uygulamaz. Bu bilgi IANA saat dilimi veritabanında Europe/Istanbul adıyla kayıtlıdır. Güncel kayıtlar için çeviri tek bir çıkarma işlemidir.

Eski arşivlerde durum farklıdır. 2016'dan önce Türkiye kışın EET (UTC+2), yazın EEST (UTC+3) kullanıyordu. Ocak 2015'te yerel saatle yazılmış 10:00 damgası 08:00 UTC'ye, Temmuz 2015'teki aynı damga 07:00 UTC'ye denk gelir.

2016 öncesi bir kayıtta sabit +3 varsaymak bir saatlik hata üretir. Çözüm ofseti elle yazmak değil, saat dilimi adını kullanmaktır. Europe/Istanbul adını bilen bir araç o tarihteki kuralı kendisi uygular.

$ TZ=Europe/Istanbul date -d '2015-01-10 10:00' +'%F %T %z'
2015-01-10 10:00:00 +0200
$ TZ=Europe/Istanbul date -d '2015-07-10 10:00' +'%F %T %z'
2015-07-10 10:00:00 +0300
$ TZ=Europe/Istanbul date -d '2026-01-10 10:00' +'%F %T %z'
2026-01-10 10:00:00 +0300
Aynı saat, üç tarih. Saat dilimi adı, tarihe göre doğru ofseti kendisi seçer.

Yaz saati uygulayan ülkelerin kayıtlarında ofset yıl içinde değişir. Avrupa'daki bir sunucunun mart ve kasım damgaları farklı ofset taşır. Geçiş gecesinde bir saat ya iki kez yaşanır ya da hiç yaşanmaz.

Orta Avrupa'da sonbaharda saat geri alındığında 02:30 damgası iki ayrı anı gösterebilir. Çok ülkeli ortamda ofseti sabit varsaymak sessiz ama büyük bir hatadır. Syslog'un eksik yılı da ayrı bir tuzaktır.

Yıl dönümünde toplanan bir dosyada aralık satırları ocak satırlarıyla karışır. Toplayıcı yılı kendi saatinden eklerse aralık kayıtları bir sonraki yıla taşınabilir. Yılı dosya adından, döndürme tarihinden ya da merkezî toplayıcının alınma zamanından doğrula.

Derinleş:Türkiye'nin saat serüveni

IANA veritabanının Türkiye bölümü, saat kararlarının kayıtlara nasıl yansıdığını gösteren iyi bir örnektir. 2011'de yaz saatine geçiş, 27 Mart'taki ulusal bir sınav yüzünden bir gün ertelendi. 2014'te yerel seçim nedeniyle geçiş yine bir gün kaydırıldı. Birçok telefon ve havayolu sistemi eski kurala göre saati ileri aldı ve seçim günü karışıklık yaşandı.

2015'te genel seçim nedeniyle yaz saatinin bitişi 25 Ekim'den 8 Kasım'a ertelendi. Otomatik güncellenen cihazların bir kısmı saati yine 25 Ekim'de geri aldı. 7 Eylül 2016'da yaz saati kalıcı hâle geldi ve Türkiye UTC+3'te kaldı. Ekim 2017'de mevsimlik saate dönme kararı yayımlandı, iki hafta dolmadan geri alındı.

Analist için ders açıktır. Aynı gün, aynı şehirde iki cihaz farklı saat yazmış olabilir. Eski bir olayı incelerken cihazın saat dilimi verisinin ne kadar güncel olduğunu da sorgula.

Etkinlik 4 / 8

Ocak 2015'te İstanbul'daki bir sunucunun yerel saatle ve ofsetsiz yazdığı 10:00 damgası UTC'de kaçtır?

Olay zamanı ve alınma zamanı

İkinci tuzak kayıt gecikmesidir. Olayın olduğu an ile SIEM'e düştüğü an aynı değildir. Arada ajanın okuma aralığı, ağ, kuyruk ve ayrıştırma vardır.

Fark bazen saniyeler, bazen saatlerdir; makine ağdan kopmuşsa kayıtlar günler sonra gelebilir. Bu yüzden her kayıtta iki zaman alanı bulunur. Olay zamanı işin gerçekten olduğu andır. Alınma zamanı kaydın toplayıcıya ya da dizine vardığı andır.

Splunk'ta bu ikisi _time ve _indextime alanlarıdır. Microsoft Sentinel ve Log Analytics'te olay zamanı TimeGenerated, alınma zamanı _TimeReceived alanıdır. Sıralamayı olay zamanına göre yap. Alınma zamanına göre sıralarsan, ağ yavaşladığı anda hikâye ters döner.

index=guvenlik earliest=-24h
| eval gecikme = _indextime - _time
| stats count perc95(gecikme) AS p95 max(gecikme) AS enbuyuk by sourcetype
| sort - p95

sourcetype      count    p95   enbuyuk
WinEventLog     48211    41    9312
nginx:access    120544   4     38
linux:auth      9310     2     11
Kaynak türüne göre alınma gecikmesi, saniye cinsinden. Windows kayıtlarında en az bir makine bir süre kopuk kalmış.

Sorgu her kayıt için alınma ile olay zamanı arasındaki farkı saniye olarak hesaplar. perc95 kayıtların yüzde 95'inin bu süre içinde geldiğini söyler.

Windows kayıtlarında 95. yüzdelik 41 saniyedir, ama en büyük gecikme iki buçuk saati aşar. Demek ki en az bir makine bir süre toplayıcıya ulaşamamıştır. Gecikme tespit kurallarını da etkiler.

Son beş dakikaya bakan ve her beş dakikada bir çalışan bir kural, geç gelen kaydı hiçbir turda görmeyebilir. Kural penceresini kaynağın gecikmesine göre ayarlamak bu yüzden bir tespit mühendisliği işidir. Aynı ölçümü Log Analytics'te ingestion_time() ile TimeGenerated farkından yaparsın.

Alınma zamanının işe yaradığı bir durum da vardır. Olay zamanını kaynak makine yazar. Makinenin saati kaymışsa olay zamanı da kayar. Toplayıcının saati ise genelde düzgündür, çünkü merkezî sunucular sıkı izlenir.

Bir kaynağın kayıtları alınma zamanından sonra olmuş görünüyorsa, yani olay zamanı gelecekteyse, o makinenin saati ileridedir. Gecikme değerinin aniden eksiye düşmesi sapmayı yakalamanın ucuz bir yoludur. Aynı sorgu bu yüzden hem geç gelen kaydı hem de ileri giden saati gösterir. Eksi gecikme gördüğünde o makinenin saat ayarını hemen kontrol et.

Etkinlik 5 / 8

Alanları taşıdıkları zamana göre ayır.

Önce bir seçeneğe, sonra aşağıdaki uygun kutuya bas. İstersen seçeneği kutuya sürükleyip bırak. Yerini değiştirmek için aynı işlemi tekrarla.

0/5 seçenek yerleşti.

Etkinlik 6 / 8

Doğru mu, yanlış mı?

Zaman çizelgesini kaydın SIEM'e düştüğü ana göre sıralamak güvenlidir.

Saat sapması ve çizelgeyi kurmak

Üçüncü tuzak saat sapmasıdır. Her makinenin saati zamanla kayar. NTP kapalıysa ya da kaynağa ulaşamıyorsa birkaç ayda dakikalarca fark oluşur. Bu kaymayı bilmeden kurduğun çizelge olayları yanlış sıraya dizer ve seni yanlış makineye götürür.

Sapmayı ölçmek kolaydır. Linux'ta timedatectl status saatin eşitlenip eşitlenmediğini, chronyc tracking ise NTP saatine göre güncel farkı gösterir. Windows'ta w32tm /query /status zaman kaynağını ve son başarılı eşitlemeyi listeler.

Sapma kendi izini de bırakır. Kerberos, istemci ile DC arasındaki saat farkı ilkedeki toleransı aşarsa isteği reddeder. Varsayılan tolerans beş dakikadır ve hata KRB_AP_ERR_SKEW (0x25) koduyla kayda düşer.

depo01$ timedatectl status | grep -E 'Time zone|synchronized|NTP'
                Time zone: Europe/Istanbul (+03, +0300)
System clock synchronized: no
              NTP service: active

depo01$ chronyc tracking | grep -E 'Reference|System time'
Reference ID    : C0000201 (ntp1.altaykargo.example)
System time     : 241.337209702 seconds slow of NTP time
depo01 saati NTP saatinin yaklaşık dört dakika gerisinde. chrony büyük farkı yavaşça kapatır; makestep bunu tek adımda düzeltir.

Sapmayı ölçtükten sonra düzeltmeyi yaz ve o makinenin bütün damgalarına aynı değeri uygula. depo01 saati 241 saniye gerideyse, o makinenin her damgasına 241 saniye eklersin. Çizelgede her satır kaynağını taşısın: dosya adı, makine ve ham damga.

ISO 8601 biçimi burada işini kolaylaştırır. En büyük birim en solda durduğu için metin sıralaması zaman sıralamasıyla aynı sonucu verir. Eşit damgalar ayrı bir sorundur.

Saniye çözünürlüğü kalabalık sistemlerde yetmez; kaynağın milisaniye yazıp yazmadığını kontrol et. Yazmıyorsa sırayı olay mantığıyla düzelt, çünkü giriş, komut ve çıkış sırası değişmez. Çok sayıda kaynak için Plaso (log2timeline) bütün delillerden tek bir süper zaman çizelgesi üretir. Timesketch'te ise ekip bu çizelgeyi birlikte inceler.

Derinleş:Epoch, artık saniye ve 2038

Unix zamanı 1 Ocak 1970 00:00:00 UTC'den bu yana geçen saniyeyi sayar. Basit görünür ama iki ayrıntı taşır. Birincisi artık saniyedir. UTC zaman zaman bir saniye eklenerek Dünya'nın dönüşüne uydurulur.

Unix zamanı bu saniyeleri saymaz ve her günü tam 86.400 saniye kabul eder. Artık saniye anında iki farklı an aynı epoch değerini alabilir.

Ağırlıklar ve Ölçüler Genel Konferansı (CGPM) 2022'de UT1 ile UTC arasındaki izinli farkı en geç 2035'te büyütmeye karar verdi; bu karar artık saniyeyi fiilen emekliye ayırır. İkincisi taşmadır. İşaretli 32 bitlik bir sayaç 19 Ocak 2038'de 03:14:07 UTC'de dolar ve eksiye döner.

Eski gömülü cihazlar ve eski dosya biçimleri 2038 sonrası tarihleri bu yüzden yanlış yazar. Windows ise başka bir başlangıç kullanır. FILETIME değeri 1 Ocak 1601'den bu yana geçen 100 nanosaniyelik aralıkları sayar. Kayıt defteri ve NTFS damgalarında bu biçimle karşılaşırsın.

Etkinlik 7 / 8

birlesik.log dosyasında her satır ISO 8601 UTC zaman alanıyla başlıyor. Satırları zaman sırasına dizip birebir tekrar eden satırları atan boruyu kur.

Parçalara tıklayarak komutu soldan sağa kur.

$

Savunma tarafı basittir ama disiplin ister. Bütün sunucular aynı iç NTP kaynağına bağlanır ve eşitleme durumu izlenir. Sapma belirli bir eşiği, örneğin bir saniyeyi aşarsa alarm üretilir.

Windows etki alanında üyeler saatini DC'den alır. Orman kökündeki PDC öykünücüsü rolünü taşıyan DC ise güvenilir bir dış kaynağa bağlanır.

Toplayıcı her kayda normalleştirilmiş bir UTC alanı ekler ve ham damgayı da saklar. Bu ayarlar olaydan önce yapılır; olay anında geriye dönük düzeltme hem zaman alır hem tartışma yaratır. NIST'in log yönetimi planlama rehberi de (SP 800-92 Rev. 1 taslağı) log yönetimini olaydan önce planlanan bir iş olarak ele alır.

Etkinlik 8 / 8

Bir sunucunun saati NTP kapalı olduğu için 4 dakika geride kalmış. Bu durumun olay müdahalesindeki ilk etkisi nedir?

Bu derste bir hata mı gördün? Bildir