访问控制
目录
用户签名验证(Authentication)
NOS 通过使用访问凭证 ID( AccessKey )/访问凭证密钥( SecretKey )非对称加密的方法来验证某 个请求的发送者身份。AccessKey 用于标识用户,SecretKey 是用户用于加密签名字符串和 NOS 用来验证签名字符串的密钥,其中 SecretKey 必须保密,只有用户和 NOS 知道。每个访问凭证 对都有 active/inactive 两种状态
- active 表明用户可以用此 ID 对签名验证请求
- inactive 表明用户暂停此 ID 对签名验证的功能
一个用户可以同时拥有多个 active 或者 inactive 的 ID 对。用户可以登录 API KEY 管理页面查看 管理访问凭证。当用户想以个人身份向 NOS 发送请求时,需要首先将发送的请求按照 NOS 指定 的格式生成签名字符串;然后使用 SecretKey 对签名字符串进行加密产生验证码。NOS 收到请 求以后,会通过 AccessKey 找到对应的 SecretKey,以同样的方法提取签名字符串和验证码, 如果计算出来的验证码和提供的一样即认为该请求是有效的;否则,NOS 将拒绝处理这次请求 ,并返回相关的错误码。例如若 AccessKey 格式有误,返回错误码: InvalidAccessKeyId 。
在 Head 中包含签名
用户可以在 HTTP 请求头中增加 Authorization(授权)来包含签名信息,表明这个请求已被授 权。如果用户的请求中没有 Authentication 字段,则认为是匿名访问。
验证码计算
"Authorization: NOS " + AccessKey + ":" + Base64(HMAC-SHA256(HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedHeaders + CanonicalizedResource))
- HTTP-Verb 表示 HTTP 请求类型,如:PUT,GET,DELETE等
- Content-MD5 表示内容数据的 MD5 值,某些 API 该字段非必须
- Content-Type 表示内容的类型,某些 API 该字段非必须
- Date 表示此次操作的时间,格式必须符合 RFC1123 的日期格式,示例:Wed, 01 Mar 2009 12:00:00 GMT
- CanonicalizedHeaders 表示请求中其他重要的 HTTP 头。
- CanonicalizedResource 表示用户想要访问的 NOS 资源。
其中,Date 和 CanonicalizedResource 不能为空,其余字段如为空,用空字符串" "代 替;如果请求中的 Date 时间和 NOS 服务器的时间差正负15分钟以上,NOS 服务器将拒绝该服务 ,并返回错误码:AccessDenied。
构建 CanonicalizedHeaders 的方法
所有以 ”x-nos-“ 为前缀的 HTTP Header 被称为 CanonicalizedHeaders 。它的构建方法如下:
1. 将所有以 "x-nos-" 为前缀的 HTTP 请求头的 key 转换成小写字母。如 "x-nos-meta-Name: Easyread" 转换成 "x-nos-meta-name: Easyread"。
2. 如果有相同名字的请求头,则根据标准 RFC 2616, 4.2 章进行合并(两个值之间只用逗号分隔)。如有两个名为 "x-nos-meta-name" 的请求头,对应的值分别为 "photo" 和 "Easyread",则合并后为:"x-nos-meta-name:photo,Easyread" 。注意:合并之后的顺序和请求头中出现的顺序一致
3. 将上一步得到的所有 HTTP 请求头按照字典序进行升序排列。
4. 删除请求头和内容之间分隔符两端出现的任何空格。如 "x-nos-meta-name : photo,Easyread" 转换成:"x-nos-meta-name:photo,Easyread"。
5. 将所有的头和内容用 \n 分隔符分隔拼成最后的 CanonicalizedHeader。
构建 CanonicalizedResource 的方法
用户发送请求中想访问的 NOS 目标资源被称为 CanonicalizedResource 。它的构建方法如下:
- 将 CanonicalizedResource 置成空字符串"";
- 放入要访问的 NOS 资源:对于 ListBucket 操作,资源为/;对于桶操作,资源为 /BucketName/;对于对象操作,资源为 /BucketName/ObjectName;
- 如果请求包含子资源( sub-resource ),那么将所有子资源的 Key 按照字典序排列,并以”&”为分隔符生成子资源字符串。在 CanonicalizedResource 字符串尾添加”?”和子资源字符串。示例:/BucketName/ObjectName?partNumber=PartNumber&uploadId=UploadId
sub-resource,指的是 NOS 里面某些特殊的请求参数。NOS 当前支持的子资源包括:”acl”, “location”, “uploadId”, “uploads”, “partNumber”, “delete”等
在计算签名头的时候请遵循如下规则
1. 用来签名的字符串为 UTF-8 格式,URL 中的 resource 和 queryString 应该经过 URL encode 。
2. 签名的方法用 RFC 2104 中定义的 HMAC-SHA1 方法,其中 Key 为 Secretkey 。
3. Content-Type 和 Content-MD5 在请求中不是必须的,但是如果请求需要签名验证,空值的话以回车符代替。
4. 在所有非 HTTP 标准定义的 header 中,以 ”x-nos-“ 开头的 header ,都需要加入签名字符串。
5. 以 ”x-nos-“ 开头的 header 在签名验证前需要符合以下规范:
- header 的名字需要变成小写。
- header 按字典序自小到大排序。
- 分割 header name 和 value 的冒号前后不能有空格。
- 每个 Header 之后都有一个回车,如果没有 Header,CanonicalizedHeaders 就设置为空。
注意事项
1. 如果传入的 AccessKey 不存在或 inactive,返回 403 Forbidden。错误码:InvalidAccessKeyId。
2. 若用户请求头中 Authorization 值的格式不对,返回 403 Forbidden。错误码:InvalidAccessKeyId。
3. 如果签名验证的时候,请求头中没有传入Date或者格式不正确,返回 403 Forbidden 错误。错误码: AccessDenied 。
4. 传入请求的时间必须在 NOS 服务器当前时间之后的15分钟以内,否则返回 403 Forbidden。错误码:RequestTimeTooSkewed 。
5. 如果 AccessKey 是 active 的,但 NOS 判断用户的请求发生签名错误,则返回 403 Forbidden,错误码 AccessDenied。
6. 计算签名的逻辑,可参看各类 SDK 源码 。
Bucket权限控制
NOS 提供 Bucket 级别的权限访问控制,Bucket 目前有两种访问权限:Public-read 和 Private,它们的含义如下:
- Public-read:只有该 Bucket 的创建者可以对该 Bucket 内的 Object 进行写操作(包括 Put 和 Delete Object);任何人(包括匿名访问)可以对该 Bucket 中的 Object 进行读操作(Get Object)。
- Private:只有该 Bucket 的创建者可以对该 Bucket 内的 Object 进行读写操作(包括 Put 、 Delete 和 Get Object);其他人无法访问该 Bucket 内的 Object 。
用户新创建一个 Bucket 时,如果不指定 Bucket 权限,NOS 会自动为该 Bucket 设置 Private 权限。对于一个已经存在的 Bucket,只有它的创建者可以修改该 Bucket 的权限。
Object外链地址的构成规则
如果一个 Bucket 设置成 Public-read 权限,意味着你允许其他用户来访问属于你的 Object。你的 Object 的外链地址构成规则如下:
https://<你的Bucket名字>.endpoint/<你的Object名字>
例如,在一个杭州分区 Bucket(名字为photo)中,放了名为一个 ”image/test.jpg” 的 Object,那么这个 Object 的 URL 为:
https://photo.nos-eastchina1-i.netease.com/image/test.jpg
photo 是 Bucket
nos-eastchina1-i.netease.com 为杭州分区的访问域名
image/test.jpg 是 Object
用户可以将该 URL 链接放入 HTML 中:
<img src=”https://photo.nos-eastchina1-i.netease.com/image/test.jpg” />
最后更新:2017-01-03 10:48:54