监控异常操作频率并报警

简介: 当企业上云后,监控云资源的异常操作就是一件非常重要的事情。如何监控这些异常操作呢?答案就是操作审计。接下来就以一些实际场景为例,介绍如何基于操作审计,监控云上异常操作或操作频率,进行报警。

TB1a2VWlOpE_u4jSZKbXXbCUVXa-1355-735.png

当企业上云后,监控云资源的异常操作就是一件非常重要的事情。比如:

• 针对主账号登陆行为进行通知,因为大部分情况企业都是使用子账号;
• 针对会产生费用的操作进行通知,避免异常购买行为对企业造成资损;

• 针对删除资源的事件进行报警,因为删除是个敏感操作,误删资源极可能导致服务不可用;
• 针对接口调用量突变进行报警,因为这很可能是业务出现了异常; 等等

那么如何监控这些异常操作呢?答案就是操作审计。接下来就以一些实际场景为例,介绍如何基于操作审计,监控云上异常操作或操作频率,进行报警。

技术方案

操作审计记录了云账号在阿里云上的所有操作事件,例如 OpenAPI 调用、售卖页购买资源等。用户可以使用操作审计的跟踪功能,将账号下的操作事件投递到指定的 SLS,接下来就可以利用 SLS 的报警能力,针对异常事件进行报警。

图1.png

实现步骤

实现过程分为两步:

  1. 创建跟踪:将云账号的操作事件投递到 SLS
  2. 配置报警:在 SLS 中,根据不同场景配置报警规则

创建跟踪

如果您的账号中已经有投递到日志服务 SLS 的跟踪,则可以跳过这一步骤

操作审计默认会帮助您记录账号内最近 90 天的操作日志,但如果想要实现自定义监控报警,则需要创建一个跟踪,并设置投递到日志服务 SLS 中,利用 SLS 实现监控报警。
• 如果您习惯控制台操作,则可以参考 这篇文档,在操作审计控制台中,完成跟踪创建
• 如果您希望通过通过 SDK 调用 API 来操作,则可以参考操作审计的 CreateTrail API 介绍
• 如果您希望使用 IaC 方案自动化创建跟踪,则可以参考:
使用 阿里云资源编排 ROS 创建 操作审计跟踪
使用 Terraform 创建操作审计跟踪

创建了跟踪后,操作审计就会持续且实时地将您云账号下的操作事件投递到您指定的 SLS 中。

报警设置

设置报警可分为以下几个步骤:
• 确定异常操作事件
• 针对异常事件编写 SLS 查询语句
• 根据查询结果进行报警
接下来本文将针对一些常见场景,结合真实案例描述如何设置报警。

常见场景

监控主账号登陆

真实案例

当企业对云资源进行管控的时候,为了进行权限控制,一般都是使用子账号,很少直接使用主账号。所以企业希望主账号一旦登陆,就进行报警。这样当主账号可能密码泄漏、非法登陆时,能及时发现。

步骤一:确定登陆事件

在操作审计中,登陆事件名称为 ConsoleSignin
登陆事件中 userIdentity 标记登陆者信息:
userIdentity.type 如果为 root-account 则表示主账号; ram-user 表示 RAM 用户;
userIdentity.accountId 是主账号 ID;
userIdentity.pricipalld 是当登陆者的 ID,如果是主账号登陆就是主账号 ID,如果是子账号登陆就是子账号 ID。

登陆事件如图所示:

图2.png

操作事件主要有以下几类:
ApiCall 阿里云 OpenAPI 调用事件,其 eventName 字段就是 API 名称
PasswordReset 密码重置事件
ConsoleSignin 控制登陆事件
ConsoleSignout 控制台登出事件
AliyunServiceEvent 实例到期自动释放事件
ConsoleOperation 其他控制操作

关于事件结构定义可参考文档:操作事件结构定义

步骤二:查询主账号登陆事件

了解了以上信息,就可以编写 SQL 查询主账号登陆事件了。查询条件就是 eventNameConsoleSignin ,且 event.userIdentity.typeroot-account

