30 秒锁定黑客攻击:SLS SQL 如何从海量乱序日志中“揪”出攻击源

SLS SQL用户故事系列——第一番

作者:客户公司运维技术负责人(maoshu)、顾汉杰(执少)

系列引言

阿里云日志服务(SLS)为客户提供云上海量日志数据的存储、查询和分析服务,用户在 SLS 上的使用场景千变万化,但最终殊途同归,都是为自身业务所服务。基于 SLS SQL 的数据分析能力,用户可以从任意结构(无论是数值,还是 json,亦或无结构的文本)的海量日志数据中提取出有效信息,以支撑业务运维、运营、洞察、决策。

一直以来,我们强调 SQL 的基础通用能力、高性能、低成本,却较少分享用户使用 SLS 服务在最终业务上面的落地。事实上,用户在我们的基础能力之上,开展了各式各样的业务,产生了非常多的奇思妙想和经典解决方案,这些是真正业务价值的体现,我们希望通过本系列,以“用户故事”的方式分享用户遇到的问题、解决思路、实践落地等,我们相信这些真实的用户故事和经验,同样会是许多用户正在经历和思索的,期待给读者带来启发、引起共鸣、互学互鉴。

本系列将以轻松愉悦的方式带给读者不一样的阅读体验,每篇故事简短轻量,风格活泼,阅读时间将不超过 5 分钟,请各位看官放心阅读。

系列第一篇,我们讲述一个大型平台客户被恶意攻击的溯源分析案例。

“糟糕,我们被恶意攻击了…”

某天,中午时分,客户线上遭受大规模流量攻击,大量来自全球各地的 IP 持续大规模访问服务,导致服务负载陡升,影响到了正常用户的服务请求。

业务部门紧急电话联系运维负责人,希望能够找出攻击来源,并进行紧急封禁处理。

检索并找出高频访问 IP

幸运的是,访问日志中记录了“高频”行为:短时间内超过 N 次访问会记录如下特征日志:...rate limit for true-client-ip: 139.135.241.87 trace_id: ... 。

利用 SLS 查询检索能力,根据关键词可以快速从海量访问日志中检索出高频特征数据。

"rate limit for true-client-ip"

image

ok,接下来对这些特征数据使用 SQL 按 IP 分组聚合,统计最高频 IP 就搞定了!

但是,等等~

这个日志是一个无结构化的纯文本数据(只有一个大段的 msg 字段),我们并没有建立 IP 列,又怎么统计分析最高频的 IP 呢?

没问题!SLS SQL 提供了灵活的无结构化数据提取能力,利用正则提取函数 regexp_extract,可以轻松从 msg 字段的海量数据中根据日志 pattern 提取出 IP 列,同时对提取出的 IP 列按每 2 分钟为粒度分组聚合,统计分析出时间区间内最高频的访问 IP。

"rate limit for true-client-ip:" | select regexp_extract(msg, 'true-client-ip: (\d+.\d+.\d+.\d+)', 1) as ip, count(1) as pv, __time__-time % 120 as t from log group by ip, t order by pv desc limit all

关联分析恶意账号

果然,在此时间段,存在大量的高频访问 IP,但高频访问 IP 的量实在太多了,黑客可能从全球各地使用“肉鸡”进行 DDOS 攻击,业务方很难根据这么大量的 IP 进行封禁控制,何况攻击 IP 还在实时变化中~

image

image

[10/May/2025:12:55:31 +0800] player.getSMScode Received "uid":nbNgQ01wRWiOSVcI2Y/hUw== "trace_id":7b3d9f2a-418a-4b4e-9c52-a60c1f3e8b45
[10/May/2025:13:55:36 +0800] "GET /index.html HTTP/1.1" 200 432 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" "rate limit for true-client-ip": 139.135.241.87 "trace_id": 7b3d9f2a-418a-4b4e-9c52-a60c1f3e8b45

用户的访问日志库存放了大量的异构日志,有短信接收日志(记录了账号 uid、trace_id 等信息),也有上述高频访问日志,还有其他常规访问日志数据等等。

基于这些事实数据(哪怕它们很乱),利用 SLS 强大的查询和分析能力,我们就可以实现数据关联分析了。

* | select 
  date_trunc('minute', __time__) t, 
  uuid, 
  count(1) cnt, 
  array_agg(distinct ip) ip
FROM  (
    select __time__, regexp_extract(msg, '"true-client-ip": (\d+.\d+.\d+.\d+)', 1) as ip, trace_id FROM log where msg has '"rate limit for true-client-ip": '
  ) t1
  left join (
    select trace_id, regexp_extract(msg, '"uid":"([^"]*)"', 1) uuid FROM log where msg has 'player.getSMScode'and msg has 'Received'
  ) t2 
  on t1.trace_id = t2.trace_id
