0003-00000301

更新时间:
复制 MD 格式

问题描述

请求被STS Token Policy所拒绝。

问题原因

该报错是获取STS Token代码中的Policy参数的授权问题导致。

问题示例

比如下面Java获取Token的Demo代码所示,其中的Policy设置代表Token的Policy权限设置,最终的Token权限是用户角色的授权和代码中Policy权限的交集:

String roleSessionName = "<session-name>";
String policy = "{\n" +
        "    \"Version\": \"1\", \n" +
        "    \"Statement\": [\n" +
        "        {\n" +
        "            \"Action\": [\n" +
        "                \"oss:*\"\n" +
        "            ], \n" +
        "            \"Resource\": [\n" +
        "                \"acs:oss:*:*:*\" \n" +
        "            ], \n" +
        "            \"Effect\": \"Allow\"\n" +
        "        }\n" +
        "    ]\n" +
        "}";
try {
    // 添加endpoint (直接使用STS endpoint, 前两个参数留空, 无需添加region ID)
    DefaultProfile.addEndpoint("", "", "Sts", endpoint);
    // 构造default profile (参数留空, 无需添加region ID)
    IClientProfile profile = DefaultProfile.getProfile("", accessKeyId, accessKeySecret);
    // 用profile构造client
    DefaultAcsClient client = new DefaultAcsClient(profile);
    final AssumeRoleRequest request = new AssumeRoleRequest();
    request.setMethod(MethodType.POST);
    request.setRoleArn(roleArn);
    request.setRoleSessionName(roleSessionName);
    request.setPolicy(policy); // 若policy为空,则用户将获得该角色下所有权限
    request.setDurationSeconds(1000L); // 设置凭证有效时间

解决方案

请结合您调用的OSS接口,检查您代码中Policy参数的授权策略,排查Policy中的授权是否正确。更多信息,请参见使用STS临时访问凭证访问OSS。其中临时访问凭证最终获取的权限是步骤四:为角色授予上传文件的权限设置的角色权限和步骤五:获取临时访问凭证中Policy设置权限的交集。请通过以下示例检查您在这两个步骤中设置的权限交集。

  • 示例一

    步骤四设置的角色权限为AliyunOSSFullAccess系统权限,步骤五Policy中设置了oss:PutObject权限,则临时访问凭证最终获取的权限为oss:PutObject,即仅支持执行向指定Bucket上传文件的操作。

  • 示例二

    步骤四设置的角色权限为oss:PutObject系统权限,步骤五Policy中设置了oss:GetObject权限,则临时访问凭证最终未获取任何权限,即无法向指定Bucket执行任何操作。