教程示例:基于RAM Policy实现某个用户仅通过HTTPS方式访问OSS资源

更新时间: 2023-07-11 17:23:26

OSS支持用户使用HTTPS和HTTP协议访问OSS的Bucket资源,但由于HTTP访问存在安全漏洞,为防止OSS遭受攻击,需要使用HTTPS方式访问OSS资源,并且拒绝HTTP访问请求。本文主要介绍如何通过RAM Policy实现限制某个用户、角色通过HTTPS方式访问OSS资源。

背景信息

OSS可以通过RAM Policy方式实现限制某个用户、角色通过HTTPS协议访问指定的Bucket和对象。但是RAM Policy是基于用户的授权策略,只能针对用户授权,无法对资源(Bucket或者对象)进行授权,拒绝所有用户的HTTP请求。

操作步骤

  1. 登录访问控制控制台

    如果您使用RAM用户登录,请确保RAM用户已被阿里云账号授予AliyunOSSFullAccess、 AliyunRAMFullAccess、AliyunSTSAssumeRoleAccess权限。关于如何为RAM用户授权,请参见为为RAM用户授权

  2. 使用Secure Transport参数生成RAM Policy,以实现拒绝指定的用户通过HTTP方式访问Bucket。请参见创建自定义策略,通过脚本配置方式创建自定义的RAM Policy,RAM Policy示例如下:

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Deny",
          "Action": [
            "oss:*"
          ],
          "Resource": [
            "acs:oss:*:*:*"
          ],
          "Condition": {
            "Bool": {
              "acs:SecureTransport": [
                "false"
              ]
            }
          }
        }
      ]
    }
    说明

    设置SecureTransport参数后,如果请求是HTTP协议,则为HTTP,如果请求是HTTPS协议,则为HTTPS。建议您通过Deny的方式拒绝HTTP的访问请求,而不是通过Allow方式允许HTTPS访问请求。

  3. 为指定RAM用户授予该RAM Policy。

    关于如何为RAM用户授权,请参见为RAM用户授权

  4. 使用Python SDK示例,通过HTTP方式上传文件,Python SDK示例如下:

    # -*- coding: utf-8 -*-
    import oss2
    
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM管理控制台创建RAM账号。
    auth = oss2.Auth('[$AccessKeyId]', '[$AccessKeySecret]')
    #yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为http://oss-cn-hangzhou.aliyuncs.com,其它Region请按实际情况填写。
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
    
    # 填写Object完整路径和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
    # 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
    bucket.put_object_from_file('exampleobject.txt', 'D:\\localpath\\examplefile.txt')

    系统显示类似如下,上传文件失败,说明RAM Policy已经生效。

    oss2.exceptions.AccessDenied: {'status': 403, 'x-oss-request-id': '6V37D53DMF67EBeDF5BDa095', 
    'details': {'HostId': 'examplebucket.oss-cn-hangzhou.aliyuncs.com', 
    'Message': 'You have no right to access this object because of bucket acl.',
     'Code': 'AccessDenied', 'RequestId': '6V37D53DMF67EBeDF5BDa095'}}
  5. 使用Python SDK示例,通过HTTPS方式上传文件,Python SDK示例如下:

    # -*- coding: utf-8 -*-
    import oss2
    
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM管理控制台创建RAM账号。
    auth = oss2.Auth('[$AccessKeyId]', '[$AccessKeySecret]')
    #yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com,其它Region请按实际情况填写。
    bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
    
    # 填写Object完整路径和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
    # 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
    bucket.put_object_from_file('exampleobject.txt', 'D:\\localpath\\examplefile.txt')

    系统显示类似如下,说明文件已经上传成功。

    Put object done, req_id: 6V37D53DMF67EBeDF5BDa095, status_code: 200
阿里云首页 对象存储 相关技术圈