我正在尝试使用一些 Python 代码下载一些已经上传到 S3 的文件,但尝试使用严格的策略时我感到头疼。
我可以列出存储桶中的所有文件,但是当我尝试使用我认为正确的策略下载它们时,我收到 botocore.exceptions.ClientError: An error returned (403) when call the HeadObject操作:禁止
然后,当我尝试添加适用于 2 个不同存储桶的不同策略时,我添加了存储桶名称的一部分,然后添加了星号,出于某种原因,同样的事情起作用了。
有人可以告诉我为什么会发生这种情况吗?
例如,这就像一个魅力:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1499955913000",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::THE-BEGINING-OF-THE-NAME*"
}
]
}
但这不是:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1499955913000",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::THE-EXACT-COMPLETE-FULL-NAME"
}
]
}
如果相关,我可以添加用于下载的Python代码,但是这个问题似乎足够长,而且代码非常简单
最佳答案
似乎我只需要一些橡皮鸭调试,答案是我认为违反直觉,但很简单:
ARN 似乎不仅是 AWS 资源本身的标识符,也是其内容的标识符。因此,在授予权限时,您需要授予“存储桶”列出它的权限,以及“内容”下载它的权限
这导致了这样的政策:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "Stmt1499955913000",
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::THE-EXACT-COMPLETE-FULL-NAME",
"arn:aws:s3:::THE-EXACT-COMPLETE-FULL-NAME/*"
]
}]
}
正如我所说,它可以控制存储桶本身,没有星号,以及斜杠后面的任何内容。
关于python - 为什么此 AWS IAM 策略仅适用于资源上的星号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45108097/