本文发布于Cylon的收藏册,转载请著名原文链接~


CEPH RGW 支持 Bucket 的 S3 策略语言,但又不完全类似于 S3 的策略,因为 S3 中策略是基于 AWS 的,某些属性在 CEPH 中并不存在,下面就解开 RGW 关于桶策略的配置。

Bucket Policy (桶策略,下文中统称为 BP) 是对象存储中的管理权限和对象存储访问的机制。

Policy Language 的组成

BP 的格式采用了 JSON 语言,也就是 PL 是基于 JSON 的一种策略语言,他的格式主要为几个元素

{
 "Version": "2012-10-17",
 "Statement": [{
   "Effect": ...,
   "Principal": ...,
   "Action": ...,
   "Resource": ...
 }]
}

该结构由 ==一个== Version (表示当前版本) 和 ==一个或多个== Statement 数组组成,这些数组定义了希望应用的策略。每个语句数组中都有Effect, Principal, Action, Resource 和可选的 Condition 元素。

Effect

Effect 部分定义是一个动作,表示是否 AllowDeny 指定资源的访问

"Effect":"Allow"

Principal

Principal 部分定义了策略应用的 “用户” 或 “实体” (entity) 或 “服务” 等,这里是按照 aws 中子源固定语法组成,当然在 CEPH 中不存在这些资源,那么相对的也是一种固定格式

AWS 将用户分为了三类:

  • AWS 账户 (AWS ACCOUNT)
  • IAM 用户 (IAM USER)
  • 匿名用户 (anonymous)

语法如下:

"Principal": {
  "AWS": [
    "arn:aws:iam:::user/a0000000-000a-0000-0000-00d0ff0f0000"
  ]
}

AWS Account

对于该类 “实体”,采用了下面的语法

"AWS":"account-ARN"

示例

"Principal":{"AWS":"arn:aws:iam::AccountIDWithoutHyphens:root"}

"Principal":{"AWS":["arn:aws:iam::AccountID1WithoutHyphens:root","arn:aws:iam::AccountID2WithoutHyphens:root"]}

IAM USER

AWS IAM (AWS Identity and Access Management) ,是 AWS 中用户管理的一种方式,指定 “WHO”, “CAN ACCESS”, “WAHT” (AWS 中的服务和资源、集中管理精细权限)

对于该类 “实体”,采用了下面的语法

"Principal":{"AWS":"arn:aws:iam::account-number-without-hyphens:user/username"}

匿名用户

匿名用户就是指对 ”每个人都授予的权限“,可以使用 通配符 ("*") ,这类权限的配置对象是 ”存储桶中的所有对象均可公开访问“

"Principal":"*"

或者

"Principal":{"AWS":"*"}

上面两类用户实际上权限分散的还是不一样,主要区别如下:

  • "Principal": "*" 并且 Effect: Allow 那么将允许任何人访问该资源。
  • 如果 Effect: Allow 并且 "Principal" : { "AWS" : "*" },允许 AWS 账户中的 IAM User, Root User.. 访问该资源(通常 不涉及到 CEPH)

Action

Action 部分定义了 ”对策略授予 (删除) 的权限”。这些操作包括 list bucket 等的功能;需要注意的是,这里 AWS S3 与 CEPH RGW 中定义的权限又不相同,对于 CEPH 中 Action 的权限集合,可以参考 [1]

Resource

Action 部分定义了 “应用于对象存储资源” 例如存储桶和对象,这里的资源类型也是一种基于 aws 资源的固定格式,而在 CEPH 中不存在的部分直接为空,例如:

  • Bucket resources:"arn:aws:s3:::[bucket]"
  • 应用所存储同种所有对象或部分对象:"arn:aws:s3:::[bucket]/[object]"

在上面的策略语言中,将 [bucket] 替换为存储桶的标签,将 [object] 替换为指定所有对象的通配符值 (*) 或对象的路径和名称。

例如下面几个示例

将策略应用到所有对象:

"Resource": [
  "arn:aws:s3:::example-bucket/*"
]

指定目录中的所有对象:

"Resource": [
  "arn:aws:s3:::example-bucket/folder/*"
]

特殊对象

"Resource": [
  "arn:aws:s3:::example-bucket/example-file.ext"
]

桶策略示例

允许任何人查看和下载 bucket 中的对象

{
 "Version": "2012-10-17",
 "Statement": [{
   "Effect": "Allow",
   "Principal": "*",
   "Action": [
     "s3:GetObject",
     "s3:ListBucket"
   ],
   "Resource": [
     "arn:aws:s3:::bucket-example/*"
   ]
 }]
}

授予指定帐户只能对指定目录的访问权限

{
 "Version": "2012-10-17",
 "Statement": [
   {
     "Effect": "Allow",
     "Principal": {
       "AWS": "arn:aws:iam:::user/a0000000-000a-0000-0000-00d0ff0f0000"
     },
     "Action": [
       "s3:ListBucket"
     ],
     "Resource": [
       "arn:aws:s3:::example-bucket"
     ]
   },
   {
     "Effect": "Allow",
     "Principal": {
       "AWS": "arn:aws:iam:::user/a0000000-000a-0000-0000-00d0ff0f0000"
     },
     "Action": [
       "s3:GetObject"
     ],
     "Resource": [
       "arn:aws:s3:::example-bucket/test/*"
     ]
   }
 ]
}

允许特定 IP 的访问

上面在 “策略语言” 中没有提到一个可选参数 “Condition”,这在 CEPH 中也是支持的,通过使用 “Condition” 您可以选择允许或拒绝来自指定 IP 地址或范围的流量。

下面的示例仅允许来自指定 IP 地址的所有流量:

{
 "Version": "2012-10-17",
 "Statement": [
   {
     "Effect": "Allow",
     "Principal": "*",
     "Action": "s3:*",
     "Resource": "arn:aws:s3:::example-bucket/*",
     "Condition": {
       "IpAddress": {
         "aws:SourceIp": "192.0.2.1/32"
       }
     }
   }
 ]
}

目前 CEPH 支持的 Condition 字段的值为,参考与 [1]

  • aws:CurrentTime
  • aws:EpochTime
  • aws:PrincipalType
  • aws:Referer
  • aws:SecureTransport
  • aws:SourceIp
  • aws:UserAgent
  • aws:username

应用桶策略

桶策略的应用只能通过 s3cmd 命令执行,radosgw-admin 命令并不可以应用,所以要想应用前,需要准备好对应的对象存储相关的配置

语法

s3cmd setpolicy [policy-file] s3://[bucket-label]

例如,将文件 “policy.json” 中定义的策略应用到名为 “example-bucket” 的存储桶中

s3cmd setpolicy policy.json s3://example-bucket

Reference

[1] LIMITATIONS

[2] Guides - Define Access and Permissions using Bucket Policies

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2023/09/05-2-bucket-policy/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。