Sistem yöneticiliğinde dosya zaman damgaları, görünürde basit ama derinlemesine bakıldığında oldukça kritik bir konu. Özellikle Active Directory ortamlarında, GPO uygulamalarında, log rotasyonlarında ve betik tabanlı otomasyon işlerinde zaman damgalarını doğru yönetmek, işlerin düzgün yürümesi açısından hayati önem taşıyor. Bu yazıda hem Linux tarafındaki touch komutunu hem de Windows Server/Active Directory ortamındaki eşdeğer yöntemleri ele alacağız.
Zaman Damgası Nedir ve Neden Önemlidir?
Bir dosya sistemi üzerinde her dosyanın birden fazla zaman damgası tutulur. Linux tarafında üç temel zaman damgası vardır:
- atime (Access Time): Dosyaya en son erişildiği zaman
- mtime (Modification Time): Dosyanın içeriğinin en son değiştirildiği zaman
- ctime (Change Time): Dosyanın meta verilerinin (izinler, sahiplik) en son değiştirildiği zaman
Windows tarafında ise durum biraz farklıdır. NTFS dosya sistemi şu zaman damgalarını tutar:
- Created Time: Dosyanın oluşturulma zamanı
- Last Modified Time: Son değiştirilme zamanı
- Last Accessed Time: Son erişim zamanı
- MFT Entry Modified Time: Master File Table kaydının değiştirilme zamanı
Active Directory ortamında bu zaman damgaları, Group Policy Object (GPO) uygulamalarında, SYSVOL replikasyonunda ve script tabanlı deployment süreçlerinde doğrudan rol oynar. Yanlış zaman damgaları, GPO’ların yeniden uygulanmamasına, dosya senkronizasyon sorunlarına hatta güvenlik log analizlerinde yanıltıcı sonuçlara yol açabilir.
Linux’ta touch Komutu
touch komutu, isminden de anlaşılabileceği gibi, bir dosyaya “dokunarak” zaman damgasını güncellemek ya da sıfırdan boş bir dosya oluşturmak için kullanılır.
Temel Kullanım
En basit haliyle touch bir dosya oluşturur:
touch yeni_dosya.txt
Eğer dosya zaten varsa, touch onu silmez, sadece zaman damgasını günceller. Bu özellik, birçok otomasyon senaryosunda çok işe yarar.
# Birden fazla dosyayı aynı anda oluşturmak veya güncellemek
touch dosya1.txt dosya2.txt dosya3.log
# Bir dizindeki tüm .conf dosyalarının mtime'ını güncellemek
touch /etc/nginx/*.conf
touch Parametreleri
-a: Sadece atime (erişim zamanı) güncellenir, mtime dokunulmaz.
-m: Sadece mtime (değiştirme zamanı) güncellenir, atime dokunulmaz.
-c veya –no-create: Dosya mevcut değilse yeni dosya oluşturulmaz, sadece varsa güncellenir.
-t [[CC]YY]MMDDhhmm[.ss]: Belirtilen zaman damgasını kullanır, şimdiki zamanı değil.
-d veya –date=STRING: İnsan tarafından okunabilir tarih formatında zaman damgası belirlemek için kullanılır.
-r DOSYA: Zaman damgasını başka bir dosyadan referans alarak eşitler.
-f: BSD uyumluluğu için, artık GNU touch’ta pek işlevi yoktur ama bazı eski scriptlerde karşılaşabilirsiniz.
Belirli Bir Zaman Damgası Atamak
Production ortamında bazen bir dosyanın belirli bir tarihe ait görünmesi gerekir. Örneğin eski bir backup dosyasını restore ettiniz ve orijinal tarihini korumak istiyorsunuz:
# -t parametresiyle belirli bir tarih atama (YYYYMMDDHHMM.SS formatı)
touch -t 202301150830.00 backup_restore.tar.gz
# -d parametresiyle daha okunaklı format
touch -d "2023-01-15 08:30:00" backup_restore.tar.gz
# Görece zaman ifadeleri de kullanabilirsiniz
touch -d "yesterday" rapor.txt
touch -d "2 days ago" log_arsiv.log
touch -d "next monday" planlanan_gorev.sh
Referans Dosyadan Zaman Damgası Kopyalamak
Bu özellik özellikle dosya senkronizasyon scriptlerinde altın değerindedir:
# kaynak_dosya'nın zaman damgasını hedef_dosya'ya kopyala
touch -r kaynak_dosya.conf hedef_dosya.conf
# Pratik senaryo: Yedekten restore edilen bir config dosyasının
# orijinal dosyayla aynı zaman damgasına sahip olmasını sağlamak
touch -r /backup/nginx.conf.bak /etc/nginx/nginx.conf
Active Directory Ortamında Zaman Damgası Yönetimi
Active Directory senaryolarında zaman damgaları birkaç kritik noktada devreye girer. Bunların başında SYSVOL replikasyonu, GPO script deployment’ları ve AD tabanlı dosya servisleri gelir.
PowerShell ile Zaman Damgası Manipülasyonu
Windows Server ortamında touch‘un doğrudan karşılığı yoktur ama PowerShell ile çok daha güçlü araçlar elde edebiliriz:
# Basit touch emülasyonu - dosya yoksa oluşturur, varsa günceller
function Touch-File {
param([string]$FilePath)
if (Test-Path $FilePath) {
(Get-Item $FilePath).LastWriteTime = Get-Date
} else {
New-Item -ItemType File -Path $FilePath | Out-Null
}
}
# Kullanımı
Touch-File "C:Scriptskontrol.flag"
# SYSVOL altındaki script dosyalarını güncellemek
Touch-File "\DC01SYSVOLdomain.localscriptslogon.ps1"
Daha kapsamlı bir senaryo düşünelim: GPO logon scriptleriniz var ve bunların yeniden dağıtılmasını tetiklemek istiyorsunuz. Dosya içeriğini değiştirmeden sadece zaman damgasını güncelleyerek bunu yapabilirsiniz:
# SYSVOL'deki tüm .ps1 scriptlerinin LastWriteTime'ını güncelle
$SysvolPath = "\DC01SYSVOLdomain.localscripts"
Get-ChildItem -Path $SysvolPath -Filter "*.ps1" -Recurse | ForEach-Object {
$_.LastWriteTime = Get-Date
Write-Host "$($_.FullName) guncellendi: $($_.LastWriteTime)"
}
Belirli Bir Zaman Damgası Atamak (PowerShell)
# Belirli bir tarihe zaman damgası ayarlama
$TargetFile = "C:Logssistem_logu.txt"
$TargetDate = [DateTime]"2023-03-15 14:30:00"
$FileItem = Get-Item $TargetFile
$FileItem.CreationTime = $TargetDate
$FileItem.LastWriteTime = $TargetDate
$FileItem.LastAccessTime = $TargetDate
Write-Host "Zaman damgaları güncellendi:"
Write-Host " Oluşturma: $($FileItem.CreationTime)"
Write-Host " Değiştirme: $($FileItem.LastWriteTime)"
Write-Host " Erişim: $($FileItem.LastAccessTime)"
Gerçek Dünya Senaryoları
Senaryo 1: GPO Uygulama Sorunlarını Gidermek
Kurumsal ortamlarda sık karşılaşılan bir durum: Domain Controller’ınızdaki SYSVOL ile client’lar arasında GPO versiyon uyuşmazlığı oluşmuş. Client’lar GPO’nun güncel versiyonunu çekmiyor. Zaman damgaları bu senaryoda büyük rol oynar.
# Linux/Samba DC ortamında SYSVOL dosyalarını kontrol etmek
# SYSVOL genellikle /var/lib/samba/sysvol/ altında bulunur
ls -la /var/lib/samba/sysvol/domain.local/Policies/
# GPO policy dosyasının zaman damgasını güncelle
touch /var/lib/samba/sysvol/domain.local/Policies/{GUID}/Machine/Registry.pol
# Tüm policy dosyalarını güncelle
find /var/lib/samba/sysvol/domain.local/Policies/ -name "*.pol" -exec touch {} ;
Bu işlem sonrası client’ların gpupdate /force çalıştırmasına gerek kalmadan bir sonraki Group Policy refresh döngüsünde güncellemeyi almasını sağlarsınız.
Senaryo 2: Log Rotasyonu ve Arşivleme
Log yönetimi sistemlerinde tarihsel logları arşivlerken orijinal tarihleri korumak kritiktir. Özellikle compliance ve audit gereksinimlerinde logların üretildiği tarihi yansıtması zorunludur:
#!/bin/bash
# Log arşivleme scripti - orijinal zaman damgalarını korur
ARSIV_DIR="/mnt/archive/logs/2023"
KAYNAK_DIR="/var/log/samba"
HEDEF_DOSYA="samba_logs_$(date +%Y%m).tar.gz"
mkdir -p "$ARSIV_DIR"
# --preserve ile tar, zaman damgalarını korur
tar czf "$ARSIV_DIR/$HEDEF_DOSYA"
--preserve-permissions
--atime-preserve
"$KAYNAK_DIR"/*.log
# Arşiv dosyasının kendisine orijinal log'un tarihini ata
ILKLOG=$(ls -t "$KAYNAK_DIR"/*.log | tail -1)
touch -r "$ILKLOG" "$ARSIV_DIR/$HEDEF_DOSYA"
echo "Arşiv oluşturuldu: $ARSIV_DIR/$HEDEF_DOSYA"
echo "Zaman damgası: $(stat -c '%y' "$ARSIV_DIR/$HEDEF_DOSYA")"
Senaryo 3: Makefile Tarzı Bağımlılık Kontrolü
CI/CD pipeline’larında veya otomasyon betiklerinde, bir dosyanın başka bir dosyadan daha yeni olup olmadığını kontrol ederek gereksiz işlemleri atlamak yaygın bir tekniktir:
#!/bin/bash
# Konfigürasyon değişmişse servisi yeniden başlat
KAYNAK_CONF="/etc/myapp/app.conf"
ISLENMIS_FLAG="/tmp/conf_islendi.flag"
if [ "$KAYNAK_CONF" -nt "$ISLENMIS_FLAG" ]; then
echo "Konfigürasyon değişmiş, servis yeniden başlatılıyor..."
systemctl restart myapp
# İşlendiğini işaretle
touch "$ISLENMIS_FLAG"
else
echo "Konfigürasyon değişmemiş, işlem atlanıyor."
fi
Buradaki -nt (newer than) operatörü, Bash’in dosya zaman damgalarını karşılaştırmasına olanak tanır. -ot (older than) ise tersini yapar.
Senaryo 4: Active Directory Kullanıcı Script Deployment’ı
Büyük ölçekli AD ortamlarında logon scriptlerini yönetirken zaman damgaları kritik rol oynar. NETLOGON payload’larındaki scriptlerin doğru sırada çalışması için bazen zaman damgası manipülasyonu gerekir:
# AD'deki tüm OU'lardaki scriptleri güncelle ve dağıtım tarihini logla
$DomainController = "DC01.domain.local"
$NetlogonPath = "\$DomainControllerNETLOGON"
$LogFile = "C:AdminLogsscript_deployment_$(Get-Date -Format 'yyyyMMdd').log"
function Update-LogonScript {
param(
[string]$ScriptPath,
[datetime]$TargetTime = (Get-Date)
)
try {
$Item = Get-Item -Path $ScriptPath -ErrorAction Stop
$OldTime = $Item.LastWriteTime
$Item.LastWriteTime = $TargetTime
$LogEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | GUNCELLENDI | $ScriptPath | Eski: $OldTime | Yeni: $TargetTime"
Add-Content -Path $LogFile -Value $LogEntry
return $true
}
catch {
$LogEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | HATA | $ScriptPath | $($_.Exception.Message)"
Add-Content -Path $LogFile -Value $LogEntry
return $false
}
}
# NETLOGON altındaki tüm scriptleri güncelle
Get-ChildItem -Path $NetlogonPath -Include "*.bat","*.ps1","*.vbs" -Recurse | ForEach-Object {
Update-LogonScript -ScriptPath $_.FullName
}
Write-Host "Deployment tamamlandı. Log: $LogFile"
İleri Düzey touch Kullanımı
find ile Kombine Kullanım
touch‘un gerçek gücü find komutuyla kombinasyonda ortaya çıkar. Özellikle eski dosyaları bulmak ve zaman damgalarını normalize etmek gibi senaryolarda çok işe yarar:
# 30 günden eski .tmp dosyalarını bul ve zaman damgasını güncelle
# (silmeden önce işaretleme amacıyla)
find /tmp -name "*.tmp" -mtime +30 -exec touch -t 200001010000.00 {} ;
# Belirli bir tarihten önce oluşturulan log dosyalarını bul
find /var/log -name "*.log" -newer /var/log/referans_tarih.flag
# Tüm konfigürasyon dosyalarının atime'ını sıfırla
# (disk I/O optimizasyonu için noatime kullanmadan önce mevcut durumu kaydetmek)
find /etc -type f -exec touch -a {} ;
stat Komutu ile Zaman Damgası Doğrulama
touch işlemlerini doğrulamak için stat komutunu kullanmak en sağlıklı yöntemdir:
# Detaylı zaman damgası bilgisi
stat /etc/nginx/nginx.conf
# Sadece mtime almak için
stat -c '%y' /etc/nginx/nginx.conf
# Birden fazla dosyayı karşılaştır
for f in /etc/nginx/*.conf; do
echo "$(stat -c '%n: %y' "$f")"
done
Zaman Damgalarında Dikkat Edilmesi Gereken Durumlar
Filesystem Mount Seçenekleri
Linux sistemlerde /etc/fstab içindeki mount seçenekleri, touch‘un davranışını doğrudan etkiler. noatime veya relatime seçeneği kullanılan bir dosya sisteminde, touch -a komutu beklenen sonucu vermeyebilir ya da kısmi sonuç üretebilir.
# Mevcut mount seçeneklerini kontrol et
cat /proc/mounts | grep -E "ext4|xfs|btrfs"
# noatime ile mount edilmiş bir partition'da atime güncelleme denemesi
# Bu durumda sadece mtime'a odaklanmak daha güvenlidir
mount | grep noatime
NTP Uyumu ve Zaman Senkronizasyonu
Active Directory ortamlarında Kerberos authentication, sunucular arasındaki zaman farkının 5 dakikayı geçmemesini zorunlu kılar. Manuel olarak atadığınız zaman damgaları, NTP senkronizasyon sorunlarıyla birleşince çok kafa karıştırıcı durumlar yaratabilir:
# Sistem saatini kontrol et
timedatectl status
# NTP senkronizasyonu aktif mi?
timedatectl show | grep NTPSynchronized
# Windows Server'da (PowerShell)
# w32tm /query /status
CIFS/SMB Share’lerinde Zaman Damgası Sorunları
Samba veya Windows SMB share’leri üzerinde çalışırken zaman damgası davranışı yerel dosya sisteminden farklı olabilir. Özellikle cross-platform (Linux client, Windows server) senaryolarda:
# SMB share'e bağlı dizinde touch kullanımı
mount | grep cifs
# CIFS mount'ta zaman damgası desteği için noserverino seçeneğine dikkat
# /etc/fstab'da:
# //DC01/SYSVOL /mnt/sysvol cifs credentials=/etc/samba/creds,uid=1000,noserverino 0 0
touch /mnt/sysvol/domain.local/scripts/test.flag
ls -la /mnt/sysvol/domain.local/scripts/test.flag
Güvenlik ve Forensics Perspektifi
Zaman damgaları, sistem güvenliği açısından da kritik öneme sahiptir. Bir saldırgan, sistemde iz bırakmamak amacıyla oluşturduğu veya değiştirdiği dosyaların zaman damgalarını manipüle etmeye çalışabilir. Bu tekniğe “timestomping” denir.
Sysadmin olarak dikkat etmeniz gereken bazı göstergeler:
- ctime her zaman değişir:
touchveya başka bir araçla mtime/atime değiştirilse bile, ctime (inode change time) güncellenir. Bu, forensic analizde önemli bir ipucudur. - Dosya içeriği ile mtime tutarsızlığı: Bir log dosyasının içeriği yeni kayıtlar içeriyor ama mtime çok eski gösteriyorsa, bu bir manipülasyon işareti olabilir.
- NTFS MFT zaman damgası çelişkileri: Windows’ta $STANDARD_INFORMATION ile $FILE_NAME attribute’larındaki zaman damgaları genellikle tutarlıdır. Tutarsızlık varsa dikkat edin.
# Forensic kontrol: ctime vs mtime karşılaştırması
stat suspicious_file.txt
# Sadece ctime'ı al
stat -c '%z' suspicious_file.txt # ctime
stat -c '%y' suspicious_file.txt # mtime
Otomasyon Scriptlerinde touch ile Flag Dosyaları
Uzun süreli otomasyon işlerinde “lock file” veya “flag file” mantığı, touch komutunun en yaygın kullanım senaryolarından biridir. Active Directory ortamlarında backup scriptleri, kullanıcı provisioning otomasyonları ve benzeri işlemlerde bu teknik hayat kurtarır:
#!/bin/bash
# AD backup işlemi için lock mekanizması
LOCK_FILE="/tmp/ad_backup.lock"
LOG_FILE="/var/log/ad_backup_$(date +%Y%m%d).log"
# Lock dosyası var ve 2 saatten yeni mi?
if [ -f "$LOCK_FILE" ] && [ "$LOCK_FILE" -nt "$(find /tmp -maxdepth 1 -name 'dummy' -newer "$LOCK_FILE" -mmin +120 2>/dev/null)" ]; then
echo "Backup zaten çalışıyor veya kilitli. Çıkılıyor."
exit 1
fi
# Lock dosyasını oluştur
touch "$LOCK_FILE"
echo "Backup başladı: $(date)" | tee -a "$LOG_FILE"
# AD backup işlemleri burada...
# samba-tool domain backup online --targetdir=/backup/ad/ ...
# İşlem bitti, lock'u kaldır
rm -f "$LOCK_FILE"
touch "$LOG_FILE" # Log dosyasının mtime'ını güncelle (monitoring için)
echo "Backup tamamlandı: $(date)" | tee -a "$LOG_FILE"
Sonuç
touch komutu, sysadmin araç kutusundaki en küçük ama en kullanışlı araçlardan biri. Dosya oluşturma, zaman damgası güncelleme, referans tabanlı tarih kopyalama ve flag dosyası yönetimi gibi fonksiyonlarıyla hem Linux/Samba AD ortamlarında hem de Windows Server üzerinde PowerShell eşdeğerleriyle birlikte düşünüldüğünde, kapsamlı bir zaman damgası yönetim altyapısı kurulabilir.
Active Directory bağlamında ise zaman damgaları hiç de küçümsenmeyecek bir konu. SYSVOL replikasyonu, GPO dağıtımı, logon script yönetimi ve forensic analizlerde zaman damgalarının doğru yönetimi, hem operasyonel istikrar hem de güvenlik açısından belirleyici rol oynar. Özellikle Kerberos’un zaman hassasiyeti, tüm AD altyapısında NTP uyumunu zorunlu kılar ve bu ortamda elle zaman damgası manipülasyonu dikkatli yapılmalıdır.
Kısa özet olarak:
touch -tile tarihsel dosya zaman damgası atayabilirsiniztouch -rile bir dosyadan diğerine zaman damgası kopyalayabilirsiniz-ntve-otbash operatörleriyle bağımlılık tabanlı otomasyon yazabilirsiniz- PowerShell’de
.LastWriteTime,.CreationTime,.LastAccessTimeözellikleriyle Windows eşdeğeri işlemleri yapabilirsiniz - Forensics açısından ctime’ın manipüle edilemeyeceğini (kolayca) unutmayın
Sade görünen bu araç, doğru kullanıldığında otomasyon scriptlerinizin bel kemiği haline gelebilir.