存储桶策略

桶存储策略作为JSON文档存储在 NOS 中,作为基于资源的策略,附加到桶上。

存储桶策略简介

包含一下元素:

  • 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"}
           }
       }
   ]
}

各个策略元素的解释

Sid

Sid (声明 ID) 是您针对策略语句提供的可选标识符。您可以为声明数组中的每份声明指定 Sid 值,如果指定,那么在当前策略中必须是唯一的。

Effect

Effect 元素是必需具备的元素,用于指定声明所产生的结果是“允许”还是“显式拒绝”。Effect 的有效值为 AllowDeny

在默认情况下,将拒绝访问资源。如要允许访问资源,您必须将 Effect 元素设置为 Allow。如果要拒绝结果,您需要将 Effect 元素设置为 Deny

Action

NOS定义了可在策略中指定的一组权限。这些是关键字,其中每一个均映射到特定NOS操作,包含对象的操作和桶子资源的操作。

对象操作权限

以下存储桶策略示例授予用户 (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"
            ]
        }
    ]
}
桶子资源操作权限

以下用户策略授予用户 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"
            ]
        }
    ]
}

Attention

可以是用nos:*来表示所有的nos操作

Principal

元素用于指定被允许或拒绝访问资源的用户

使用格式为:

“Principal” : {“nws”:[“nrn:nws:iam::productid:relative-id”]}

relative-id:

  • 如果是根用户,使用root
  • 如果是指定某个子账号,使用user/username

如果要授权给所有的用户,使用 “nws”:[“*”]

nws - Netease Web Service,用来指明其value要使用什么样的格式

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 is nws-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是唯一确定的

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 特殊字符

有几个特殊预定义策略变量具有固定值,可用于表示字符 (这些字符本身有特殊的含义)。如果这些特殊字符是您尝试匹配的字符串的一部分,而您原样插入这些字符,则不能正确进行解释。例如,在字符串中插入 * 星号会解释为与任何字符匹配的通配符 (而不是解释为文本 *)。这种情况下,可以使用以下预定义策略变量:

  • ${*} - 在需要星号字符 * 的位置使用。
  • ${?} - 在需要问号字符 ? 的位置使用。
  • } - 在需要美元符号字符 $ 的位置使用。

在任何可以使用常规策略变量的字符串中,都可以使用这些预定义策略变量。

策略变量

下述condition中的条件键及为策略变量

Condition

概述

访问策略语言可使您在授予权限时指定条件。在 Condition 元素 (或 Condition 块) 中,可以指定策略生效的条件。在可选的 Condition 元素中,您创建的表达式应使用布尔值运算符 (等于、小于等),以使您指定的条件与请求中的值相匹配。例如,当授予用户上传对象的权限时,存储桶拥有者可通过添加 StringEquals 条件要求此对象可公开读取。

基本语法解析

img

一个Condition子句可以包含多个条件,每个条件由运算符和键值对组成。键值对可以有大于等于一个值。

鉴权规则
image0
可用条件建
  • 在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
针对对象操作的条件键

下表显示了可对哪些 NOS操作使用哪些 NOS条件。在该表之后提供有策略示例。注意下面有关下表中所述的 NOS特定条件键的内容:

  • 这些条件键名称的前缀为 nos:。例如:nos:x-nos-acl。
  • 每个条件键均映射到可设置条件的 API 所允许的相同名称请求标头。即,这些条件键指定同名请求标头的行为。例如:

条件键 nos:x-nos-acl 可用于对 nos:PutBucket 权限授予条件权限,它定义 PUT Bucket API 支持的 x-nos-acl 请求标头的行为。

许可适用的条件建描述
nos:PutObjectnos:x-nos-copy-source要复制对象,请使用 PUT Object API 并使用 x-nos-copy-source 标头指定源。通过使用此键,存储桶拥有者可将复制源限定到特定存储桶、存储桶中的特定文件夹,或者存储桶中的特定对象。
nos:PutObjectnos: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/*"
                }
            }
        }
    ]
}
针对存储桶操作的条件键

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"
                }
            }
        }
    ]
}
条件运算符

条件运算符是条件的“动词”形式,可指定执行的比较类型。条件运算符可分为以下类别:

  • 字符串
  • 数值
  • 日期和时间
  • 布尔值
  • 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"
        ]}}
    }]
}

Attention

如果请求中的键值解析为空数据集,则 ForAllValues 修改的条件运算符将返回 true,而 ForAnyValue 修改的条件运算符将返回 false。