阿里云的oss与cdn配置说明
现状说明
目前使用阿里云的服务,直接使用其中的oss与cdn,但是需求的安全说明和文档有很多问题
需求拆解
- 允许上传图片,不允许公开访问图片,只允许通过默认配置好的style后缀访问图片
- 走cdn,不走oss的原始域名
上传token权限设置
默认的阿里云可以通过ram的权限来进行控制,但是官方文档里面的ram配置很随意,默认允许一个新建的ram用户拥有对应的oss相关的全部权限,比如列出所有bucket;
列出bucket下面的所有objects等等。
正常来说,应该生成一个token,只允许上传图片,不允许其他操作,可以保证token泄漏也没有太大影响,甚至直接下发给前端也没有问题。
自己研究了很久oss的ram参数,最终给出的最精简的ram自定义权限的配置如下:
{
"Version": "1",
"Statement": [
{
"Sid": "允许访问bucket",
"Effect": "Allow",
"Action": [
"oss:ListBuckets",
"oss:GetBucketAcl"
],
"Resource": [
"acs:oss:*:*:bucket_name"
]
},
{
"Sid": "允许上传文件",
"Effect": "Allow",
"Action": [
"oss:PostObject",
"oss:PutObject",
"oss:GetObjectACL",
"oss:GetObject"
],
"Resource": [
"acs:oss:*:*:bucket_name/*"
]
}
]
}
说明:
- bucket来说,只需要允许最简单的两个权限就可以了,同时配置只允许这个token用户看到制定的bucket
- object来说,只允许上传,同时获取上传完成的回调部分,所以相对权限会多一些
cdn回源设置
阿里云的oss可以很方便的和自己的cdn打通,同时可以使用阿里云自己的ssl域名服务申请单域名的证书,相对而言还是统一一些的
oss允许设置原图保护,禁止用户直接访问原始图片,必须要带上后缀部分。
那么问题来了:
- 如果开启了cdn的"私有Bucket回源",那么cdn会自动计算回源的私有签名,这个时候访问任何地址都能获取到oss的原始地址,相当于通过cdn就可以直接获取原图了
- 如果关闭cdn的"私有Bucket回源", 那么cdn就无法抓取oss的原站图片
和阿里云的工程师问过之后,对方建议oss的安全设置改成"公共读",同时关闭cdn的"私有Bucket回源",这个时候是可以按照预期的,通过cdn的域名,只能访问带上style的地址的数据,无法访问原始图片,但是新的问题来了:
用户可以直接通过访问oss的外战地址进行原图的获取与下载,比如用户直接访问https://bucket_name.oss-cn-hangzhou.aliyuncs.com/a.png
就可以直接获取图片原图了
最后通过一个trick的方式来进行了规避,设置方案是采用referer的私密性来完成:
- 设置oss的安全防盗链,不允许空referrer,同时配置只允许一个referer的白名单:
$privatekey.$notexistsdomain.com
<-注意这里的referer是一个密钥 - 设置cdn的回源策略,自定义回源httph头,配置header的参数是
referer: 上述的密钥
- Done!
这种设置的情况下,虽然用户可以通过oss的原始域名区访问图片,但是因为不知道私有的referer而无论如何都无法访问到任何图片, 而通过cdn域名去访问的时候,就会带上这个私有的referer,从而保证了只有cdn能回源。同时再去设置cdn本身的防盗链措施加强cdn的安全请求。