You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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错误。

另外还有两个小细节需要修正:

  1. MinIO中IAM用户的ARN格式应该是arn:aws:iam:::user/user1,你写的arn:aws:iam:::user1少了user/前缀,会导致后续匹配失败;
  2. 如果只是想给特定用户授权,直接指定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

火山引擎 最新活动