本文发布于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 部分定义是一个动作,表示是否 Allow 或 Deny 指定资源的访问
"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 国际」 许可协议进行许可。