Windows服务器访问日志默认记录在C:\inetpub\logs\LogFiles(IIS)或通过事件查看器中的“安全”日志(RDP登录、文件访问等)呈现。很多管理员只在出事后才去翻日志,但真正有效的安全审计是把日志当成日常巡检的一部分,而不是应急工具。审计的核心不是“看有没有异常”,而是建立一套可持续执行的检查流程,把登录来源、访问路径、响应状态、请求频率这几个维度交叉比对,才能从海量记录里找出真正的攻击痕迹。
先确定要审计哪些日志源Windows服务器上至少有三类日志需要纳入审计范围。第一类是IIS的W3C格式访问日志,记录每个HTTP请求的IP、时间、方法、URI、状态码、用户代理等字段。第二类是Windows安全事件日志,重点关注事件ID 4624(登录成功)、4625(登录失败)、4648(显式凭据登录)、4672(特殊权限登录)。第三类是应用程序日志,比如SQL Server错误日志、FTP日志、远程桌面服务日志。很多安全事件在IIS日志里看不到,必须结合安全事件日志才能还原完整攻击链。
IIS日志字段的审计要点打开IIS日志文件,每一行是一条请求记录,字段之间用空格分隔。默认字段包括日期、时间、客户端IP、用户名、方法、URI资源、查询字符串、状态码、协议、用户代理等。审计时不要只看状态码,要重点看几个组合。比如同一IP在短时间内出现大量401状态码,说明有人在尝试弱口令爆破。URI中出现类似“/wp-admin”、“/phpmyadmin”、“/.env”、“/config.php”这类敏感路径,即使返回404或403,也说明有人在扫描目录结构。查询字符串里出现“union select”、“sleep(”、“cmd.exe”、“/bin/bash”等关键字,基本可以判定是SQL注入或命令注入尝试。
用PowerShell批量筛选异常请求手动打开几百MB的日志文件不现实,PowerShell是最直接的审计工具。下面这段命令可以从单个日志文件中提取所有返回401或403的请求,并按IP统计次数:
$logPath = "C:\inetpub\logs\LogFiles\W3SVC1\u_ex250101.log"
Get-Content $logPath | ForEach-Object {
$fields = $_ -split ' '
if ($fields.Count -ge 15) {
[PSCustomObject]@{
IP = $fields[8]
Status = $fields[11]
URI = $fields[5]
Time = $fields[1]
}
}
} | Where-Object { $_.Status -eq '401' -or $_.Status -eq '403' } |
Group-Object IP | Sort-Object Count -Descending |
Select-Object Count, Name
这段代码假设日志字段顺序是默认W3C格式,实际使用时需要先确认日志文件头部的#Fields行,根据实际字段顺序调整索引。如果日志量很大,可以用Get-Content -ReadCount 1000分批读取,避免内存占用过高。
安全事件日志的登录审计RDP暴力破解是Windows服务器面临的最常见攻击。审计时重点看事件ID 4625,它记录登录失败的原因。通过PowerShell可以快速统计某个时间段内登录失败的IP和次数:
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddHours(-24)} |
ForEach-Object {
$ip = $_.Properties[19].Value
[PSCustomObject]@{
IP = $ip
User = $_.Properties[5].Value
Time = $_.TimeCreated
}
} | Group-Object IP | Sort-Object Count -Descending |
Select-Object Count, Name
事件ID 4625的Properties数组索引在不同Windows版本中可能略有差异,需要先手动查看几条事件确认字段位置。如果发现某个IP在24小时内登录失败超过50次,应立即在防火墙层面封禁该IP。同时检查事件ID 4624中的登录类型,类型10是远程交互登录,类型3是网络登录,类型2是控制台登录。如果出现非业务需要的类型10登录,且来源IP不属于公司网段,说明RDP端口可能暴露在公网。
建立基线,区分正常与异常安全审计最忌讳只看单条日志,必须建立行为基线。比如一个正常的企业网站,每天访问量在5000到8000之间,某天突然飙到50000,且大部分请求来自同一个IP或同一个网段,这很可能是CC攻击或爬虫抓取。再比如某个API接口平时每小时调用量在200次左右,某天凌晨出现每分钟50次的调用,说明接口可能被恶意利用。基线不需要复杂模型,用Excel或简单脚本统计每天的总请求数、独立IP数、各状态码占比、TOP10访问路径,连续记录两周就能形成初步判断标准。
日志保留策略与完整性保护很多服务器日志只保留7天,出事后想回溯一个月前的攻击根本不可能。建议IIS日志至少保留90天,安全事件日志至少保留180天。日志文件本身也要防篡改,攻击者进入服务器后第一件事往往是清除日志。可以通过组策略设置“审核日志无法删除”,或者将日志实时转发到独立的日志服务器。Windows自带的事件转发功能可以做到,在源服务器上配置WinRM,在目标服务器上创建订阅,把安全事件实时推送过去。这样即使源服务器被攻破,日志仍然保留在独立节点上。
自动化告警与定期报告人工每天看日志不现实,需要设置自动化告警。Windows任务计划程序可以定时运行PowerShell脚本,检测异常条件后发送邮件或写入告警日志。比如每小时检查一次4625事件,如果某个IP登录失败超过20次,立即触发告警。IIS日志方面,可以每小时统计一次状态码为500的请求数量,如果超过阈值说明应用层可能出现问题或被攻击。每周生成一份审计报告,内容包括登录失败TOP10 IP、异常状态码分布、敏感路径访问记录、请求量突增时段。报告不需要很长,关键是让管理员能快速判断本周安全态势。
常见攻击痕迹的日志特征SQL注入攻击在IIS日志中表现为URI或查询字符串包含SQL关键字,如“union”、“select”、“information_schema”、“sleep”、“benchmark”。Webshell上传成功后会留下POST请求,URI指向某个脚本文件,且该文件在短时间内被多次访问。目录扫描表现为同一IP在短时间内请求大量不存在的路径,404状态码占比异常高。CC攻击表现为大量请求集中在少数几个URI,且请求间隔极短,用户代理可能相同。勒索软件入侵前通常伴随RDP暴力破解成功,安全日志中会出现4625大量失败后紧跟一条4624成功记录,且登录IP来自境外或非业务网段。
审计过程中的几个实用技巧第一,日志时间戳要统一。IIS日志默认使用UTC时间,而安全事件日志使用本地时间,审计时要先统一时区,否则时间线对不上。第二,关注User-Agent字段。正常浏览器都有明确的UA标识,如果出现空UA、python-requests、sqlmap、nikto等工具特征,直接标记为可疑。第三,对URI进行解码后再分析。很多攻击载荷会进行URL编码,比如%27代表单引号,%20代表空格,不解码会漏掉关键特征。第四,结合防火墙日志一起看。Windows防火墙日志记录的是网络层连接,IIS日志记录的是应用层请求,两者结合可以判断攻击者是否在探测端口、是否建立了后门连接。
日志审计的常见误区有人认为只要安装了安全软件就可以不用看日志,这是错误的想法。安全软件只能拦截已知威胁,日志审计能发现未知攻击和内部异常行为。还有人只关注攻击成功的记录,忽略大量失败尝试。实际上,持续的失败尝试本身就是重要情报,说明有人在针对你的系统做侦察。另外,不要只审计Web日志而忽略系统日志,很多入侵是从RDP或数据库端口进来的,Web日志根本看不到。最后,日志审计不是一次性工作,攻击手法在变,审计规则也要定期更新。
