RAM Policy

更新时间:
复制 MD 格式

RAM Policy是附加在RAM身份(用户、用户组、角色)上的授权策略。当需要管理RAM用户或角色对OSS资源的访问权限时,可通过RAM Policy定义该身份可以执行的操作和可以访问的资源范围。

工作原理

RAM Policy采用基于身份的授权模式,策略附加在RAM用户、用户组或RAM角色上,定义该身份在满足哪些条件(Condition)时,可对哪些资源(Resource)执行哪些操作(Action)。

RAM身份发起访问请求时,OSS会综合评估所有相关策略(包括RAM Policy和Bucket Policy),权限判定遵循显式拒绝优先原则:

  1. 显式拒绝优先 :任何策略中存在匹配请求的Deny规则,请求立即被拒绝 。

  2. 寻找显式允许 :不存在Deny规则时,若存在匹配的Allow规则,请求被允许 。

  3. 默认拒绝 :既无Deny也无Allow,请求默认被拒绝 。

OSS支持两种RAM Policy类型:系统策略由阿里云预置,用户只能使用不能修改;自定义策略由用户自行创建和维护,提供更灵活的权限配置。

授权系统权限策略

系统权限策略由阿里云创建,可在RAM控制台直接为用户身份授权。以下以RAM用户为例演示授权步骤。

  1. 前往RAM用户列表,单击目标用户操作列的添加权限。

  2. 在新增授权面板中,资源范围默认选中账号级别。如需授权到指定资源组,选择资源组级别。

  3. 在搜索框中输入系统策略名称,勾选目标系统策略。OSS支持以下两种系统策略:

  4. 单击确认新增授权,完成权限设置。

授权自定义权限策略

自定义策略由用户自主创建和维护,授权自定义权限策略时,需先创建自定义权限策略,再为对应的用户身份进行授权。

步骤一:创建自定义权限策略

  1. 前往权限策略列表,单击创建权限策略。

  2. 选择脚本编辑,在编辑框内输入JSON格式的授权策略。可使用RAM Policy Editor快速生成授权策略。

    示例授权策略:允许对example-bucket及该Bucket内所有资源的全部操作。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "oss:*",
          "Resource": [
            "acs:oss:*:*:example-bucket",
            "acs:oss:*:*:example-bucket/*"
          ]
        }
      ]
    }

    完整的授权策略包含Version(版本号)和Statement(授权语句)。

    • Version:权限策略版本,固定为1,不允许修改。

    • Statement:策略语句的主体,包含一条或多条具体的授权/拒绝规则。每条授权语句包含Effect(授权效力)、Action(授权操作)、Resource(授权资源)和Condition(授权条件)。

      策略元素

      说明

      Effect

      策略的效力,可选值为Allow(允许)或Deny(拒绝)。

      Action

      对资源执行的具体操作,支持使用通配符*。

      Resource

      策略作用的资源范围。

      Condition

      策略生效的条件。

      当配置多个条件时,所有条件必须同时满足(AND关系),策略才会生效。

      完整的授权元素列表请参见授权语法与元素。

  3. 单击确定,输入策略名称,然后单击确定,完成自定义策略创建。

步骤二:为用户身份进行授权

创建自定义权限策略后,需要将自定义策略授权给目标用户身份。以下以RAM用户为例演示授权步骤。

  1. 前往RAM用户列表,单击目标用户操作列的添加权限。

  2. 在搜索框中输入自定义策略名称,勾选目标策略。

  3. 单击确认新增授权,完成权限设置。

常见授权场景

以下场景展示了RAM Policy在实际业务中的典型应用,涵盖权限授予、访问限制和安全控制等多种需求。每个场景提供完整的策略配置示例,可根据实际需求修改其中的Bucket名称、目录路径等参数后直接使用。

场景1:授予RAM用户对某个Bucket的完全控制权限

以下示例为授予RAM用户对名为mybucket的Bucket拥有完全控制的权限。

重要

对于移动应用来说,授予用户对Bucket的完全控制权限存在极高风险,应尽量避免。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "oss:*",
      "Resource": [
        "acs:oss:*:*:mybucket",
        "acs:oss:*:*:mybucket/*"
      ]
    }
  ]
}

