我们希望在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): 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对对象进行加密,并对密钥设置访问策略。我们非常喜欢这个解决方案,如果可以的话,我们更愿意保留它。
谢谢
我犯过很多次关于ARN的错误
对于某些权限,您需要在bucket本身(no/*)…和一些你需要的内容。
我会尝试使用你目前拥有的,只包括两者,所以像…
"Resource": ["arn:aws:s3:::the-bucket/*", "arn:aws:s3:::the-bucket"]
这里的问题是,对于NotPrincipal,您必须提供特定的会话角色。不幸的是,当使用InstanceProfiles(或Lambda)时,这个会话角色是动态的。AWS不支持主体字段中的通配符,因此基本上不可能在InstanceProfile中使用NotPrincipal。
请参阅此处的AWS支持响应,其中承认这是一个已知的限制:https://forums.aws.amazon.com/message.jspa?messageID=740656#740656