* | SELECT  COUNT(*) as count FROM log WHERE "event.eventName" = 'ConsoleSignin' AND "event.userIdentity.type" = 'root-account'.

如图所示,查询出来主账号在 15 分钟内有 1 次登陆。

步骤三:配置报警

点击 “另存为告警”,就可以针对上述查询结果进行报警。
假设我们希望主账号只要登陆控制台就报警,则可以配置报警规则为:每隔 5 分钟,查询 5 分钟内主账号登陆事件数量,如果有大于等于一次登陆就报警。如果想要报警更及时,则可以调整间隔时间和查询区间。
配置如下:

图3.png

$0 表示第一条查询语句, $0.count 就是查询结果中的 count 字段。接下来再完善通知信息即可,这里不再赘述。
关于 SLS 报警配置的详细说明可参考文档:日志服务-告警

报警示例

假设前面配置了钉钉群报警,则一旦主账号登陆,就会收到类似下图的报警:

图4.png

高危操作报警

真实案例

某企业网站突然打不开了,经排查发现原来是 SSL 证书被误删了,导致 CDN 资源都无法访问。
资源删除操作是个高危操作,如果资源在被删除时能有报警,就能及时发现甚至避免业务故障了。

解决方案

要针对资源删除进行报警,就需要列举出删除资源的 API,可以在对应云产品文档中找到删除相关的 API;为了简单,也可以模糊查询 DeleteRemove 开头的 API,这类 API 基本是删除操作。

查询条件
* | SELECT "event.serviceName" AS service, "event.eventName" AS event, COUNT(*) AS count FROM log WHERE "event.eventName" LIKE 'Delete%' OR "event.eventName" LIKE 'Remove%' GROUP BY service,event ORDER BY count DESC
触发条件

$0.count > 0 即只要有资源删除,就报警。

报警通知发送内容

${Results[0].RawResultsAsKv} ,即发送文本格式的查询结果,查询结果可能有多项。

报警示例

图5.png


收到报警后,就能及时在跟踪投递的 SLS LogStore 中查询到删除操作以及操作者。

高频失败调用报警

真实案例

某运维在查看日志时,发现某 AccessKey 在一段时间内频繁出现 403 的错误。经过排查发现,是因为该 AccessKey 没有权限,但一直在尝试调用云服务。
此外还有其他调用失败的情况,这些调用失败,可能是权限问题,也可能是使用方式不正确。如果能针调用失败进行报警,就能及时发现并解决问题。

解决方案

操作审计记录了所有云服务调用操作,并且针对异常调用记录了错误码。所以可以通过有无错误码来判断调用是否正常。

event.errorCode 错误码,如果有该字段,则表示调用出错
event.errorMessage 错误消息,如果有该字段,则表示调用出错
因为正常调用 API 也可能出错,所以为了让报警更准确,可以根据频率来报警。最终设计报警规则为:每 5 分钟执行一次,查询当前 5 分钟至的错误总数 x,和前 5 分钟至前 10 分钟错误总数 y,如果 x 相比 y 增长了 30%,则报警。

查询条件
* |
SELECT
  count_old AS "前10分钟至前5分钟接口调用失败",
  count_new AS "前5分钟至现在接口调用失败",
  if(count_old > 0, round((count_new-count_old + 0.0) / count_old, 6), 0) AS res
FROM  (
    SELECT
      SUM(
        CASE
          WHEN "event.errorMessage" IS NOT NULL
          AND __time__ >= to_unixtime(date_add('minute', -10, current_timestamp))
          AND __time__ < to_unixtime(date_add('minute', -5, current_timestamp)) THEN 1
          ELSE 0
        END
      ) AS count_old,
      SUM(
        CASE
          WHEN "event.errorMessage" IS NOT NULL
          AND __time__ >= to_unixtime(date_add('minute', -5, current_timestamp))
          AND __time__ < to_unixtime(date_add('minute', 0, current_timestamp)) THEN 1
          ELSE 0
        END
      ) AS count_new
    FROM log
  )

