全部产品
访问控制

对象存储 OSS 授权

更新时间:2017-09-15 10:32:39   分享:   

问题

查看 OSS 的权限定义

  请参考 OSS 产品文档中的 访问控制 部分。

为一个子用户授予只读访问 OSS 的权限

  在 RAM 控制台中创建一个子用户,并为此子用户附加系统授权策略”AliyunOSSReadOnlyAccess”。附加授权策略的方式请参考 授权

为一个子用户授予完全管理 OSS 的权限

  在 RAM 控制台中为此子用户附加系统授权策略 “AliyunOSSFullAccess”。

授权一个子用户列出并读取一个 Bucket 中的资源

  如果您需要授权一个子用户(例如,代表您的某个应用程序)通过 OSS SDK 或 OSS CMD 列出并读取一个 Bucket 中的资源,那么您需要创建一条自定义授权策略来完成。

  假设您的 Bucket 名称为 “myphotos”,那么创建的授权策略样例如下:

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": "oss:ListObjects",
  7. "Resource": "acs:oss:*:*:myphotos"
  8. },
  9. {
  10. "Effect": "Allow",
  11. "Action": "oss:GetObject",
  12. "Resource": "acs:oss:*:*:myphotos/*"
  13. }
  14. ]
  15. }

  如果您希望被授权的子用户能够通过 OSS 控制台进行操作,那么授权策略中还需要添加 GetBucketAcl 以及 GetObjectAcl 权限(控制台为了操作体验的优化需要额外调用 OSS 的部分 API)。允许子用户通过 OSS 控制台操作的授权策略样例如下:

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": "oss:ListBuckets",
  7. "Resource": "acs:oss:*:*:*"
  8. },
  9. {
  10. "Effect": "Allow",
  11. "Action": [
  12. "oss:ListObjects",
  13. "oss:GetBucketAcl"
  14. ],
  15. "Resource": "acs:oss:*:*:myphotos"
  16. },
  17. {
  18. "Effect": "Allow",
  19. "Action": [
  20. "oss:GetObject",
  21. "oss:GetObjectAcl"
  22. ],
  23. "Resource": "acs:oss:*:*:myphotos/*"
  24. }
  25. ]
  26. }

授权子用户完全管理某个 Bucket 的权限

  首先您需要创建一条自定义授权策略。假设您的 Bucket 名称为 “myphotos”。创建如下的自定义授权策略:

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": "oss:*",
  7. "Resource": [
  8. "acs:oss:*:*:myphotos",
  9. "acs:oss:*:*:myphotos/*"
  10. ]
  11. }
  12. ]
  13. }

  然后为此用户添加此条自定义授权策略。

子用户已经被授权了某个 Bucket 权限,登录 OSS 控制台访问时提示没有操作权限

  假设您按照如下自定义授权策略样例,授权某个子用户对某个 Bucket(比如 myphotos)拥有读取数据对象的操作权限:

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": [
  7. "oss:ListObjects"
  8. ],
  9. "Resource": "acs:oss:*:*:myphotos"
  10. },
  11. {
  12. "Effect": "Allow",
  13. "Action": [
  14. "oss:GetObject"
  15. ],
  16. "Resource": "acs:oss:*:*:myphotos/*"
  17. }
  18. ]
  19. }

  但当子用户登录 OSS 控制台时,为什么会收到报错“没有相应操作权限”?

  因为当用户登录 OSS 控制台时,OSS 控制台为以当前登录用户的授权身份去访问 OSS 服务。为了获得更好的交互体验,OSS 控制台会额外调用 ListBuckets 操作,以及 GetBucketAcl 和 GetObjectAcl 操作(用来区分 bucket 属性是公开或私有)。

  所以,为了支持通过 OSS 控制台操作某个 Bucket,相应的授权 Policy 如下所示:

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": "oss:ListBuckets",
  7. "Resource": "acs:oss:*:*:*"
  8. },
  9. {
  10. "Effect": "Allow",
  11. "Action": [
  12. "oss:ListObjects",
  13. "oss:GetBucketAcl"
  14. ],
  15. "Resource": "acs:oss:*:*:myphotos"
  16. },
  17. {
  18. "Effect": "Allow",
  19. "Action": [
  20. "oss:GetObject",
  21. "oss:GetObjectAcl"
  22. ],
  23. "Resource": "acs:oss:*:*:myphotos/*"
  24. }
  25. ]
  26. }

