ActionTrail会将事件压缩之后保存到OSS中。用户使用和分析OSS中的文件比较麻烦。如果能将审计事件写入到SLS,会给用户提供很大的便利。阿里云函数计算是实现这个迁移的好办法,成本低,见效快。本文将介绍如何通过函数计算将ActionTrail事件从OSS导入到SLS中。
创建服务
首先进入函数计算控制台创建服务。在高级配置
中配置好SLS project,用于保存函数计算运行的信息,方便排查问题。函数计算会往里面写入函数运行的信息,用户也可以用过logger对象写入自定义的信息。
创建服务的过程中涉及到很多授权,需要根据提示授予权限。具体到这个例子,是要给OSS服务
授权调用函数计算的触发器。给函数计算服务
授权,读取OSS的数据,往SLS写入事件。
函数计算目前支持的Region不多,会限制目标OSS的区域。比如在华东2
创建服务,就要求读的OSS要在华东2
。
创建触发器
ActionTrail通过OSS PutObject方法往OSS写入文件,因此触发函数选择PubObject。
创建函数
通过Python 2.7实现处理逻辑。在线编辑器还不错,不过没有智能提示功能。先获取ActionTrail的压缩文件,将其解压后,使用SLS客户端将其上传到指定的SLS Project中。需要将OSS client的endpoint和bucket name,SLS client的endpoint、log project、logstore替换成自己的。
# coding=utf-8
import time
from hashlib import md5
import zlib
import json
import logging
import oss2
from aliyun.log.logclient import LogClient
from aliyun.log.putlogsrequest import PutLogsRequest
from aliyun.log.logitem import LogItem
def handler(event, context):
logger = logging.getLogger()
endpoint = 'oss-cn-shanghai.aliyuncs.com'.format(context.region)
creds = context.credentials
auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
sls_client = LogClient('cn-shanghai.log.aliyuncs.com', creds.access_key_id, creds.access_key_secret, securityToken=creds.security_token)
for evt in json.loads(event)['events']:
bucket_name = evt['oss']['bucket']['name']
bucket = oss2.Bucket(auth, endpoint, bucket_name)
object_name = evt['oss']['object']['key']
r = bucket.get_object(object_name)
zipData = r.read(409600) #ActionTrail一个文件压缩前不会超过32KB,所以超过8KB就OK。
actionTrailEvents = zlib.decompress(zipData, zlib.MAX_WBITS|16)
logitemList = []
for actionTrailEvent in json.loads(actionTrailEvents):
logItem = LogItem()
event_time = time.mktime(time.strptime(actionTrailEvent['eventTime'], '%Y-%m-%dT%XZ'))
logItem.set_time(event_time)
#这里只配置了'eventName',可以增加更多需要单独展示或者检索的字段。
logItem.set_contents([('eventName', actionTrailEvent['eventName']), ('event', json.dumps(actionTrailEvent))])
logitemList.append(logItem)
req = PutLogsRequest('actiontrail-events-from-oss-to-sls', 'actiontrail-events', 'ActionTrail', 'henshao', logitemList)
res = sls_client.put_logs(req)
logger.info(res.log_print())
return 'OK'
开发调试
函数计算的调试非常方便。在触发事件中,选择自定义事件
,拿一个真实的ActionTrail文件来做测试(需要替换JSON里面的oss.bucket.arn、oss.object.key,以及所有的阿里云id)。每次修改代码之后,点击保存并运行
。函数运行的信息都会在Web页上打印出来。
验证结果
通过一个登录事件来验证函数计算的运行情况。这里有一点需要注意,SLS开启检索功能之前的日志在查询
里面是不能展示的,可以去预览
里面翻翻。
参考资料
实践中,我发现函数计算是可以使用阿里云Python SDK的,相关的Python代码直接帖进去都可以使用,所以函数计算可以实现非常复杂的功能。