使用 AWS Go SDK 读取审计日志(CloudTrail)
背景
公司的海外业务需要将云上的操作读取到内部的日志文件中,永久保存,供内部审计使用。
由于之前没有用过AWS相关的SDK,在使用过程中也遇到一些困难,这里记录一下,并且总结一下过程。
代码
快速开始
代码参考地址:https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/go/example_code/cloudtrail/lookup_events.go
func AwsCloudTrail() (_err error) {
//初始化session,通过aws.config 将Region 和 AK、SK进行配置(Region、AK、SK需要自己的)
sess := session.Must(session.NewSession(&aws.Config{
Region: aws.String("ap-southeast-1"),
Credentials: credentials.NewStaticCredentials("AK", "SK", ""),
}))
svc := cloudtrail.New(sess)
maxResult := int64(30)
//构造请求参数,可以配置时间、limit等,具体支持参数看后面提供的文档链接
input := &cloudtrail.LookupEventsInput{EndTime: aws.Time(time.Now()), MaxResults: &maxResult}
//发送请求
resp, err := svc.LookupEvents(input)
if err != nil {
fmt.Println("Got error calling CreateTrail:")
return err
}
//读取结果
fmt.Println("Found", len(resp.Events), "events before now")
for _, event := range resp.Events {
fmt.Println("Event:")
fmt.Println(aws.StringValue(event.CloudTrailEvent))
fmt.Println("")
fmt.Println("Name ", aws.StringValue(event.EventName))
fmt.Println("ID: ", aws.StringValue(event.EventId))
fmt.Println("Time: ", aws.TimeValue(event.EventTime))
fmt.Println("User: ", aws.StringValue(event.Username))
fmt.Println("Resources:")
for _, resource := range event.Resources {
fmt.Println(" Name:", aws.StringValue(resource.ResourceName))
fmt.Println(" Type:", aws.StringValue(resource.ResourceType))
}
fmt.Println("")
}
return nil
}
原始文档
CloudTrail 文档:https://docs.aws.amazon.com/zh_cn/awscloudtrail/latest/APIReference/Welcome.html
CloudTrail GO SDK文档:https://docs.aws.amazon.com/sdk-for-go/api/service/cloudtrail/#CloudTrail.LookupEvents
AWS GO 使用案例文档:https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/go/example_code/cloudtrail/lookup_events.go
stackoverflow 问题文档:https://stackoverflow.com/questions/41544554/how-to-run-aws-sdk-with-credentials-from-variables
查看AWS 支持的Region:https://docs.aws.amazon.com/zh_cn/awscloudtrail/latest/userguide/cloudtrail-supported-regions.html
总结复盘
起初对于审计日志没有最基础的概念,可以理解成系统的操作日志,在系统上的所有操作都会被记录下来,变成一个事件(Event)
公司海外云使用的阿里和AWS,所以首先想到可以先接入阿里云,好处是阿里云的文档中文更友好,接入更加容易,对一些基础概念可以更好的掌握。
一般的云厂商都会把各种资源封装成一个服务,同样是查看审计日志阿里云就封装成审计服务,这与阿里云的SLS完全不一样,方向错了,就越走越远了。
AWS 将审计日志封装成CloudTrail 通过调用历史记录,可以对云上操作进行监控和审计。
【1】 查看CloudTrail文档,(查看上面 CloudTrail 文档)但是会有很对的Actions文档,选择哪一个?
【2】确定Action,查看相应的SDK,以及使用方法,阿里云使用的关键字是LookupEvent,所以就查看AWS有没有相关的内容。
【3】问题是SDK文档提供的是源码类似,并没有如何使用,比如我如何New CloudTrail, 参数如何传递,在New例子中,并没有使用AK,SK的地方。
【4】文档不能提供帮助,开始Google, 找到了SDK 使用示例(AWS GO 使用案例文档)但是还是没有找到如何设置这个 session,接下来问提变成AK,SK的如何与session结合,或者与New CloudTrail结合。
【5】在寻找过程中,有很多aws.Config关键字,以前没用过,感觉可以查看整体如何使用SDK的配置,查看开发者指南,果然通过“Configuring the SDK”找到了Region、Credentials的使用方式,Credentials就包括了AK、SK的设置方式。其实有四种方式。我们没有配置文件,所以首选的Static Credentials的方式。
【6】问题演成GO如何使用Static Credentials,这个时候可以Google一下,也能找到如何与session配置结合。
难者不会,会者不难,即使一个简单的事情,当我们没有概念的时候也会觉得很复杂,关键是总结出一套探索的方法。