【问题标题】:Access AWS S3 bucket from another account using roles使用角色从另一个账户访问 AWS S3 存储桶
【发布时间】:2016-02-27 06:58:05
【问题描述】:

首先,我的问题与this one 非常相似,但因为我找不到“我也是!”链接,自1月1日以来一直没有答复,我想我会在这里问。如果这样做是错误的,请告诉我。

好的,这是我的问题。我有两个 AWS 账户,我们称它们为 Prod 和 Audit。在 Prod 中,我有许多 EC2 实例,所有实例都已经定义了自己的特定 IAM 角色。在 Audit 中,我有许多 S3 存储桶。

我需要做的是,仅使用 IAM 角色,使用 Prod 账户中的特定 IAM 角色,从特定机器访问审计账户中的 S3 存储桶。

我看到很多关于组策略、资源策略和让 IAM 用户担任角色等的答案,但正如我所说,我在 EC2 实例上使用 IAM 角色,没有组、用户等。

我不想在任何实例的任何地方都拥有凭据,比如 AWS Best Practices

那么这可能吗?是否有其他安全的方法可以做到这一点,而不涉及用户或凭据?非常感谢任何和所有帮助,谢谢!

注意:

我尝试允许访问 Audit S3 存储桶的 Prod EC2 实例上运行的应用程序是 Logstash。我已经确认在将日志推送到 Prod S3 存储桶时设置有效,而不是审核那些。我也尝试过使用 S3 存储桶策略,但也没有成功。

我添加的 S3 Bucket Policy 如下:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "CrossAccountPolicy",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::<Prod Account ID>:root"
        },
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::logstash.prod.logs",
            "arn:aws:s3:::logstash.prod.logs/*"
        ]
    }
  ]
}

附加到产品 EC2 实例的 IAM 角色的内联策略:

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::<Audit Account ID>:role/ProdLogstashPush"
  }
}

附加到审计账户中 IAM 角色的策略:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::logstash.prod.logs/*",
            "arn:aws:s3:::logstash.prod.logs"
        ]
    }
  ]
}

我目前正在试用 fluentd/td-agent,因为我认为它允许 sts:AssumeRole,理论上这将允许此设置工作。

院长

【问题讨论】:

  • 是的,正确的做法是投票赞成该问题并添加评论。但你没有这样做的信誉。 :( 所以这是下一个最好的事情。

标签: amazon-web-services amazon-s3 amazon-ec2


【解决方案1】:

是的,这是可能的。我相信您可以使用角色或 S3 存储桶策略来执行此操作。参考参考How IAM Roles Differ from Resource-based Policies,以类似的S3场景为例。

使用角色

  1. 在审计账户中,设置跨账户角色

    a.) 添加一个策略,授予对 S3 存储桶的适当读/写访问权限。

    b.) 添加指定 Prod 帐户的信任策略。

  2. 在 Prod 账户中,创建或修改您的 EC2 角色(实例配置文件)

    a.) 允许您的 EC2 实例为审计账户的共享角色调用 AssumeRole

    b.) 允许您的 EC2 实例写入 S3(特定审计存储桶或任何存储桶)

  3. 在您的应用程序中,调用 sts:AssumeRole 以获取临时凭证以写入审计账户的 S3 存储桶。各种 AWS 开发工具包都有相当简单但略有不同的方法来从角色创建新的临时凭证。

使用 S3 存储桶策略

您还可以通过审核账户的 S3 存储桶上的资源策略来执行此操作,授予对 Prod 账户的访问权限,但不指定 Prod 账户中的特定用户。 Granting Cross-Account Permissions to Upload Objects While Ensuring the Bucket Owner Has Full Control 有一个类似示例的示例存储桶策略。这种方法的一个优点是您的 Prod 帐户角色将能够直接写入存储桶,而无需先从 sts:AssumeRole 获取临时凭证。有两件事要做:

  1. 在 Audit 账户中,设置 S3 存储桶策略以允许 Prod 账户访问。在我看来,您上面的 S3 存储桶策略没问题。

  2. 在 Prod 账户中,允许 EC2 实例配置文件角色写入 S3。

您可以尝试使用 AmazonS3FullAccess 托管策略进行调试,但您可能希望最终像在策略中那样指定资源。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

【讨论】:

  • 感谢您的回答和詹姆斯的建议! EC2 实例上的应用程序是 logstash,并且没有设置 (AFAICT) 来执行 sts.AssumeRole,所以我认为这已经过时了。我尝试了 S3 存储桶策略,但即使使用 s3.* 访问,我仍然收到拒绝访问。
  • 您能分享一下您在 Audit 存储桶和 Prod 角色中使用的策略吗?
  • 对不起,应该马上做,现在把它们添加到原来的问题中!
  • 您的 S3 存储桶策略看起来不错。我在您的权限中没有看到的是在 Logstash 实例上运行的 EC2 实例角色的 S3 写入访问权限。我相信如果您添加了它,您可以写入审计存储桶。
猜你喜欢
  • 2020-06-24
  • 2019-06-28
  • 2021-04-25
  • 2019-01-15
  • 2017-07-21
  • 1970-01-01
  • 2021-12-07
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多