首页 > 解决方案 > 允许基于 EC2 角色的 S3 存储桶操作

问题描述

我们的 EC2 使用 IAM 角色进行保护。当尝试运行aws s3 cp我看到的 AWS 控制台命令时:

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/*"
        },
    ]
}

如您所见,我们希望公众通常能够获取我们链接到的对象。这行得通。

我们希望开发人员能够使用他们的 AWS 密钥访问存储桶中的特定隐藏文件夹。这行得通。

我们希望 EC2 能够仅使用分配的安全角色在同一个隐藏文件夹上运行 aws-cli 命令。这不起作用。

我也尝试"Effect": "Deny", "NotPrincipal": { ... }过 EC2 声明,但也没有用。

这个 ACL 有什么问题?

标签: amazon-web-servicesamazon-s3amazon-iamacl

解决方案


您有一个Deny声明,其中委托人不是特定的 IAM 用户。在任何 AWS 特权中,拒绝总是会覆盖允许,这就是这里发生的情况。

要在此处允许此操作,您还需要在语句中包含 IAM 角色 arn 。NotPrincipal这看起来像下面的语句。

{
    "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/*"
        }
    ]
}

推荐阅读