通过函数计算实现日志告警的自动处理

当您为日志创建告警规则后,可以通过函数计算接收告警通知并自动处理告警事件。例如某企业在使用OSS时,要求所有Bucket的ACL都必须为私有(private)。如果有员工在创建或管理OSS Bucket时,将ACL设置为公共读(public-read)或公共读写(public-read-write),告警系统需快速发现并自动修复。

工作原理

本文以操作审计日志中的OSS审计日志为例,当ACL被设置为公共读(public-read)或公共读写(public-read-write)时,日志服务会发送告警通知,函数计算接收告警通知后自动调用函数修改Bucket的ACL,具体流程如下:

image
  1. 采集OSS审计日志:开启日志审计的云产品日志采集功能,操作审计日志(包括OSS审计日志)被采集到日志服务。

  2. 配置函数计算的服务和函数:创建函数计算服务和函数。

  3. 配置日志服务的告警:配置告警规则和通知对象,监测OSS审计日志中的PutBucket事件,将告警结果通知给函数计算。

  4. 查看函数计算处理结果:函数计算接收告警通知后调用函数,判断Bucket ACL权限是否为私有并修改。您可以查看函数计算调用日志和OSS Bucket的ACL。

操作权限说明

如果您使用的是阿里云RAM用户,该RAM用户需具备如下权限。具体操作,请参见为RAM用户授权

{
  "Statement": [{
    "Action": "ram:CreateServiceLinkedRole",
    "Resource": "*",
    "Effect": "Allow",
    "Condition": {
      "StringEquals": {
        "ram:ServiceName": "alert.log.aliyuncs.com"
      }
    }
  }],
  "Version": "1"
}

1. 采集OSS审计日志

ActionTrail操作日志包括OSS审计日志,因此您可以在日志审计服务中,开启ActionTrail操作日志的采集,从而采集OSS审计日志。日志审计开启云产品操作审计的具体操作,请参见操作审计

2. 创建服务和函数

2.1 创建服务

登录函数计算控制台,创建服务。具体操作,请参见创建服务

image

2.2 创建函数

  1. 服务列表页面,单击目标服务。在函数管理页面,单击创建函数

  2. 创建函数页面,重要参数说明如下所示,其他参数保持默认配置。然后单击创建具体操作,请参见创建函数

    • 函数名必须以sls-ops-开头,例如sls-ops-test

    • 设置请求处理程序类型处理事件请求

    • 本示例从环境变量中获取AccessKey ID和AccessKey Secret。其中,accessKeyIdaccessKeySecret为阿里云账号的访问密钥,您需要配置环境变量,具体操作,请参见配置环境变量

    image

    image

  3. 创建函数后,index.js替换如下,部署成功后,无需执行测试操作。

    说明

    index.js中,您可以通过调用putBucketACL方法修改Bucket ACL权限,以调整其权限设置。此方法所需的regionbucket参数,将通过解析日志服务中告警触发时返回的查询统计结果(通常可从alert.fire_results中获取)来动态获取。更多告警参数,请参见内容模板变量说明(新版)

    const OSS = require('ali-oss')
    
    const accessKeyId = process.env.ALIBABA_CLOUD_ACCESS_KEY_ID
    const accessKeySecret = process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET
    
    async function checkBucketAcl(region, bucket) {
      const client = new OSS({
        region: `oss-${region}`,
        accessKeyId,
        accessKeySecret,
        bucket: bucket
      })
      const result = await client.getBucketACL(bucket)
    
      if (result.acl !== 'private') {
        await client.putBucketACL(bucket, 'private')
      }
    }
    
    exports.handler = async (event, context, callback) => {
      const alert = JSON.parse(event.toString())
      for (const result of alert.fire_results) {
        const { region, bucket } = result
        await checkBucketAcl(region, bucket)
      }
      callback(null, '')
    }

3. 创建告警

3.1 创建告警规则

  1. 登录日志服务控制台,在 Project 列表单击目标 Project。

  2. 操作审计会自动创建一个名为actiontrail_<跟踪名称>的日志库(Logstore)。单击目标Logstore,输入如下查询和分析语句,单击查询/分析,查询无报错,单击另存为告警

    新建Bucket或者修改Bucket的ACL权限,都会生成一条PutBucket的审计日志。因此您可以使用如下查询和分析语句,获取PutBucket日志,并提取Bucket地域和名称。后续函数计算会基于该信息,判断并修改OSS Bucket的ACL。

    event.ServiceName: Oss
    AND event.eventName: PutBucket |
    SELECT
      "event.acsRegion" AS region,
      split("event.eventSource", '.') [1] AS bucket

    image

  3. 告警监控规则面板中,参考下图,完成配置。更多参数说明,请参见创建日志告警监控规则

    image

3.2 查看告警记录

创建告警后,修改Bucket的ACL权限或新建Bucket都会触发告警。您可以在告警概览页面的告警历史图表中,查看已触发的告警。告警

4. 查看函数计算处理结果

函数计算收到告警通知后,调用函数判断对应Bucket的ACL是否为私有并修改。即如果ACL为公共读或公共读写,函数计算将自动修改ACL为私有。

4.1 查看函数计算调用日志

登录函数计算控制台,在左侧导航栏,单击服务及函数,服务列表页面,单击目标服务,在函数管理页,单击目标函数,进入调用日志页面,查看调用日志。更多信息,请参见查看调用日志

告警

4.2 查看OSS Bucket的ACL

登录OSS管理控制台,进入目标Bucket的读写权限页面,查看ACL。函数计算已调用函数将该Bucket的ACL修改为私有。

告警