1

我们有以下场景:AWS 账户 A(应用程序)将数据从应用程序写入账户 B(数据湖)拥有的 S3 存储桶。账户 C(报告)中的分析师想要处理数据并在其上构建报告和仪表板。

账户 A 可以将数据写入数据湖--acl bucket-owner-full-control以允许账户 B 访问。但是账户 C 仍然无法查看和处理数据。

一种(在我们看来很糟糕)的解决方案是将数据复制到与帐户 B 相同的位置(覆盖),从而有效地获得过程中数据的所有权并消除问题。我们不想要它,因为......丑陋

我们尝试在不同的帐户中担任角色,但它不适用于我们所有的基础架构。例如,通过 CLI 或控制台访问 S3 是可以的,但在账户 C 中从 EMR 使用它却不行。此外,我们有本地基础设施(本地任务运行程序),这种机制不是一种选择。

维护所有账户和用户的 IAM 角色需要付出太多努力。我们的目标是提供一种自动解决方案,而不是每次添加新用户或帐户时我们都必须采取行动。

你有什么建议吗?

4

3 回答 3

2

一种不错且干净的方法是使用存储桶策略,通过提供账户 ARN 作为委托人来授予对外部账户(账户 C)的读取访问权限。

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "Grant read access to reporting account",
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::insertReportingAccountIdHere:root"
         },
         "Action": [
            "s3:GetBucketLocation",
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
         ],
         "Resource": [
            "arn:aws:s3:::yourdatalakebucket",
            "arn:aws:s3:::yourdatalakebucket/*"
         ]
      }
   ]
}

这使报告账户可以为其自己的用户管理存储桶的 (ListBucket, gGtObject) 权限,这意味着您现在可以在账户 C 上创建一个 IAM 策略,该策略具有从指定数据湖存储桶获取数据的权限:

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "Allow reading files from the data lake",
         "Effect": "Allow",
         "Action": [
            "s3:GetBucketLocation",
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
         ],
         "Resource": [
            "arn:aws:s3:::yourdatalakebucket",
            "arn:aws:s3:::yourdatalakebucket/*"
         ]
      }
   ]
}

然后可以将此策略附加到您想要的任何账户 C IAM 角色或用户组。例如,您可以将其附加到您的标准开发人员或分析师角色以授予对大型用户组的访问权限,或者您可以将其附加到服务角色以授予对存储桶的特定服务访问权限。

Amazon S3 文档站点上有关于如何执行此操作的指南。

于 2018-09-19T17:31:40.990 回答
1

您可以通过以下文档进行操作,

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-saml.html

脚步:

  1. 创建 SAML 提供程序
  2. 为 SAML 提供者创建角色,示例如下
  3. 根据 saml 条件分配用户角色

例如,您可以创建 S3 读取器、S3 写入器并在此基础上分配权限。

使用 SAML 假设角色的示例:

{
      "Version": "2012-10-17",
      "Statement": [{
        "Effect": "Allow",
        "Principal": {"Federated": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:saml-provider/ExampleOrgSSOProvider"},
        "Action": "sts:AssumeRoleWithSAML",
        "Condition": {"StringEquals": {
          "saml:edupersonorgdn": "ExampleOrg",
          "saml:aud": "https://signin.aws.amazon.com/saml"
        }}
      }]
}

希望能帮助到你。

于 2018-03-12T18:44:30.710 回答
0

在我们的例子中,我们使用 DataLake 帐户 (B) 中的角色解决了这个问题,包括写入 (WriterRole) 和读取 (ReaderRole) 访问。从账户 A 向 DataLake 写入数据时,您的写入者会假定账户 B 中的“WriterRole”具有所需的权限。从帐户 C 读取时,您假定为“ReaderRole”。EMR 读取的问题,我们使用 IAM 角色读取 EMRFS 解决了 ( https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-emrfs-iam-roles.html )

于 2018-09-20T11:12:25.500 回答