关于 building-detection-rule-with-splunk-spl
帮助安全分析师和 Splunk 管理员使用 Splunk SPL 编写关联搜索,涵盖检测模式、上下文丰富、性能优化、测试及 MITRE ATT&CK 映射。
主要功能
- 01阈值与事件序列检测
- 02异常及横向移动搜索
- 03数据外传与 PowerShell 检测
- 04通过查找表丰富上下文
- 05搜索性能优化
- 06测试与检测指标计算
适用场景
- 01创建暴力破解关联搜索
- 02检测可疑 PowerShell 执行
- 03监控潜在数据外传
- 04衡量告警精确率与误报
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill building-detection-rule-with-splunk-spl安装后在 Claude Code 中输入/building-detection-rule-with-splunk-spl确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py详细介绍
使用 Splunk SPL 构建检测规则
概述
Splunk 搜索处理语言(SPL)是 Splunk Enterprise Security 中用于构建关联搜索以检测可疑事件和模式的主要查询语言。精心编写的检测规则会聚合、关联和丰富安全事件,为 SOC 分析师生成可操作的关注事件。企业级 SIEM 平均仅覆盖 MITRE ATT&CK 技术的 21%,因此熟练编写 SPL 规则对于弥补检测缺口至关重要。
何时使用
- 在环境中部署或配置使用 Splunk SPL 能力的构建检测规则时
- 在建立符合合规要求的安全控制时
- 在为该领域构建或改进安全架构时
- 在开展需要此实现的安全评估时
前提条件
- 已部署并配置 Splunk Enterprise Security (ES)
- 拥有对 Splunk Search & Reporting 应用的适当角色访问权限
- 了解通用信息模型(CIM)数据模型
- 熟悉 MITRE ATT&CK 框架技术
- 了解组织的日志来源和数据流
核心 SPL 检测规则模式
1. 基于阈值的检测
检测在时间窗口内超过指定计数的事件。
index=wineventlog sourcetype=WinEventLog:Security EventCode=4625
| stats count as failed_logins dc(TargetUserName) as unique_users by src_ip
| where failed_logins > 10 AND unique_users > 3
| eval severity="high"
| eval description="Brute force attack detected from ".src_ip." with ".failed_logins." failed logins across ".unique_users." accounts"
2. 基于序列的检测(失败登录后成功登录)
关联表示成功暴力破解攻击的事件序列。
index=wineventlog sourcetype=WinEventLog:Security (EventCode=4625 OR EventCode=4624)
| eval login_status=case(EventCode=4625, "failure", EventCode=4624, "success")
| stats count(eval(login_status="failure")) as failures count(eval(login_status="success")) as successes latest(_time) as last_event by src_ip, TargetUserName
| where failures > 5 AND successes > 0
| eval description="Account ".TargetUserName." compromised via brute force from ".src_ip
| eval urgency="critical"
3. 基于基线比较的异常检测
将当前活动与基线时段进行比较,以检测突增。
index=proxy sourcetype=squid
| bin _time span=1h
| stats count as current_count by src_ip, _time
| join src_ip type=left [
search index=proxy sourcetype=squid earliest=-7d@d latest=-1d@d
| stats avg(count) as avg_count stdev(count) as stdev_count by src_ip
]
| eval threshold=avg_count + (3 * stdev_count)
| where current_count > threshold
| eval deviation=round((current_count - avg_count) / stdev_count, 2)
| eval description="Anomalous web traffic from ".src_ip." - ".deviation." standard deviations above baseline"
4. 横向移动检测
使用 Windows 登录事件识别潜在的横向移动。
index=wineventlog sourcetype=WinEventLog:Security EventCode=4624 Logon_Type=3
| where NOT match(TargetUserName, ".*\$$")
| stats dc(dest) as unique_hosts values(dest) as hosts by src_ip, TargetUserName
| where unique_hosts > 5
| eval severity=case(unique_hosts > 20, "critical", unique_hosts > 10, "high", true(), "medium")
| eval description=TargetUserName." accessed ".unique_hosts." unique hosts from ".src_ip." via network logon"
5. 数据外泄检测
监控大规模出站数据传输。
index=firewall sourcetype=pan:traffic action=allowed direction=outbound
| stats sum(bytes_out) as total_bytes_out dc(dest_ip) as unique_destinations by src_ip, user
| eval total_mb=round(total_bytes_out/1048576, 2)
| where total_mb > 500 OR unique_destinations > 50
| lookup asset_lookup ip as src_ip OUTPUT asset_category, asset_owner
| eval severity=case(total_mb > 2000, "critical", total_mb > 1000, "high", true(), "medium")
| eval description=user." transferred ".total_mb."MB to ".unique_destinations." unique destinations"
6. PowerShell 可疑执行检测
检测编码或混淆的 PowerShell 命令。
index=wineventlog sourcetype=WinEventLog:Security EventCode=4104
| where match(ScriptBlockText, "(?i)(encodedcommand|invoke-expression|iex|downloadstring|frombase64string|net\.webclient|invoke-webrequest|bitstransfer|invoke-mimikatz|invoke-shellcode)")
| eval decoded_length=len(ScriptBlockText)
| stats count values(ScriptBlockText) as commands by Computer, UserName
| where count > 0
| eval severity="high"
| eval mitre_technique="T1059.001"
| eval description="Suspicious PowerShell execution on ".Computer." by ".UserName
在 Splunk ES 中构建关联搜索
分步流程
- 定义用例:映射到 MITRE ATT&CK 技术并定义要检测的行为
- 识别数据源:确定哪些索引和源类型包含相关事件
- 编写基础搜索:构建提取相关事件的 SPL
- 添加聚合:使用
stats、eventstats或streamstats进行汇总 - 应用阈值:使用
where子句设置区分正常与异常的条件 - 丰富上下文:添加资产信息、身份数据和威胁情报的查找
- 配置关注事件:设置严重性、紧迫性和描述字段
- 调度和测试:针对历史数据运行并验证检测准确性
关联搜索配置模板
| tstats summariesonly=true count from datamodel=Authentication
where Authentication.action=failure
by Authentication.src, Authentication.user, _time span=5m
| rename "Authentication.*" as *
| stats count as total_failures dc(user) as unique_users values(user) as targeted_users by src
| where total_failures > 20 AND unique_users > 5
| lookup dnslookup clientip as src OUTPUT clienthost as src_dns
| lookup asset_lookup ip as src OUTPUT priority as asset_priority, category as asset_category
| eval urgency=case(asset_priority=="critical", "critical", asset_priority=="high", "high", true(), "medium")
| eval rule_name="Brute Force Against Multiple Accounts"
| eval rule_description="Multiple authentication failures from ".src." targeting ".unique_users." unique accounts"
| eval mitre_attack="T1110.001 - Password Guessing"
丰富上下文最佳实践
| lookup identity_lookup identity as user OUTPUT department, manager, risk_score as user_risk
| lookup asset_lookup ip as src_ip OUTPUT asset_name, asset_category, asset_priority, asset_owner
| lookup threatintel_lookup ip as src_ip OUTPUT threat_type, threat_confidence, threat_source
| eval context=case(
isnotnull(threat_type), "Known threat: ".threat_type,
user_risk > 80, "High-risk user: risk score ".user_risk,
asset_priority=="critical", "Critical asset: ".asset_name,
true(), "Standard context"
)
性能优化
使用数据模型配合 tstats
| tstats summariesonly=true count from datamodel=Network_Traffic
where All_Traffic.action=allowed
by All_Traffic.src_ip, All_Traffic.dest_ip, All_Traffic.dest_port, _time span=1h
| rename "All_Traffic.*" as *
限制时间范围并使用索引字段
index=wineventlog source="WinEventLog:Security" EventCode=4688
earliest=-15m latest=now()
| where NOT match(New_Process_Name, "(?i)(svchost|csrss|lsass|services)")
使用摘要索引建立历史基线
| tstats count from datamodel=Authentication where Authentication.action=failure by Authentication.src, _time span=1h
| collect index=summary source="auth_failure_baseline" marker="report_name=auth_failure_hourly"
测试与验证
针对已知攻击模式进行测试
| makeresults count=1
| eval src_ip="10.0.0.50", failed_logins=25, unique_users=8, severity="high"
| eval description="Test brute force detection"
| append [
search index=wineventlog sourcetype=WinEventLog:Security EventCode=4625
earliest=-24h latest=now()
| stats count as failed_logins dc(TargetUserName) as unique_users by src_ip
| where failed_logins > 10 AND unique_users > 3
| eval severity="high"
]
计算检测指标
index=notable
| search rule_name="Brute Force*"
| stats count as total_alerts count(eval(status_label="Closed - True Positive")) as true_positives count(eval(status_label="Closed - False Positive")) as false_positives by rule_name
| eval precision=round(true_positives / (true_positives + false_positives) * 100, 2)
| eval fpr=round(false_positives / total_alerts * 100, 2)
MITRE ATT&CK 映射
| 技术 ID | 技术名称 | SPL 检测方法 |
|---|---|---|
| T1110.001 | 密码猜测 | 按 src_ip 对 EventCode 4625 设置阈值 |
| T1059.001 | PowerShell | 对 EventCode 4104 ScriptBlockText 进行模式匹配 |
| T1021.002 | SMB/Windows 管理共享 | Logon Type 3 配合 dc(dest) 阈值 |
| T1048 | 通过 C2 外泄 | 在时间窗口内聚合 bytes_out |
| T1053.005 | 计划任务 | EventCode 4698 配合可疑命令模式 |
| T1003.001 | LSASS 内存 | 通过 Sysmon EventCode 10 对 lsass.exe 的进程访问 |
参考资料
评论
支持 Markdown