场景2:禁止RAM用户删除某个Bucket下匹配特定模式文件的权限

以下示例为禁止RAM用户删除名为mybucket的Bucket下前缀为abc且格式为.txt的所有文件。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "oss:DeleteObject"
      ],
      "Resource": [
        "acs:oss:*:*:mybucket/abc*.txt"
      ]
    }
  ]
}

场景3:授予RAM用户列举并读取某个Bucket下所有资源的权限

  • 以下示例为授予RAM用户通过OSS SDK或OSS命令行工具列举并读取名为mybucket的Bucket下所有资源的权限。

    说明

    ListObjects操作(Action)必须以整个Bucket作为Resource。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "oss:ListObjects",
          "Resource": "acs:oss:*:*:mybucket"
        },
        {
          "Effect": "Allow",
          "Action": "oss:GetObject",
          "Resource": "acs:oss:*:*:mybucket/*"
        }
      ]
    }
  • 以下示例为授予RAM用户通过OSS控制台列举并读取名为mybucket的Bucket下所有资源的权限。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "oss:ListBuckets",
            "oss:GetBucketStat",
            "oss:GetBucketInfo",
            "oss:GetBucketTagging",
            "oss:GetBucketLifecycle",
            "oss:GetBucketWorm",                      
            "oss:GetBucketVersioning", 
            "oss:GetBucketAcl" 
          ],    
          "Resource": "acs:oss:*:*:*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "oss:ListObjects",
            "oss:GetBucketAcl"
          ],
          "Resource": "acs:oss:*:*:mybucket"
        },
        {
          "Effect": "Allow",
          "Action": [
            "oss:GetObject",
            "oss:GetObjectAcl"
          ],
          "Resource": "acs:oss:*:*:mybucket/*"
        }
      ]
    }

场景4:禁止RAM用户删除某个Bucket的权限

以下示例用于禁止RAM用户删除名为mybucket的Bucket的权限。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "oss:*",
      "Resource": [
        "acs:oss:*:*:mybucket",
        "acs:oss:*:*:mybucket/*"
      ]
    },
    {
      "Effect": "Deny",
      "Action": [
        "oss:DeleteBucket"
      ],
      "Resource": [
        "acs:oss:*:*:mybucket"
      ]
    }
  ]
}

场景5:授予RAM用户仅上传和删除文件但不允许删除Bucket的权限

以下示例用于授予RAM用户对名为mybucket的Bucket仅拥有上传和删除文件(包括删除对象版本)的权限,但禁止删除该Bucket本身。与场景4使用oss:*宽泛授权不同,本场景精确指定允许的操作,符合最小权限原则。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "oss:PutObject",
        "oss:DeleteObject",
        "oss:DeleteObjectVersion"
      ],
      "Resource": [
        "acs:oss:*:*:mybucket/*"
      ]
    },
    {
      "Effect": "Deny",
      "Action": [
        "oss:DeleteBucket"
      ],
      "Resource": [
        "acs:oss:*:*:mybucket"
      ]
    }
  ]
}
说明

同一策略中Deny语句优先于Allow生效,因此RAM用户在拥有oss:PutObject、oss:DeleteObject、oss:DeleteObjectVersion权限的同时,oss:DeleteBucket操作会被明确拒绝。

场景6:授予RAM用户访问某个Bucket下多个目录的权限

假设用于存放照片的Bucket为mybucket,该Bucket下有一些目录,代表照片的拍摄地,每个拍摄地目录下还包含年份子目录。

mybucket[Bucket]
  ├── beijing
  │   ├── 2014
  │   └── 2015
  └── hangzhou
      ├── 2014
      └── 2015 

