本文目录导读:

要获取安全日志,脚本的方法取决于你使用的操作系统(Windows、Linux/macOS)以及你想要获取的日志类型(系统登录、防火墙、应用审计等)。
以下是针对不同平台的通用脚本方案。
Windows 系统
Windows 安全日志通常存储在 事件查看器 (Event Viewer) 中的 Security 日志下,最强大的脚本工具是 PowerShell。
使用 PowerShell (推荐)
PowerShell 可以直接查询 Windows 事件日志。
基础脚本:获取最近 100 条安全日志
# 获取最新的 100 条安全日志,并展示关键信息 Get-WinEvent -LogName Security -MaxEvents 100 | Select-Object TimeCreated, Id, LevelDisplayName, Provider, Message | Format-Table -AutoSize
高级脚本:按事件ID过滤 (登录成功 4624,登录失败 4625)
# 获取过去24小时内所有失败的登录尝试 (EventID 4625)
$yesterday = (Get-Date).AddDays(-1)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=$yesterday} | Select-Object TimeCreated, Message
实用脚本:将结果导出到 CSV 文件
# 导出所有安全日志到 csv 文件
Get-WinEvent -LogName Security | Export-Csv -Path "C:\temp\security_logs.csv" -NoTypeInformation
# 或者只导出特定类型的日志
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624,4625} | Export-Csv -Path "C:\temp\login_logs.csv"
注意:运行 PowerShell 脚本需要 管理员权限。
使用 wevtutil.exe (命令行)
如果不想用 PowerShell,可以使用内置工具:
# 将安全日志导出为 evtx 文件 wevtutil epl Security C:\temp\security_logs.evtx # 查看安全日志的统计信息 wevtutil gli Security
Linux 系统 (Ubuntu, CentOS, Debian 等)
Linux 安全日志通常存储在 /var/log/ 目录下,主要文件有:
/var/log/auth.log(Debian/Ubuntu 系列) - 认证日志/var/log/secure(RedHat/CentOS 系列) - 安全日志/var/log/syslog- 系统综合日志
使用 Bash 脚本 + grep/awk
基础脚本:获取所有失败的 SSH 登录尝试
#!/bin/bash
# 搜索认证日志中的 "Failed password" 条目
grep "Failed password" /var/log/auth.log | awk '{print $1, $2, $3, $9, $11}'
高级脚本:实时监控安全日志并报警
#!/bin/bash
# 监控认证日志,当出现新的失败登录时打印到终端
tail -f /var/log/auth.log | while read line; do
if echo "$line" | grep -q "Failed password"; then
echo "[ALERT] SSH失败登录: $line"
fi
done
实用脚本:统计攻击最多的IP
#!/bin/bash # 统计失败的 SSH 登录尝试按 IP 排序 grep "Failed password" /var/log/auth.log | grep -oP 'from \K\S+' | sort | uniq -c | sort -nr
使用 journalctl (Systemd 系统)
现代 Linux 发行版常用 systemd-journald:
# 查看内核或认证相关的安全消息 sudo journalctl -u sshd.service --since "24 hours ago" | grep "Failed password" # 查看所有安全相关的审计记录 sudo journalctl _TRANSPORT=audit
macOS 系统
macOS 日志系统基于 log 命令或传统的 system.log。
使用 log 命令 (推荐)
# 获取最近的安全相关事件 log show --predicate 'subsystem contains "security"' --last 1h # 查看登录尝试 log show --predicate 'eventMessage contains "Authentication"' --last 1h
读取 system.log
# 查看认证失败 grep "authentication failure" /var/log/system.log
使用 Python 脚本 (跨平台)
如果你想写一个更通用的脚本,Python 是一个很好的选择。
Python 脚本示例:扫描 Windows 安全日志 (需安装 pywin32)
import win32evtlog, win32evtlogutil
server = None # 本地机器
logtype = 'Security'
hand = win32evtlog.OpenEventLog(server, logtype)
total = win32evtlog.GetNumberOfEventLogRecords(hand)
flags = win32evtlog.EVENTLOG_BACKWARDS_READ | win32evtlog.EVENTLOG_SEQUENTIAL_READ
events = win32evtlog.ReadEventLog(hand, flags, 0)
for event in events[:50]: # 只取前50条
print('Event ID:', event.EventID)
print('Time:', event.TimeGenerated)
print('Source:', event.SourceName)
print('---')
Python 脚本示例:解析 Linux auth.log
import re
with open('/var/log/auth.log', 'r') as f:
for line in f:
if 'Failed password' in line:
ip_match = re.search(r'from (\S+)', line)
if ip_match:
print(f"Failed login from: {ip_match.group(1)}")
安全注意事项
- 权限:读取安全日志通常需要 root / administrator 权限,运行脚本前请确保
sudo或以管理员身份运行。 - 日志轮转:日志文件可能会被压缩或分割(如
auth.log.1,auth.log.gz),使用zcat或zless处理压缩文件。 - 性能:直接读取数百万行日志的
grep或Get-WinEvent可能非常缓慢。建议尽量按时间或事件ID过滤,而不是全量导出。 - 合规与隐私:安全日志可能包含敏感信息(如用户的登录名、IP地址),请确保你的脚本符合公司数据保护政策,不要将日志明文存储在共享目录中。
最快的方法
- Windows 10/11/Server:管理员打开 PowerShell,输入
Get-WinEvent -LogName Security | Export-Csv C:\logs.csv - Ubuntu/Debian:
sudo grep "Failed password" /var/log/auth.log | tail -50 - CentOS/RHEL:
sudo grep "Failed password" /var/log/secure | tail -50
如果需要更具体的脚本(如针对特定软件如 IIS、Apache 或 MySQL 的安全日志),请补充说明你的具体环境。