监控异常操作频率并报警

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
操作审计,不限时长
简介: 当企业上云后,监控云资源的异常操作就是一件非常重要的事情。如何监控这些异常操作呢?答案就是操作审计。接下来就以一些实际场景为例,介绍如何基于操作审计,监控云上异常操作或操作频率,进行报警。

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% 就报警。

总结

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

相关文章
|
SQL 缓存 负载均衡
线上cpu报警的一次接口优化
春天到了大地都复苏了,沉寂了很久的cpu也开始慢慢复苏了,所谓前人埋坑后人填坑,伴随着阿里云监控报警,线上CPU使用率暴增,于是就开始了排查之路。
112 0
如何设置agent上报频率监控间隔时间 - WGCLOUD
在agent/config/application.properties中设置即可
如何设置agent上报频率监控间隔时间 - WGCLOUD
|
缓存 Java Spring
报警系统QuickAlarm之报警执行器的设计与实现
根据前面一篇总纲的博文,将整体结构划分为了四大块,本文则主要目标集中在第一块,报警执行器(AlarmExecute)的设计与加载上了 主要的关注点无外乎 定义-》加载-》实现逻辑三块了: 1.AlarmExecute 的接口定义 2.如何加载用户自定义的AlarmExecute 3.AlarmExecute的内部实现
346 0
报警系统QuickAlarm之报警执行器的设计与实现
|
存储 JSON 数据格式
报警系统QuickAlarm之报警规则的设定与加载
既然命名为规则,那么就需要有对应的解析器,以根据报警规则和报警类型等相关输入条件,来选择对应的报警执行器,因此本文主要包括的内容就比较清晰了 1.报警规则的定义 2.报警规则的加载 3.报警规则的解析以及报警执行器选择
255 0
报警系统QuickAlarm之报警规则的设定与加载
|
存储 Java
报警系统QuickAlarm之频率统计及接口封装
前面将报警规则的制定加载解析,以及报警执行器的定义加载和扩展进行了讲解,基本上核心的内容已经完结,接下来剩下内容就比较简单了 1.报警频率的统计 2.报警线程池 3.对外封装统一可用的解耦
253 0
报警系统QuickAlarm之频率统计及接口封装
|
运维 监控 负载均衡
无效告警优化实践总结
无效告警优化实践总结
无效告警优化实践总结
|
Java
报警系统QuickAlarm之报警规则解析
前面两篇分别说了报警执行器和报警规则的定义及用户扩展加载,接下来就是比较核心的一块了,如何将报警规则和报警执行器关联起来,即当发生报警时,应该call哪一个报警执行器
408 0
|
机器学习/深度学习 SQL 运维
异常行为监控
用户系统中如果出现任何的异常数据,比如一个运维系统的CPU消耗突然增高,比如平台突然有大量不良信息产生,比如有用户大量薅羊毛,这些行为都是平台的异常指标。如果能通过机器学习的方式帮助用户针对各种异常指标做预防和实时预警,将大大建设平台方的风险。
3219 0
异常行为监控
|
弹性计算 监控 机器人
用自定义监控实现 GPU 异常状况的检查与报警
## 应用场景 ## * 阿里云的云监控已原生支持 GPU 实例,可参考:[云监控实现GPU云服务器的GPU监控和报警](https://yq.aliyun.com/articles/610219) * 小概率场景中,GPU 卡会处于异常状态( 例如因[显存校验失败](https://docs.
1656 0
|
监控 API 存储
如何实现 Logtail 的状态监控与异常告警
作为日志服务的采集 agent,Logtail 一般位于业务数据链路的前段,为链路中的后续部分输送数据,因此,它的正常运行显得至关重要。经过多年的实战打磨,Logtail 在稳定性和性能上都已经比较出色,在机器、网络等环境不变的情况下,配置完成后基本不再需要进行任何运维。
2459 0
如何实现 Logtail 的状态监控与异常告警