需要授予RAM用户访问mybucket/hangzhou/2014/和mybucket/hangzhou/2015/目录的只读权限。目录级别的授权属于授权的高级功能,根据使用场景不同,授权策略的复杂程度也不同,以下几种场景可供参考。

  • 授予RAM用户仅拥有读取目录mybucket/hangzhou/2014/和mybucket/hangzhou/2015/中文件内容的权限。

    由于RAM用户知道文件的完整路径,建议直接使用完整的文件路径来读取目录下的文件内容。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "oss:GetObject"
          ],
          "Resource": [
            "acs:oss:*:*:mybucket/hangzhou/2014/*",
            "acs:oss:*:*:mybucket/hangzhou/2015/*"
          ]
        }
      ]
    }
  • 授予RAM用户使用OSS命令行工具访问目录mybucket/hangzhou/2014/和mybucket/hangzhou/2015/并列举目录中文件的权限。

    RAM用户不清楚目录中有哪些文件,可使用OSS命令行工具或API直接获取目录信息,此场景下需要添加ListObjects权限。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "oss:GetObject"
          ],
          "Resource": [
            "acs:oss:*:*:mybucket/hangzhou/2014/*",
            "acs:oss:*:*:mybucket/hangzhou/2015/*"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "oss:ListObjects"
          ],
          "Resource": [
            "acs:oss:*:*:mybucket"
          ],
          "Condition":{
            "StringLike":{
              "oss:Prefix": [
                "hangzhou/2014/*",
                "hangzhou/2015/*"
              ]
            }
          }
        }
      ]
    }
  • 授予RAM用户使用OSS控制台访问目录的权限。

    使用OSS控制台访问目录mybucket/hangzhou/2014/和mybucket/hangzhou/2015/时,RAM用户可从根目录开始,逐层进入要访问的目录。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "oss:ListBuckets",
            "oss:GetBucketStat",
            "oss:GetBucketInfo",
            "oss:GetBucketTagging",
            "oss:GetBucketLifecycle",
            "oss:GetBucketWorm",                      
            "oss:GetBucketVersioning", 
            "oss:GetBucketAcl" 
          ], 
          "Resource": [
            "acs:oss:*:*:*"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "oss:GetObject",
            "oss:GetObjectAcl"
          ],
          "Resource": [
            "acs:oss:*:*:mybucket/hangzhou/2014/*",
            "acs:oss:*:*:mybucket/hangzhou/2015/*"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "oss:ListObjects"
          ],
          "Resource": [
            "acs:oss:*:*:mybucket"
          ],
          "Condition": {
            "StringLike": {
              "oss:Delimiter": "/",
              "oss:Prefix": [
                "",
                "hangzhou/",
                "hangzhou/2014/*",
                "hangzhou/2015/*"
              ]
            }
          }
        }
      ]
    }

场景7:禁止RAM用户删除某个Bucket下任意文件的权限

以下示例用于禁止RAM用户删除名为mybucket的存储空间下任意文件的权限。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "oss:DeleteObject"
      ],
      "Resource": [
        "acs:oss:*:*:mybucket/*"
      ]
    }
  ]
}

场景8:禁止RAM用户访问指定标签Object的权限

以下为添加Deny策略,用于禁止RAM用户访问存储空间examplebucket下对象标签为status:ok以及key1:value1的Object的权限。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "oss:GetObject"
      ],
      "Resource": [
        "acs:oss:*:174649585760xxxx:examplebucket/*"
      ],
      "Condition": {
        "StringEquals": {
          "oss:ExistingObjectTag/status":"ok",
          "oss:ExistingObjectTag/key1":"value1"
        }
      }
    }
  ]
}

