如何以特定用户身份运行aws cli命令?

时间:2019-08-09 11:19:49

标签: amazon-web-services security amazon-iam

当前,我们正在运行4个命令:

在jenkins docker容器中的两个aws cli命令下面:

sh 'aws cloudformation package  ...'
s3Upload()

在docker容器中的两个aws cli命令下面:

aws s3 cp source dest
aws cloudformation deploy

要在Docker容器中运行以上这4条命令,请aws cli从Docker主机(EC2)派生访问权限,假定具有策略权限的角色(访问s3并创建/更新云形成堆栈。


但是这种解决方案的问题

我们必须将此角色(例如xrole)分配给在每个测试环境中运行的每个EC2。有3-4个测试环境。

在内部,aws以aws::sts::{account Id}::assumerole/xrole/i-112223344的身份创建一个即席用户,并且以上4条命令代表该用户运行。


更好的解决方案是创建一个用户并为其分配相同的角色xrole),并以该用户身份运行以上4条命令。

但是

1)创建此类用户的过程是什么?因为它必须假设xrole ...

2)如何与此用户一起运行以上4条命令?

2 个答案:

答案 0 :(得分:1)

最佳做法是在使用EC2实例时使用角色,而不是用户。仅当您需要向在AWS环境(内部)上的计算机上运行的应用程序授予权限时,用户才是必需的。即便如此,仍然最佳做法是授予该用户权限,使其仅担任授予必要权限的角色。

如果您正在容器中运行所有命令,并且想授予容器而不是整个EC2实例的权限,那么您可以使用ECS服务代替普通的EC2实例。

在ECS中使用EC2启动类型时,您对EC2实例具有相同的控制权,但是不同之处在于,您可以将角色附加到特定任务(容器),而不是整个EC2实例。这样,您可以在同一EC2实例上运行多个不同的任务(容器),而每个任务仅具有其所需的权限。因此,如果您的容器之一需要将数据上传到S3,则可以创建必要的角色,在任务定义中指定该角色,只有该特定任务才具有这些权限。其他任务或EC2实例本身都无法将对象上传到S3。

此外,如果您为任务指定awsvpc联网模式,则每个任务将获得自己的ENI,这意味着即使每个任务在同一EC2实例上运行,也可以分别为其指定安全组。

以下是使用存储在ECR中的docker映像和名为AmazonECSTaskS3BucketRole的角色进行任务定义的示例。

{
  "containerDefinitions": [
    {
      "name": "sample-app",
      "image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/aws-nodejs-sample:v1",
      "memory": 200,
      "cpu": 10,
      "essential": true
    }
  ],
  "family": "example_task_3",
  "taskRoleArn": "arn:aws:iam::123456789012:role/AmazonECSTaskS3BucketRole"
} 

这里是task definitions

的文档

答案 1 :(得分:1)

在同一主机上运行的应用程序共享通过实例配置文件分配给主机的权限。如果出于安全方面的考虑,如果您想隔离在同一实例上运行的不同应用程序,则最好在单独的实例上启动它们。 不建议在每个应用程序中使用访问密钥,因为访问密钥是长期凭证,可以在共享主机时轻松地检索它们。

可以按照上一个答案的建议将IAM角色分配给ECS任务。但是,不会阻止在容器实例上运行的容器访问通过实例配置文件提供的凭据。因此,建议为容器实例角色分配最小权限。

如果以awsvpc网络模式运行任务,则可以配置ECS代理以阻止任务访问实例元数据。您应该只设置代理配置变量 ECS_AWSVPC_BLOCK_IMDS = true 并重新启动代理。

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html