阿里云的oss与cdn配置说明

现状说明

目前使用阿里云的服务,直接使用其中的oss与cdn,但是需求的安全说明和文档有很多问题

需求拆解

  1. 允许上传图片,不允许公开访问图片,只允许通过默认配置好的style后缀访问图片
  2. 走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/*"
            ]
        }
    ]
}

说明:

  1. bucket来说,只需要允许最简单的两个权限就可以了,同时配置只允许这个token用户看到制定的bucket
  2. 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的私密性来完成:

  1. 设置oss的安全防盗链,不允许空referrer,同时配置只允许一个referer的白名单: $privatekey.$notexistsdomain.com<-注意这里的referer是一个密钥
  2. 设置cdn的回源策略,自定义回源httph头,配置header的参数是referer: 上述的密钥
  3. Done!

这种设置的情况下,虽然用户可以通过oss的原始域名区访问图片,但是因为不知道私有的referer而无论如何都无法访问到任何图片, 而通过cdn域名去访问的时候,就会带上这个私有的referer,从而保证了只有cdn能回源。同时再去设置cdn本身的防盗链措施加强cdn的安全请求。