场景9:授予RAM用户通过特定的IP地址访问OSS的权限

  • 在Allow授权中增加IP地址限制。

    以下示例为在Allow授权中增加IP地址限制,授予RAM用户仅允许通过192.168.0.0/16和198.51.100.0/24两个IP地址段读取名为mybucket的Bucket下所有资源的权限。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "oss:ListBuckets",
            "oss:GetBucketStat",
            "oss:GetBucketInfo",
            "oss:GetBucketTagging",
            "oss:GetBucketAcl" 
          ], 
          "Resource": [
            "acs:oss:*:*:*"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "oss:ListObjects",
            "oss:GetObject"
          ],
          "Resource": [
            "acs:oss:*:*:mybucket",
            "acs:oss:*:*:mybucket/*"
          ],
          "Condition":{
            "IpAddress": {
              "acs:SourceIp": ["192.168.0.0/16", "198.51.100.0/24"]
            },
            "StringNotLike": {
              "acs:SourceVpc": [
                "vpc-*"
              ]
            }
          }
        }
      ]
    }
  • 在Deny授权中增加IP地址限制。

    以下示例为在Deny授权中增加IP地址限制,禁止源IP地址不在192.168.0.0/16范围内的RAM用户对OSS执行任何操作。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "oss:ListBuckets",
            "oss:GetBucketStat",
            "oss:GetBucketInfo",
            "oss:GetBucketTagging",
            "oss:GetBucketAcl" 
          ], 
          "Resource": [
            "acs:oss:*:*:*"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "oss:ListObjects",
            "oss:GetObject"
          ],
          "Resource": [
            "acs:oss:*:*:mybucket",
            "acs:oss:*:*:mybucket/*"
          ]
        },
        {
          "Effect": "Deny",
          "Action": "oss:*",
          "Resource": [
            "acs:oss:*:*:*"
          ],
          "Condition":{
            "NotIpAddress": {
              "acs:SourceIp": ["192.168.0.0/16"]
            },
            "StringLike": {
              "acs:SourceVpc": [
                "*"
              ]
            }
          }
        }
      ]
    }
    说明

    由于权限策略的鉴权规则是Deny优先,所以访问者从192.168.0.0/16以外的IP地址访问mybucket中的内容时,OSS会提示没有权限。

场景10:通过RAM或STS服务向其他用户授权

通过RAM或STS服务授予IP地址为192.168.0.1的用户使用Java SDK客户端执行以下操作。

  • 列举mybucket中以foo为前缀的对象。

  • 允许向mybucket中上传、下载和删除以file开头的对象。

{
  "Version": "1",
  "Statement": [{
    "Action": [
      "oss:GetBucketAcl",
      "oss:ListObjects"
    ],
    "Resource": [
      "acs:oss:*:177530505652xxxx:mybucket"
    ],
    "Effect": "Allow",
    "Condition": {
      "StringLike": {
        "acs:UserAgent": "*java-sdk*",
        "oss:Prefix": "foo"
      },
      "IpAddress": {
        "acs:SourceIp": "192.168.0.1"
      },
      "StringNotLike": {
        "acs:SourceVpc": [
          "vpc-*"
        ]
      }
    }
  },
    {
      "Action": [
        "oss:PutObject",
        "oss:GetObject",
        "oss:DeleteObject"
      ],
      "Resource": [
        "acs:oss:*:177530505652xxxx:mybucket/file*"
      ],
      "Effect": "Allow",
      "Condition": {
        "StringEquals": {
          "acs:UserAgent": "java-sdk"
        },
        "IpAddress": {
          "acs:SourceIp": "192.168.0.1"
        },
        "StringNotLike": {
          "acs:SourceVpc": [
            "vpc-*"
          ]
        }
      }
    }
  ]
}

场景11:禁止将 Bucket 和 Object 的 ACL 设置为公共访问

以下示例用于禁止将Bucket和Object的ACL设置为公共访问,保障OSS数据安全。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "oss:PutBucket",
        "oss:PutBucketAcl"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "oss:x-oss-acl": "private"
        }
      }
    },
    {
      "Effect": "Deny",
      "Action": [
        "oss:PutObject",
        "oss:PutObjectAcl"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "oss:x-oss-object-acl": [
            "private",
            "default"
          ]
        }
      }
    }
  ]
}

场景12:授予RAM用户使用IMM相关功能的权限

以下RAM Policy用于授予RAM用户使用IMM文档处理的权限。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "oss:GetObject",
        "oss:PutObject",
        "oss:PostProcessTask",
        "oss:ProcessImm"
      ],
      "Resource": "*"
    },
    {
      "Action": [
        "imm:CreateOfficeConversionTask",
        "imm:GetWebofficeURL"
      ],
      "Resource": "*",
      "Effect": "Allow"
    },
    {
      "Effect": "Allow",
      "Action": "ram:PassRole",
      "Resource": "acs:ram:*:*:role/aliyunimmdefaultrole"
    }
  ]
}

