基于 Apache/Nginx 访问日志的入侵检测:Anthropic-Cybersecurity-Skills 技能实战指南
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
导读
本文以 analyzing-web-server-logs-for-intrusion 技能为主线,讲解如何解析 Apache/Nginx 访问日志,通过正则签名匹配识别 SQL 注入(SQLi)、本地文件包含(LFI)、目录穿越、XSS、Web 扫描器指纹与暴力破解模式,并结合 GeoIP 做来源归属富化、基于请求频率与响应大小的统计异常检测。读完本文,你将掌握一套可直接运行的日志入侵检测流程,能独立产出带攻击类型、严重级别与攻击者画像的 JSON 报告,并可将其落地为 SOC 的检测规则或威胁狩猎查询。
技能定位与适用场景
在 Anthropic-Cybersecurity-Skills 仓库的 817 个结构化安全技能中,该技能归属于security-operations子域,遵循 agentskills.io 开放标准,以机器可读的 frontmatter 元数据(name、description、domain、tags、version)描述触发条件与能力边界,便于 Claude Code、GitHub Copilot、Codex CLI、Cursor、Gemini CLI 等 20+ 平台上的 AI Agent 按需加载。
官方标注的适用场景包括:
- 调查安全事件时需要分析 Web 服务器日志定位入侵行为;
- 为入侵检测域构建检测规则或威胁狩猎查询;
- SOC 分析人员需要结构化的分析流程;
- 校验相关攻击技术在既有监控体系中的覆盖度。
该技能同时映射了多套安全框架(见 SKILL.md frontmatter):
- MITRE ATT&CK:T1190(利用面向公众的应用)、T1059.007(JavaScript 命令解释执行)、T1110(暴力破解)、T1595.002(主动扫描)、T1505.003(Web Shell);
- NIST CSF 2.0:DE.CM-01(持续监控)、DE.AE-02(异常活动分析)、RS.MA-01(事件响应管理)、GV.OV-01(资产与漏洞视图)。
这意味着该技能在仓库的跨框架能力矩阵中,覆盖的是"初始访问 → 暴力破解 → 主动侦察 → Web 后门驻留"这一条 Web 攻击链路的日志侧检测视角。
前置条件
- 具备安全运营(SecOps)概念与常用工具的使用经验;
- 拥有可安全执行分析的测试或实验环境,并已获得相应授权(任何测试活动都必须取得明确授权,详见 SECURITY.md);
- Python 3.8+ 环境;
- 安装依赖:
pip install geoip2 user-agents。
其中geoip2用于日志来源 IP 的地理位置富化;user-agents库可用于辅助解析与规整 User-Agent 字段。
日志格式基础:Combined Log Format 与 Nginx 默认格式
分析的第一步是理解输入数据的结构。本技能处理 Apache 的 Combined Log Format(组合日志格式)与 Nginx 默认访问日志格式。其字段布局(见 references/api-reference.md):
<ip> <ident> <authuser> [<date>] "<method> <uri> <proto>" <status> <size> "<referer>" "<user-agent>"各字段含义:
| 字段 | 含义 | 示例 |
|---|---|---|
ip | 客户端源 IP | 192.168.1.100 |
ident | 客户端标识(通常为-) | - |
authuser | 认证用户名(通常为-) | - |
date | 请求时间戳 | 15/Jan/2024:10:30:45 +0000 |
method | HTTP 方法 | GET、POST |
uri | 请求的资源路径与参数 | /products?id=1' UNION SELECT ... |
proto | 协议版本 | HTTP/1.1 |
status | HTTP 状态码 | 200、403、500 |
size | 响应体字节数(可能为-) | 4532 |
referer | 来源页面 | -或 URL |
user-agent | 客户端标识串 | Nikto/2.1.6 |
注意:Nginx 默认格式与 Combined Log Format 高度兼容,因此同一套解析正则可以直接复用。若日志中响应大小为
-(如无响应体),解析时应将其归一化为0(源码parse_log_line中即做了该处理,见 scripts/agent.py)。
日志解析:正则提取结构化字段
使用 Python 标准库re模块即可完成字段提取。api-reference 与 agent.py 中共用的核心正则如下:
import re pattern = re.compile( r'(?P<ip>\S+) \S+ \S+ \[(?P<time>[^\]]+)\] ' r'"(?P<method>\S+) (?P<uri>\S+) (?P<proto>[^"]*)" ' r'(?P<status>\d+) (?P<size>\S+) "(?P<referer>[^"]*)" "(?P<ua>[^"]*)"' ) match = pattern.match(line) data = match.groupdict()该正则通过命名捕获组((?P<name>...))一次性提取 9 个字段。从源码实现看,parse_log_line 在拿到字典后还会做两项类型归一化:
size字段若为-转为整数0;status字段转为整数。
这为后续的统计与阈值比较(如按状态码过滤、按响应大小做离群检测)提供了统一的数据类型。parse_log_file 会逐行读取日志文件,忽略解析失败的畸形行,并输出Parsed N log entries from <path>的进度日志,便于在大文件上观察处理进度。
攻击检测规则:四类签名匹配
1. SQL 注入(SQLi)——严重级 Critical
detect_attacks会对每条请求的 URI 依次执行各类签名正则匹配。SQLi 签名覆盖了从基础到进阶的多种手法(SQLI_PATTERNS):
| 正则模式 | 检测描述 |
|---|---|
(union\s+(all\s+)?select) | UNION SELECT 注入 |
(or\s+1\s*=\s*1) | OR 1=1 恒真永真 |
('\s*or\s*') | 基于字符串的 OR 注入 |
(;\s*drop\s+table) | DROP TABLE 注入 |
(sleep\s*\(\d+\)) | 基于时间的盲注(SLEEP) |
(benchmark\s*\(\d+) | 基于时间的盲注(BENCHMARK) |
(0x[0-9a-f]{8,}) | 十六进制编码载荷 |
(concat\s*\(|group_concat) | 数据提取函数 |
(information_schema) | 库结构枚举 |
(load_file\s*\(|into\s+outfile) | 通过 SQL 读写文件 |
示例命中日志:
192.168.1.100 - - [15/Jan/2024:10:30:45 +0000] "GET /products?id=1' UNION SELECT username,password FROM users-- HTTP/1.1" 200 4532该请求 URI 中同时包含UNION SELECT(命中第 1 条)与'引号构造(命中第 3 条的变体),会被标记为 critical 级别。所有模式均带(?i)忽略大小写标志,以避免攻击者大小写混合绕过。
2. 本地文件包含 / 目录穿越(LFI)——高危 High
| 正则模式 | 检测描述 |
|---|---|
(\.\./){2,} | 目录穿越 |
(/etc/passwd|/etc/shadow) | Linux 口令文件访问 |
(/proc/self|/proc/version) | proc 文件系统访问 |
(php://filter|php://input|data://) | PHP 流包装器 |
(c:\\windows|c:/windows) | Windows 路径穿越 |
(%00|%2500) | 空字节注入 |
3. XSS(跨站脚本)——高危 High
| 正则模式 | 检测描述 |
|---|---|
(<script[^>]*>) | Script 标签注入 |
(javascript\s*:) | JavaScript URI |
(onerror\s*=|onload\s*=|onmouseover\s*=) | 事件处理器注入 |
(alert\s*\(|prompt\s*\(|confirm\s*\()) | JS 对话框函数 |
4. 扫描器指纹(User-Agent 签名)——中危 Medium
XSS 与扫描器签名均匹配 URL 编码与非编码形式,其中扫描器检测针对 User-Agent 字段,覆盖面远超 SKILL.md 正文列出的四种工具(SCANNER_UA_PATTERNS):
| 工具 | UA 特征 | 说明 |
|---|---|---|
| Nikto | Nikto/2.x | 综合漏洞扫描器 |
| sqlmap | sqlmap/1.x | SQL 注入自动化工具 |
| DirBuster | DirBuster-1.0 | 目录爆破工具 |
| Gobuster | gobuster/3.x | 目录/子域爆破工具 |
| Wfuzz | Wfuzz/3.x | Web 模糊测试工具 |
| Nmap | nmap | 端口扫描引擎 |
| Masscan | masscan | 高速端口扫描器 |
| ZGrab | zgrab | 应用层扫描器 |
| 脚本化客户端 | python-requests、python-urllib、go-http-client | 常见脚本化 HTTP 客户端 |
api-reference 中的签名表(references/api-reference.md)与源码逐一对应,示例命中:
Nikto/2.1.6, sqlmap/1.7, DirBuster-1.0-RC1, gobuster/3.1.05. 暴力破解检测——高危 High
暴力破解不依赖正则,而是统计维度。detect_brute_force 的实现逻辑:
- 默认监控的登录端点:
/login、/wp-login、/admin/login、/api/auth、/signin; - 统计同一 IP 对这些端点发起的POST 请求总数;
- 阈值默认
50(可通过 CLI 参数覆盖); - 命中后记录
{"ip": ..., "post_count": ..., "severity": "high"}。
SKILL.md 给出的判定标准是"同一 IP 在 5 分钟内对登录端点的 POST 请求超过 50 次",对应源码中的threshold=50默认值。需要说明的是:源码默认以整个日志时间窗内统计,若要与"5 分钟窗口"精确对齐,可在接入 SIEM/Splunk 时增加时间窗口切片逻辑,或对输入日志先做时间段过滤。
GeoIP 来源归属富化
命中攻击特征的请求会按源 IP 进行地理位置富化。enrich_with_geoip 使用geoip2库读取 MaxMind GeoLite2-City 数据库:
import geoip2.database reader = geoip2.database.Reader("GeoLite2-City.mmdb") response = reader.city("8.8.8.8") response.country.name # "United States" response.city.name # "Mountain View" response.location.latitude # 37.386 response.location.longitude # -122.0838 reader.close()每条命中记录会附加geo字段(国家、城市、经纬度)。源码中做了两级容错:若geoip2未安装则跳过富化并输出警告日志;若单个 IP 查询失败则置geo: null,不会中断整个分析流程。
攻击者画像聚合
summarize_attackers 将全部命中记录按源 IP 聚合,输出按命中数降序排列的前 50 个攻击者,每个画像包含:
total_hits:该 IP 命中的总请求数;attack_types:该 IP 使用的攻击类型分布(如{"SQLi": 5, "Scanner": 3});unique_uris:访问过的去重 URI 数量。
这一输出可直接用于研判攻击者的行为阶段——例如某 IP 同时存在扫描器 UA 与 SQLi 载荷,可推断其处于"侦察 + 漏洞利用"的复合阶段。
运行与分析:CLI 使用与报告结构
运行方式
在技能目录下执行(SKILL.md 中的标准用法):
python scripts/agent.py --log-file /var/log/nginx/access.log --geoip-db GeoLite2-City.mmdb --output web_intrusion_report.json完整 CLI 参数(见 main):
| 参数 | 必填 | 默认值 | 说明 |
|---|---|---|---|
--log-file | 是 | — | 访问日志文件路径 |
--geoip-db | 否 | — | GeoLite2-City.mmdb 路径;提供后启用 GeoIP 富化 |
--brute-threshold | 否 | 50 | 暴力破解 POST 次数阈值 |
--output | 否 | web_intrusion_report.json | 报告输出路径 |
报告结构
generate_report 生成的 JSON 报告包含:
total_log_entries:解析的日志总条数;suspicious_requests:命中攻击签名的请求数;brute_force_sources:暴力破解来源 IP 数;attack_breakdown:攻击类型分布计数;top_attackers:前 20 名攻击者画像;brute_force_details:暴力破解明细;sample_findings:前 30 条命中样例(每条含 IP、时间戳、方法、URI 截断 200 字符、状态码、UA 截断 150 字符与攻击详情列表)。
运行结束会在终端打印汇总行WEB LOG ANALYSIS: N suspicious, M brute force sources,并将报告写入--output指定文件。URI 与 UA 的截断处理(200/150 字符)防止异常超长字段破坏 JSON 结构与下游存储。
完整处理链路与源码结构
整个技能的处理流程可概括为五步流水线(与 SKILL.md 的 Instructions 一一对应):
- 依赖安装:
pip install geoip2 user-agents; - 日志采集:收集 Combined Log Format(Apache)或 Nginx 默认格式访问日志;
- 逐条解析:提取 IP、时间戳、方法、URI、状态码、响应大小、User-Agent、Referer(parse_log_file);
- 规则检测:SQLi / LFI / XSS / 扫描器签名 / 暴力破解阈值(detect_attacks 与 detect_brute_force);
- GeoIP 富化 + 优先级排序报告(enrich_with_geoip 与 generate_report)。
技能文件布局清晰:主流程定义在 SKILL.md,日志格式、正则解析、GeoIP2 用法与攻击签名速查表在 references/api-reference.md,完整可执行实现(约 220 行,零第三方运行时依赖、geoip2为可选增强)在 scripts/agent.py,授权条款见同目录 LICENSE(Apache-2.0)。
落地为检测规则与威胁狩猎查询
除直接运行脚本外,该技能的签名与阈值设计可直接转化为 SIEM 检测逻辑:
- SQLi 检测规则:将 SQLI_PATTERNS 中的核心模式(
UNION SELECT、OR 1=1、SLEEP())转为 Splunk/Sigma 查询,对uri字段做大小写不敏感匹配,可参考仓库中 building-detection-rule-with-splunk-spl 与 building-detection-rules-with-sigma 的规则构建方法; - 暴力破解告警:按
clientip + uri维度统计 5 分钟窗口内 POST 到登录端点的计数,阈值 50,对应 ATT&CK T1110(暴力破解)的检测覆盖; - 扫描器识别:对 User-Agent 匹配 nikto、sqlmap、dirbuster、gobuster、wfuzz 等签名,对应 T1595.002(主动扫描);
- Web Shell 驻留:结合命中记录中的可疑 POST 上传 URI 与高响应状态码,关联 T1505.003 的猎杀视角,可与 hunting-for-webshell-activity 组合使用。
局限性与注意事项
- 误报管理:正则签名可能命中合法业务参数(如商品名含
SELECT、正文讨论 SQL 的页面),建议结合响应状态码(如 200 且 5xx 比例)、请求频率与攻击者画像综合研判,降低误报; - 编码绕过:仅覆盖十六进制编码(
0x...)与空字节(%00/%2500),URL 双层编码、Unicode 变体等绕过手段不在本技能覆盖范围,可结合 performing-web-application-firewall-bypass 补足对抗视角; - 数据可用性:若日志未开启 Referer/User-Agent 记录(如 Nginx 默认格式有时省略 referer),解析器仍能工作,但扫描器与 Referer 相关检测会受限;
- 授权前提:该技能属于安全运营检测能力,仅限在拥有明确授权的环境中使用。
小结
通过本文你可以完整掌握一条"日志采集 → 正则解析 → 四类攻击签名检测 → 暴力破解统计 → GeoIP 富化 → 攻击者画像聚合 → JSON 报告输出"的 Web 入侵检测流水线。无论是将 scripts/agent.py 直接跑在 Nginx/Apache 日志上快速定位可疑请求,还是把其中的签名表与阈值抽取为 SIEM 检测规则,都能基于仓库源码与 API 参考文档直接落地,为 SOC 的持续监控(NIST CSF DE.CM-01)与异常分析(DE.AE-02)提供可复用的结构化能力。
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考