OSS目录级别的授权

  目录级别的授权属于授权的高级功能。假设有一个用于存放照片的 Bucket,叫myphotos。这个 bucket 下有一些目录,代表照片的拍摄地;每个拍摄地目录下又有年份子目录。

  目录树结构如下:

  1. myphotos[Bucket]
  2. ├── beijing
  3. ├── 2014
  4. └── 2015
  5. ├── hangzhou
  6. ├── 2013
  7. ├── 2014
  8. └── 2015 //授予此目录只读权限
  9. └── qingdao
  10. ├── 2014
  11. └── 2015

  假设您需要授权一个子用户只读访问 myphotos/hangzhou/2015/ 目录的只读权限。根据使用场景不同,授权策略也有很大的区别。

  下面根据授权策略的复杂程度,由简入繁的为您介绍三种场景。

场景 1:不需要列出文件

  场景描述:子用户知道所有文件的路径,只需要读取文件内容的权限,不需要列出文件的权限。

  这个场景的特点是子用户知道文件的完整路径,可以使用完整的文件路径直接去读取文件内容。

  通常我们会将这样的权限授予一个软件系统,系统中文件路径符合某种规则(比如文件名是员工工号),或者文件路径持久化在软件系统的数据库中。

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": [
  7. "oss:GetObject"
  8. ],
  9. "Resource": [
  10. "acs:oss:*:*:myphotos/hangzhou/2015/*"
  11. ]
  12. }
  13. ]
  14. }

场景 2:需要列出文件

  场景描述:子用户使用 OSS CMD 访问目录 myphotos/hangzhou/2015/ 但是不知道目录中有哪些文件,需要列出目录中文件的权限

  通常会将这样的权限授予软件开发者。开发者不清楚目录中究竟有哪些文件,然后使用 OSS CMD 或 API 直接获取目录信息。

  与场景一相比,这里需要新增 ListObjects 的权限。因为我们仅允许列出 myphotos/hangzhou/2015/ 目录中的文件,所以在新增的 ListObjects 权限中,增加 oss:Prefix 的条件限定。

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": [
  7. "oss:GetObject"
  8. ],
  9. "Resource": [
  10. "acs:oss:*:*:myphotos/hangzhou/2015/*"
  11. ]
  12. },
  13. {
  14. "Effect": "Allow",
  15. "Action": [
  16. "oss:ListObjects"
  17. ],
  18. "Resource": [
  19. "acs:oss:*:*:myphotos"
  20. ],
  21. "Condition":{
  22. "StringLike":{
  23. "oss:Prefix":"hangzhou/2015/*"
  24. }
  25. }
  26. }
  27. ]
  28. }

