最小权限原则说明

最后更新时间:2020-10-09 15:43:19

    概述

    在使用 COS 时,您可能需要使用临时密钥授予用户相应的资源操作权限,或者为您的子用户或者协作者授予相应的用户策略,允许他们协助您操作 COS 上的资源,或者需要为存储桶添加相应的存储桶策略,允许指定的用户能够在您的存储桶中进行指定的操作,操作指定的资源。在进行这些权限配置的时候,请务必遵循最小权限原则,以保障您的数据资产安全。

    最小权限原则指的是,当您在授权的时候,请务必明确权限范围,需要明确授予指定用户何种条件下,执行何种操作,访问何种资源的权限。

    注意事项

    当您在授权的时候,建议严格遵循最小权限,限定用户执行受限的操作(例如授权action:GetObject),访问受限的资源(例如授权resource:examplebucket-1250000000/exampleobject.txt)。
    为避免授予过大的权限,导致预期外的越权操作,引起数据安全风险。我们强烈建议您尽量避免授予用户访问所有资源(例如resource:*),或者进行所有操作(例如action:*)的权限。

    潜在的数据安全风险举例如下:

    • 数据泄露:授予用户下载指定资源,例如下载examplebucket-1250000000/data/config.jsonexamplebucket-1250000000/video/,但如果在权限策略中配置了examplebucket-1250000000/*,将导致该存储桶下的所有对象均被允许下载,出现越权操作行为,导致预期外的数据被泄漏。
    • 数据被覆盖写:授予用户上传资源权限,例如上传examplebucket-1250000000/data/config.jsonexamplebucket-1250000000/video/,但如果在权限策略中配置了examplebucket-1250000000/*,将导致该存储桶下的所有对象均被允许上传,出现越权操作行为,导致预期外的对象被覆盖。防范该风险,除了遵循最小权限原则,您可以通过 版本控制 来保留数据的所有历史版本以便追溯。
    • 权限泄露:授予用户列出存储桶的对象列表cos:GetBucket,但如果在权限策略中配置了cos:*,将导致该存储桶的所有操作均被允许,包括对存储桶再授权、删除对象和删除存储桶,您的数据将存在巨大风险。

    使用指引

    在最小权限原则下,您需要在策略中明确指定以下信息:

    • 委托人(principal):必须明确指定您需要授予哪些子用户(需要填写用户 ID)、协作者(需要填写用户 ID)、匿名用户或者用户组权限。如果您使用临时密钥进行访问,则不需要指定此项。
    • 语句(statement):在以下几项参数中明确填写相应的参数。
      • 效力(effect):必须明确声明该策略是“允许”还是“显式拒绝”,包括 allow 和 deny 两种情况。
      • 操作(action):必须明确声明该策略允许或拒绝的操作。操作可以是单个 API 操作或者多个 API 操作的集合。
      • 资源(resource):必须明确声明该策略授权的具体资源。资源是用六段式描述。您可以指定资源范围为指定的文件,例如exampleobject.jpg,或者指定的目录,例如examplePrefix/*。除非业务需要,否则请不要随意授予用户访问所有资源的权限,即通配符*
      • 条件(condition):描述策略生效的约束条件。条件包括操作符、操作键和操作值组成。条件值可包括时间、IP 地址等信息。

    临时密钥最小权限指引

    申请临时密钥过程中,您可以通过设置权限策略 [Policy] 字段,限制操作和资源,将权限限制在指定的范围内。有关临时密钥的生成说明,可参见 临时密钥生成和使用指引 文档。

    授权示例

    使用 Java SDK 授权访问某个对象的权限

    假设需要使用 Java SDK 授权下载存储桶examplebucket-1250000000中对象exampleObject.txt的权限,则相应的需要配置代码如下:

    // 根据 github 提供的 maven 集成方法导入 java sts sdk 
    import java.util.*;
    import org.json.JSONObject; 
    import com.tencent.cloud.CosStsClient;
    
    public class Demo {
        public static void main(String[] args) {
            TreeMap<String, Object> config = new TreeMap<String, Object>();
    
            try {
                // 替换为您的 SecretId 
                config.put("SecretId", "AKIDHTVVaVR6e3");
                // 替换为您的 SecretKey
                config.put("SecretKey", "PdkhT9e2rZCfy6");
    
                // 临时密钥有效时长,单位是秒,默认1800秒,最长可设定有效期为7200秒
                config.put("durationSeconds", 1800);
    
                // 换成您的 bucket
                config.put("bucket", "examplebucket-1250000000");
                // 换成 bucket 所在地区
                config.put("region", "ap-guangzhou");
    
                // 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子:a.jpg 或者 a/* 或者 * 。
                // 如果填写了“*”,将允许用户访问所有资源;除非业务需要,否则请按照最小权限原则授予用户相应的访问权限范围。
                config.put("allowPrefix", "exampleObject.txt");
    
                // 密钥的权限列表。简单上传、表单上传和分片上传需要以下的权限,其他权限列表请看 https://intl.cloud.tencent.com/document/product/436/31923?from_cn_redirect=1
                String[] allowActions = new String[] {
                        // 下载数据
                        "name/cos:GetObject"
                };
                config.put("allowActions", allowActions);
    
                JSONObject credential = CosStsClient.getCredential(config);
                //成功返回临时密钥信息,如下打印密钥信息
                System.out.println(credential);
            } catch (Exception e) {
                //失败抛出异常
                throw new IllegalArgumentException("no valid secret !");
            }
        }
    }

    使用 API 授权访问某个对象的权限

    假设需要使用 API 授权下载存储桶examplebucket-1250000000中对象exampleObject.txt和目录为examplePrefix下所有对象的权限,则相应的需要写入的 Policy 如下:

    {
      "version": "2.0",
      "statement": [
        {
          "action": [
            "name/cos:GetObject"
          ],
          "effect": "allow",
          "resource": [
            "qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/exampleObject.txt",
            "qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/examplePrefix/*"
          ]
        }
      ]
    }

    用户策略最小权限指引

    用户策略是指在 CAM控制台 添加的用户权限策略,用于授予用户访问 COS 资源的权限。用户访问策略概述的配置说明,可参见 访问策略语言概述 文档。

    授权示例

    授予账户访问某个对象的权限

    假设需要授予账户 UIN 为100000000001,下载存储桶examplebucket-1250000000中对象exampleObject.txt的权限,则相应的访问策略为:

    {
       "version": "2.0",
       "principal": {
          "qcs": [
             "qcs::cam::uin/100000000001:uin/100000000001"
          ]
       },
        "statement": [
            {
                "action": [
                    "name/cos:GetObject"
                ],
                "effect": "allow",
                "resource": [
                    "qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000.ap-guangzhou.myqcloud.com/exampleObject.txt"
                ]
            }
        ]
    }

    授予子账户访问某个目录的权限

    假设需要授予子账户 UIN 为100000000011(主账户 UIN 为 100000000001),下载存储桶examplebucket-1250000000中目录为examplePrefix下的对象的权限,则相应的访问策略为:

    {
       "version": "2.0",
       "principal": {
          "qcs": [
             "qcs::cam::uin/100000000001:uin/100000000011"
          ]
       },
        "statement": [
            {
                "action": [
                    "name/cos:GetObject"
                ],
                "effect": "allow",
                "resource": [
                    "qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000.ap-guangzhou.myqcloud.com/examplePrefix/*"
                ]
            }
        ]
    }

    存储桶策略最小权限指引

    存储桶策略是指在存储桶中配置的访问策略,允许指定用户对存储桶及桶内的资源进行指定的操作。配置存储桶策略可参见 添加存储桶策略 文档。

    授权示例

    授予子账号访问特定对象的权限

    假设需要授予子账户 UIN 为100000000011(主账户 UIN 为 100000000001),下载存储桶examplebucket-1250000000中的对象exampleObject.txt和目录examplePrefix下所有对象的权限,则相应的访问策略为:

    {
      "Statement": [
        {
          "Action": [
            "name/cos:GetObject"
          ],
          "Effect": "allow",
          "Principal": {
            "qcs": [
              "qcs::cam::uin/100000000001:uin/100000000011"
            ]
          },
          "Resource": [
            "qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/exampleObject.txt",
            "qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/examplePrefix/*"
          ]
        }
      ],
      "version": "2.0"
    }

    Was this page helpful?

    本页内容是否解决了您的问题?

    • 完全没帮助
    • 文档较差
    • 文档一般
    • 文档不错
    • 文档很好
    反馈
    帮助