允许基于 EC2 角色的 S3 存储桶操作
Allow S3 bucket operations based on EC2 role
我们的 EC2 使用 IAM 角色进行保护。当尝试 运行 AWS 控制台命令时,例如 aws s3 cp
我看到:
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
如果允许基于给定密钥的特定用户,则没有问题。这只是不适用于角色。
这是存储桶 ACL:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Public",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
},
{
"Sid": "Devs",
"Effect": "Deny",
"NotPrincipal": {
"AWS": "arn:aws:iam::1234567890:user/DevUser"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::my-bucket/something-privileged/*"
},
{
"Sid": "EC2s",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::1234567890:role/EC2Role"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::my-bucket/something-privileged/*"
},
]
}
如您所见,我们希望 public 通常能够获取我们 link 获取的对象。这行得通。
我们希望开发人员能够使用他们的 AWS 密钥访问存储桶中的特定隐藏文件夹。这行得通。
我们希望 EC2 能够 运行 仅使用分配的安全角色在同一个隐藏文件夹上执行 aws-cli 命令。这不起作用。
我也在 EC2 语句上尝试了 "Effect": "Deny", "NotPrincipal": { ... }
,但也没有用。
这个 ACL 有什么问题?
您在此中有一个 Deny
声明,其中主体不是特定的 IAM 用户。在任何 AWS 权限中,deny will always override an allow 就是这里发生的情况。
要在此处允许此操作,您还需要在 NotPrincipal
语句中 include the IAM role arn。这看起来像下面的语句。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Public",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
},
{
"Sid": "Devs",
"Effect": "Deny",
"NotPrincipal": {
"AWS": ["arn:aws:iam::1234567890:user/DevUser", "arn:aws:iam::1234567890:role/EC2Role"]
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::my-bucket/something-privileged/*"
}
]
}
我们的 EC2 使用 IAM 角色进行保护。当尝试 运行 AWS 控制台命令时,例如 aws s3 cp
我看到:
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
如果允许基于给定密钥的特定用户,则没有问题。这只是不适用于角色。
这是存储桶 ACL:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Public",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
},
{
"Sid": "Devs",
"Effect": "Deny",
"NotPrincipal": {
"AWS": "arn:aws:iam::1234567890:user/DevUser"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::my-bucket/something-privileged/*"
},
{
"Sid": "EC2s",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::1234567890:role/EC2Role"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::my-bucket/something-privileged/*"
},
]
}
如您所见,我们希望 public 通常能够获取我们 link 获取的对象。这行得通。
我们希望开发人员能够使用他们的 AWS 密钥访问存储桶中的特定隐藏文件夹。这行得通。
我们希望 EC2 能够 运行 仅使用分配的安全角色在同一个隐藏文件夹上执行 aws-cli 命令。这不起作用。
我也在 EC2 语句上尝试了 "Effect": "Deny", "NotPrincipal": { ... }
,但也没有用。
这个 ACL 有什么问题?
您在此中有一个 Deny
声明,其中主体不是特定的 IAM 用户。在任何 AWS 权限中,deny will always override an allow 就是这里发生的情况。
要在此处允许此操作,您还需要在 NotPrincipal
语句中 include the IAM role arn。这看起来像下面的语句。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Public",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
},
{
"Sid": "Devs",
"Effect": "Deny",
"NotPrincipal": {
"AWS": ["arn:aws:iam::1234567890:user/DevUser", "arn:aws:iam::1234567890:role/EC2Role"]
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::my-bucket/something-privileged/*"
}
]
}