场景13:授予RAM用户转换存储冗余类型的权限

  • 授予RAM用户转换某个Bucket存储冗余类型的权限。

    以下示例为RAM用户授予转换mybucket的存储冗余类型的权限。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "oss:CreateBucketDataRedundancyTransition",
            "oss:GetBucketDataRedundancyTransition",
            "oss:ListBucketDataRedundancyTransition",
            "oss:DeleteBucketDataRedundancyTransition"
          ],
          "Resource": "acs:oss:*:*:mybucket"
        }
      ]
    }
  • 授予RAM用户转换所有Bucket存储冗余类型的权限。

    重要

    以下示例会授予RAM用户转换阿里云账号下所有Bucket的存储冗余类型的权限,请谨慎操作。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "oss:CreateBucketDataRedundancyTransition",
            "oss:GetBucketDataRedundancyTransition",
            "oss:ListBucketDataRedundancyTransition",
            "oss:DeleteBucketDataRedundancyTransition"
          ],
          "Resource": "acs:oss:*:*:*"
        }
      ]
    }

场景14:授予RAM用户创建OSS资源包、预留空间、无地域属性预留空间订单的权限

以下RAM Policy用于授予RAM用户创建OSS资源包、预留空间、无地域属性预留空间订单的权限。

重要

RAM用户创建OSS资源包、预留空间、无地域属性预留空间订单后,可联系云账号拥有者完成订单支付。如果要使RAM用户能够完成OSS资源包订单支付,云账号拥有者需要授予RAM用户支付订单的权限bss:PayOrder。bss:PayOrder属于高危权限,涉及资金操作,非必要请勿授予。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "oss:CreateOrder",
      "Resource": "acs:oss:*:*:*"
    }
  ]
}

场景15:授予RAM用户开通OSS的权限

以下RAM Policy用于授予RAM用户开通OSS的权限。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "oss:ActivateProduct",
      "Resource": "acs:oss:*:*:*"
    }
  ]
}

场景16:授予RAM用户读写指定标签Bucket数据的权限

以下RAM Policy用于授予RAM用户读写指定标签Bucket数据的权限,标签键为key1,标签值为value1。

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "oss:ListBuckets",
        "oss:GetBucketStat",
        "oss:GetBucketInfo",
        "oss:GetBucketAcl",
        "oss:ListObjects",
        "oss:PutObject",
        "oss:GetObject"
      ],
      "Resource": [
        "acs:oss:*:*:*"
      ],
      "Effect": "Allow",
      "Condition": {
        "StringEquals": {
          "oss:BucketTag/key1": "value1"
        }
      }
    }
  ]
}
说明

策略生效后,RAM用户仅能对带有标签key1=value1的OSS Bucket执行指定操作。不同访问方式的行为特性如下:

  • 通过OSS SDK或ossutil发起ListBuckets请求时,需添加标签过滤参数(如tag-key=key1,tag-value=value1)。策略配置正确时,返回结果仅包含符合指定标签条件的Bucket。

  • 通过OSS控制台发起ListBuckets请求时,由于控制台无法附加标签参数,请求将因不满足策略条件限制(oss:BucketTag/key1=value1)而被拒绝,系统提示权限不足。

  • 其他操作(如PutObject、GetObject等)同样受标签条件限制,操作的目标Bucket必须满足key1=value1的标签要求。

场景 17:授予 RAM 用户仅写权限(oss:PutObject)

以下 RAM Policy 用于授予 RAM 用户向 OSS 上传文件,但不允许读取或列举 Bucket 及 Object 的权限。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "oss:PutObject",
      "Resource": "acs:oss:*:*:*"
    }
  ]
}

