ktr*_*ace 8 amazon-s3 amazon-cloudfront amazon-iam
我的总体目标:我尝试了几件事并阅读了相关的 AWS 文档,但无法弄清楚如何编写 S3 存储桶策略以仅允许访问特定的 IAM 角色和 Cloudfront 源访问身份 (OAI),并拒绝其他所有人。
到目前为止我尝试过的: 1. 我找到了这个博客,它展示了如何限制 s3 存储桶对特定 IAM 角色的访问:https : //aws.amazon.com/blogs/security/how-to-restrict-amazon- s3-bucket-access-to-a-specific-iam-role/ 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:*"
]
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的问题: 如何在单个策略声明中组合 (1) aws:IAM 角色/用户的用户 ID 和 (2) OAI ID?
我遇到了同样的问题,我需要将我的存储桶的访问权限限制为 Cloudfront (OAI)、MediaConvert (Role) 和某些用户 (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/*"
]
}
Run Code Online (Sandbox Code Playgroud)
概括地说,您需要一个存储桶策略来限制对您的 S3 存储桶和内容的访问,但允许访问您的 Cloudfront 源访问身份以及您想要指定的 IAM 角色。我有几种方法可以做到这一点,一种使用 NotPrincipal 元素,另一种使用 Principal 元素。这取决于有多少人在使用您的 IAM 角色,或者您是否计划扩展对该角色的访问量。您可以通过使用 NotPrincipal 元素和显式拒绝在存储桶策略中指定权限来阻止 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"
]
}
Run Code Online (Sandbox Code Playgroud)
要涵盖所有这些用户和实例,您需要在语句中使用通配符来表示假定的角色:
"arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/*"
Run Code Online (Sandbox Code Playgroud)
但是,NotPrincipal 元素不支持通配符。例如,如果您只使用角色或一个实例,这将起作用,但随着您的扩展,您需要为承担该角色的用户/实例添加 ARN。
在此示例中,代替NotPrincipal,"Principal": "*"用作每个语句块中的目标实体,其中包括每个 Allow 块的 Condition。通配符用于"aws:userid": ["ROLE-ID:*"]包括调用进程在调用以获取临时凭证时传递的所有名称(例如应用程序、服务或实例 ID)。有关更多信息,请参阅所有请求中可用的信息。包含 root 帐户以防止锁定:
"Condition": {
"StringLike": {
"aws:userid": [
"AROAID2GEXAMPLEROLEID:*",
"444455556666"
]
}
}
Run Code Online (Sandbox Code Playgroud)
拒绝块中的 StringNotLike:
"Condition": {
"StringNotLike": {
"aws:userid": [
"AROAID2GEXAMPLEROLEID:*",
"444455556666"
]
}
}
Run Code Online (Sandbox Code Playgroud)
这是完整的政策:
{
"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"
]
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
笔记:
- 请确保将示例名称替换为您自己的角色 ID 和存储桶名称。
- 在上面的示例中,我使用了 IAM 实体的唯一 ID。http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids
获取有关 IAM 角色 的信息 以下 get-role 命令获取有关名为 Test-Role 的角色的信息:
aws iam get-role --role-name Test-Role
Run Code Online (Sandbox Code Playgroud)
输出:
{
"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"
}
}
Run Code Online (Sandbox Code Playgroud)
重要说明
基本上,当您使用CloundFront API创建Origin Access Identity 时,您将获得 UserID 和 S3 规范 ID,您必须记下它才能在条件字符串中使用它。如果您目前没有 CloudFront 的源访问标识的 ID,请创建一个新的 ID,您可以按照建议保存 ID 元素和 S3 规范 ID。
| 归档时间: |
|
| 查看次数: |
17652 次 |
| 最近记录: |