Bucket Policy设置常见问题

Bucket policy导致阿里云账号无权限操作Bucket

Bucket Policy中未设置条件时不会限制阿里云账号(主账号)的访问。如果在Bucket Policy中添加了条件,则阿里云账号也必须满足相应条件才能访问Bucket。设置条件前需确保阿里云账号能满足对应条件再修改Bucket Policy的权限,否则该Bucket将无法访问。请谨慎设置如下所示的Bucket Policy。

image

通过Bucket Policy授权后,仍无对应权限

  • 接口授权级别不正确

    ListObjects、GetBucketInfo等接口用于获取Bucket相关信息,接口授权的资源要授权到Bucket级别,GetObject、PutObject等接口是针对Object的操作,接口授权的资源要授权到Object级别。

    • Bucket级别资源的授权格式:acs:oss:<bucket所属地域>:<账号uid>:<bucketName>

    • object级别资源的授权格式:acs:oss:<bucket所属地域>:<账号uid>:<bucketName>/<objectName>

    其中<bucket所属地域><账号uid><bucketName><objectName>均支持通配符星号(*),请根据实际替换。

    例如以下授权是无效的,ListObjectVersionsBucket级别的操作,Resource的授权不能加/*,否则会授权到Object级别,导致该授权无效。

    {
        "Version": "1",
        "Statement": [{
            "Effect": "Allow",
            "Action": [
                "oss:ListObjectVersions"
            ],
            "Principal": [
                "209xxxxxxxxx441"
            ],
            "Resource": [
                "acs:oss:*:*:bucketName/*"
            ]
        }]
    }
  • 角色授权有固定格式,不能直接写用户ID

    当需要给RAM角色授权时,输入格式为arn:sts::{RoleOwnerUid}:assumed-role/{RoleName}/{RoleSessionName}。例如扮演的RAM角色为testrole,角色拥有者的账号UID137918634953xxxx,角色会话名称RoleSessionNametestsession。此时应填写arn:sts::137918634953xxxx:assumed-role/testrole/testsession

    当需要给所有RAM角色授权时,请使用通配符星号(*)。例如配置为arn:sts::*:*/*/*

    授权方式如下图所示,使用语法策略添加方式时可将arn:sts::*:*/*/*添加到Principal元素中。

    image

Bucket被匿名访问

当配置Principal为*的Bucket Policy时,匿名用户也会有对应操作的权限,风险较高,不建议此配置。

  • 图形策略配置示例

    使用如下图所示配置时,匿名用户也有读取Bucket文件的权限,相当于为Bucket开启公共读权限。

    image

  • 语法策略配置示例

    使用如下图所示配置时,Principal为*,即使是匿名用户也有BucketListObjectVersions权限。

    image