使用 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配置结合。

难者不会,会者不难,即使一个简单的事情,当我们没有概念的时候也会觉得很复杂,关键是总结出一套探索的方法。

热门相关:在遗忘的时光里重逢   隐身侍卫   圣人门徒   隐身侍卫   现代隐士高手