自动化AutoTalk第十五期:自动化场景-多账号自动化场景下的AK管理方案
本次主题是多账号自动化场景下的身份管理方案。
如果写程序或者通过Terraform工具做一些自动化,把它抽象成三步。首先要有一个程序的身份,操作阿里云的API必须要有一个AK,
第二步,一定要有一个账号,因为所有的资源一定在一个账号里面。第三步,要调阿里API去创建像ECS,OSS 资源。
程序的身份就是应用程序调API,身份的认证,阿里云提供两种方式,一种是有一个固定的凭据,叫AccessKey,简称AK,还有一种方式是用一些临时凭据,叫STS Token,程序使用AK或者用STS Token的方式,有很多常见的一些风险。比如,有些客户可能用主账号来操作API,主账号的AK的风险很高,因为一旦被泄露,止血成本非常高,有些用户把AK直接硬编码到代码里面,AK一旦泄露,账号的风险非常大。
基于这些风险。有一些最佳原则,总结两点,第一个是尽量缩短暴露的时长,比如可以用固定的凭据AK,可能时间很长,只要不去轮转它。AK给到研发可能用一年、两年甚至十年,AK一直在,时长非常长,如果可以通过一些策略,比如定期的做轮转,半年做一些轮转,AK的时长就可以控制在时间范围里。或者用一些临时的Token方式,第二种方式是尽量缩小暴露的面积,比如测试环境和生产环境,可以使用不同的凭据,而不是一个凭据操作应用的各个环境,甚至可能一个AK操作所有的应用,如果AK一旦被泄露,里面所有的系统都会受影响,这是一个比较简单的理解。
刚刚讲到的临时Token,在云上有一些最佳实践,比如把程序布在ECS里跑,ECS其实有一种方案,叫实例角色的功能,给ECS实例,给他一个角色,然后他可以操作云上的一些资源。这样,程序其实没有感知到AK的存在,只要把代码部署在这台ECS上,就有相应的权限,这里面不会存在AK泄露的问题,因为程序感知不到AK的存在,整个频率都在ECS实例上面,这是一种实践。有很多的用户其实是一个多账号,这是个账号树,比如有很多业务,有业务A,业务B,每一个业务都有一个账号A1,B1,如果今天要做一些自动化的操作。可能会开一个新的云账号,比如运维账号,假设运维账号C,在运维账号C里跑脚本,或者跑流水线,搭一个Jenkins,或者用阿里云的云效,那在跑流水线的时候,要去操作业务A1账号,b1账号里面的资源。也就是要有这两个账号的身份和权限。如果A1账号给一个AK,B1账号给一个AK,出现AK的泄露风险很高,而且每一个账号都要开一个AK,管理效率、管理成本也很高。如果企业正好是多账号的场景,强烈建议用这套方案,在运维账号里面,比如ECS实例,开一个ECS实例,给它一个实例角色,实例角色有扮演的功能,可以扮演管理账号,叫根账号,里面的一个角色有权限到每个账号里做资源的开通管理操作。在整个过程里,没有一个明文AK,这是方案里非常重要的一点,核心用两个能力,一个是资源管理树,有一个资源目录树管成员账号,另一个重要的点是在运维账号C里做角色的扮演。
接下来,有一个演示图,这是一个非常典型的多账号架构,一个企业有很多账号,运维账号要做一些自动化的程序,程序大概率部在运维账号里,它有生产账号A,然后B还有很多账号,所有的自动化程序可能都跑在运维账号C里面。
看一下它大概是有几步,首先,在运维账号里面,创建一个ECS角色ecs-role,权限是STS的AssumeRole权限,给角色授权限,然后在自动化程序ECS上关联到角色。第二步,在管理账号里面创建一个,比如automation-assume,权限有资源目录的权限,有STS AssumeRole的权限,然后在运维账号里配置ECS的角色,并且在这台ECS上面安装比如阿里云的CLI工具,就可以拿到临时的一个AK。接下来做一个简单的实操。
这是一个演示的环境,多账号的树,现在当前登录账号是资源管理的主账号,之后选择一个运维账号,用来跑自动化程序。
简单写几个操作步骤,首先在运维账号里创建一个可信实体类型为阿里云服务的角色:ecs-role。给角色创建调用STS服务的权限。第二步,在管理账号里面创建一个可信类型为阿里云账号的角色,授信策略可以被运维账号扮演。第三步,在运维账号里面购买一台ECS,在ECS里做一些简单的操作,只要能拿到主账号的临时AK,调阿里云的SDK,或者API,或者跑Terraform,都可以往下走。把操作通过Terraform写成一个程序。
首先第一步在运维上号里面创建一个角色,并且授权。在step里面,创建一个角色,同时授权。第二步,在ma账号,管理账号里面创建一个自动化的角色,同样完成授权跟访问的授信策略,执行一下脚本。
执行完后,看一下账号里的资源是不是已经被创建出来,当前是管理账号,文档里面会创建一个角色,看一下角色是不是创建出来,时间是12:28。
创建出来角色,角色里给两个权限,一个是STS的权限,一个是管理资源目录的权限。
授信策略是可以被463扮演,463是运维账号。权限跟授信策略都有,脚本已经成功。
然后进到运维账号里,运维账号里会创建一个角色,看一下运维账号里角色是不是也创建出来,叫ecs-role。时间也是刚刚创建的时间。看到里面权限有了,授信策略是ECS。执行完Terraform脚本,已经把步骤一跟步骤二的资源创建好了,创建好之后,在运维账号里面有一台ECS,ECS里面要注意一点是跟角色要绑定。
是跟ecs-role有个绑定关系,如果不绑定,ECS没有权限,绑定完之后,开始在ECS上执行一些阿里云的CLI命令,阿里云CLI可以直接安装在ECS里。
可以把这几行代码都贴进去,直接echo,把值echo出来,这个时候拿到的值其实是一个STS,是一个临时的密钥,临时的密钥是当前账号临时的密钥。如果拿到这个账号的密钥,可以操作这里面的账号的资源,它权限比较大。
这样实现当企业有多账号的时候。然后有一个ops账号,它专门做运维跟自动化相关。在这里面可以买一台ECS,所有的脚本都在这台ECS里面操作,全过程中没有看到一个明文AK,通过临时的密钥来实现,能够提升安全性。