登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: [oss]列出文件列表的权限要另外写一个 POLICY 规则     [回主站]     [分站链接]
[oss]列出文件列表的权限要另外写一个 POLICY 规则
clq
浏览(371) - 2019-09-17 12:49:28 发表 编辑

关键字: oss

[2019-09-17 12:51:27 最后更新]
[oss]列出文件列表的权限要另外写一个 POLICY 规则

不知道  POLICY 正式的学名叫啥,总之可以理解为阿里云 STS (临时权限)下的一个权限描述的 json 文本。
相当于一个防火墙规则吧。

普通的规则,看 https://help.aliyun.com/document_detail/28791.html 然后根据 http://gosspublic.alicdn.com/ram-policy-editor/index.html
生成 资源(Resource)的字符串就行了。最后的字符串类似于

{
  "Statement": [
    {
      "Action": [
        "*"
      ],
      "Effect": "Allow",
      "Resource": [
        $Resource
      ]
    }

  ],
  "Version": "1"
}

这里的问题在于,当访问的不是根目录而是下面的子目录时上传下载都没问题,但列不出文件(即 objects)
这时的 $Resource 类似 "acs:oss:*:*:BUCKET_NAME/path/*"
只有去掉路径部分,变成 "acs:oss:*:*:BUCKET_NAME/*" 及 "acs:oss:*:*:BUCKET_NAME" 时才行. 原理我查看了一下具体的 http 请求,应该是列目录文件的 http get 请求一直就是访问的
根目录,所以不开放根目录权限是不行的。而对于子目录,oss 的  http 请求中是全用了其他参数来传递的。那么怎么在规则中表示这个参数呢,请看
https://help.aliyun.com/knowledge_detail/58905.html
中的 “场景2” 部分,是要加上一个 Condition

根据 https://help.aliyun.com/document_detail/28663.html 的说法,Condition 指的是限制条件

结果类似于         {
            "Effect": "Allow",
            "Action": [
                "oss:ListObjects"
            ],
            "Resource": [
                "acs:oss:*:*:myphotos"
            ],
            "Condition":{
                "StringLike":{
                    "oss:Prefix":"hangzhou/2015/*"
                }
            }
        }

所以最终的规则代码变成了

$policy=<<<POLICY
{
  "Statement": [
    {
      "Action": [
        "*"
      ],
      "Effect": "Allow",
      "Resource": [
        $Resource
      ]
    },
    $policy_list
  ],
  "Version": "1"
}
POLICY;

真够累人的,说实在的有点蠢。我折腾了一个下午加第二天的早上,不知道各位花了多少时间来理解这个?
后面我再附加上这个 https://help.aliyun.com/knowledge_detail/58905.html 的全文,里面还有别的场景,很需要仔细研究一下的。





clq  2019-09-17 12:51:27 发表 编辑

[图片]



使用RAM对OSS进行权限管理

KB: 58905


更新时间:2019-07-22 17:10:37

本页目录

    前提条件
    基本信息
    将自定义策略授权给RAM用户
    OSS授权样例

本文介绍了通过RAM的权限管理功能,创建相应的权限策略,从而对对象存储(OSS)进行权限管理,以满足RAM用户操作OSS的多种需求。
前提条件

请确保您已经注册了阿里云账号。如还未注册,请先完成账号注册。详情请参见账号注册。
基本信息

使用RAM对OSS进行权限管理前,需先了解几个常用的权限策略。
权限策略     描述
AliyunOSSFullAccess     为RAM用户授予OSS的完全管理权限。
AliyunOSSReadOnlyAccess     为RAM用户授予OSS的只读访问权限。
说明 查看OSS的权限定义,请参见OSS产品文档中的权限控制概述。
将自定义策略授权给RAM用户

    根据下述OSS授权样例创建相应的自定义策略。

    详情请参见创建自定义策略。
    找到创建好的权限策略,单击其权限策略名称。
    单击引用记录 > 新增授权。
    被授权主体处输入需要授权的用户名称或ID。
    单击确定。
    说明 您也可以直接对用户或用户组授予创建好的权限策略,详情请参见为RAM用户授权和为用户组授权。

