详细解答可以参考官方帮助文档
本文基于快速搭建移动应用直传服务中提到的应用服务器,以上海的Bucket app-base-oss 为例,讲解如何配置不同的Policy实现不同的权限控制。
说明
本文提到的Policy是指快速搭建移动应用直传服务提到的config.json中指定的Policy文件内容。
以下讲述的获取STS Token 后对OSS的操作是指为应用服务器指定Policy。从STS获取临时凭证后,应用通过临时凭证访问OSS。
常见Policy
完全授权的Policy 完全授权的Policy表示允许应用可以对OSS进行任何操作。
警告
完全授权的Policy对移动应用来说是不安全的授权,不推荐使用。
{
"Statement": [
{
"Action": [
"oss:*"
],
"Effect": "Allow",
"Resource": ["acs:oss:*:*:*"]
}
],
"Version": "1"
}
获取STS Token 后对OSS的操作
结果
列出所有创建的Bucket
成功
上传不带前缀的Object,test.txt
成功
下载不带前缀的Object,test.txt
成功
上传带前缀的Object,user1/test.txt
成功
下载带前缀的Object,user1/test.txt
成功
列出Object,test.txt
成功
带前缀的Object,user1/test.txt
成功
不限制前缀的只读不写Policy 此Policy表示应用对Bucketapp-base-oss下所有的Object可列举,可下载。 {
"Statement": [
{
"Action": [
"oss:GetObject",
"oss:ListObjects"
],
"Effect": "Allow",
"Resource": ["acs:oss:*:*:app-base-oss/*", "acs:oss:*:*:app-base-oss"]
}
],
"Version": "1"
}
获取STS Token 后对OSS的操作
结果
列出所有创建的Bucket
失败
上传不带前缀的Object,test.txt
失败
下载不带前缀的Object,test.txt
成功
上传带前缀的Object,user1/test.txt
失败
下载带前缀的Object,user1/test.txt
成功
列出不带前缀的Object,test.txt
成功
列出带前缀的Object,user1/test.txt
成功
限制前缀的只读不写Policy 此Policy表示应用对Bucketapp-base-oss下带有前缀user1/的Object可列举、可下载,但无法下载其他前缀的Object。采用此种Policy,如果不同的应用对应不同的前缀,就可以达到在同一个Bucket中空间隔离的效果。 {
"Statement": [
{
"Action": [
"oss:GetObject",
"oss:ListObjects"
],
"Effect": "Allow",
"Resource": ["acs:oss:*:*:app-base-oss/user1/*", "acs:oss:*:*:app-base-oss"]
}
],
"Version": "1"
}
获取STS Token 后对OSS的操作
结果
列出所有创建的Bucket
失败
上传不带前缀的Object,test.txt
失败
下载不带前缀的Object,test.txt
失败
上传带前缀的Object,user1/test.txt
失败
下载带前缀的Object,user1/test.txt
成功
列出Object,test.txt
成功
带前缀的Object,user1/test.txt
成功
不限制前缀的只写不读Policy 此Policy表示应用可以对Bucketapp-base-oss下所有的Object进行上传。 {
"Statement": [
{
"Action": [
"oss:PutObject"
],
"Effect": "Allow",
"Resource": ["acs:oss:*:*:app-base-oss/*", "acs:oss:*:*:app-base-oss"]
}
],
"Version": "1"
}
获取STS Token 后对OSS操作
结果
列出所有创建的Bucket
失败
上传不带前缀的Object,test.txt
成功
下载不带前缀的Object,test.txt
失败
上传带前缀的Object,user1/test.txt
成功
下载带前缀的Object,user1/test.txt
成功
列出Object,test.txt
成功
带前缀的Object,user1/test.txt
成功
限制前缀的只写不读Policy 此Policy表示应用可以对Bucketapp-base-oss下带有前缀user1/的Object进行上传。但无法上传其他前缀的Object。采用此种Policy,如果不同的应用对应不同的前缀,就可以达到在同一个Bucket中空间隔离的效果。 {
"Statement": [
{
"Action": [
"oss:PutObject"
],
"Effect": "Allow",
"Resource": ["acs:oss:*:*:app-base-oss/user1/*", "acs:oss:*:*:app-base-oss"]
}
],
"Version": "1"
}
获取STS Token 后对OSS的操作
结果
列出所有创建的Bucket
失败
上传不带前缀的Object,test.txt
失败
下载不带前缀的Object,test.txt
失败
上传带前缀的Object,user1/test.txt
失败
下载带前缀的Object,user1/test.txt
成功
列出Object,test.txt
失败
带前缀的Object,user1/test.txt
失败
不限制前缀的读写Policy 此Policy表示应用可以对Bucketapp-base-oss下所有的Object进行列举、下载、上传和删除。 {
"Statement": [
{
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:DeleteObject",
"oss:ListParts",
"oss:AbortMultipartUpload",
"oss:ListObjects"
],
"Effect": "Allow",
"Resource": ["acs:oss:*:*:app-base-oss/*", "acs:oss:*:*:app-base-oss"]
}
],
"Version": "1"
}
获取STS Token 后对OSS的操作
结果
列出所有创建的Bucket
失败
上传不带前缀的Object,test.txt
成功
下载不带前缀的Object,test.txt
成功
上传带前缀的Object,user1/test.txt
成功
下载带前缀的Object,user1/test.txt
成功
列出Object,test.txt
成功
带前缀的Object,user1/test.txt
成功
限制前缀的读写Policy 此Policy表示应用可以对Bucketapp-base-oss下带有前缀user1/的Object进行列举、下载、上传和删除,但无法对其他前缀的Object进行读写。采用此种Policy,如果不同的应用对应不同的前缀,就可以达到在同一个Bucket中空间隔离的效果。 {
"Statement": [
{
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:DeleteObject",
"oss:ListParts",
"oss:AbortMultipartUpload",
"oss:ListObjects"
],
"Effect": "Allow",
"Resource": ["acs:oss:*:*:app-base-oss/user1/*", "acs:oss:*:*:app-base-oss"]
}
],
"Version": "1"
}
获取STS Token 后对OSS的操作
结果
列出所有创建的Bucket
失败
上传不带前缀的Object,test.txt
失败
下载不带前缀的Object,test.txt
失败
上传带前缀的Object,user1/test.txt
成功
下载带前缀的Object,user1/test.txt
成功
列出Object,test.txt
成功
带前缀的Object,user1/test.txt
成功
总结
从上面的例子可以看出:
可以根据不同的应用场景制定不同的Policy,然后对应用服务器稍作修改就可以实现对不用的应用用户实现不同的权限控制。
可以在应用端做优化,使得STS Token过期之前不需要向应用服务器再次请求。
Token由STS颁发。应用服务器只是定制了Policy,向STS请求Token,然后将Token转发给应用。这里的Token包含了AccessKeyId、AccessKeySecret、Expiration、SecurityToken,这些参数在OSS提供给应用的SDK中会用到。详情请参见各语言SDK参考中的授权访问章节。
参考文档
RAM和STS在OSS中的使用指南
阿里云RAM官方文档
阿里云STS官方文档