注意:上述查询条件中,根据 event.errorMessage 是否为 NULL 来决定是否调用异常。因为当前操作审计创建跟踪时,默认创建的 SLS Project 及 LogStore 中,将 event.errorMessage 加入了索引;而 event.errorCode 没有加入索引。所以如果要使用 event.errorCode 作为查询条件,需要将其加入索引。

触发条件

$0.res > 0.3 即错误率增长 30% 就报警。

总结

本文基于一些真实案例,介绍了如何基于操作审计对云上资源异常操作进行监控报警,提高云上资源管控的安全性。当然,实际可能还会有更复杂的场景。希望通过本文的介绍,大家能够举一反三,实现更贴合自己业务的报警。

相关文章
|
供应链 芯片
电商黑话之 spu sku
SPU = Standard Product Unit (标准化产品单元),SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的基本特性。因此在电商类产品库建立时,通常会根据SPU来建立。
电商黑话之 spu sku
|
9月前
|
算法 区块链 数据安全/隐私保护
加密算法:深度解析Ed25519原理
在 Solana 开发过程中,我一直对 Ed25519 加密算法 如何生成公钥、签名以及验证签名的机制感到困惑。为了弄清这一点,我查阅了大量相关资料,终于对其流程有了更清晰的理解。在此记录实现过程,方便日后查阅。
1119 1
|
9月前
|
安全 Java Android开发
GDA反编译工具全面指南:从入门到高级应用
GDA(Generic Dalvik Analyzer)是一款专为Android逆向工程和安全研究设计的高性能反编译工具,由中国团队开发。它采用C++编写,无需依赖Java虚拟机,具备低资源消耗与高分析效率的优势。GDA支持多种文件格式的反编译,如APK、DEX、JAR等,并集成了恶意行为检测、隐私泄露分析、漏洞扫描等功能。同时提供变量追踪、路径解析、脚本自动化等实用特性,广泛应用于逆向分析、安全审计与漏洞挖掘。作为国产优秀逆向工具,GDA凭借其独立运行能力、丰富的功能和持续更新,在全球范围内受到分析师青睐。
1262 0
|
数据库
分布式锁实现问题之数据库中的分布式锁有哪些缺点
分布式锁实现问题之数据库中的分布式锁有哪些缺点
|
机器学习/深度学习 人工智能 自然语言处理
20用于深度学习训练和研究的数据集
无论是图像识别,自然语言处理,医疗保健还是任何其他人工智能领域感兴趣,这些数据集都是非常重要的,所以本文将整理常用且有效的20个数据集。
1198 1
|
Linux
通过ELRepo修改CentOS 7内核版本的详细步骤
通过ELRepo修改CentOS 7内核版本的详细步骤
2217 3
|
安全
tp5使用ueditor请求后台配置项http错误,上传功能将不能正常使用!
tp5使用ueditor请求后台配置项http错误,上传功能将不能正常使用!
1060 0
|
SQL 存储
【TiDB原理与实战详解】3、 集群升级和逻辑备份恢复~学不会? 不存在的!
TiDB集群可通过打补丁和版本升级来维护。打补丁针对特定组件(如TiDB或TiKV)进行,而版本升级包括不停机升级和停机升级两种方式,前者会重启部分组件。升级前需更新tiup工具并调整拓扑配置,确保集群健康。TiDB的数据备份与恢复依赖于Dumpling和TiDB Lightning工具,前者负责数据导出,后者用于数据导入。导出时推荐使用小文件和多线程以提升效率,并可通过多种参数控制导出细节。恢复时需注意备份目录与存储节点分离,并可通过配置文件控制导入过程,支持断点续传及错误处理策略。此外,4.0及以上版本支持库表过滤功能,便于灵活管理数据导入。
|
机器学习/深度学习 人工智能 算法
【语音识别算法】深度学习语音识别算法与传统语音识别算法的区别、对比及联系
深度学习语音识别算法与传统语音识别算法在理论基础、实现方式、性能表现等方面存在显著区别,同时也有一些联系。下面将从几个方面详细比较这两种方法,并给出应用实例和代码示例
886 4