OSS授权样例

    示例1:授权RAM用户完全管理某个Bucket的权限。

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

    示例2:授权RAM用户列出并读取一个Bucket中的资源。
        授权RAM用户通过OSS SDK或OSS命令行工具列出并读取一个Bucket中的资源。Bucket名称为:myphotos。

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

        授权RAM用户能够通过OSS控制台进行操作。
        说明 用户登录OSS控制台时,为了操作体验的优化,OSS控制台会额外调用ListBuckets操作,以及GetBucketAcl和GetObjectAcl,以确定bucket属性是公开还是私有。

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

    示例3:授权RAM用户通过特定的IP地址访问OSS。
        在Allow授权中增加IP限制:允许通过192.168.0.0/16, 172.12.0.0/16两个IP段读取myphotos中的信息。

        {
            "Version": "1",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                              "oss:ListBuckets",
                              "oss:GetBucketStat",
                              "oss:GetBucketInfo",
                              "oss:GetBucketAcl"
                              ],
                    "Resource": [
                        "acs:oss:*:*:*"
                    ]
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "oss:ListObjects",
                        "oss:GetObject"
                    ],
                    "Resource": [
                        "acs:oss:*:*:myphotos",
                        "acs:oss:*:*:myphotos/*"
                    ],
                    "Condition":{
                        "IpAddress": {
                            "acs:SourceIp": ["192.168.0.0/16", "172.12.0.0/16"]
                        }
                    }
                }
            ]
        }

        在Deny授权中增加IP限制:如果源IP不在192.168.0.0/16中,则禁止对OSS执行任何操作。

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

        说明 因为Policy的鉴权规则是Deny优先,所以访问者从192.168.0.0/16以外的IP地址访问myphotos中的内容时,OSS服务会提示没有权限。
    示例4:OSS目录级别的授权。

    假设用于存放照片的Bucket:myphotos。这个Bucket下有一些目录,代表照片的拍摄地,每个拍摄地目录下又有年份子目录。

    myphotos[Bucket]
      ├── beijing
      │   ├── 2014
      │   └── 2015
      ├── hangzhou
      │   ├── 2013
      │   ├── 2014
      │   └── 2015 //授予此目录只读权限
      └── qingdao
          ├── 2014
          └── 2015

    若要授权RAM用户访问myphotos/hangzhou/2015/目录的只读权限。目录级别的授权属于授权的高级功能,根据使用场景不同,授权策略的复杂程度也不同,以下几种场景可供参考。
        场景1:授予RAM用户读取文件内容的权限,不需要列出文件的权限。

        RAM用户知道文件的完整路径,可以使用完整的文件路径直接去读取文件内容,通常会将这样的权限授予应用程序。

        {
            "Version": "1",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "oss:GetObject"
                    ],
                    "Resource": [
                        "acs:oss:*:*:myphotos/hangzhou/2015/*"
                    ]
                }
            ]
        }

        场景2:授权RAM用户使用OSS命令行工具访问目录myphotos/hangzhou/2015/并列出目录中文件的权限。

        RAM用户不清楚目录中有哪些文件,可以使用OSS命令行工具或API直接获取目录信息,通常会将这样的权限授予软件开发者。

        此场景需要新增ListObjects的权限。

        {
            "Version": "1",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "oss:GetObject"
                    ],
                    "Resource": [
                        "acs:oss:*:*:myphotos/hangzhou/2015/*"
                    ]
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "oss:ListObjects"
                    ],
                    "Resource": [
                        "acs:oss:*:*:myphotos"
                    ],
                    "Condition":{
                        "StringLike":{
                            "oss:Prefix":"hangzhou/2015/*"
                        }
                    }
                }
            ]
        }

        场景3: 授予RAM用户使用OSS控制台访问目录。

        RAM用户使用可视化的OSS客户端访问目录myphotos/hangzhou/2015/,可视化的客户端类似Windows文件管理器,RAM用户可以从根目录开始,一层一层的进入要访问的目录,此场景是最易用的场景。

        此场景需要新增以下权限:
            列出所有Bucket的权限
            列出myphotos下目录的权限。
            列出myphotos/hangzhou下的目录的权限。

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




总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1