RBC文档¶
主题
- RBC简介
- 存储桶策略
1.RBC简介¶
默认情况下,所有 NOS 资源都是私有的,包括存储桶、对象和相关子资源 (例如, website 配置)。只有资源拥有者,即创建该资源的 NOS 账户可以访问该资源。资源拥有者可以选择通过编写访问策略授予他人访问权限。
NOS提供的访问策略选项大致可分为基于资源的策略和用户策略两类。附加到资源 (存储桶和对象) 的访问策略称为基于资源的策略。例如,存储桶策略和访问控制列表 (ACL) 就是基于资源的策略。您也可以将访问策略附加到您账户中的用户,这些策略称为用户策略。您可以选择使用基于资源的策略、用户策略或这些策略的某种组合来管理您的NOS资源权限。本文提供了对资源的管理(存储桶策略),但是也会涉及用户管理,用户管理可以参考子账号权限管理。
2.存储桶策略¶
桶存储策略作为JSON文档存储在 NOS 中,作为基于资源的策略,附加到桶上。
2.1 存储桶策略简介¶
包含一下元素:
- Version - 用来标识当前policy都可以支持什么操作,目前的版本为2018-06-25
- Id - 可以填写有意义的标识,不填也可以
- Sid - Statement的id
- Effect- 策略允许还是拒绝访问
- Action - 策略允许或拒绝的操作的列表,如果只有一个action,不需要使用数组的形式
- Principal - 元素用于指定被允许或拒绝访问资源的用户,如果只有一个用户,不需要使用数组的形式
- Resource - 作为操作目标的资源的列表, 如果只有一个资源,不需要使用数组的形式
- Condition (可选) – 策略在哪些情况下授予权限
下面是一个简单的demo
{
"Version": "2018-06-25",
"Id": "Policy1528352061981",
"Statement": [
{
"Sid":"test",
"Effect": "Allow",
"Action": ["nos:ListBucket"],
"Principal": {"nws":["nrn:nws:iam::productid:root"]},
"Resource": ["nrn:nws:nos:::example_bucket"],
"Condition":{
"IpAddress": {"nws:SourceIp": "203.0.113.0/24"}
}
}
]
}
2.2 各个策略元素的解释¶
2.2.1 Sid¶
Sid
(声明 ID)
是您针对策略语句提供的可选标识符。您可以为声明数组中的每份声明指定 Sid
值,如果指定,那么在当前策略中必须是唯一的。
2.2.2 Effect¶
Effect
元素是必需具备的元素,用于指定声明所产生的结果是“允许”还是“显式拒绝”。Effect
的有效值为 Allow
和 Deny
。
在默认情况下,将拒绝访问资源。如要允许访问资源,您必须将 Effect
元素设置为 Allow
。如果要拒绝结果,您需要将 Effect
元素设置为 Deny
。
2.2.3 Action¶
NOS定义了可在策略中指定的一组权限。这些是关键字,其中每一个均映射到特定NOS操作,包含对象的操作和桶子资源的操作。
2.2.3.1 对象操作权限¶
以下存储桶策略示例授予用户 (Dave) nos:PutObject权限:
{
"Version":"2018-06-25",
"Id":"Policy1528352061981",
"Statement":[
{
"Sid":"test",
"Effect":"Allow",
"Principal":{
"nws":[
"nrn:nws:iam::Dave-productid:root"
]
},
"Resource":[
"nrn:nws:nos:::examplebucket"
],
"Action":[
"nos:PutObject"
]
}
]
}
2.2.3.2 桶子资源操作权限¶
以下用户策略授予用户 Dave 对 examplebucket 存储桶的 nos:GetBucketAcl 权限。
{
"Version":"2018-06-25",
"Id":"Policy1528352061981",
"Statement":[
{
"Sid":"test",
"Effect":"Allow",
"Principal":{
"nws":[
"nrn:nws:iam::Dave-productid:root"
]
},
"Resource":[
"nrn:nws:nos:::examplebuck"
],
"Action":[
"nos:GetBucketAcl"
]
}
]
}
注
可以是用nos:*来表示所有的nos操作
2.2.4 Principal¶
元素用于指定被允许或拒绝访问资源的用户
使用格式为:
“Principal” : {“nws”:[“nrn:nws:iam::productid:relative-id”]}
relative-id:
- 如果是根用户,使用root
- 如果是指定某个子账号,使用user/username
如果要授权给所有的用户,使用 “nws”:[“*”]
nws - Netease Web Service,用来指明其value要使用什么样的格式
2.2.5 Resource¶
2.2.5.1 以下是用于标识 网易云中任何资源的资源名称常用格式¶
nrn:partition:service:region:account-id:relative-id
- nrn - netease resource name
- partition - The partition that the resource is in. For standard nws
regions, the partition is
nws
, If you have resources in other partitions, the partition is nws-partitionname. For example, the partition for resources in the hz region isnws-hz
. - service - The service namespace that identifies the NWS product(for example, nos)
- region - The region the resource resides in. Note that the ARNs for some resources do not require a region, so this component might be omitted.
- account-id - The ID of the NWS account that owns the resource, fos nos, this component might be omitted
- relative-id - The content of this part of the NRN varies by service. It can be a bucket-name or a bucketname/object. You can use wild card.
对于nos,使用的格式为:
nrn:nws:nos:::bucket_name
nrn:nws:nos:::bucket_name/key_name
对应region和account-id中的omitted,因为nos给定bucket_name后,其region和account-id是唯一确定的
2.2.5.2 demo¶
- examplebucket 存储桶中的 /developers/design_info.doc 对象。
nrn:nws:nos:::examplebucket/developers/design_info.doc
您可将通配符作为资源一部分.您可在relative-id分块中使用通配符 (* 和 ?)。星号 (*) 表示 0 个或多个字符的任意组合,问号 (?) 表示任何单个字符。您可在每个分块中使用多个 * 或 ? 字符,但通配符不能跨分块。
此 ID 块使用通配符 * 来标识 examplebucket 存储桶中的所有对象。
nrn:nws:nos:::examplebucket/*
此ID 块同时使用通配符 * 和 ?。它标识存储桶 (例如 example1bucket、example2bucket、example3bucket 等) 中的所有对象
arn:aws:s3:::example?bucket/*
您也可以在resource中使用策略变量。在策略评估时,这些预定义变量被它们的相应值替换。假设您将存储桶组织为一个文件夹的集合,每个用户拥有一个文件夹。文件夹名称与用户名称相同。要为他们的文件夹授予用户权限,您可以在资源中指定策略变量:
nrn:nws:nos:::bucket_name/aa/${nws:username}
在运行时,当评估此策略时,资源中的变量 ${nws:username} 替换为发出此请求的用户名称。
2.2.5.3 特殊字符¶
有几个特殊预定义策略变量具有固定值,可用于表示字符 (这些字符本身有特殊的含义)。如果这些特殊字符是您尝试匹配的字符串的一部分,而您原样插入这些字符,则不能正确进行解释。例如,在字符串中插入 * 星号会解释为与任何字符匹配的通配符 (而不是解释为文本 *)。这种情况下,可以使用以下预定义策略变量:
- ${*} - 在需要星号字符 * 的位置使用。
- ${?} - 在需要问号字符 ? 的位置使用。
- } - 在需要美元符号字符 $ 的位置使用。
在任何可以使用常规策略变量的字符串中,都可以使用这些预定义策略变量。
2.2.5.4 策略变量¶
下述condition中的条件键及为策略变量
2.2.6 Condition¶
2.2.6.1 概述¶
访问策略语言可使您在授予权限时指定条件。在 Condition 元素 (或 Condition 块) 中,可以指定策略生效的条件。在可选的 Condition 元素中,您创建的表达式应使用布尔值运算符 (等于、小于等),以使您指定的条件与请求中的值相匹配。例如,当授予用户上传对象的权限时,存储桶拥有者可通过添加 StringEquals 条件要求此对象可公开读取。
2.2.6.4 可用条件建¶
- 在nws中可以使用的键
- nws:CurrentTime 这可用于检查日期和时间的条件。
- nws:userid 用户的productId
- nws:username 用户名
- nws:SourceIp 源ip,支持ip块
- nws:SecureTransport 是否是用https
- nws:UserAgent 用户的agent
- nws:sourceVpce vpc endpoint
- nws:sourceVpc vpc
- 用在NOS访问策略中指定条件的预定义键
- nos:x-nos-acl 桶的acl
- nos:x-nos-copy-source 拷贝源
- nos:x-nos-server-side-encryption 服务端加密
- nos:delimiter delimiter
- nos:max-keys 最大的key值,listObject时使用
- nos:prefix ListObject中的prefix
- 签名相关的aws键,用于s3请求时(nos兼容aws s3)
- aws:signatureversion
- aws:authType
- aws:signatureAge
- aws:x-amz-content-sha256
2.2.6.5 针对对象操作的条件键¶
下表显示了可对哪些 NOS操作使用哪些 NOS条件。在该表之后提供有策略示例。注意下面有关下表中所述的 NOS特定条件键的内容:
- 这些条件键名称的前缀为 nos:。例如:nos:x-nos-acl。
- 每个条件键均映射到可设置条件的 API 所允许的相同名称请求标头。即,这些条件键指定同名请求标头的行为。例如:
条件键 nos:x-nos-acl 可用于对 nos:PutBucket 权限授予条件权限,它定义 PUT Bucket API 支持的 x-nos-acl 请求标头的行为。
许可 | 适用的条件建 | 描述 |
---|---|---|
nos:PutObject | nos:x-nos-copy-source | 要复制对象,请使用 PUT Object API 并使用 x-nos-copy-source 标头指定源。通过使用此键,存储桶拥有者可将复制源限定到特定存储桶、存储桶中的特定文件夹,或者存储桶中的特定对象。 |
nos:PutObject | nos:x-nos-server-side-encryption | 上传对象时,可以使用 x-nos-server-side-encryption 标头请求 nos在保存对象时适用服务端加密。 当授予 nos:PutObject 权限时,存储桶拥有者可使用此键添加条件,要求用户在请求中指定此标头。存储桶拥有者可通过授予此类条件权限,确保在保存用户上传的对象时进行加密。 |
demo
在 PUT Object 请求中,如果指定了源对象,则为一个复制操作 (请参阅 PUT Object - Copy)。因此,存储桶拥有者可授予用户复制限定于此源上的对象的权限。例如:
- 允许仅从 sourcebucket 存储桶复制对象。
- 允许从 sourcebucket 存储桶复制对象,并仅复制键名称前缀开头为 public/ 的对象。例如 sourcebucket/public/*
- 只允许从 sourcebucket 复制特定对象;例如 sourcebucket/example.jpg。
下存储桶策略授予用户 Dave nos:PutObject 权限,此权限要求他复制对象时需满足以下条件:请求中包含 nos:x-nos-copy-source 标头且标头值指定 /examplebucket/public/* 键名称前缀。
{
"Version": "2018-06-25",
"Id": "Policy1528352061981",
"Statement":[
{
"Sid":"cross-account permission to user in your own account",
"Effect":"Allow",
"Principal":{
"nws":[
"nrn:nws:iam::dave-productid:root"
]
},
"Action":[
"nos:PutObject"
],
"Resource":[
"nrn:nws:nos:::examplebucket/*"
]
},
{
"Sid":"Deny your user permission to upload object if copy source is not /bucket/folder",
"Effect":"Deny",
"Principal":{
"nws":[
"nrn:nws:iam::dave-productid:root"
]
},
"Action":[
"nos:PutObject"
],
"Resource":["nrn:nws:nos:::examplebucket/*"],
"Condition":{
"StringNotLike":{
"nos:x-nos-copy-source":"examplebucket/public/*"
}
}
}
]
}
2.2.6.6 针对存储桶操作的条件键¶
demo
存储桶拥有者可限定用户仅列出存储桶中特定文件夹的内容。如果存储桶中的对象按键名称前缀组织,这非常有用。NOS 控制台可使用这些前缀显示文件夹的层级结构.
此条件只允许用户列出examplefolder目录,就算用户拥有其他的权限,也不能List其他目录的对象。
{
"Version": "2018-06-25",
"Id": "Policy1528352061981",
"Statement":[
{
"Sid":"statement1",
"Effect":"Allow",
"Principal":{
"nws":[
"nrn:nws:iam::productid:root"
]
},
"Action":[
"nos:ListBucket"
],
"Resource":[
"nrn:nws:nos:::examplebucket"
],
"Condition":{
"StringEquals":{
"nos:prefix":"examplefolder"
}
}
},
{
"Sid":"statement2",
"Effect":"Deny",
"Principal":{
"nws":[
"nrn:nws:iam::productid:root"
]
},
"Action":[
"nos:ListBucket"
],
"Resource":[
"nrn:nws:nos:::examplebucket"
],
"Condition":{
"StringNotEquals":{
"nos:prefix":"examplefolder"
}
}
}
]
}
2.2.6.7 条件运算符¶
条件运算符是条件的“动词”形式,可指定执行的比较类型。条件运算符可分为以下类别:
- 字符串
- 数值
- 日期和时间
- 布尔值
- IP 地址(目前仅支持该运算符)
字符串条件运算符
利用字符串条件运算符,您可以构建基于键与字符串值的对比来限制访问的 Condition 元素。
条件运算符 | 说明 |
---|---|
StringEquals | 精确匹配,区分大小写 |
StringNotEquals | 否定匹配 |
StringEqualsIgnoreCase | 精确匹配,忽略大小写 |
StringNotEqualsIgnoreCase | 否定匹配,忽略大小写 |
StringLike | 区分大小写的匹配。此值可包括字符串中任何一个多字符匹配的通配符 (*) 或单字符匹配的通配符 (?)。字符串中的任何地方。注意如果键包含多个值,可使用集合运算符限定 StringLike - ForAllValues:StringLike 和 ForAnyValue:StringLike。 | | StringNotLike | 不区分大小写的无效匹配。此值可包括字符串中任何一个多字符匹配的通配符 (*) 或单字符匹配的通配符 (?)。字符串中的任何地方。 |
example:
以下声明包含一个 Condition 元素,该元素采用 StringEquals 条件运算符和 nos:UserAgent 键来指定在请求的用户代理标头中必须包含特定值。
{
"Version": "2018-06-25",
"Statement": {
"Sid":"test",
"Effect": "Allow",
"Principal": {"nws":["nrn:nws:iam::productid:root"]},
"Action": ["nos:GetObject"],
"Resource": ["comb:nos:examplebucket/*"],
"Condition": {"StringEquals": {"nos:UserAgent": "Example Corp Java Client"}}
}
}
以下示例使用 StringLike 条件运算符执行与策略变量的字符串匹配来创建策略。该策略允许对 nos 存储桶执行指定操作,前提是 nos:prefix 与任一指定模式相匹配。
{
"Statement": [
{
"Sid":"test",
"Effect": "Allow",
"Principal": {"nws":["nrn:nws:iam::productid:root"]},
"Action": [
"nos:ListAllMyBuckets",
"nos:GetBucketLocation"
],
"Resource": ["comb:nos:*"}
},
{
"Sid":"test",
"Effect": "Allow",
"Action": ["nos:ListBucket"],
"Principal": {"nws":["nrn:nws:iam::productid:root"]},
"Resource": ["comb:nos:BUCKET-NAME"],
"Condition": {"StringLike": {"nos:prefix": [
"",
"home/",
"home/${nos:username}/"
]}}
},
{
"Sid":"test",
"Effect": "Allow",
"Principal": {"nws":["nrn:nws:iam::productid:root"]},
"Action": ["nos:*"],
"Resource": [
"comb:nos:BUCKET-NAME/home/${nos:username}",
"comb:nos:BUCKET-NAME/home/${nos:username}/*"
]
}
]
}
数字条件运算符
利用数字条件运算符,您可以构建基于键与整数或小数值的对比来限制访问的 Condition 元素。
条件运算符 | 说明 |
---|---|
NumericEquals | 匹配 |
NumericNotEquals | 否定匹配 |
NumericLessThan | “小于”匹配 |
NumericLessThanEquals | “小于或等于”匹配 |
NumericGreaterThan | “大于”匹配 |
NumericGreaterThanEquals | “大于或等于”匹配 |
example:
下声明包含一个 Condition 元素,该元素使用 NumericLessThanEquals 条件运算符与 nos:max-keys 键来指定请求者一次最多可在 example_bucket 内列出 10 个对象。
{
"Version": "2018-06-25",
"Statement": {
"Sid":"test",
"Effect": "Allow",
"Principal": {"nws":["nrn:nws:iam::productid:root"]},
"Action": ["nos:ListBucket"],
"Resource": ["comb:nos:example_bucket"],
"Condition": {"NumericLessThanEquals": {"nos:max-keys": "10"}}
}
}
日期条件运算符
利用日期条件运算符,您可以构建基于键与日期/时间值的对比来限制访问的 Condition 元素。您同时使用这些条件运算符与 nos:CurrentTime 键或 nos:EpochTime 键。您必须指定日期/时间值,且其中一个 W3C 实现要采用 ISO 8601 日期格式或新纪元 (UNIX) 时间格式。
注意
日期条件运算符不允许使用通配符。
条件运算符 | 说明 |
---|---|
DateEquals | 匹配特定日期 |
DateNotEquals | 否定匹配 |
DateLessThan | 在特定日期和时间 |
DateLessThanEquals | 在特定日期和时间 |
DateGreaterThan | 在特定日期和时间 |
DateGreaterThanEquals | 在特定日期和时间 |
example:
以下声明包含一个 Condition 元素,该元素使用 DateLessThan 条件运算符与 nos:CurrentTime 键来指定必须在 2013 年 6 月 30 日之前收到请求。
{
"Version": "2018-06-25",
"Statement": {
"Sid":"test",
"Effect": "Allow",
"Principal": {"nws":["nrn:nws:iam::productid:root"]},
"Action": ["nos:GetObject"],
"Resource": ["comb:nos:examplebucket/*"],
"Condition": {"DateLessThan": {"nos:CurrentTime": "2013-06-30T00:00:00Z"}}
}
}
布尔值条件运算符
利用布尔值条件,您可以构建基于键与“正确”或“错误”的对比来限制访问的 Condition 元素。
条件运算符 | 说明 |
---|---|
Bool | 布尔值匹配 |
example:
下列声明使用 Bool 条件运算符与 nos:SecureTransport 键来指定必须使用 SSL 发出请求。
{
"Version": "2018-06-25",
"Statement": {
"Sid":"test",
"Effect": "Allow",
"Principal": {"nws":["nrn:nws:iam::productid:root"]},
"Action": ["nos:GetObject"],
"Resource": ["comb:nos:examplebucket/*"],
"Condition": {"Bool": {"nos:SecureTransport": "true"}}
}
}
IP 地址条件运算符
利用 IP 地址条件运算符,您可以构建 Condition 元素,它们会基于键与 IPv4 或 IPv6 地址或 IP 地址范围的对比来限制访问。可以用nws:SourceIp键使用它们。该值必须采用标准的 CIDR 格式 (例如 203.0.113.0/24 或 2001:DB8:1234:5678::/64)。如果您指定的 IP 地址没有关联的路由前缀, 将使用 /32 作为默认前缀值。
条件运算符 | 说明 |
---|---|
IpAddress | 指定的 IP 地址或范围 |
NotIpAddress | 除指定 IP 地址或范围外的所有 IP 地址 |
下列声明使用 IpAddress 条件运算符与 nos:SourceIp 键来指定必须从 IP 范围 203.0.113.0 至 203.0.113.255 发出请求。
{
"Statement": {
"Sid":"test",
"Effect": "Allow",
"Principal": {"nws":["nrn:nws:iam::productid:root"]},
"Action": ["nos:GetObject"],
"Resource": ["comb:nos:examplebucket/*"],
"Condition": {"IpAddress": {"nws:SourceIp": "203.0.113.0/24"}}
}
}
集合条件限定词
如果请求中的某个条件键存在多个值,那么可以使用集合条件限定词来修饰运算符,改变评估逻辑。
目前仅支持ForAnyValue和ForAllValues两个限定词
- ForAnyValue – 如果请求中的任何一个键值与策略中的任何一个条件值匹配,则该条件将返回 true。
- ForAllValues – 如果请求中的每个指定的键值都与策略中至少一个值匹配,则该条件将返回 true。
示例:
{
"Statement": [{
"Sid":"test",
"Effect": "Allow",
"Principal": {"nws":["nrn:nws:iam::productid:root"]},
"Action": ["nos:GetObject"],
"Resource": ["comb:nos:*"],
"Condition": {"ForAllValues:StringLike": {"nos:prefix": [
"aa",
"bb",
"cc"
]}}
}]
}
注意
如果请求中的键值解析为空数据集,则 ForAllValues 修改的条件运算符将返回 true,而 ForAnyValue 修改的条件运算符将返回 false。