group by t, t2.uuid
having cnt > 100
order by cnt desc

虽然,这可能稍微有点高阶,稍微解释一下:

  • 我们使用了两个子查询,分别提取出高频访问的 ip 和 trace_id,以及账号登录接收短信的 uid 和 trace_id。
  • 在子查询中我们高效检索出特征数据(使用 where msg has 'xxx' 可以高效利用索引过滤出有效数据)。
  • 利用 SQL JOIN 将左右子表以 trace_id 进行关联。
  • 同时,我们对 uid 分组聚合,并过滤出单分钟内访问频次超过 100 次的高频账号(疑似恶意攻击账号)。
  • 最后,我们利用聚合函数 array_agg(distinct ip)汇聚列出每分钟每个疑似账户的攻击 IP 列表。

但是,非常高效,我们仅通过一次分析,便将所有可疑账户和 IP 来源分析出来了。

image

截图展示数据仅为示意数据

地理信息溯源

更进一步,我们还可以利用 SLS 的 IP 地理位置函数分析确定 IP 来源。

SQL 中只需要将 array_agg(distinct ip) 改为 array_agg(distinct ip_to_country(ip)) 即可。

image

截图展示数据仅为示意数据

最终,经过业务部门核对,以上分析准确溯源了恶意账号和 IP 来源,并且恶意账号只有一个,交由风控部门进行紧急封禁控制,有效阻止了持续的恶意攻击。

多云联动

拿到以上异常 IP 后,就可以配置防火墙封堵策略,结果又遇到了以下问题:

  • IP 误封:异常 IP 很多,来不及审查,办公室 IP/关联方 IP 也在里面。狠起来,我们自己人都不放过。
  • 频繁攻击:黑客一个定时脚本半夜攻击。业务运维人员半夜起床搬砖,头发掉得一把一把的。

在这个友方和头发保卫战中,提出了一个自动化封堵方案。

客户的服务是多云部署(同时在 AWS、阿里云部署)的,有了这次的成功经验,运维负责人进一步发挥,通过自动化方案,定期从 SLS 进行查询分析,同步更新到阿里云和 AWS 的 WAF 服务中,攻击账号和 IP 来源存储 3 天,过期释放,从而实现了真实业务恶意攻击的自主分析和防控能力。

image

整体方案核心逻辑如下

image

分为两部分:SLS 异常 IP 自动检测和 AWS WAF 动态更新 IP 策略。利用 Redis 实现 IP 数据的生命周期管理,借助 Redis TTL 功能,可以更轻松实现 IP 数据的定时释放(判刑也有时限,黑名单用户同样如此)。

SLS 异常 IP 自动检测

这里基于阿里云 SLS 提供的 Python SDK 来实现定时查询和结果处理,SDK 已经提供了完善的 SLS 操作方法,文档也丰富,可以快速完成对应功能的实现。其核心处理代码如下:

def get_logs_from_sls():
    # 查询阿里云sls记录中有可能是攻击的ip SQL 拼接
    query = "\"rate limit for true-client-ip:\"|select " + \
        " ..... + \ #此处省略N个重要的SQL拼接部分
        " limit all "
    ...
    # 通过SQL查询日志。
    request = GetLogsRequest(project_name, logstore_name, from_time, to_time, query=query)
    response = client.get_logs(request)
    #日志处理为json格式
    logs_data={}
    for log in response.get_logs():
        ip = None
        ...
        if ip and cnt:
            #判断是否为 办公室 / 合作方 IP
            if not is_in_whitelist(ip):
                logs_data[ip]=int(cnt)
            else:
                continue
    return logs_data

整体程序主要步骤如下:

  1. 利用 SLS 查询分析出高频访问 IP

  2. 基于白名单去重,生成最终的异常 IP 清单,供后续使用。

AWS WAF 动态更新 IP 策略

AWS WAF(Web Application Firewall)是 Amazon Web Services 提供的一种托管型 Web 应用防火墙服务,用于保护 Web 应用程序免受常见的网络攻击。该设置步骤需要两部分内容:

  • IP sets:用于定义封堵/允许的 IP 地址池,单个设置上限为 1 万条。
  • Web ACLs:WAF 主要配置策略,引用 IP sets 中的地址池并设置对应的访问策略(运行/拒绝)

此处,采用 AWS 提供的 Python SDK boto3 来进行 waf 相关的更新与创建。核心操作代码如下:

