数据安全性是云存储服务的重中之重。云存储的安全机制主要需要考虑以下几个因素:
- 如何判断该请求方是否合法,且对目标空间有相应的访问权限。
- 因为服务的访问协议同时支持 HTTP 和 HTTPS,服务端需要判断收到的请求是否经过篡改。
- 相比上传新资源,覆盖文件或删除已有资源拥有更高的风险。因此对上传或修改动作,需要确认请求方是否拥有修改或删除的权限。
在使用七牛云存储服务的过程中,需要考虑安全机制的场景主要有如下几种:
- 上传资源
- 访问资源
- 管理和修改资源
这三个场景需要考虑不同的安全因素,因此七牛针对性的提供了三种安全机制:上传凭证、下载凭证和管理凭证。
因为凭证的生成需要用到SecretKey,因此该生成动作不应在不受信任的环境中进行。需要注意的是,开发者绝不能将密钥包含在分发给最终用户的程序中,无论是包含在配置文件中还是二进制文件中都会带来非常大的密钥泄漏风险。
推荐的模型如下所示:
密钥(AccessKey/SecretKey)
密钥用于以上几种凭证的生成。以 SecretKey 为参数,配合适当的签名算法,可以得到原始信息的数字签名,防止内容在传递过程中被伪造或篡改。
密钥通常是成对创建和使用,包含一个 AccessKey 和一个 SecretKey。其中 AccessKey 会在传输中包含,而用户必须保管好 SecretKey 不在网络上传输以防止被窃取。若 SecretKey 被恶意第三方窃取,可能导致非常严重的数据泄漏风险。因此,如发现 SecretKey 被非法使用,管理员应第一时间在七牛开发者平台的密钥管理中更换密钥。
在具体描述各种凭证的详细生成过程中我们会看到 AccessKey 和 SecretKey 是如何被使用的。
上传凭证(UploadToken)
客户端上传前需要先获取从服务端颁发的上传凭证,并在上传资源时将上传凭证包含为请求内容的一部分。不带凭证或带非法凭证的请求将返回 HTTP 错误码 401,代表认证失败。
生成上传凭证时需要指定以下要素:
- 权限,指定上传的目标空间或允许覆盖的指定资源。
- 凭证有效期,即一个符合Unix时间戳规范的数值,单位为秒。
注意:
因为时间戳的创建和验证在不同的服务端进行(在业务服务器创建,在云存储服务器验证),因此开发者的业务服务器需要尽可能校准时间,否则可能出现凭证刚创建就过期等各种奇怪的问题。 - 可选择设置的最终用户标识 ID。这是为了让业务服务器在收到结果回调时能够识别产生该请求的最终用户信息。
我们使用上传策略 (PutPolicy)保存和传递这些设置。关于上传策略和上传凭证的生成细节,请查阅上传凭证。
下载凭证(DownloadToken)
下载私有资源的请求需要带一个合法的下载凭证。不带凭证或带非法凭证的请求将返回 HTTP 错误码 401,代表认证失败。
与上传凭证相比,下载凭证的作用比较简单:
- 保证请求发起者拥有对目标空间的访问权限。
- 保证服务端收到的下载请求内容未经中途篡改,具体包括目标资源的 URI 和该访问请求的有效期信息均应未受到篡改。
关于下载凭证的生成细节,请查阅下载凭证。
防盗链
下载还有一种常见的场景,即公开资源的防盗链,例如禁止特定来源域名的访问,禁止非浏览器发起的访问等。
我们可以通过 HTTP 协议支持的 Referer 机制即HTTP Referer来进行相应的来源识别和管理。
防盗链是一个系统设置,不影响开发工作。如发现有盗链情况,开发者可在七牛开发者平台里的 融合CDN加速 中的 高级配置 进行设置。
管理凭证(AccessToken)
在管理现有资源时,例如查看资源元数据、删除或移动资源等,通常需要带一个合法的管理凭证。不带凭证或带非法凭证的管理请求将返回 HTTP 错误码 401,代表认证失败。
管理凭证的作用与下载凭证比较类似:
- 保证请求发起者拥有对目标空间的管理权限。
- 保证服务端收到的管理请求内容未经中途篡改,具体包括代表管理动作的 URI 和该管理动作的参数信息均应未受到篡改。
关于管理凭证的生成细节,请查阅管理凭证。
跨域访问
出于安全的考虑,Web 浏览器从很早之前就定下同域安全策略的标准,默认情况下同一域名下的页面只能向同域(包括 CNAME 域名、端口)下的 URL 发送所有类型的 HTTP 请求。而向不同域的地址发送非 GET 请求时,默认情况下只能返回同域安全策略错误。
对此,在发起上传或下载请求的时候,服务会返回相应的支持跨域的 Header:
Access-Control-Allow-Headers: X-File-Name, X-File-Type, X-File-Size
Access-Control-Allow-Methods: OPTIONS, HEAD, POST
Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: *