如何将S3存储牌策略编写为 *仅 *允许特定的IAM角色和CloudFront Origin Access身份



我的整体目标:我尝试了几件事并阅读了相关的AWS文档,但无法弄清楚如何编写S3存储措施策略以仅允许访问特定的IAM角色和CloudFront Origin访问身份(OAI),并拒绝其他所有人。

我到目前为止尝试的是:1.我找到了这个博客,该博客显示了如何限制S3存储桶访问特定IAM角色的访问:https://aws.amazon.com/blogs/security/how-to-to-restrict-celtrict-astertict-mazon-s3-bucket-access-access-cess-to-cess-to-cess-to-cess-to-ces-to-ces-to-cess-to-access-to-cess-to-cess-to-cess-to-cess-to-cess-to-cess-to-ces-to-co-ces-to-co-ces,a特异性iam-lole/2.基于上述博客,我编写了以下存储策略。此策略仅允许my_iam_role允许在称为" mybucket"的存储桶上进行所有操作:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::myBucket",
                "arn:aws:s3:::myBucket/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": [
                        "MY_IAM_ROLE_USER_ID:*"
                    ]
                }
            }
        }
    ]
}
  1. 我找不到AWS范围的密钥-http://docs.aws.amazon.com/amazons3/latest/dev/amazon-s3-policy-keys.html- for oai,我可以将其与my_iam_role_user_id一起插入" AWS:USERID"数组。我尝试插入OAI的Canonicaluserid,但它不起作用。

我的问题:我如何组合(1)AWS:IAM角色/用户的用户ID和(2)单个策略语句中的OAI ID?

我遇到了同样的问题,我需要限制仅访问我对CloudFront(OAI),MediaConvert(角色)和某些用户(IAM)的访问。

NotPrincipal指令为CloudFront和单个用户工作,但是正如@muhammadhannad所说,问题在于,对于角色,您必须列出与之关联的每个会话名称,并且您无法通过将通配符与字符串相结合,因为此元素,不支持它。

使用"Condition": {"StringNotLike": {"aws:userid" [...]}}也无法使用,因为正如您在评论中所说的那样,CloudFront Origin Access Identity没有相应的aws:userid

我终于找到了一个解决方案,而不是使用StringNotLike,我们可以使用"Condition": {"ArnNotLike": {"aws:PrincipalArn": [...]}},其行为与NotPrincipal相同,但有可能在资源名称中使用通配符。

{
    "Sid": "1",
    "Effect": "Deny",
    "Principal": "*",
    "Condition": {
        "ArnNotLike": {
            "aws:PrincipalArn": [
                "arn:aws:iam::111122223333:user/S3-USER",
                "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity AAAABBBBCCCC1",
                "arn:aws:iam::111122223333:role/MediaConvertRole",
                "arn:aws:sts::111122223333:assumed-role/MediaConvertRole/*",
                "arn:aws:iam::111122223333:root"
            ]
        }
    },
    "Action": "s3:*",
    "Resource": [
        "arn:aws:s3:::myBucket",
        "arn:aws:s3:::myBucket/*"
    ]
}

要回顾一下,您需要一个限制访问S3存储桶和内容的存储策略,但允许访问您的CloudFront Origin访问访问身份以及您的IAM角色(s)您想指定。我有几种方法可以做到这一点,一个带有非主题元素,另一个带有主要元素。这取决于有多少人在使用您的IAM角色,或者您打算扩展访问该角色的范围。您可以通过使用NotPrincipal Element并显式拒绝在存储措施策略中指定权限,以防止Amazon识别和访问管理(IAM)实体访问您的Amazon S3存储桶。但是,NotPrincipal不支持通配符。

在此策略示例中,您必须列出每个用户的角色会话名称以及将假定角色的每个实例ID:

"Effect": "Deny",
"NotPrincipal": {
"AWS": [
    "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/cross-account-audit-app",
    "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/instanceID",
    "arn:aws:iam::444455556666:role/cross-account-read-only-role",
    "arn:aws:iam::444455556666:root"
    ]
}

要涵盖所有这些用户和实例,您需要在声明中的通配符来表示假定的角色:

"arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/*"

但是,通配符不支持NOTPRINCIPAL元素。,如果您只使用自己使用该角色或一个实例,则可以使用,但是随着您的扩展,您需要添加ARN对于使用该角色的用户/实例。

在此示例中,而不是NotPrincipal,将"Principal": "*"用作每个语句块中的目标实体,其中包括每个允许块的条件。通配符在"aws:userid": ["ROLE-ID:*"]中使用,以在调用临时凭据的情况下,包括通话过程传递的所有名称(例如应用程序,服务或实例ID)。有关更多信息,请参阅所有请求中可用的信息。包括根帐户以防止锁定:

