允许基于 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 命令。这不起作用。

我也在 E​​C2 语句上尝试了 "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/*"
        }
    ]
}