# 创建 Web ACL
def create_web_acl(waf_acl_name, waf_rules):
    try:
        response = waf_client.create_web_acl(
            Name=waf_acl_name,  # Web ACL 的名称
            Scope=region_scope,  # 适用于 Regional 或 CLOUDFRONT
            DefaultAction={
                'Allow': {}  # 默认操作:拒绝流量
            },
            Rules=waf_rules,
            VisibilityConfig={
                'SampledRequestsEnabled': True,
                'CloudWatchMetricsEnabled': True,
                'MetricName': waf_acl_name+'ACLMetric'
            }
        )
        return response['Summary']['Id']
    except ClientError as e:
        mylog("error",f"Error creating Web ACL: {e}")
        return None

其中变量“waf_rules”定义的就是阻挡策略,以下是一个具体配置示例,其中 arn 就是关联 IP sets 与 Web ACL 的关键:

{
  "Name": "blacklist_ip_sets_1",
  "Priority": 101,
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "blacklist_ip_sets_1_Metric"
  },
  "Statement": {
    "IPSetReferenceStatement": {
      "ARN": "arn:aws:****0f"
    }
  }
}

整体更新流程需要操作的内容如下:

  • 从 Redis 读取 IP 数据集,处理成 ip 格式:“192.168.1.100/32”,并以 5000(上限为 1 万)进行分组。
  • 对于分组后的数据,创建 / 更新 对应的 IP sets 信息。
  • 记录创建/更新的 IP sets 的 name,arn 信息,提供后续使用。
  • 读取现有 WEB ACLs 配置,记录历史 rule 信息,只更新自动创建的策略。

创建后的效果展示:

image

通过以上操作,再配置上对应的运行环境,定时任务就可以实现异常 IP 自动获取与 Waf 更新,非常完美。

01 客户反馈

SLS 是真的好用,关键时刻确实顶,接下来需要好好学习 SQL,把价值发挥起来!

02 技术关键词

异构数据特征提取、regexp_extract、ip_to_country、单表自 join。

结语

本文讲述了一个大型平台客户被恶意攻击的溯源分析案例,结合多种异构的访问日志数据源,利用关键词检索、正则提取、JOIN 关联分析、地理位置函数等溯源到恶意攻击来源,并有效进行了安全防控。不管是什么样的数据,在阿里云日志服务 SLS 中,利用高性能的查询检索和灵活易用的分析能力,都可以实现任意且灵活的业务分析、安全审计、风险预估,帮助客户在关键时刻快速定位问题、锁定目标、消除风险。

点击此处,了解阿里云日志服务 SLS 产品详情

相关推荐

推荐一款好用的刷题工具

为了帮助正在准备求职季的开发者提升备战效率,阿里云特别推出“通义灵码陪你备战求职季”活动,精心挑选百道历史校招技术面试/笔试题,借助通义灵码智能问答、代码智能生成、代码优化等核心功能,帮助开发者更加准确地了解程序员职业所需的核心技能,加强对问题解决思维和解题能力的练习。

阿里巴巴云原生的博客 1383

通义灵码 Visual Studio 下载安装指南(附安装包)

本安装步骤适用于 Windows 10 及以上操作系统中安装和使用通义灵码。

阿里巴巴云原生的博客 4436

生产更可信,订阅更耐用丨Higress 社区进展报告

阿里巴巴云原生的博客 115

让 Agent 成为企业生产力丨Alibaba Cloud AgentCore 企业智能体构建与治理沙龙·杭州站精彩回顾 & PPT 下载

近日,让 Agent 成为企业生产力丨Alibaba Cloud AgentCore 企业智能体构建与治理沙龙·杭州站圆满落幕。本场活动吸引了 100+ 名技术从业者深度参与,深度分享了企业 Agent 趋势、AgentCore 构建与治理、Agent 观测与优化、STAROps 智能运维及 AI 网关等相关议题,并设置了动手实操环节。

阿里巴巴云原生的博客 19

如何用 STAROps Elasticsearch 智能助手看穿“搜索变慢”

某电商平台的商品搜索服务使用一台 6 个数据节点的 Elasticsearch 实例。周五北京时间 20:00 起,业务陆续反馈搜索变慢。业务监控中的搜索接口 P99 从平时约 200 ms 升到 2s 以上,部分请求超时。值班工程师打开控制台:集群状态为 Green,没有未分配分片,集群平均 CPU 约 40%,乍看不像资源已经吃紧。

阿里巴巴云原生的博客 110

满帮基于阿里云 AgentCore 打造生产级 SRE 稳定性数字人