将该策略授予 RAM 用户后,RAM 用户可通过 ossutil 或 SDK 上传文件,但无法使用 ls 列举 Bucket 或 cp 下载文件,这两类请求会返回 403 AccessDenied,属于策略生效的预期表现。如果只需授予对指定 Bucket 的仅写权限,可将 Resource 收紧为 acs:oss:*:*:{bucket-name}/*;请勿使用 acs:oss:*:*:/*,该写法不是有效的 Resource 格式,无法通过授权校验。

该策略可单独授予 RAM 用户,也可单独授予 RAM 角色,不需要同时对两者授权。如果通过 STS 临时凭证访问 OSS,RAM 用户最终获得的权限是 RAM 角色权限与 STS 会话策略的交集,此时可以直接为 RAM 角色授予该仅写权限策略。

应用于生产环境

在配置RAM Policy和管理RAM身份时,遵循以下安全最佳实践,可有效降低数据泄露风险并确保权限管控的精确性:

  • 遵循最小权限原则:始终只授予执行任务所必需的最小权限集。避免使用oss:*这样宽泛的授权,除非绝对必要。通过最小权限原则可减少潜在的攻击面,降低权限滥用和误操作风险。

  • 使用RAM角色和STS临时凭证:对于应用程序,尤其是部署在ECS或容器中的应用,建议使用RAM角色并获取STS临时凭证来访问OSS。相比长期AccessKey,临时凭证具备自动过期机制,避免将长期AccessKey硬编码在代码或配置文件中,显著降低了AK泄露的风险。

  • 人员用户与程序用户分离:为不同的人员和应用程序创建独立的RAM用户,实现身份管理的专业化和权限的精细控制。

    • 人员用户:设置控制台访问,使用账号和密码访问云产品控制台,推荐开启MFA多因素认证。

    • 程序用户:设置使用永久AccessKey访问,通过访问密钥调用API访问云资源。

  • AccessKey安全管理:

    • 不要把RAM用户的AccessKey ID和AccessKey Secret保存在工程代码中,否则可能导致AK泄露。

    • 建议使用STS或环境变量等方式获取访问授权。

    • 定期轮换AccessKey。

  • RAM角色安全建议:

    • 创建RAM角色后,请勿随意变更RAM角色的可信实体,避免影响业务或带来过度授权风险。

    • 设置合理的STS Token有效期,避免有效期过长带来安全风险。

  • 定期审计权限:定期检查并清理不再需要的RAM用户和权限策略,确保权限与当前业务需求保持一致。

  • 利用Condition加强安全:在策略中添加Condition,例如限制源IP或VPC,通过多维度条件约束为数据访问增加额外的安全防线。

    重要

    配置RAM Policy时,请结合自身的网络接入架构进行配置。建议同时配置acs:SourceIp和acs:SourceVpc条件,实现双重访问控制。单一条件可能存在安全盲区,例如仅限制公网IP时,VPC可通过公网私用方式以匹配的出口IP访问,造成越权。

策略未生效排查

配置 RAM 自定义策略后,如果 OSS 访问请求仍然失败,可参考以下常见原因逐步排查。

显式 Deny 规则覆盖 Allow

症状:RAM Policy 中已配置 Allow 语句,但请求仍返回 AccessDenied 错误。

排查步骤:

  1. 前往RAM 用户列表,单击目标用户,在权限标签页查看该身份已绑定的所有策略(含系统策略和自定义策略)。

  2. 逐一检查各策略,查找 Effect: Deny 的语句,重点关注 Action 包含通配符(如 oss:*)或覆盖目标操作的规则。

  3. 如账号层面启用了服务控制策略(SCP),同时检查 SCP 中是否有 Deny 规则命中该请求。

解决方法:删除不必要的 Deny 语句,或缩小 Deny 规则的 Resource 和 Condition 范围,避免误拦截已 Allow 的合法请求。RAM Policy 遵循显式拒绝优先原则:任意一条 Deny 规则命中请求,访问即被拒绝,与同策略或其他策略中的 Allow 规则无关。

Resource ARN 格式不正确

症状:GetObject、PutObject 等对象级操作返回权限不足;或 ListObjects 等 Bucket 级操作失败;两类操作需分别配置 Resource。

排查步骤:

  1. 检查策略中的 Resource 字段,确认 Bucket 级资源(acs:oss:*:*:bucketname)和 Object 级资源(acs:oss:*:*:bucketname/*)是否均已包含。

  2. 确认账号 ID 填写正确。如果使用了 * 匹配所有账号,确认这符合预期授权范围。

  3. 对于目录级授权,确认使用了正确的前缀通配符(如 acs:oss:*:*:mybucket/dir/*),而非将目录路径写入 Resource 但遗漏了 ListObjects 所需的 Bucket 级资源。

解决方法:需要同时授权 Bucket 级和 Object 级操作时,在同一策略中分别配置两类 Resource:

{
  "Effect": "Allow",
  "Action": ["oss:ListObjects", "oss:GetBucketInfo"],
  "Resource": "acs:oss:*:*:mybucket"
},
{
  "Effect": "Allow",
  "Action": ["oss:GetObject", "oss:PutObject"],
  "Resource": "acs:oss:*:*:mybucket/*"
}

策略未附加到正确 RAM 身份

症状:创建或修改策略后权限未生效,RAM 用户或角色的实际访问行为未发生变化。

排查步骤:

  1. 前往权限策略列表,找到目标策略,单击绑定用户查看当前已绑定的身份列表,确认目标用户或角色在列表中。

  2. 如果通过用户组授权,前往RAM 用户组列表确认:该 RAM 用户已加入对应用户组,且用户组已绑定目标策略。

  3. 如果使用 RAM 角色,确认应用程序或用户扮演的是已绑定目标策略的正确角色,而非其他角色。

解决方法:在目标用户的权限标签页单击新增授权,将目标策略附加给该 RAM 身份后重新测试。

Condition 条件不匹配

症状:策略中包含 Condition(如 IP 限制、VPC 限制、时间窗口限制),部分来源或时间段的请求意外被拒绝。

排查步骤:

  1. 查看策略中的 Condition 配置,核对使用的条件键(如 acs:SourceIp、acs:SourceVpc、oss:Prefix)及对应的匹配值。

  2. 确认发起请求的客户端实际 IP、VPC ID 或其他属性是否满足 Condition 要求。

  3. 注意 acs:SourceIp 和 acs:SourceVpc 通常需要同时配置才能避免安全盲区:仅限制公网 IP 时,VPC 内的请求可能通过公网出口以匹配的 IP 绕过限制;详见应用于生产环境中的安全建议。

解决方法:根据实际网络接入架构调整 Condition 字段。如需定位问题,可临时移除 Condition 以验证策略基础 Allow 是否正常,再逐步添加条件约束并验证。

Action 名称拼写错误或不完整

症状:已配置对应操作的 Allow,但请求仍返回 AccessDenied;或通过 OSS 控制台可以正常访问,但 SDK 或 API 调用失败(或反之)。

排查步骤:

  1. 核对策略中每条 Action 的名称,注意大小写(OSS Action 区分大小写,正确格式如 oss:GetObject,而非 oss:getobject)。

  2. 通过 OSS 控制台操作通常需要同时授权多个 Action(如 oss:ListBuckets、oss:GetBucketStat、oss:GetBucketInfo、oss:GetBucketAcl 等),检查是否有遗漏。

  3. 参考OSS 支持的 RAM 授权元素确认所需操作的完整名称及适用场景。

解决方法:修正拼写错误的 Action 名称,并按实际使用场景(控制台、SDK 或 API)补充所需的完整 Action 集合。

Bucket Policy 与 RAM Policy 交叉影响

症状:RAM Policy 已授权目标操作,但访问特定 Bucket 时仍被拒绝;或移除 RAM Policy 后访问行为未改变。

排查步骤:

  1. 前往 OSS 控制台,进入目标 Bucket,选择权限控制 > Bucket Policy,查看是否存在覆盖当前身份的 Deny 规则。

  2. 根据显式拒绝优先原则,Bucket Policy 中的 Deny 规则与 RAM Policy 中的 Allow 之间同样遵循 Deny 优先——即使 RAM Policy 已授权该操作,只要 Bucket Policy 中有匹配的 Deny 规则,请求仍会被拒绝。

  3. 检查 Bucket 的访问控制列表(ACL)设置。对于 private ACL 的 Bucket,所有访问均需通过 RAM Policy 或 Bucket Policy 明确授权;Bucket 级 ACL 为 public-read 或 public-read-write 时,匿名用户也可访问,需注意数据安全风险。

解决方法:综合梳理 RAM Policy 和 Bucket Policy,确认两者不冲突。如需 RAM Policy 的 Allow 生效,调整或删除 Bucket Policy 中对应的 Deny 规则,或将相关授权统一收归 RAM Policy 管理。

相关文档