MinIO中通过Bucket Level Policy为IAM用户授权时遭遇MalformedPolicy错误的问题排查
MinIO中通过Bucket Level Policy为IAM用户授权时遭遇MalformedPolicy错误的问题排查
问题描述
我在MinIO环境里有个名为bucket的存储桶,还有个叫user1的IAM用户,想通过Bucket Level Policy给这个用户授权存储桶的全量访问权限。我用了下面的boto3代码:
client = boto3.client('s3', endpoint_url='localhost:9000') client.put_bucket_policy(Bucket=bucket_name, Policy=bucket_policy)
对应的Policy内容是:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": "*", "Condition": { "StringLike": { "arn:aws:iam": [ "arn:aws:iam:::user1", ] } }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket", "arn:aws:s3:::bucket/*" ] } ] }
但执行后直接报错了:
ClientError: An error occurred (MalformedPolicy) when calling the PutBucketPolicy operation: invalid condition key 'arn:aws:iam'
错误原因
你这里的问题出在Condition部分用了一个不存在的条件键——arn:aws:iam,这个键并不是MinIO(或AWS S3兼容)Policy规范里合法的条件键,所以MinIO无法识别,直接返回了MalformedPolicy错误。
另外还有两个小细节需要修正:
- MinIO中IAM用户的ARN格式应该是
arn:aws:iam:::user/user1,你写的arn:aws:iam:::user1少了user/前缀,会导致后续匹配失败; - 如果只是想给特定用户授权,直接指定Principal比用Condition限制更简洁直观。
修正后的解决方案
这里提供两种可行的修正方式,你可以根据需求选择:
方式一:直接指定目标用户为Principal(推荐)
这种方式更直接,也符合Policy的常规写法:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam:::user/user1" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket", "arn:aws:s3:::bucket/*" ] } ] }
把这个Policy替换到你的代码里,执行后就能给user1授予bucket存储桶的全量操作权限了。
方式二:使用合法的Condition条件键(如果必须用Condition)
如果你一定要通过Condition来限制访问,需要用aws:PrincipalArn这个合法的条件键,写法如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": "*", "Condition": { "StringEquals": { "aws:PrincipalArn": "arn:aws:iam:::user/user1" } }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket", "arn:aws:s3:::bucket/*" ] } ] }
这里通过aws:PrincipalArn条件键匹配请求发起者的ARN,同样能实现只允许user1访问存储桶的效果。
备注:内容来源于stack exchange,提问作者RuS