满帮基于阿里云 AgentCore 构建“稳定性数字人”:满帮提供业务知识、专业工具与处置流程,AgentCore 提供智能体运行、协作和治理支撑。数字人已在核心链路的巡检与根因分析中得到应用,受控处置能力也在持续建设,让满帮积累的稳定性能力能够在具体任务中得到复用。

阿里巴巴云原生的博客 111

稳定复现超 70% 的缺陷,报警到自动修复的 Agent 流水线实践

本文将分享我们在 PolarDB-X 团队做的一些工程实践:让 Agent 从一条报警或工单出发,自主完成排查、复现、修复和验证,再把结果交给研发评审。

阿里巴巴云原生的博客 294

从“自证清白”到“因果链条”:智能体如何重塑运维排障效率

STAROps 做全域关联分析,把范围从「五个团队依次自证清白」收拢到一条具体链路;证据指向对象存储后,OSS Agent 接手,基于真实配置、访问日志和用量数据往下挖,给出根因和支撑它的证据链。你面对的始终是一个对话框:路由归它管,说清现象、拍板方案归你。

阿里巴巴云原生的博客 125

TechTalk丨从能买奶茶到能进企业,Agent 绕不开同一组问题

史明伟所在的 Alibaba Cloud AgentCore 是企业级 Agent 构建和治理平台,为 Agent 在业务场景下的规模化落地提供基础设施,所以这场对话,他和 Datawhale 主持人从个人助理一路聊到企业 Agent:权限该怎么一步步放开?进了企业,账号打通、数据权限、沙箱隔离又会带来哪些新问题?没有强技术团队的企业,该从哪里起步?

阿里巴巴云原生的博客 208

AgentCore + Codex 构建生产级 Agent 的原理与实践

本文章演示 AgentCore[1]的自定义代码/镜像能力,目的是展示如何基于自定义的 Harness 框架(Codex) 结合 AgentCore 提供的身份、模型、工具、技能、凭证 、观测评估等能力实现一个端到端的 Agent 应用,内容包含两个部分,技术方案和实践教程,文末附相关源码和本次的测试数据,可以根据需要自行查阅。

阿里巴巴云原生的博客 187

让复杂任务由团队完成:阿里云 AgentCore 多 Agent 协作架构及实践

Alibaba Cloud AgentCore 以身份、通信、团队和任务为基础,让专业 Agent 与人类成员共同参与业务协作。企业可以按职责组合知识、工具、Skill 和模型,用任务系统持续追踪工作,再结合 AgentLoop 评估效果、优化配置。

阿里巴巴云原生的博客 334

易点天下:AI 驱动 IT 运维组织提效的实践

易点天下作为一家专注品牌全球化的营销科技公司,由智能营销、全域增长、智能变现三大引擎驱动。公司旗下拥有“整合营销服务”与“广告平台业务”两大业务线。

阿里巴巴云原生的博客 300

阿里云可观测 2026 年 10 月产品动态

阿里云可观测 2026 年 10 月产品动态

阿里巴巴云原生的博客 199

用 Nacos 3.3.0 ARD 让 Agent 按任务发现工具和 Skill

如今,工作中用 Agent 帮忙已经越来越常见。研发同学用 Coding Agent 写代码、补测试、排查问题,业务同学用 Work Agent 整理资料、分析表格、制作演示文稿。不少过去需要自己一步步操作的事情,现在可以把需求交给 Agent,让它协助完成。

阿里巴巴云原生的博客 314

HiRoute 新版本发布:结合自己的真实工作选择最佳模型

HiRoute[1]是一个开源、运行在本地的 Agent 智能路由引擎。你继续用 Codex、Claude Code、Qoder、Pi、OpenCode、Hermes、DeepSeek Harness 等熟悉的 Agent,由 HiRoute 判断每一步交给哪个模型。

阿里巴巴云原生的博客 388

用户说 App“下不了单”:用 Session Replay 看清流程卡在哪一步

Session Replay(会话回放)将采集到的页面变化重建为可回看的过程。研发可以沿着这次会话,查看操作前后的界面变化,先确认流程停在了哪里,再结合当时的事件、日志和代码检查原因。

阿里巴巴云原生的博客 55

欢迎报名丨Alibaba Cloud AgentCore 企业智能体构建与治理八城巡回沙龙 · 杭州站开启

欢迎报名丨Alibaba Cloud AgentCore 企业智能体构建与治理八城巡回沙龙 · 杭州站开启

阿里巴巴云原生的博客 144

运维走出控制台:阿里云 AgentCore AI Native 运维实践

UModel 让现场能够被关联,运维数字员工让经验能够被调用,AgentCore Team 让分析能够协作,AgentLoop 让质量能够被检验。这些建设共同服务于一件事:让团队对系统的理解,成为每个人处理问题时都能接上的能力。