场景 3:使用控制台访问

  场景描述:子用户使用OSS控制台访问目录 myphotos/hangzhou/2015/

  最易用的场景,当子用户使用可视化的 OSS 客户端访问目录myphotos/hangzhou/2015/,可视化的客户端像 Windows 文件管理器一样,让子用户可以从根目录开始,一层一层的进入所要访问的目录。

  与场景 2 相比,使用 OSS 可视化客户端时需要从从根目录一层一层导航进入myphotos/hangzhou/2015/,所以需要新增以下权限:

  • 列出所有 Bucket 的权限
  • 列出 “myphotos” 下目录的权限,在这个例子中,即可以看到 “beijing/hangzhou/qingdao” 三个目录
  • 列出 “myphotos/hangzhou” 下的目录的权限,即可以看到 “2013/2014/2015” 三个目录
  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": [
  7. "oss:ListBuckets",
  8. "oss:GetBucketAcl"
  9. ],
  10. "Resource": [
  11. "acs:oss:*:*:*"
  12. ]
  13. },
  14. {
  15. "Effect": "Allow",
  16. "Action": [
  17. "oss:GetObject",
  18. "oss:GetObjectAcl"
  19. ],
  20. "Resource": [
  21. "acs:oss:*:*:myphotos/hangzhou/2015/*"
  22. ]
  23. },
  24. {
  25. "Effect": "Allow",
  26. "Action": [
  27. "oss:ListObjects"
  28. ],
  29. "Resource": [
  30. "acs:oss:*:*:myphotos"
  31. ],
  32. "Condition": {
  33. "StringLike": {
  34. "oss:Delimiter": "/",
  35. "oss:Prefix": [
  36. "",
  37. "hangzhou/",
  38. "hangzhou/2015/*"
  39. ]
  40. }
  41. }
  42. }
  43. ]
  44. }

在 OSS 中使用带 IP 限制的访问控制

  在 Allow 授权中,使用 IpAddress 允许通过特定 IP 段的访问;在 Deny 授权中,使用 NotIpAddress 拒绝不在特定 IP 段的访问。

Allow 授权中增加 IP 限制

  允许通过 42.120.88.0/24, 42.120.66.0/24 两个 IP 段读取 myphotos 中的信息,授权策略样例如下:

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Sid": "允许列出所有Bucket",
  6. "Effect": "Allow",
  7. "Action": [
  8. "oss:ListBuckets"
  9. ],
  10. "Resource": [
  11. "acs:oss:*:*:*"
  12. ]
  13. },
  14. {
  15. "Sid": "允许获取myphotos中的信息, 访问源必须在允许的IP段中",
  16. "Effect": "Allow",
  17. "Action": [
  18. "oss:ListObjects",
  19. "oss:GetObject"
  20. ],
  21. "Resource": [
  22. "acs:oss:*:*:myphotos",
  23. "acs:oss:*:*:myphotos/*"
  24. ],
  25. "Condition":{
  26. "IpAddress": {
  27. "acs:SourceIp": ["42.120.88.0/24", "42.120.66.0/24"]
  28. }
  29. }
  30. }
  31. ]
  32. }

Deny 授权中增加 IP 限制

  如果源 IP 不在 42.120.88.0/24 中则禁止对 OSS 执行任何操作,授权策略样例如下:

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Sid": "允许列出所有Bucket",
  6. "Effect": "Allow",
  7. "Action": [
  8. "oss:ListBuckets"
  9. ],
  10. "Resource": [
  11. "acs:oss:*:*:*"
  12. ]
  13. },
  14. {
  15. "Sid": "允许获取myphotos中的信息",
  16. "Effect": "Allow",
  17. "Action": [
  18. "oss:ListObjects",
  19. "oss:GetObject"
  20. ],
  21. "Resource": [
  22. "acs:oss:*:*:myphotos",
  23. "acs:oss:*:*:myphotos/*"
  24. ]
  25. },
  26. {
  27. "Sid": "禁止从42.120.88.0/24以外访问OSS",
  28. "Effect": "Deny",
  29. "Action": "oss:*",
  30. "Resource": [
  31. "acs:oss:*:*:*"
  32. ],
  33. "Condition":{
  34. "NotIpAddress": {
  35. "acs:SourceIp": ["42.120.88.0/24"]
  36. }
  37. }
  38. }
  39. ]
  40. }

  注意:因为 Policy 的鉴权规则是 Deny 优先(即如果用户的访问操作命中任意一条 Deny 规则,则禁止访问),所以访问者从 42.120.88.0/24 以外的 IP 地址访问 myphotos 中的内容时,OSS 服务会报没有权限。

本文导读目录
本文导读目录
以上内容是否对您有帮助?