如何限制对特定IAM角色的S3存储桶的访问?

时间:2015-10-22 10:00:03

标签: amazon-web-services amazon-s3 amazon-ec2 amazon-iam

我们希望在S3上存储一些数据,并且只允许EC2实例或具有特定IAM角色的特定用户访问它们。不幸的是,我们在这方面遇到了一些麻烦。

我们就像这样设置了一个政策

{
"Version": "2012-10-17",
"Id": "SamplePolicy",
"Statement": [

    {
        "Sid": "Stmt1331136294179",
        "Effect": "Deny",
        "NotPrincipal": {
            "AWS": [
                "arn:aws:iam::our-account-number:user/the-user",

                "arn:aws:iam::our-account-number:role/the-role"
            ]
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::the-bucket/*"
    },
        {
        "Sid": "Stmt1331136364169",
        "Effect": "Allow",
        "Principal": {
            "AWS": [
                "arn:aws:iam::our-account-number:user/the-user",
                "arn:aws:iam::our-account-number:role/the-role"
            ]
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::the-bucket/*"
    }

]}

当我们使用用户密钥访问Bucket(使用boto)时,它可以在本地计算机或任何EC2实例中正常工作。

但是,当我们从Boto访问存储桶时,我们得到了

  

ClientError:调用GetObject操作时发生错误(AccessDenied):拒绝访问

我已确认该实例具有正确的IAM角色

   curl http://169.254.169.254/latest/meta-data/iam/info/
{
  "Code" : "Success",
  "LastUpdated" : "2015-10-22T09:09:31Z",
  "InstanceProfileArn" : "our-account-number:instance-profile/the-role",
  "InstanceProfileId" : "instance-rpofile-id"
}

我还尝试从存储桶中删除该策略,这确实使其可以再次访问。 任何想法如何处理这个?

我在这里分享的示例是我为调试而做的简化版本。在生产中,我们希望强制使用KMS加密对象,并在密钥上也有访问策略。我们非常喜欢这个解决方案,如果可以,我们更愿意保留它。

由于

2 个答案:

答案 0 :(得分:5)

我犯了多次这个错误涉及你的ARN

对于某些权限,你需要它在存储桶本身(没有/ *)......以及你需要它的内容。

我会尝试使用你现有的东西,只包括两者,所以像......

"Resource": ["arn:aws:s3:::the-bucket/*", "arn:aws:s3:::the-bucket"]

答案 1 :(得分:3)

这里的问题是,对于NotPrincipal,您必须提供特定的会话角色。不幸的是,在使用InstanceProfiles(或Lambda)时,此会话角色是动态的。 AWS在主要字段中不支持通配符,因此基本上不可能将NotPrincipal与InstanceProfile一起使用。

请参阅此处的AWS支持响应,该响应将其视为已知限制:https://forums.aws.amazon.com/message.jspa?messageID=740656#740656