阿里巴巴云原生的博客 301

从长程 Agent 到 Super-agent,解锁更多场景

Deepseek Harness 提升了架构的透明度,但也带来了工程上的复杂度。这次开源的dsh-superagent-prototype,是对 Agent “连续实体”能力的工程拆解。

阿里巴巴云原生的博客 237

排查提效 50%:淘大集新核心系统的观测护航之路

供应链运维,缺的不是更多机器,是“一条能把指标、日志、链路串起来的线”。阿里云 ARMS+SLS+云监控2.0+STAROps 重构观测底座。

阿里巴巴云原生的博客 148

概率、插座与 5000 个爱因斯坦:专访阿里云研发副总裁周琦

这次访谈发生在 2026 年云栖大会之后。大会期间,阿里云发布了智能体构建和治理平台 AgentCore,将企业级 Agent 基础设施进一步标准化和托管化。

阿里巴巴云原生的博客 154

Agent 数据飞轮平台的选型和实践

用统一标准判断修改效果,积累覆盖不同路径的测试样本,沿执行记录排查失败,并将典型问题纳入后续回归。而这也是宙斯接入 AgentLoop 要解决的问题。

阿里巴巴云原生的博客 29

Durable Agent 详解:如何让 Agent 在云端长期稳定运行

本文使用一个具体的用户任务示例“向五位客户发送通知邮件”,解释为什么保存聊天记录还不够,再以 AgentScope 构建的 Agent 为例,展开任务状态、持久提交和故障恢复的通用设计,最后结合 Alibaba Cloud AgentCore 已有的 Harness 托管与节点恢复能力,讨论共享状态、可靠调度及 Brain / Hands 分离如何支撑更完整的长期托管服务。

阿里巴巴云原生的博客 335

Qoder × AgentLoop:智能体规模化应用,敏感数据保护如何跟上?

智能体观测与优化平台 AgentLoop 持续分析已采集的 Qoder 审计日志,将发现的风险线索关联到具体会话、工具调用、成员和环境,帮助安全团队回查任务过程、明确需要整改的环节,并复查处理效果。

阿里巴巴云原生的博客 291

完整还原已经服务千家企业的 AIOps Agent 的评测和调优实践

阿里云 STAROps 是一个生产运维 Agent,通过连接多域数据、运维工具与专家经验,从被动响应走向智能自治,7×24 保障业务连续、稳定运行。本文将分享 STAROps 的评测和调优实践。

阿里巴巴云原生的博客 199

阿里云云原生四项 AI 应用工程化实荣获“鼎新杯”优秀案例

第五届“鼎新杯”由中国通信标准化协会主办、中国信息通信研究院承办,自2026年05月正式启动,历时近 5 个月,聚焦国内政企数智化转型领域的创新成果,旨在为行业提供可复制、可推广的实践参考。

阿里巴巴云原生的博客 323

交付周期从 51 天缩短到 14 天,多 Agent 协作产品⾃进化背后的组织重构

本⽂结合这段实践,介绍评测如何驱动产品持续进化、⼈机协作的边界如何设定,以及团队如何通过统⼀⽬标、结果标准和责任分⼯,减少跨岗位交接,降低沟通损耗,把技术能⼒转化为实际交付效果。

阿里巴巴云原生的博客 328

从部署上线到运维优化:STAROps 与 ROS Agent 的资源运维自动化实践

STAROps 数字员工提供统一的运维对话入口,结合日志、指标、告警等信息理解问题,并通过 alibabacloud-ros-agent 技能,将基础设施规划和变更任务委派给 ROS Agent。

阿里巴巴云原生的博客 130

车企数据隐私保护必修课:如何用 SLS mask 守住日志中的敏感信息

阿里云日志服务 SLS 的 mask 函数可在采集或写入阶段替换匹配的敏感值,同时保留业务状态与调用链,并结合访问控制和保留期限管理减少暴露。下文通过车辆与车主服务、海外联网订阅、智能座舱交互三类业务中的四组日志,介绍规则选择与脱敏效果。

阿里巴巴云原生的博客 113

切换模型会损失缓存,智能路由还省钱吗?

智能路由会把不同的工作交给不同的模型。很多人随之会问:模型一换,之前积累的缓存就用不上了,这笔损失会不会把省下的钱又花回去?

阿里巴巴云原生的博客 209
上一篇: 通义灵码软件工程大模型获顶会最高奖!
下一篇: Spring AI Alibaba 游乐场开放!一站式体验AI 应用开发全流程
阿里云云原生
阿里云云原生 企业官方账号 企业官方账号
码龄8年 1万+粉丝 3151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值