IIS 預設將日誌寫入 %SystemRoot%\System32\LogFiles\W3SVC1\ (系統磁碟、預設路徑、Everyone 可讀)。駭客取得 WebShell 後,首要動作即是刪除/清空日誌抹除痕跡,或下載日誌分析目錄結構、參數規律規劃進一步攻擊。本文提供四層防護:路徑遷移、權限收斂、審計留痕、自動化歸檔異地備份。
D:\IISLogs\W3SVC1\ (D: 為非系統磁碟,獨立於網站內容)。D:\IISLogs\W3SVC1\ → 確定三次。D:\IISLogs\W3SVC\ 。%SystemRoot%\System32\LogFiles\ 既有檔案剪貼至新位置,保留歷史審計軌跡。D:\IISLogs\ →「內容」→「安全性」→「進階」。D:\IISLogs\ 「安全性」→「進階」→「審計」頁籤 → 新增 → 「Everyone」 → 類型:「所有」 → 勾選「刪除」、「寫入資料/附加資料」、「變更權限」、「取得擁有權」 → 確定。
# Archive-IISLogs.ps1
param(
[string]$SourceRoot = "D:\IISLogs",
[string]$DestRoot = "\\BackupServer\IISLogsArchive",
[int] $RetainDays = 90
)
$cutoff = (Get-Date).AddDays(-$RetainDays)
Get-ChildItem $SourceRoot -Recurse -File -Name "*.log" |
Where-Object { $_.LastWriteTime -lt $cutoff } |
ForEach-Object {
$rel = $_.FullName.Substring($SourceRoot.Length+1)
$dest = Join-Path $DestRoot $rel
$destDir = Split-Path $dest -Parent
if (-not (Test-Path $destDir)) { New-Item -ItemType Directory -Path $destDir -Force | Out-Null }
Move-Item $_.FullName -Destination $dest -Force
Write-Host "Archived: $rel"
}
# 清理空目錄
Get-ChildItem $SourceRoot -Recurse -Directory | Where-Object { @(Get-ChildItem $_.FullName -Recurse).Count -eq 0 } | Remove-Item -Force -Recurse
工作排程器 → 建立基本任務 → 每日 02:00 執行:
powershell.exe -ExecutionPolicy Bypass -File C:\Scripts\Archive-IISLogs.ps1
為防範駭客竊取備份伺服器後竄改歷史日誌,建議在歸檔腳本中對每日日誌檔計算 SHA-256 雜湊,寫入 D:\IISLogs\HashChain\YYYYMMDD.sha256,並將雜湊清單本身簽署 (代碼簽署憑證) 或上傳至不可變物件儲存 (AWS S3 Object Lock / Azure Immutable Blob)。
結語: IIS 日誌安全防護的核心邏輯是 「遷移隔離 + 權限最小 + 審計全覆蓋 + 歸檔異地不可變」。完成四層部署後,即使 Web 伺服器被完全攻陷、WebShell 權限提升至 SYSTEM,攻擊者也無法刪除/竄改已歸檔的歷史日誌,也無法在不留痕跡的情況下讀取即時日誌,為事後鑑識、合規審計保留不可抵賴的鐵證。