"Condition": {
    "StringLike": {
        "aws:userid": [
            "AROAID2GEXAMPLEROLEID:*",
            "444455556666"
        ]
    }
}

deny块中的字符串notlike:

"Condition": {
    "StringNotLike": {
        "aws:userid": [
            "AROAID2GEXAMPLEROLEID:*",
            "444455556666"
        ]
    }
}

这是完整的策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::myExampleBucket",
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::myExampleBucket/*",
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAID2GEXAMPLEROLEID:*",
                        "444455556666"
                    ]
                }
            }
        },
        {
            "Sid": "",
            "Effect": "Deny",
            "Principal": "*",
                "Action": "s3:*",
                "Resource": [
                    "arn:aws:s3:::myExampleBucket/*",
                    "arn:aws:s3:::myExampleBucket"
                ],
                "Condition": {
                    "StringNotLike": {
                        "aws:userid": [
                            "AROAID2GEXAMPLEROLEID:*",
                            "444455556666"
                        ]
                    }
                }
            }
        ]
}

注意:

  • 请确保您将示例名称替换为自己的角色ID和存储桶名。
  • 在上面的示例中,我正在使用IAM实体的唯一ID。http://docs.aws.amazon.com/iam/latest/userguide/Reference_Identifiers.html#Identifiers-inique-Inique-Ids

获取有关IAM角色的信息以下get-lole命令获取有关名为test-lole的角色的信息:

aws iam get-role --role-name Test-Role

输出:

{
    "Role": {
        "AssumeRolePolicyDocument": "<URL-encoded-JSON>",
        "RoleId": "AIDIODR4TAW7CSEXAMPLE",
        "CreateDate": "2013-04-18T05:01:58Z",
        "RoleName": "Test-Role",
        "Path": "/",
        "Arn": "arn:aws:iam::123456789012:role/Test-Role"
    }
}

重要说明
基本上,当您使用 cloundfront api 创建 Origin访问身份时,您可以获得USERID和S3 canonical ID,并且您必须将其记下来以在条件字符串。

http://docs.aws.amazon.com/amazoncloudfront/latest/developerguide/private-content-restricting-access-to-s3.html#private-content-content-content-cortent-coreating-coreating-oai-oai-aai-aapi

如果您当前没有云范围的原始访问标识的ID,请创建一个新的ID,您可以按建议保存ID元素和S3 canonical ID。

我的较旧答案会支持某些人,但可能不准确。因此,我要发布另一个答案,这将更准确地满足您的需求。以下角色政策将允许访问IAM角色和OAI,并将否认其他所有人:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EXXXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucketname/*"
        },
        {
            "Sid": "2",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EXXXXXXXXX",
                    "arn:aws:iam::AWS-account-ID:role/role-name"
                ]
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucketname/*"
        }
    ]
}

似乎有点远,但是找到Origin Access Iddity的ID(而不是规范用户ID ...找到以E开头的一个和大约是12个字符),并将其添加到这样的策略中:

"StringNotLike": {
   "aws:userId": [
      "MY_IAM_ROLE_USER_ID:*",
      "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EXXEXAMPLEXX"
   ]
 }

请注意,包括空格在内的" CloudFront Origin Access身份"一词是该引号字符串的一部分。完全插入它,如图所示,仅更改12个字符ID。

可能会阻止此政策拒绝访问OAI的访问。如果有一种方法可以将OAI的用户包含在条件密钥中,那么这似乎是唯一可能的解决方案。

单独需要第二个策略声明,即将授予OAI必要访问的正常语句。

您的问题可以通过用适当的NotPrincipal在您的Deny中替换Principal: "*",并引用CloudFront OAI,并为CloudFront OAI添加适当的Allow语句:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "NotPrincipal": {
        "CanonicalUser": "..."
      },
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::myBucket",
        "arn:aws:s3:::myBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "MY_IAM_ROLE_USER_ID:*"
          ]
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "CanonicalUser": "..."
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::myBucket/*"
    }
  ]
}

以这种方式,您的IAM角色被aws:userId条件排除在Deny语句中,而NotPrincipal条件则排除了CloudFront OAI。所有其他校长仍将被拒绝访问,并且CloudFront OAI仅在存储措施策略中直接授予其权限。

回想起来似乎很简单,这种解决方案当然并不明显,此答案的信用应该是AWS支持,他们最近对我回答了同样的问题。

相关内容

  • 没有找到相关文章

最新更新