• 关于

    python里面os

    的搜索结果

问题

linux里面python调用系统命令问题?报错

想用linux里的awk处理一个文本,输入行号,打印出来。因为数据是逗号分隔的csv文件,我第一时间就想起了awk。但是在写python时,出错了。 以下是用shell写的程序可...
爱吃鱼的程序员 2020-06-10 14:09:15 0 浏览量 回答数 1

问题

linux里面python调用系统命令问题 400 请求报错 

想用linux里的awk处理一个文本,输入行号,打印出来。因为数据是逗号分隔的csv文件,我第一时间就想起了awk。但是在写python时,出错了。 以下是用shell写的程序可以运行...
kun坤 2020-05-29 22:54:51 0 浏览量 回答数 1

问题

急求 请问 在centos7命令行里执行可以,但是python下os.popen却报错--username 不存在该命令?

环境:centos 7 64; python2.7.3问题:用命令行直接$ pptpsetup --create myvpn --server ip --username name --password pwd --start可以直接运行但...
a123456678 2019-12-01 20:12:42 1299 浏览量 回答数 1

阿里云试用中心,为您提供0门槛上云实践机会!

100+款试用云产品,最长免费试用12个月!拨打95187-1,咨询专业上云建议!

回答

python可以做shell脚本吗? 首先介绍一个函数: os.system(command) 这个函数可以调用shell运行命令行command并且返回它的返回值。试一下在 python的解释器里输入os.system(”ls -l”),就可以看到”ls”列出了当前目录下的文件。可以说,通过这个函数,python就拥有了shell的所有能力。呵呵。。不过,通常这条命令不需要用到。因为shell常用的那些命令在python中通常有对应而且同样简洁的写法。 shell中最常用的是ls命令,python对应的写法是:os.listdir(dirname),这个函数返回字符串列表,里面是所有的文件名,不过不包含”.”和”..”。如果要遍历整个目录的话就会比较复杂一点。我们等下再说吧。先在解释器里试一下: os.listdir(”/”) [’tmp’, ‘misc’, ‘opt’, ‘root’, ‘.autorelabel’, ’sbin’, ’srv’, ‘.autofsck’, ‘mnt’, ‘usr’, ‘var’, ‘etc’, ’selinux’, ‘lib’, ‘net’, ‘lost found’, ’sys’, ‘media’, ‘dev’, ‘proc’, ‘boot’, ‘home’, ‘bin’] 就像这样,接下去所有命令都可以在python的解释器里直接运行观看结果。 对应于cp命令的是:shutil.copy(src,dest),这个函数有两个参数,参数src是指源文件的名字,参数dest则是目标文件或者目标目录的名字。 如果dest是一个目录名,就会在那个目录下创建一个相同名字的文件。与shutil.copy函数相类似的是 shutil.copy2(src,dest),不过copy2还会复制最后存取时间和最后更新时间。 不过,shell的cp命令还可以复制目录,python的shutil.copy却不行,第一个参数只能是一个文件。这怎么办?其实,python还有个shutil.copytree(src,dst[,symlinks]) 。参数多了一个symlinks,它是一个布尔值,如果是True的话就创建符号链接。 移动或者重命名文件和目录呢?估计被聪明的朋友猜到了,shutil.move(src,dst),呵呵。。与mv命令类似,如果src和dst在同一个文件系统上,shutil.move只是简单改一下名字,如果src和dst在不同的文件系统上,shutil.move会先把src复制到dst,然后删除src文件。看到现在,大多数朋友应该已经对 python的能力有点眉目了,接下来我就列个表,介绍一下其它的函数: os.chdir(dirname)把当前工作目录切换到dirname下 os.getcwd()返回当前的工作目录路径 os.chroot(dirname)把dirname作为进程的根目录。和*nix下的chroot命令类似 os.chmod(path,mode)更改path的权限位。mode可以是以下值(使用or)的组合: os.S_ISUIDos.S_ISGIDos.S_ENFMTos.S_ISVTXos.S_IREADos.S_IWRITEos.S_IEXECos.S_IRWXUos.S_IRUSRos.S_IWUSRos.S_IXUSRos.S_IRWXGos.S_IRGRPos.S_IWGRPos.S_IXGRPos.S_IRWXOos.S_IROTHos.S_IWOTHos.S_IXOTH 具体它们是什么含义,就不仔细说了,基本上就是R代表读,W代表写,X代表执行权限。USR 代表用户,GRP代表组,OTH代表其它。 os.chown(path,uid,gid)改变文件的属主。uid和gid为-1的时候不改变原来的属主。 os.link(src,dst)创建硬连接 os.mkdir(path,[mode])创建目录。mode的意义参见os.chmod(),默认是0777 os.makedirs(path,[mode])和os.mkdir()类似,不过会先创建不存在的父目录。 os.readlink(path)返回path这个符号链接所指向的路径 os.remove(path)删除文件,不能用于删除目录 os.rmdir(path)删除文件夹,不能用于删除文件 os.symlink(src,dst)创建符号链接 shutil.rmtree(path[,ignore_errors[,onerror]]) 删除文件夹介绍了这么多,其实只要查一下os和shutil两个模块的文档就有了,呵呵。。真正编写 shell脚本的时候还需要注意: 1.环境变量。python的环境变量保存在os.environ这个字典里,可以用普通字典的方法修改它,使用system启动其它程序的时候会自动被继承。比如: os.environ[”fish”]=”nothing”不过也要注意,环境变量的值只能是字符串。和shell有些不同的是,python没有 export环境变量这个概念。为什么没有呢?因为python没有必要有:-) 2.os.path这个模块里包含了很多关于路径名处理的函数。在shell里路径名处理好像不是很重要,但是在python里经常需要用到。最常用的两个是分离和合并目录名和文件名: os.path.split(path) -> (dirname,basename)这个函数会把一个路径分离为两部分,比如:os.path.split(”/foo /bar.dat”)会返回(”/foo”,”bar.dat”) os.path.join(dirname,basename)这个函数会把目录名和文件名组合成一个完整的路径名,比如:os.path.join(”/foo”,”bar.dat”)会返回”/foo/bar.dat”。这个函数和os.path.split()刚好相反。 还有这些函数: os.path.abspath(path)把path转成绝对路径 os.path.expanduser(path)把path中包含的”~”和”~user”转换成用户目录 os.path.expandvars(path)根据环境变量的值替换path中包含的”$name”和”${name}”,比如环境变量 FISH=nothing,那os.path.expandvars(”$FISH/abc”)会返回”nothing/abc” os.path.normpath(path)去掉path中包含的”.”和”..” os.path.splitext(path)把path分离成基本名和扩展名。比如:os.path.splitext(”/foo /bar.tar.bz2″)返回(’/foo/bar.tar’, ‘.bz2′)。要注意它和os.path.split()的区别 3.在os模块有一个很好用的函数叫os.stat()没有介绍,因为os.path模块里包含了一组和它具有同样功能的函数,但是名字更好记一点。 os.path.exists(path)判断文件或者目录是否存在 os.path.isfile(判断path所指向的是否是一个普通文件,而不是目录 os.path.isdir(path) 判断path所指向的是否是一个目录,而不是普通文件 os.path.islink(path)判断path所指向的是否是一个符号链接 os.path.ismount(path)判断path所指向的是否是一个挂接点(mount point) os.path.getatime(path)返回path所指向的文件或者目录的最后存取时间。 os.path.getmtime(path)返回path所指向的文件或者目录的最后修改时间 os.path.getctime(path)返回path所指向的文件的创建时间 os.path.getsize(path返回path所指向的文件的大小 4.应用python编写shell脚本经常要用到os,shutil,glob(正则表达式的文件名),tempfile(临时文件),pwd(操作/etc/passwd文件),grp(操作/etc/group文件),commands(取得一个命令的输出)。前面两个已经基本上介绍完了,后面几个很简单,看一下文档就可以了。 5.sys.argv是一个列表,保存了python程序的命令行参数。其中 sys.argv[0]是程序本身的名字。不能光说不练,接下来我们就编写一个用于复制文件的简单脚本。前两天叫我写脚本的同事有个几万个文件的目录,他想复制这些文件到其它的目录,又不能直接复制目录本身。他试了一下”cp src/* dest/”结果报了一个命令行太长的错误,让我帮他写一个脚本。操起python来:import sys,os.path,shutilfor f in os.listdir(sys.argv[1]):shutil.copy(os.path.join(sys.argv[1],f),sys.argv[2]) 再试一下linuxapp版里的帖子——把一个文件夹下的所有文件重命名成 10001~10999。可以这样写:import os.path,sysdirname=sys.argv[1]i=10001for f in os.listdir(dirname):src=os.path.join(dirname,f)if os.path.isdir(src):continueos.rename(src,str(i)) i =1 os.chkdir(path) 转换到目录path 下。 os.system('md a') 可以直接创建目录。 os.name字符串指示你正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'。● os.getcwd()函数得到当前工作目录,即当前Python脚本工作的目录路径。● os.getenv()和os.putenv()函数分别用来读取和设置环境变量。● os.listdir()返回指定目录下的所有文件和目录名。● os.remove()函数用来删除一个文件。● os.system()函数用来运行shell命令。● os.linesep字符串给出当前平台使用的行终止符。例如,Windows使用'rn',Linux使用'n'而Mac使用'r'。● os.path.split()函数返回一个路径的目录名和文件名。 os.path.split('/home/swaroop/byte/code/poem.txt') ('/home/swaroop/byte/code', 'poem.txt')● os.path.isfile()和os.path.isdir()函数分别检验给出的路径是一个文件还是目录。类似地,os.path.exists()函数用来检验给出的路径是否真地存在。 文件重定向 已有PY文件new1.py ,在命令行下输入:new1>new.txt 可以将new1运行的结果输出到文件new.txt,这称为流重定向。
元芳啊 2019-12-02 01:04:36 0 浏览量 回答数 0

问题

mac上输入python报错?报错

我写了一个python的文件叫abc.py,里面就是print 'hello world' ,然后在该目录下输入python进入python的命令行,进行了如下的操作 >>> import a...
爱吃鱼的程序员 2020-06-14 16:25:42 0 浏览量 回答数 1

回答

看代码除了缩进有问题之外,别的没啥问题###### import sys,os,time class Test(object): def test(self): print "abc" def main(): t = Test() t.test() print time.time() if name=="main": main();######发现一个奇怪的符号。###### 引用来自“geminiblue”的答案 import sys,os,time class Test(object): def test(self): print "abc" def main(): t = Test() t.test() print time.time() if __name__=="__main__": main(); @巴郎 python里面不用大括号,注意缩进就好了 ######建议先学学基础知识。######建议先学学基础知识。######同意,建议先把基础的东西看看把···######最后的if语句缩进不对 ###### 看了半天,才看懂。 很明显该改为: #!/usr/bin/env python class Test(object): def test(self): print 'abc' def main(): t = Test() t.test() print '1' if __name__ == '__main__': main() 然后,不清楚为何这么改,去看: 1. 【教程】详解Python中代码缩进(Indent):影响代码的内在逻辑关系和执行结果 2.相关的: 【整理】Python中的__name__和__main__含义详解 总结: 还是要先学好python的基础,至少是语法级别上的基础知识 然后才能是继续折腾。 3.关于学习python,我写的,供参考: 初级:python初级教程:入门详解 中级:python中级教程:开发总结 高级: Python专题教程:字符串和字符编码 Python专题教程:抓取网站,模拟登陆,抓取动态网页
爱吃鱼的程序员 2020-06-03 17:15:18 0 浏览量 回答数 0

问题

【精品锦集】Python热门问答02

我们的Python合集系列面世啦,预计会有10个系列。 下面是我们【精品锦集】Python热门问答01 https://developer.aliyun.com/ask/138865 1、怎么将我需要的Python库导入...
问问小秘 2019-12-01 19:52:09 72 浏览量 回答数 1

问题

【python学习全家桶】263道python热门问题,阿里百位技术专家答疑解惑

阿里极客公益活动:或许你挑灯夜战只为一道难题或许你百思不解只求一个答案或许你绞尽脑汁只因一种未知那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了他们用户自己手中的技术来帮助用户成长本次活动特邀百位阿里技术专家对python常见问题进...
管理贝贝 2019-12-01 20:07:21 7217 浏览量 回答数 2

回答

python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。 现假定有一个shell脚本test.sh: !/bin/bash echo "hello world!" exit 3os.system(cmd):该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况下,则函数的返回值是0×100,换算为10进制得到256。 如果我们需要获得os.system的正确返回值,那使用位移运算可以还原返回值: n = os.system(test.sh) n >> 8 3os.popen(cmd): 这种调用方式是通过管道的方式来实现,函数返回一个file-like的对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容)。使用os.popen调用test.sh的情况: file = os.popen(test.sh) file.read() ‘hello world!n’ 明显地,像调用"ls"这样的shell命令,应该使用popen的方法来获得内容。
ylrf1212 2019-12-02 01:08:45 0 浏览量 回答数 0

问题

SLB Python API有一个编码的问题

最近在测试SLB,通过我们自己的脚本去动态调整SLB后端服务器的访问权重(我们只使用了SLB提供的VIP,并不依赖SLB的心跳检测,我们有自己的心跳检测来监控后端服务器)...
redcatmiss 2019-12-01 21:11:04 4596 浏览量 回答数 2

问题

shutil.rmtree问题,报错目录非空 ?报错

os.system('attrib -r -h -S -A 3.XXX/. /s') shutil.rmtree(g_py_path+"\3.XXX") 这样的代码在python里面完全没有问题&#...
爱吃鱼的程序员 2020-06-23 20:40:28 0 浏览量 回答数 1

问题

win7 alios-things IDE环境安装失败问题求助

OS: win7 按照指南 进行开发环境安装 python  pip 和 aos-cube都已经安装了,但是在 vsc里面执行aos-cube或者进行编译的时候报如下错误: D:\AliO...
weimj00 2019-12-01 21:49:59 1121 浏览量 回答数 0

回答

在使用内置模块的时候需要导入,例如import abc,则导入abc模块,当然模块也可以自己写,相当于一个类,后面放到类里说,这个因为环境闲置,有些无法执行,只能理解了 os系统操作 import os os.system('ls') #调用系统命令,并返回执行结果,os.system('dir').... os.popen('ls') #和system相似,system会直接把结果打印到屏幕上,popen可以把结果返回给一个变量,然后可以用read()或for循环来遍历 os.chdir('/home/myuser/py') #windows可以直接把路径打成'c:mypy'这种,os可以将路径改成通用路径 dir_path = os.getcwd() #获取到当前目录,结果是当前目录路径'/home/myuser/py' os.listdir(dir_path) #获取指定目录下的所有文件和文件夹,结果是一个list os.path.isdir(dir_name) #判断指定名称是否是文件夹,假如dir_name是个文件夹,则返回True,否则False os.path.join(dir1,dir2,file1) #合并多个路径,可以是dir1,dir2...,file1 os.mkdir('py') #创建目录,和linux一样,没什么可说的 os.rmdir('py') #删除目录,必须是个空目录,和linux一样 os.environ.get(env) #获取环境变量,例os.environ.get('oracle_home') re正则操作 import re a = "my py it's fucking greate!" 几个常用的正则内容,|或,.通配符(同excel的),?匹配0个或1个,匹配0个或多个,+匹配1个或多个,\符号,*比如要匹配需要用转义就是只是个而不是0个或多个,^匹配行开始,$匹配行结尾 (?<=XXX)前视,(?=XXX)后视,这个可以百度,我说不清,一般不会用,爬虫时候用的多 [A-Z]大写的全部字母,[a-z]小写的全部字母,[0-9]全部数字 正则默认是贪婪模式, .*?这样写是非贪婪模式,(XXX)匹配一个字符串 re_value = re.compile('^.*? ') #编译正则表达式,这段正则的意思是匹配从开始到第一个空格的内容,正则最好先编译下再用 re_search = re.search(re_value,a) #在字符串里找正则匹配的,这个不能直接显示需要group print re_search.group() #结果是my re_find = re.findall(re_value,a) #在字符串里找全部可以匹配的结果,返回一个迭代 for i in re_find: print i #因为只有一行,因此只找到一个,结果是my,可以自己搞多行试试 re.sub(re_value,'',a) #用''替换re_value,就是把正则匹配的结果替换成空,当然也可以替换成别的,结果是"py it's fucking greate!" sys,这个功能很乱,我也不知道应该怎么归类 import sys sys.argv #取得外部传入参数,返回一个list,平常执行命令python a.py,参数在后面输入,例 a.py a = sys.argv #执行命令python a.py 111 222,执行后a变量的结果是[a.py,111,222] 各种随机生成 import random random.randint(1,10) #随机生成一个1到10的随机数,结果可能是1/2/3/4/5/6/7/8/9/10其中任意一个 a = ['a','b','c'] #搞个a存个list random.choice(a) #从a里面随机抽个元素出来,结果可能是'a'/'b'/'c' random.uniform(1,10) #随机生成一个1到10的随机小数,结果可能是。。。。。这个我就不写了,你懂的
元芳啊 2019-12-02 01:04:40 0 浏览量 回答数 0

问题

阿里云禁止25端口,python自动邮件发送告警解决方案

服务商阿里云 操作系统Centos6.8 由于阿里云把SMTP-25端口禁止使用,即使在安全组里面开通25端口也是无法使用的,于是把python邮件脚本改成SSL协议,端口465 下面是p...
砂锅饭 2019-12-01 21:41:55 5483 浏览量 回答数 1

问题

如何利用python脚本启动spring boot项目?? 400 报错

如何利用python脚本启动spring boot项目?? 400 报错 有一个spring boot 项目最终落地为jar包.原本可以直接通过nohup命令来实现。 nohup java -jar app.jar &am...
爱吃鱼的程序员 2020-06-04 16:30:27 1 浏览量 回答数 1

问题

python写的windows服务,启动显示错误:服务没有及时响应启动或控制请求

'''pythonimport win32serviceimport win32serviceutilimport win32eventimport os, timeimport winerrorclass service(win32ser...
concealment 2019-12-01 19:25:09 3983 浏览量 回答数 1

回答

对于需要调用C代码的一些小的问题,通常使用Python标准库中的 ctypes 模块就足够了。 要使用 ctypes ,你首先要确保你要访问的C代码已经被编译到和Python解释器兼容 (同样的架构、字大小、编译器等)的某个共享库中了。 为了进行本节的演示,假设你有一个共享库名字叫 libsample.so ,里面的内容就是15章介绍部分那样。 另外还假设这个 libsample.so 文件被放置到位于 sample.py 文件相同的目录中了。 要访问这个函数库,你要先构建一个包装它的Python模块,如下这样: # sample.py import ctypes import os # Try to locate the .so file in the same directory as this file _file = 'libsample.so' _path = os.path.join(*(os.path.split(__file__)[:-1] + (_file,))) _mod = ctypes.cdll.LoadLibrary(_path) # int gcd(int, int) gcd = _mod.gcd gcd.argtypes = (ctypes.c_int, ctypes.c_int) gcd.restype = ctypes.c_int # int in_mandel(double, double, int) in_mandel = _mod.in_mandel in_mandel.argtypes = (ctypes.c_double, ctypes.c_double, ctypes.c_int) in_mandel.restype = ctypes.c_int # int divide(int, int, int *) _divide = _mod.divide _divide.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int)) _divide.restype = ctypes.c_int def divide(x, y): rem = ctypes.c_int() quot = _divide(x, y, rem) return quot,rem.value # void avg(double *, int n) # Define a special type for the 'double *' argument class DoubleArrayType: def from_param(self, param): typename = type(param).__name__ if hasattr(self, 'from_' + typename): return getattr(self, 'from_' + typename)(param) elif isinstance(param, ctypes.Array): return param else: raise TypeError("Can't convert %s" % typename) # Cast from array.array objects def from_array(self, param): if param.typecode != 'd': raise TypeError('must be an array of doubles') ptr, _ = param.buffer_info() return ctypes.cast(ptr, ctypes.POINTER(ctypes.c_double)) # Cast from lists/tuples def from_list(self, param): val = ((ctypes.c_double)*len(param))(*param) return val from_tuple = from_list # Cast from a numpy array def from_ndarray(self, param): return param.ctypes.data_as(ctypes.POINTER(ctypes.c_double)) DoubleArray = DoubleArrayType() _avg = _mod.avg _avg.argtypes = (DoubleArray, ctypes.c_int) _avg.restype = ctypes.c_double def avg(values): return _avg(values, len(values)) # struct Point { } class Point(ctypes.Structure): _fields_ = [('x', ctypes.c_double), ('y', ctypes.c_double)] # double distance(Point *, Point *) distance = _mod.distance distance.argtypes = (ctypes.POINTER(Point), ctypes.POINTER(Point)) distance.restype = ctypes.c_double 如果一切正常,你就可以加载并使用里面定义的C函数了。例如: >>> import sample >>> sample.gcd(35,42) 7 >>> sample.in_mandel(0,0,500) 1 >>> sample.in_mandel(2.0,1.0,500) 0 >>> sample.divide(42,8) (5, 2) >>> sample.avg([1,2,3]) 2.0 >>> p1 = sample.Point(1,2) >>> p2 = sample.Point(4,5) >>> sample.distance(p1,p2) 4.242640687119285 >>>
哦哦喔 2020-04-17 18:10:17 0 浏览量 回答数 0

问题

命令行工具 CLI:配置命令行工具和SDK:专有云和专有域版

注意:本文档内容仅适用于专有云、专有域用户配置其命令行工具,公共云用户请参见 配置命令行工具(公共云版)。 安装好命令行工具后,您需要先配置安全证书,证书是...
行者武松 2019-12-01 21:52:24 1721 浏览量 回答数 0

问题

厦门求职,应届毕业生求个java方向或者安卓的岗位~~? 400 报错

厦门求职,应届毕业生求个java方向或者安卓的岗位~~? 400 报错     男,本科,软件工程专业,之前在一家小公司实习过三个月,本来...
爱吃鱼的程序员 2020-06-02 17:06:34 0 浏览量 回答数 1

回答

详细解答可以参考官方帮助文档 之前章节只用到了RAM的子账号功能,这些子账号都是可以长期正常使用的,发生泄露之后如果无法及时解除权限的话会很危险。 继续上文的例子,当开发者的app被用户使用之后,用户的数据要上传到OSS的ram-test-app这个Bucket,当app的用户数据很多的时候,需要考虑如何才能安全的授权给众多的app用户上传数据呢,以及如何保证多个用户之间存储的隔离。 类似这种需要临时访问的场景可以使用STS来完成。STS可以指定复杂的策略来对特定的用户进行限制,仅提供最小的权限。 创建角色 继续上一章节的例子,App用户有一个名为ram-test-app的Bucket来保存个人数据。创建角色的步骤如下: 按照上文的流程创建一个子账号ram_test_app,不需要赋予任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。 创建角色。这里创建两个角色,一个用于用户读取等操作,一个用于用户上传文件。 打开访问控制的管理控制台,选择角色管理 > 新建角色。 选择角色类型。这里选择用户角色。 填写类型信息。因为角色是被阿里云账号使用过的,因此选择默认的即可。 配置角色基本信息。 创建完角色之后,角色是没有任何权限的,因此这里和上文所述一样需要新建一个自定义的授权策略。授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }表示对ram-test-app拥有只读权限。 建立完成后,即可在角色管理里面给RamTestAppReadOnly添加上ram-test-app的只读授权。 按照上文同样的方法,建立一个RamTestAppWrite的角色,并且赋予写ram-test-app的自定义授权,授权如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }目前新建的两个角色为:RamTestAppReadOnly和RamTestAppWrite,分别表示了对于ram-test-app的读写权限。 临时授权访问 创建了角色之后,接下来就可以使用临时授权来访问OSS了。 准备工作 在正式使用之前,还有一些工作需要完成。扮演角色也是需要授权的,否则任意子账号都可以扮演这些角色会带来不可预计的风险,因此有扮演对应角色需求的子账号需要显式的配置权限。 在授权管理策略中新建两个自定义的授权策略,分别如下:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappreadonly" } ], "Version": "1" }使用相同的方法创建另一个自定义授权策略:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappwrite" } ], "Version": "1" }这里Resource后面填写的内容表示某个角色ID,角色的ID可以在角色管理 > 角色详情中找到。 将这两个授权赋给ram_test_app这个账号。 使用STS授权访问 现在一切准备就绪,可以正式使用STS来授权访问了。 这里使用一个简单的STS的python命令行工具sts.py。 具体的调用方法如下: $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret RoleArn表示的是需要扮演的角色ID,角色的ID可以在角色管理 > 角色详情中找到。 RoleSessionName是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。 Policy表示的是在扮演角色的时候额外加上的一个权限限制。 DurationSeconds指的是临时凭证的有效期,单位是s,最小为900,最大为3600。 id和secret表示的是需要扮演角色的子账号的AccessKey。 这里需要解释一下Policy,这里传入的Policy是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的Policy的交集。 在扮演角色的时候传入Policy的原因是为了灵活性,比如上传文件的时候可以根据不同的用户添加对于上传文件路径的限制,这点会在下面的例子展示。 现在我们可以来实际试验一下STS的作用,作为试验用的Bucket,先在控制台向ram-test-app传入一个test.txt的文本,内容为ststest。 首先使用ram_test_app这个子账号直接来访问。请将下面的AccessKey换成自己试验用的AccessKey。 [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94D444F4D8B2225E4AFE'), ('date', 'Tue, 17 Nov 2015 02:45:40 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94D444F4D8B2225E4AFE</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA 100% Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94E5B1119B445B9F8C3A'), ('date', 'Tue, 17 Nov 2015 02:45:57 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94E5B1119B445B9F8C3A</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed! 因为ram_test_app这个子账号没有访问权限,因此访问失败。 使用临时授权下载 现在使用STS来下载文件,这里为了简单,传入的Policy和角色的Policy一致,过期时间使用默认的3600s,App的用户假定为usr001。步骤如下: 使用STS来获取临时的凭证。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A07%3A25Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappreadonly&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3AListObjects%22%2C%22oss%3AGetObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%22%2C%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=bshxPZpwRJv5ch3SjaBiXLodwq0%3D&Action=AssumeRole&SignatureNonce=53e1be9c-8cd8-11e5-9b86-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappreadonly/usr001", "AssumedRoleId": "317446347657426289:usr001" }, "Credentials": { "AccessKeyId": "STS.3mQEbNf******wa180Le", "AccessKeySecret": "B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB", "Expiration": "2015-11-17T04:07:25Z", "SecurityToken": "CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=" }, "RequestId": "8C009F64-F19D-4EC1-A3AD-7A718CD0B49B" } 使用临时凭证来下载文件,这里sts_token就是上面STS返回的SecurityToken。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% The object test.txt is downloaded to test.txt, please check. 0.061(s) elapsed 可见已经可以使用临时凭证来下载文件了,那再试着使用这个凭证来上传。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9A2A1790CF0F53C15C82'), ('date', 'Tue, 17 Nov 2015 03:08:26 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9A2A1790CF0F53C15C82</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!由于扮演的角色只有下载的权限,因此上传失败。 使用临时授权上传 现在可以来试验一下使用STS上传。步骤如下: 获取STS的临时凭证,App用户为usr001。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappwrite RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["acs:oss:*:*:ram-test-app/usr001/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A16%3A10Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappwrite&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3APutObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2Fusr001%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=Y0OPUoL1PrCqX4X6A3%2FJvgXuS6c%3D&Action=AssumeRole&SignatureNonce=8d0798a8-8cd9-11e5-9f49-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappwrite/usr001", "AssumedRoleId": "355407847660029428:usr001" }, "Credentials": { "AccessKeyId": "STS.rtfx13******NlIJlS4U", "AccessKeySecret": "2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM", "Expiration": "2015-11-17T04:16:10Z", "SecurityToken": "CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl" }, "RequestId": "19407707-54B2-41AD-AAF0-FE87E8870B0D" } 试验一下能否使用这个凭证来上传下载。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C31FFFC811F24B6E7E3'), ('date', 'Tue, 17 Nov 2015 03:17:05 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C31FFFC811F24B6E7E3</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C3FB8DE437A91B16772'), ('date', 'Tue, 17 Nov 2015 03:17:19 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C3FB8DE437A91B16772</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!这里出现了问题,上传test.txt失败了。将本小节开始的时候传入的Policy格式化之后如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app/usr001/*" ] } ] }这个Policy的意义是仅允许用户向ram-test-app这个Bucket上传类似usr001/的文件,如果App用户是usr002的时候,就可以修改Policy为仅允许上传类似usr002/这种类型的文件,通过这种对不同的App用户设定不同的Policy的方式,可以做到不同App用户之间拥有独立的存储空间互不干扰的目的。 重新试验,将上传的目标指定为ram-test-app/usr001/test.txt。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/usr001/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Object URL is: http://ram-test-app.oss-cn-hangzhou.aliyuncs.com/usr001%2Ftest.txt Object abstract path is: oss://ram-test-app/usr001/test.txt ETag is "946A0A1AC8245696B9C6A6F35942690B" 0.071(s) elapsed可见上传成功了。 总结 本章主要介绍了使用STS来临时授权用户访问OSS。在典型的移动开发场景中,使用STS可以做到不同的App用户需要访问App的时候,可以通过获取到的临时授权来访问OSS。临时授权可以指定过期时间,因此大大降低了泄露的危害。在获取临时授权的时候,可以根据App用户的不同,传入不同的授权策略来限制用户的访问权限,比如限制用户访问的Object路径,从而达到隔离不同App用户的存储空间的目的。
2019-12-01 23:13:36 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 之前章节只用到了RAM的子账号功能,这些子账号都是可以长期正常使用的,发生泄露之后如果无法及时解除权限的话会很危险。 继续上文的例子,当开发者的app被用户使用之后,用户的数据要上传到OSS的ram-test-app这个Bucket,当app的用户数据很多的时候,需要考虑如何才能安全的授权给众多的app用户上传数据呢,以及如何保证多个用户之间存储的隔离。 类似这种需要临时访问的场景可以使用STS来完成。STS可以指定复杂的策略来对特定的用户进行限制,仅提供最小的权限。 创建角色 继续上一章节的例子,App用户有一个名为ram-test-app的Bucket来保存个人数据。创建角色的步骤如下: 按照上文的流程创建一个子账号ram_test_app,不需要赋予任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。 创建角色。这里创建两个角色,一个用于用户读取等操作,一个用于用户上传文件。 打开访问控制的管理控制台,选择角色管理 > 新建角色。 选择角色类型。这里选择用户角色。 填写类型信息。因为角色是被阿里云账号使用过的,因此选择默认的即可。 配置角色基本信息。 创建完角色之后,角色是没有任何权限的,因此这里和上文所述一样需要新建一个自定义的授权策略。授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }表示对ram-test-app拥有只读权限。 建立完成后,即可在角色管理里面给RamTestAppReadOnly添加上ram-test-app的只读授权。 按照上文同样的方法,建立一个RamTestAppWrite的角色,并且赋予写ram-test-app的自定义授权,授权如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }目前新建的两个角色为:RamTestAppReadOnly和RamTestAppWrite,分别表示了对于ram-test-app的读写权限。 临时授权访问 创建了角色之后,接下来就可以使用临时授权来访问OSS了。 准备工作 在正式使用之前,还有一些工作需要完成。扮演角色也是需要授权的,否则任意子账号都可以扮演这些角色会带来不可预计的风险,因此有扮演对应角色需求的子账号需要显式的配置权限。 在授权管理策略中新建两个自定义的授权策略,分别如下:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappreadonly" } ], "Version": "1" }使用相同的方法创建另一个自定义授权策略:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappwrite" } ], "Version": "1" }这里Resource后面填写的内容表示某个角色ID,角色的ID可以在角色管理 > 角色详情中找到。 将这两个授权赋给ram_test_app这个账号。 使用STS授权访问 现在一切准备就绪,可以正式使用STS来授权访问了。 这里使用一个简单的STS的python命令行工具sts.py。 具体的调用方法如下: $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret RoleArn表示的是需要扮演的角色ID,角色的ID可以在角色管理 > 角色详情中找到。 RoleSessionName是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。 Policy表示的是在扮演角色的时候额外加上的一个权限限制。 DurationSeconds指的是临时凭证的有效期,单位是s,最小为900,最大为3600。 id和secret表示的是需要扮演角色的子账号的AccessKey。 这里需要解释一下Policy,这里传入的Policy是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的Policy的交集。 在扮演角色的时候传入Policy的原因是为了灵活性,比如上传文件的时候可以根据不同的用户添加对于上传文件路径的限制,这点会在下面的例子展示。 现在我们可以来实际试验一下STS的作用,作为试验用的Bucket,先在控制台向ram-test-app传入一个test.txt的文本,内容为ststest。 首先使用ram_test_app这个子账号直接来访问。请将下面的AccessKey换成自己试验用的AccessKey。 [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94D444F4D8B2225E4AFE'), ('date', 'Tue, 17 Nov 2015 02:45:40 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94D444F4D8B2225E4AFE</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA 100% Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94E5B1119B445B9F8C3A'), ('date', 'Tue, 17 Nov 2015 02:45:57 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94E5B1119B445B9F8C3A</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed! 因为ram_test_app这个子账号没有访问权限,因此访问失败。 使用临时授权下载 现在使用STS来下载文件,这里为了简单,传入的Policy和角色的Policy一致,过期时间使用默认的3600s,App的用户假定为usr001。步骤如下: 使用STS来获取临时的凭证。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A07%3A25Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappreadonly&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3AListObjects%22%2C%22oss%3AGetObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%22%2C%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=bshxPZpwRJv5ch3SjaBiXLodwq0%3D&Action=AssumeRole&SignatureNonce=53e1be9c-8cd8-11e5-9b86-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappreadonly/usr001", "AssumedRoleId": "317446347657426289:usr001" }, "Credentials": { "AccessKeyId": "STS.3mQEbNf******wa180Le", "AccessKeySecret": "B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB", "Expiration": "2015-11-17T04:07:25Z", "SecurityToken": "CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=" }, "RequestId": "8C009F64-F19D-4EC1-A3AD-7A718CD0B49B" } 使用临时凭证来下载文件,这里sts_token就是上面STS返回的SecurityToken。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% The object test.txt is downloaded to test.txt, please check. 0.061(s) elapsed 可见已经可以使用临时凭证来下载文件了,那再试着使用这个凭证来上传。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9A2A1790CF0F53C15C82'), ('date', 'Tue, 17 Nov 2015 03:08:26 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9A2A1790CF0F53C15C82</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!由于扮演的角色只有下载的权限,因此上传失败。 使用临时授权上传 现在可以来试验一下使用STS上传。步骤如下: 获取STS的临时凭证,App用户为usr001。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappwrite RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["acs:oss:*:*:ram-test-app/usr001/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A16%3A10Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappwrite&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3APutObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2Fusr001%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=Y0OPUoL1PrCqX4X6A3%2FJvgXuS6c%3D&Action=AssumeRole&SignatureNonce=8d0798a8-8cd9-11e5-9f49-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappwrite/usr001", "AssumedRoleId": "355407847660029428:usr001" }, "Credentials": { "AccessKeyId": "STS.rtfx13******NlIJlS4U", "AccessKeySecret": "2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM", "Expiration": "2015-11-17T04:16:10Z", "SecurityToken": "CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl" }, "RequestId": "19407707-54B2-41AD-AAF0-FE87E8870B0D" } 试验一下能否使用这个凭证来上传下载。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C31FFFC811F24B6E7E3'), ('date', 'Tue, 17 Nov 2015 03:17:05 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C31FFFC811F24B6E7E3</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C3FB8DE437A91B16772'), ('date', 'Tue, 17 Nov 2015 03:17:19 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C3FB8DE437A91B16772</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!这里出现了问题,上传test.txt失败了。将本小节开始的时候传入的Policy格式化之后如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app/usr001/*" ] } ] }这个Policy的意义是仅允许用户向ram-test-app这个Bucket上传类似usr001/的文件,如果App用户是usr002的时候,就可以修改Policy为仅允许上传类似usr002/这种类型的文件,通过这种对不同的App用户设定不同的Policy的方式,可以做到不同App用户之间拥有独立的存储空间互不干扰的目的。 重新试验,将上传的目标指定为ram-test-app/usr001/test.txt。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/usr001/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Object URL is: http://ram-test-app.oss-cn-hangzhou.aliyuncs.com/usr001%2Ftest.txt Object abstract path is: oss://ram-test-app/usr001/test.txt ETag is "946A0A1AC8245696B9C6A6F35942690B" 0.071(s) elapsed可见上传成功了。 总结 本章主要介绍了使用STS来临时授权用户访问OSS。在典型的移动开发场景中,使用STS可以做到不同的App用户需要访问App的时候,可以通过获取到的临时授权来访问OSS。临时授权可以指定过期时间,因此大大降低了泄露的危害。在获取临时授权的时候,可以根据App用户的不同,传入不同的授权策略来限制用户的访问权限,比如限制用户访问的Object路径,从而达到隔离不同App用户的存储空间的目的。
2019-12-01 23:13:38 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 之前章节只用到了RAM的子账号功能,这些子账号都是可以长期正常使用的,发生泄露之后如果无法及时解除权限的话会很危险。 继续上文的例子,当开发者的app被用户使用之后,用户的数据要上传到OSS的ram-test-app这个Bucket,当app的用户数据很多的时候,需要考虑如何才能安全的授权给众多的app用户上传数据呢,以及如何保证多个用户之间存储的隔离。 类似这种需要临时访问的场景可以使用STS来完成。STS可以指定复杂的策略来对特定的用户进行限制,仅提供最小的权限。 创建角色 继续上一章节的例子,App用户有一个名为ram-test-app的Bucket来保存个人数据。创建角色的步骤如下: 按照上文的流程创建一个子账号ram_test_app,不需要赋予任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。 创建角色。这里创建两个角色,一个用于用户读取等操作,一个用于用户上传文件。 打开访问控制的管理控制台,选择角色管理 > 新建角色。 选择角色类型。这里选择用户角色。 填写类型信息。因为角色是被阿里云账号使用过的,因此选择默认的即可。 配置角色基本信息。 创建完角色之后,角色是没有任何权限的,因此这里和上文所述一样需要新建一个自定义的授权策略。授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }表示对ram-test-app拥有只读权限。 建立完成后,即可在角色管理里面给RamTestAppReadOnly添加上ram-test-app的只读授权。 按照上文同样的方法,建立一个RamTestAppWrite的角色,并且赋予写ram-test-app的自定义授权,授权如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }目前新建的两个角色为:RamTestAppReadOnly和RamTestAppWrite,分别表示了对于ram-test-app的读写权限。 临时授权访问 创建了角色之后,接下来就可以使用临时授权来访问OSS了。 准备工作 在正式使用之前,还有一些工作需要完成。扮演角色也是需要授权的,否则任意子账号都可以扮演这些角色会带来不可预计的风险,因此有扮演对应角色需求的子账号需要显式的配置权限。 在授权管理策略中新建两个自定义的授权策略,分别如下:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappreadonly" } ], "Version": "1" }使用相同的方法创建另一个自定义授权策略:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappwrite" } ], "Version": "1" }这里Resource后面填写的内容表示某个角色ID,角色的ID可以在角色管理 > 角色详情中找到。 将这两个授权赋给ram_test_app这个账号。 使用STS授权访问 现在一切准备就绪,可以正式使用STS来授权访问了。 这里使用一个简单的STS的python命令行工具sts.py。 具体的调用方法如下: $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret RoleArn表示的是需要扮演的角色ID,角色的ID可以在角色管理 > 角色详情中找到。 RoleSessionName是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。 Policy表示的是在扮演角色的时候额外加上的一个权限限制。 DurationSeconds指的是临时凭证的有效期,单位是s,最小为900,最大为3600。 id和secret表示的是需要扮演角色的子账号的AccessKey。 这里需要解释一下Policy,这里传入的Policy是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的Policy的交集。 在扮演角色的时候传入Policy的原因是为了灵活性,比如上传文件的时候可以根据不同的用户添加对于上传文件路径的限制,这点会在下面的例子展示。 现在我们可以来实际试验一下STS的作用,作为试验用的Bucket,先在控制台向ram-test-app传入一个test.txt的文本,内容为ststest。 首先使用ram_test_app这个子账号直接来访问。请将下面的AccessKey换成自己试验用的AccessKey。 [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94D444F4D8B2225E4AFE'), ('date', 'Tue, 17 Nov 2015 02:45:40 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94D444F4D8B2225E4AFE</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA 100% Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94E5B1119B445B9F8C3A'), ('date', 'Tue, 17 Nov 2015 02:45:57 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94E5B1119B445B9F8C3A</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed! 因为ram_test_app这个子账号没有访问权限,因此访问失败。 使用临时授权下载 现在使用STS来下载文件,这里为了简单,传入的Policy和角色的Policy一致,过期时间使用默认的3600s,App的用户假定为usr001。步骤如下: 使用STS来获取临时的凭证。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A07%3A25Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappreadonly&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3AListObjects%22%2C%22oss%3AGetObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%22%2C%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=bshxPZpwRJv5ch3SjaBiXLodwq0%3D&Action=AssumeRole&SignatureNonce=53e1be9c-8cd8-11e5-9b86-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappreadonly/usr001", "AssumedRoleId": "317446347657426289:usr001" }, "Credentials": { "AccessKeyId": "STS.3mQEbNf******wa180Le", "AccessKeySecret": "B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB", "Expiration": "2015-11-17T04:07:25Z", "SecurityToken": "CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=" }, "RequestId": "8C009F64-F19D-4EC1-A3AD-7A718CD0B49B" } 使用临时凭证来下载文件,这里sts_token就是上面STS返回的SecurityToken。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% The object test.txt is downloaded to test.txt, please check. 0.061(s) elapsed 可见已经可以使用临时凭证来下载文件了,那再试着使用这个凭证来上传。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9A2A1790CF0F53C15C82'), ('date', 'Tue, 17 Nov 2015 03:08:26 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9A2A1790CF0F53C15C82</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!由于扮演的角色只有下载的权限,因此上传失败。 使用临时授权上传 现在可以来试验一下使用STS上传。步骤如下: 获取STS的临时凭证,App用户为usr001。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappwrite RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["acs:oss:*:*:ram-test-app/usr001/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A16%3A10Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappwrite&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3APutObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2Fusr001%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=Y0OPUoL1PrCqX4X6A3%2FJvgXuS6c%3D&Action=AssumeRole&SignatureNonce=8d0798a8-8cd9-11e5-9f49-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappwrite/usr001", "AssumedRoleId": "355407847660029428:usr001" }, "Credentials": { "AccessKeyId": "STS.rtfx13******NlIJlS4U", "AccessKeySecret": "2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM", "Expiration": "2015-11-17T04:16:10Z", "SecurityToken": "CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl" }, "RequestId": "19407707-54B2-41AD-AAF0-FE87E8870B0D" } 试验一下能否使用这个凭证来上传下载。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C31FFFC811F24B6E7E3'), ('date', 'Tue, 17 Nov 2015 03:17:05 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C31FFFC811F24B6E7E3</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C3FB8DE437A91B16772'), ('date', 'Tue, 17 Nov 2015 03:17:19 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C3FB8DE437A91B16772</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!这里出现了问题,上传test.txt失败了。将本小节开始的时候传入的Policy格式化之后如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app/usr001/*" ] } ] }这个Policy的意义是仅允许用户向ram-test-app这个Bucket上传类似usr001/的文件,如果App用户是usr002的时候,就可以修改Policy为仅允许上传类似usr002/这种类型的文件,通过这种对不同的App用户设定不同的Policy的方式,可以做到不同App用户之间拥有独立的存储空间互不干扰的目的。 重新试验,将上传的目标指定为ram-test-app/usr001/test.txt。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/usr001/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Object URL is: http://ram-test-app.oss-cn-hangzhou.aliyuncs.com/usr001%2Ftest.txt Object abstract path is: oss://ram-test-app/usr001/test.txt ETag is "946A0A1AC8245696B9C6A6F35942690B" 0.071(s) elapsed可见上传成功了。 总结 本章主要介绍了使用STS来临时授权用户访问OSS。在典型的移动开发场景中,使用STS可以做到不同的App用户需要访问App的时候,可以通过获取到的临时授权来访问OSS。临时授权可以指定过期时间,因此大大降低了泄露的危害。在获取临时授权的时候,可以根据App用户的不同,传入不同的授权策略来限制用户的访问权限,比如限制用户访问的Object路径,从而达到隔离不同App用户的存储空间的目的。
2019-12-01 23:13:38 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 之前章节只用到了RAM的子账号功能,这些子账号都是可以长期正常使用的,发生泄露之后如果无法及时解除权限的话会很危险。 继续上文的例子,当开发者的app被用户使用之后,用户的数据要上传到OSS的ram-test-app这个Bucket,当app的用户数据很多的时候,需要考虑如何才能安全的授权给众多的app用户上传数据呢,以及如何保证多个用户之间存储的隔离。 类似这种需要临时访问的场景可以使用STS来完成。STS可以指定复杂的策略来对特定的用户进行限制,仅提供最小的权限。 创建角色 继续上一章节的例子,App用户有一个名为ram-test-app的Bucket来保存个人数据。创建角色的步骤如下: 按照上文的流程创建一个子账号ram_test_app,不需要赋予任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。 创建角色。这里创建两个角色,一个用于用户读取等操作,一个用于用户上传文件。 打开访问控制的管理控制台,选择角色管理 > 新建角色。 选择角色类型。这里选择用户角色。 填写类型信息。因为角色是被阿里云账号使用过的,因此选择默认的即可。 配置角色基本信息。 创建完角色之后,角色是没有任何权限的,因此这里和上文所述一样需要新建一个自定义的授权策略。授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }表示对ram-test-app拥有只读权限。 建立完成后,即可在角色管理里面给RamTestAppReadOnly添加上ram-test-app的只读授权。 按照上文同样的方法,建立一个RamTestAppWrite的角色,并且赋予写ram-test-app的自定义授权,授权如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }目前新建的两个角色为:RamTestAppReadOnly和RamTestAppWrite,分别表示了对于ram-test-app的读写权限。 临时授权访问 创建了角色之后,接下来就可以使用临时授权来访问OSS了。 准备工作 在正式使用之前,还有一些工作需要完成。扮演角色也是需要授权的,否则任意子账号都可以扮演这些角色会带来不可预计的风险,因此有扮演对应角色需求的子账号需要显式的配置权限。 在授权管理策略中新建两个自定义的授权策略,分别如下:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappreadonly" } ], "Version": "1" }使用相同的方法创建另一个自定义授权策略:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappwrite" } ], "Version": "1" }这里Resource后面填写的内容表示某个角色ID,角色的ID可以在角色管理 > 角色详情中找到。 将这两个授权赋给ram_test_app这个账号。 使用STS授权访问 现在一切准备就绪,可以正式使用STS来授权访问了。 这里使用一个简单的STS的python命令行工具sts.py。 具体的调用方法如下: $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret RoleArn表示的是需要扮演的角色ID,角色的ID可以在角色管理 > 角色详情中找到。 RoleSessionName是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。 Policy表示的是在扮演角色的时候额外加上的一个权限限制。 DurationSeconds指的是临时凭证的有效期,单位是s,最小为900,最大为3600。 id和secret表示的是需要扮演角色的子账号的AccessKey。 这里需要解释一下Policy,这里传入的Policy是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的Policy的交集。 在扮演角色的时候传入Policy的原因是为了灵活性,比如上传文件的时候可以根据不同的用户添加对于上传文件路径的限制,这点会在下面的例子展示。 现在我们可以来实际试验一下STS的作用,作为试验用的Bucket,先在控制台向ram-test-app传入一个test.txt的文本,内容为ststest。 首先使用ram_test_app这个子账号直接来访问。请将下面的AccessKey换成自己试验用的AccessKey。 [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94D444F4D8B2225E4AFE'), ('date', 'Tue, 17 Nov 2015 02:45:40 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94D444F4D8B2225E4AFE</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA 100% Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94E5B1119B445B9F8C3A'), ('date', 'Tue, 17 Nov 2015 02:45:57 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94E5B1119B445B9F8C3A</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed! 因为ram_test_app这个子账号没有访问权限,因此访问失败。 使用临时授权下载 现在使用STS来下载文件,这里为了简单,传入的Policy和角色的Policy一致,过期时间使用默认的3600s,App的用户假定为usr001。步骤如下: 使用STS来获取临时的凭证。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A07%3A25Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappreadonly&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3AListObjects%22%2C%22oss%3AGetObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%22%2C%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=bshxPZpwRJv5ch3SjaBiXLodwq0%3D&Action=AssumeRole&SignatureNonce=53e1be9c-8cd8-11e5-9b86-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappreadonly/usr001", "AssumedRoleId": "317446347657426289:usr001" }, "Credentials": { "AccessKeyId": "STS.3mQEbNf******wa180Le", "AccessKeySecret": "B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB", "Expiration": "2015-11-17T04:07:25Z", "SecurityToken": "CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=" }, "RequestId": "8C009F64-F19D-4EC1-A3AD-7A718CD0B49B" } 使用临时凭证来下载文件,这里sts_token就是上面STS返回的SecurityToken。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% The object test.txt is downloaded to test.txt, please check. 0.061(s) elapsed 可见已经可以使用临时凭证来下载文件了,那再试着使用这个凭证来上传。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9A2A1790CF0F53C15C82'), ('date', 'Tue, 17 Nov 2015 03:08:26 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9A2A1790CF0F53C15C82</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!由于扮演的角色只有下载的权限,因此上传失败。 使用临时授权上传 现在可以来试验一下使用STS上传。步骤如下: 获取STS的临时凭证,App用户为usr001。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappwrite RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["acs:oss:*:*:ram-test-app/usr001/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A16%3A10Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappwrite&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3APutObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2Fusr001%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=Y0OPUoL1PrCqX4X6A3%2FJvgXuS6c%3D&Action=AssumeRole&SignatureNonce=8d0798a8-8cd9-11e5-9f49-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappwrite/usr001", "AssumedRoleId": "355407847660029428:usr001" }, "Credentials": { "AccessKeyId": "STS.rtfx13******NlIJlS4U", "AccessKeySecret": "2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM", "Expiration": "2015-11-17T04:16:10Z", "SecurityToken": "CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl" }, "RequestId": "19407707-54B2-41AD-AAF0-FE87E8870B0D" } 试验一下能否使用这个凭证来上传下载。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C31FFFC811F24B6E7E3'), ('date', 'Tue, 17 Nov 2015 03:17:05 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C31FFFC811F24B6E7E3</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C3FB8DE437A91B16772'), ('date', 'Tue, 17 Nov 2015 03:17:19 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C3FB8DE437A91B16772</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!这里出现了问题,上传test.txt失败了。将本小节开始的时候传入的Policy格式化之后如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app/usr001/*" ] } ] }这个Policy的意义是仅允许用户向ram-test-app这个Bucket上传类似usr001/的文件,如果App用户是usr002的时候,就可以修改Policy为仅允许上传类似usr002/这种类型的文件,通过这种对不同的App用户设定不同的Policy的方式,可以做到不同App用户之间拥有独立的存储空间互不干扰的目的。 重新试验,将上传的目标指定为ram-test-app/usr001/test.txt。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/usr001/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Object URL is: http://ram-test-app.oss-cn-hangzhou.aliyuncs.com/usr001%2Ftest.txt Object abstract path is: oss://ram-test-app/usr001/test.txt ETag is "946A0A1AC8245696B9C6A6F35942690B" 0.071(s) elapsed可见上传成功了。 总结 本章主要介绍了使用STS来临时授权用户访问OSS。在典型的移动开发场景中,使用STS可以做到不同的App用户需要访问App的时候,可以通过获取到的临时授权来访问OSS。临时授权可以指定过期时间,因此大大降低了泄露的危害。在获取临时授权的时候,可以根据App用户的不同,传入不同的授权策略来限制用户的访问权限,比如限制用户访问的Object路径,从而达到隔离不同App用户的存储空间的目的。
2019-12-01 23:13:38 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 之前章节只用到了RAM的子账号功能,这些子账号都是可以长期正常使用的,发生泄露之后如果无法及时解除权限的话会很危险。 继续上文的例子,当开发者的app被用户使用之后,用户的数据要上传到OSS的ram-test-app这个Bucket,当app的用户数据很多的时候,需要考虑如何才能安全的授权给众多的app用户上传数据呢,以及如何保证多个用户之间存储的隔离。 类似这种需要临时访问的场景可以使用STS来完成。STS可以指定复杂的策略来对特定的用户进行限制,仅提供最小的权限。 创建角色 继续上一章节的例子,App用户有一个名为ram-test-app的Bucket来保存个人数据。创建角色的步骤如下: 按照上文的流程创建一个子账号ram_test_app,不需要赋予任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。 创建角色。这里创建两个角色,一个用于用户读取等操作,一个用于用户上传文件。 打开访问控制的管理控制台,选择角色管理 > 新建角色。 选择角色类型。这里选择用户角色。 填写类型信息。因为角色是被阿里云账号使用过的,因此选择默认的即可。 配置角色基本信息。 创建完角色之后,角色是没有任何权限的,因此这里和上文所述一样需要新建一个自定义的授权策略。授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }表示对ram-test-app拥有只读权限。 建立完成后,即可在角色管理里面给RamTestAppReadOnly添加上ram-test-app的只读授权。 按照上文同样的方法,建立一个RamTestAppWrite的角色,并且赋予写ram-test-app的自定义授权,授权如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }目前新建的两个角色为:RamTestAppReadOnly和RamTestAppWrite,分别表示了对于ram-test-app的读写权限。 临时授权访问 创建了角色之后,接下来就可以使用临时授权来访问OSS了。 准备工作 在正式使用之前,还有一些工作需要完成。扮演角色也是需要授权的,否则任意子账号都可以扮演这些角色会带来不可预计的风险,因此有扮演对应角色需求的子账号需要显式的配置权限。 在授权管理策略中新建两个自定义的授权策略,分别如下:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappreadonly" } ], "Version": "1" }使用相同的方法创建另一个自定义授权策略:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappwrite" } ], "Version": "1" }这里Resource后面填写的内容表示某个角色ID,角色的ID可以在角色管理 > 角色详情中找到。 将这两个授权赋给ram_test_app这个账号。 使用STS授权访问 现在一切准备就绪,可以正式使用STS来授权访问了。 这里使用一个简单的STS的python命令行工具sts.py。 具体的调用方法如下: $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret RoleArn表示的是需要扮演的角色ID,角色的ID可以在角色管理 > 角色详情中找到。 RoleSessionName是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。 Policy表示的是在扮演角色的时候额外加上的一个权限限制。 DurationSeconds指的是临时凭证的有效期,单位是s,最小为900,最大为3600。 id和secret表示的是需要扮演角色的子账号的AccessKey。 这里需要解释一下Policy,这里传入的Policy是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的Policy的交集。 在扮演角色的时候传入Policy的原因是为了灵活性,比如上传文件的时候可以根据不同的用户添加对于上传文件路径的限制,这点会在下面的例子展示。 现在我们可以来实际试验一下STS的作用,作为试验用的Bucket,先在控制台向ram-test-app传入一个test.txt的文本,内容为ststest。 首先使用ram_test_app这个子账号直接来访问。请将下面的AccessKey换成自己试验用的AccessKey。 [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94D444F4D8B2225E4AFE'), ('date', 'Tue, 17 Nov 2015 02:45:40 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94D444F4D8B2225E4AFE</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA 100% Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94E5B1119B445B9F8C3A'), ('date', 'Tue, 17 Nov 2015 02:45:57 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94E5B1119B445B9F8C3A</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed! 因为ram_test_app这个子账号没有访问权限,因此访问失败。 使用临时授权下载 现在使用STS来下载文件,这里为了简单,传入的Policy和角色的Policy一致,过期时间使用默认的3600s,App的用户假定为usr001。步骤如下: 使用STS来获取临时的凭证。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A07%3A25Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappreadonly&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3AListObjects%22%2C%22oss%3AGetObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%22%2C%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=bshxPZpwRJv5ch3SjaBiXLodwq0%3D&Action=AssumeRole&SignatureNonce=53e1be9c-8cd8-11e5-9b86-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappreadonly/usr001", "AssumedRoleId": "317446347657426289:usr001" }, "Credentials": { "AccessKeyId": "STS.3mQEbNf******wa180Le", "AccessKeySecret": "B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB", "Expiration": "2015-11-17T04:07:25Z", "SecurityToken": "CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=" }, "RequestId": "8C009F64-F19D-4EC1-A3AD-7A718CD0B49B" } 使用临时凭证来下载文件,这里sts_token就是上面STS返回的SecurityToken。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% The object test.txt is downloaded to test.txt, please check. 0.061(s) elapsed 可见已经可以使用临时凭证来下载文件了,那再试着使用这个凭证来上传。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9A2A1790CF0F53C15C82'), ('date', 'Tue, 17 Nov 2015 03:08:26 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9A2A1790CF0F53C15C82</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!由于扮演的角色只有下载的权限,因此上传失败。 使用临时授权上传 现在可以来试验一下使用STS上传。步骤如下: 获取STS的临时凭证,App用户为usr001。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappwrite RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["acs:oss:*:*:ram-test-app/usr001/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A16%3A10Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappwrite&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3APutObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2Fusr001%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=Y0OPUoL1PrCqX4X6A3%2FJvgXuS6c%3D&Action=AssumeRole&SignatureNonce=8d0798a8-8cd9-11e5-9f49-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappwrite/usr001", "AssumedRoleId": "355407847660029428:usr001" }, "Credentials": { "AccessKeyId": "STS.rtfx13******NlIJlS4U", "AccessKeySecret": "2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM", "Expiration": "2015-11-17T04:16:10Z", "SecurityToken": "CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl" }, "RequestId": "19407707-54B2-41AD-AAF0-FE87E8870B0D" } 试验一下能否使用这个凭证来上传下载。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C31FFFC811F24B6E7E3'), ('date', 'Tue, 17 Nov 2015 03:17:05 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C31FFFC811F24B6E7E3</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C3FB8DE437A91B16772'), ('date', 'Tue, 17 Nov 2015 03:17:19 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C3FB8DE437A91B16772</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!这里出现了问题,上传test.txt失败了。将本小节开始的时候传入的Policy格式化之后如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app/usr001/*" ] } ] }这个Policy的意义是仅允许用户向ram-test-app这个Bucket上传类似usr001/的文件,如果App用户是usr002的时候,就可以修改Policy为仅允许上传类似usr002/这种类型的文件,通过这种对不同的App用户设定不同的Policy的方式,可以做到不同App用户之间拥有独立的存储空间互不干扰的目的。 重新试验,将上传的目标指定为ram-test-app/usr001/test.txt。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/usr001/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Object URL is: http://ram-test-app.oss-cn-hangzhou.aliyuncs.com/usr001%2Ftest.txt Object abstract path is: oss://ram-test-app/usr001/test.txt ETag is "946A0A1AC8245696B9C6A6F35942690B" 0.071(s) elapsed可见上传成功了。 总结 本章主要介绍了使用STS来临时授权用户访问OSS。在典型的移动开发场景中,使用STS可以做到不同的App用户需要访问App的时候,可以通过获取到的临时授权来访问OSS。临时授权可以指定过期时间,因此大大降低了泄露的危害。在获取临时授权的时候,可以根据App用户的不同,传入不同的授权策略来限制用户的访问权限,比如限制用户访问的Object路径,从而达到隔离不同App用户的存储空间的目的。
2019-12-01 23:13:37 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 之前章节只用到了RAM的子账号功能,这些子账号都是可以长期正常使用的,发生泄露之后如果无法及时解除权限的话会很危险。 继续上文的例子,当开发者的app被用户使用之后,用户的数据要上传到OSS的ram-test-app这个Bucket,当app的用户数据很多的时候,需要考虑如何才能安全的授权给众多的app用户上传数据呢,以及如何保证多个用户之间存储的隔离。 类似这种需要临时访问的场景可以使用STS来完成。STS可以指定复杂的策略来对特定的用户进行限制,仅提供最小的权限。 创建角色 继续上一章节的例子,App用户有一个名为ram-test-app的Bucket来保存个人数据。创建角色的步骤如下: 按照上文的流程创建一个子账号ram_test_app,不需要赋予任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。 创建角色。这里创建两个角色,一个用于用户读取等操作,一个用于用户上传文件。 打开访问控制的管理控制台,选择角色管理 > 新建角色。 选择角色类型。这里选择用户角色。 填写类型信息。因为角色是被阿里云账号使用过的,因此选择默认的即可。 配置角色基本信息。 创建完角色之后,角色是没有任何权限的,因此这里和上文所述一样需要新建一个自定义的授权策略。授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }表示对ram-test-app拥有只读权限。 建立完成后,即可在角色管理里面给RamTestAppReadOnly添加上ram-test-app的只读授权。 按照上文同样的方法,建立一个RamTestAppWrite的角色,并且赋予写ram-test-app的自定义授权,授权如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }目前新建的两个角色为:RamTestAppReadOnly和RamTestAppWrite,分别表示了对于ram-test-app的读写权限。 临时授权访问 创建了角色之后,接下来就可以使用临时授权来访问OSS了。 准备工作 在正式使用之前,还有一些工作需要完成。扮演角色也是需要授权的,否则任意子账号都可以扮演这些角色会带来不可预计的风险,因此有扮演对应角色需求的子账号需要显式的配置权限。 在授权管理策略中新建两个自定义的授权策略,分别如下:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappreadonly" } ], "Version": "1" }使用相同的方法创建另一个自定义授权策略:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappwrite" } ], "Version": "1" }这里Resource后面填写的内容表示某个角色ID,角色的ID可以在角色管理 > 角色详情中找到。 将这两个授权赋给ram_test_app这个账号。 使用STS授权访问 现在一切准备就绪,可以正式使用STS来授权访问了。 这里使用一个简单的STS的python命令行工具sts.py。 具体的调用方法如下: $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret RoleArn表示的是需要扮演的角色ID,角色的ID可以在角色管理 > 角色详情中找到。 RoleSessionName是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。 Policy表示的是在扮演角色的时候额外加上的一个权限限制。 DurationSeconds指的是临时凭证的有效期,单位是s,最小为900,最大为3600。 id和secret表示的是需要扮演角色的子账号的AccessKey。 这里需要解释一下Policy,这里传入的Policy是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的Policy的交集。 在扮演角色的时候传入Policy的原因是为了灵活性,比如上传文件的时候可以根据不同的用户添加对于上传文件路径的限制,这点会在下面的例子展示。 现在我们可以来实际试验一下STS的作用,作为试验用的Bucket,先在控制台向ram-test-app传入一个test.txt的文本,内容为ststest。 首先使用ram_test_app这个子账号直接来访问。请将下面的AccessKey换成自己试验用的AccessKey。 [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94D444F4D8B2225E4AFE'), ('date', 'Tue, 17 Nov 2015 02:45:40 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94D444F4D8B2225E4AFE</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA 100% Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94E5B1119B445B9F8C3A'), ('date', 'Tue, 17 Nov 2015 02:45:57 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94E5B1119B445B9F8C3A</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed! 因为ram_test_app这个子账号没有访问权限,因此访问失败。 使用临时授权下载 现在使用STS来下载文件,这里为了简单,传入的Policy和角色的Policy一致,过期时间使用默认的3600s,App的用户假定为usr001。步骤如下: 使用STS来获取临时的凭证。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A07%3A25Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappreadonly&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3AListObjects%22%2C%22oss%3AGetObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%22%2C%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=bshxPZpwRJv5ch3SjaBiXLodwq0%3D&Action=AssumeRole&SignatureNonce=53e1be9c-8cd8-11e5-9b86-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappreadonly/usr001", "AssumedRoleId": "317446347657426289:usr001" }, "Credentials": { "AccessKeyId": "STS.3mQEbNf******wa180Le", "AccessKeySecret": "B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB", "Expiration": "2015-11-17T04:07:25Z", "SecurityToken": "CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=" }, "RequestId": "8C009F64-F19D-4EC1-A3AD-7A718CD0B49B" } 使用临时凭证来下载文件,这里sts_token就是上面STS返回的SecurityToken。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% The object test.txt is downloaded to test.txt, please check. 0.061(s) elapsed 可见已经可以使用临时凭证来下载文件了,那再试着使用这个凭证来上传。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9A2A1790CF0F53C15C82'), ('date', 'Tue, 17 Nov 2015 03:08:26 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9A2A1790CF0F53C15C82</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!由于扮演的角色只有下载的权限,因此上传失败。 使用临时授权上传 现在可以来试验一下使用STS上传。步骤如下: 获取STS的临时凭证,App用户为usr001。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappwrite RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["acs:oss:*:*:ram-test-app/usr001/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A16%3A10Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappwrite&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3APutObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2Fusr001%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=Y0OPUoL1PrCqX4X6A3%2FJvgXuS6c%3D&Action=AssumeRole&SignatureNonce=8d0798a8-8cd9-11e5-9f49-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappwrite/usr001", "AssumedRoleId": "355407847660029428:usr001" }, "Credentials": { "AccessKeyId": "STS.rtfx13******NlIJlS4U", "AccessKeySecret": "2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM", "Expiration": "2015-11-17T04:16:10Z", "SecurityToken": "CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl" }, "RequestId": "19407707-54B2-41AD-AAF0-FE87E8870B0D" } 试验一下能否使用这个凭证来上传下载。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C31FFFC811F24B6E7E3'), ('date', 'Tue, 17 Nov 2015 03:17:05 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C31FFFC811F24B6E7E3</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C3FB8DE437A91B16772'), ('date', 'Tue, 17 Nov 2015 03:17:19 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C3FB8DE437A91B16772</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!这里出现了问题,上传test.txt失败了。将本小节开始的时候传入的Policy格式化之后如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app/usr001/*" ] } ] }这个Policy的意义是仅允许用户向ram-test-app这个Bucket上传类似usr001/的文件,如果App用户是usr002的时候,就可以修改Policy为仅允许上传类似usr002/这种类型的文件,通过这种对不同的App用户设定不同的Policy的方式,可以做到不同App用户之间拥有独立的存储空间互不干扰的目的。 重新试验,将上传的目标指定为ram-test-app/usr001/test.txt。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/usr001/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Object URL is: http://ram-test-app.oss-cn-hangzhou.aliyuncs.com/usr001%2Ftest.txt Object abstract path is: oss://ram-test-app/usr001/test.txt ETag is "946A0A1AC8245696B9C6A6F35942690B" 0.071(s) elapsed可见上传成功了。 总结 本章主要介绍了使用STS来临时授权用户访问OSS。在典型的移动开发场景中,使用STS可以做到不同的App用户需要访问App的时候,可以通过获取到的临时授权来访问OSS。临时授权可以指定过期时间,因此大大降低了泄露的危害。在获取临时授权的时候,可以根据App用户的不同,传入不同的授权策略来限制用户的访问权限,比如限制用户访问的Object路径,从而达到隔离不同App用户的存储空间的目的。
2019-12-01 23:13:37 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 之前章节只用到了RAM的子账号功能,这些子账号都是可以长期正常使用的,发生泄露之后如果无法及时解除权限的话会很危险。 继续上文的例子,当开发者的app被用户使用之后,用户的数据要上传到OSS的ram-test-app这个Bucket,当app的用户数据很多的时候,需要考虑如何才能安全的授权给众多的app用户上传数据呢,以及如何保证多个用户之间存储的隔离。 类似这种需要临时访问的场景可以使用STS来完成。STS可以指定复杂的策略来对特定的用户进行限制,仅提供最小的权限。 创建角色 继续上一章节的例子,App用户有一个名为ram-test-app的Bucket来保存个人数据。创建角色的步骤如下: 按照上文的流程创建一个子账号ram_test_app,不需要赋予任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。 创建角色。这里创建两个角色,一个用于用户读取等操作,一个用于用户上传文件。 打开访问控制的管理控制台,选择角色管理 > 新建角色。 选择角色类型。这里选择用户角色。 填写类型信息。因为角色是被阿里云账号使用过的,因此选择默认的即可。 配置角色基本信息。 创建完角色之后,角色是没有任何权限的,因此这里和上文所述一样需要新建一个自定义的授权策略。授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }表示对ram-test-app拥有只读权限。 建立完成后,即可在角色管理里面给RamTestAppReadOnly添加上ram-test-app的只读授权。 按照上文同样的方法,建立一个RamTestAppWrite的角色,并且赋予写ram-test-app的自定义授权,授权如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }目前新建的两个角色为:RamTestAppReadOnly和RamTestAppWrite,分别表示了对于ram-test-app的读写权限。 临时授权访问 创建了角色之后,接下来就可以使用临时授权来访问OSS了。 准备工作 在正式使用之前,还有一些工作需要完成。扮演角色也是需要授权的,否则任意子账号都可以扮演这些角色会带来不可预计的风险,因此有扮演对应角色需求的子账号需要显式的配置权限。 在授权管理策略中新建两个自定义的授权策略,分别如下:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappreadonly" } ], "Version": "1" }使用相同的方法创建另一个自定义授权策略:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappwrite" } ], "Version": "1" }这里Resource后面填写的内容表示某个角色ID,角色的ID可以在角色管理 > 角色详情中找到。 将这两个授权赋给ram_test_app这个账号。 使用STS授权访问 现在一切准备就绪,可以正式使用STS来授权访问了。 这里使用一个简单的STS的python命令行工具sts.py。 具体的调用方法如下: $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret RoleArn表示的是需要扮演的角色ID,角色的ID可以在角色管理 > 角色详情中找到。 RoleSessionName是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。 Policy表示的是在扮演角色的时候额外加上的一个权限限制。 DurationSeconds指的是临时凭证的有效期,单位是s,最小为900,最大为3600。 id和secret表示的是需要扮演角色的子账号的AccessKey。 这里需要解释一下Policy,这里传入的Policy是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的Policy的交集。 在扮演角色的时候传入Policy的原因是为了灵活性,比如上传文件的时候可以根据不同的用户添加对于上传文件路径的限制,这点会在下面的例子展示。 现在我们可以来实际试验一下STS的作用,作为试验用的Bucket,先在控制台向ram-test-app传入一个test.txt的文本,内容为ststest。 首先使用ram_test_app这个子账号直接来访问。请将下面的AccessKey换成自己试验用的AccessKey。 [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94D444F4D8B2225E4AFE'), ('date', 'Tue, 17 Nov 2015 02:45:40 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94D444F4D8B2225E4AFE</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA 100% Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94E5B1119B445B9F8C3A'), ('date', 'Tue, 17 Nov 2015 02:45:57 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94E5B1119B445B9F8C3A</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed! 因为ram_test_app这个子账号没有访问权限,因此访问失败。 使用临时授权下载 现在使用STS来下载文件,这里为了简单,传入的Policy和角色的Policy一致,过期时间使用默认的3600s,App的用户假定为usr001。步骤如下: 使用STS来获取临时的凭证。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A07%3A25Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappreadonly&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3AListObjects%22%2C%22oss%3AGetObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%22%2C%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=bshxPZpwRJv5ch3SjaBiXLodwq0%3D&Action=AssumeRole&SignatureNonce=53e1be9c-8cd8-11e5-9b86-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappreadonly/usr001", "AssumedRoleId": "317446347657426289:usr001" }, "Credentials": { "AccessKeyId": "STS.3mQEbNf******wa180Le", "AccessKeySecret": "B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB", "Expiration": "2015-11-17T04:07:25Z", "SecurityToken": "CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=" }, "RequestId": "8C009F64-F19D-4EC1-A3AD-7A718CD0B49B" } 使用临时凭证来下载文件,这里sts_token就是上面STS返回的SecurityToken。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% The object test.txt is downloaded to test.txt, please check. 0.061(s) elapsed 可见已经可以使用临时凭证来下载文件了,那再试着使用这个凭证来上传。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9A2A1790CF0F53C15C82'), ('date', 'Tue, 17 Nov 2015 03:08:26 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9A2A1790CF0F53C15C82</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!由于扮演的角色只有下载的权限,因此上传失败。 使用临时授权上传 现在可以来试验一下使用STS上传。步骤如下: 获取STS的临时凭证,App用户为usr001。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappwrite RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["acs:oss:*:*:ram-test-app/usr001/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A16%3A10Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappwrite&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3APutObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2Fusr001%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=Y0OPUoL1PrCqX4X6A3%2FJvgXuS6c%3D&Action=AssumeRole&SignatureNonce=8d0798a8-8cd9-11e5-9f49-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappwrite/usr001", "AssumedRoleId": "355407847660029428:usr001" }, "Credentials": { "AccessKeyId": "STS.rtfx13******NlIJlS4U", "AccessKeySecret": "2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM", "Expiration": "2015-11-17T04:16:10Z", "SecurityToken": "CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl" }, "RequestId": "19407707-54B2-41AD-AAF0-FE87E8870B0D" } 试验一下能否使用这个凭证来上传下载。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C31FFFC811F24B6E7E3'), ('date', 'Tue, 17 Nov 2015 03:17:05 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C31FFFC811F24B6E7E3</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C3FB8DE437A91B16772'), ('date', 'Tue, 17 Nov 2015 03:17:19 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C3FB8DE437A91B16772</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!这里出现了问题,上传test.txt失败了。将本小节开始的时候传入的Policy格式化之后如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app/usr001/*" ] } ] }这个Policy的意义是仅允许用户向ram-test-app这个Bucket上传类似usr001/的文件,如果App用户是usr002的时候,就可以修改Policy为仅允许上传类似usr002/这种类型的文件,通过这种对不同的App用户设定不同的Policy的方式,可以做到不同App用户之间拥有独立的存储空间互不干扰的目的。 重新试验,将上传的目标指定为ram-test-app/usr001/test.txt。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/usr001/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Object URL is: http://ram-test-app.oss-cn-hangzhou.aliyuncs.com/usr001%2Ftest.txt Object abstract path is: oss://ram-test-app/usr001/test.txt ETag is "946A0A1AC8245696B9C6A6F35942690B" 0.071(s) elapsed可见上传成功了。 总结 本章主要介绍了使用STS来临时授权用户访问OSS。在典型的移动开发场景中,使用STS可以做到不同的App用户需要访问App的时候,可以通过获取到的临时授权来访问OSS。临时授权可以指定过期时间,因此大大降低了泄露的危害。在获取临时授权的时候,可以根据App用户的不同,传入不同的授权策略来限制用户的访问权限,比如限制用户访问的Object路径,从而达到隔离不同App用户的存储空间的目的。
2019-12-01 23:13:37 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 之前章节只用到了RAM的子账号功能,这些子账号都是可以长期正常使用的,发生泄露之后如果无法及时解除权限的话会很危险。 继续上文的例子,当开发者的app被用户使用之后,用户的数据要上传到OSS的ram-test-app这个Bucket,当app的用户数据很多的时候,需要考虑如何才能安全的授权给众多的app用户上传数据呢,以及如何保证多个用户之间存储的隔离。 类似这种需要临时访问的场景可以使用STS来完成。STS可以指定复杂的策略来对特定的用户进行限制,仅提供最小的权限。 创建角色 继续上一章节的例子,App用户有一个名为ram-test-app的Bucket来保存个人数据。创建角色的步骤如下: 按照上文的流程创建一个子账号ram_test_app,不需要赋予任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。 创建角色。这里创建两个角色,一个用于用户读取等操作,一个用于用户上传文件。 打开访问控制的管理控制台,选择角色管理 > 新建角色。 选择角色类型。这里选择用户角色。 填写类型信息。因为角色是被阿里云账号使用过的,因此选择默认的即可。 配置角色基本信息。 创建完角色之后,角色是没有任何权限的,因此这里和上文所述一样需要新建一个自定义的授权策略。授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }表示对ram-test-app拥有只读权限。 建立完成后,即可在角色管理里面给RamTestAppReadOnly添加上ram-test-app的只读授权。 按照上文同样的方法,建立一个RamTestAppWrite的角色,并且赋予写ram-test-app的自定义授权,授权如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }目前新建的两个角色为:RamTestAppReadOnly和RamTestAppWrite,分别表示了对于ram-test-app的读写权限。 临时授权访问 创建了角色之后,接下来就可以使用临时授权来访问OSS了。 准备工作 在正式使用之前,还有一些工作需要完成。扮演角色也是需要授权的,否则任意子账号都可以扮演这些角色会带来不可预计的风险,因此有扮演对应角色需求的子账号需要显式的配置权限。 在授权管理策略中新建两个自定义的授权策略,分别如下:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappreadonly" } ], "Version": "1" }使用相同的方法创建另一个自定义授权策略:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappwrite" } ], "Version": "1" }这里Resource后面填写的内容表示某个角色ID,角色的ID可以在角色管理 > 角色详情中找到。 将这两个授权赋给ram_test_app这个账号。 使用STS授权访问 现在一切准备就绪,可以正式使用STS来授权访问了。 这里使用一个简单的STS的python命令行工具sts.py。 具体的调用方法如下: $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret RoleArn表示的是需要扮演的角色ID,角色的ID可以在角色管理 > 角色详情中找到。 RoleSessionName是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。 Policy表示的是在扮演角色的时候额外加上的一个权限限制。 DurationSeconds指的是临时凭证的有效期,单位是s,最小为900,最大为3600。 id和secret表示的是需要扮演角色的子账号的AccessKey。 这里需要解释一下Policy,这里传入的Policy是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的Policy的交集。 在扮演角色的时候传入Policy的原因是为了灵活性,比如上传文件的时候可以根据不同的用户添加对于上传文件路径的限制,这点会在下面的例子展示。 现在我们可以来实际试验一下STS的作用,作为试验用的Bucket,先在控制台向ram-test-app传入一个test.txt的文本,内容为ststest。 首先使用ram_test_app这个子账号直接来访问。请将下面的AccessKey换成自己试验用的AccessKey。 [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94D444F4D8B2225E4AFE'), ('date', 'Tue, 17 Nov 2015 02:45:40 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94D444F4D8B2225E4AFE</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA 100% Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94E5B1119B445B9F8C3A'), ('date', 'Tue, 17 Nov 2015 02:45:57 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94E5B1119B445B9F8C3A</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed! 因为ram_test_app这个子账号没有访问权限,因此访问失败。 使用临时授权下载 现在使用STS来下载文件,这里为了简单,传入的Policy和角色的Policy一致,过期时间使用默认的3600s,App的用户假定为usr001。步骤如下: 使用STS来获取临时的凭证。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A07%3A25Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappreadonly&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3AListObjects%22%2C%22oss%3AGetObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%22%2C%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=bshxPZpwRJv5ch3SjaBiXLodwq0%3D&Action=AssumeRole&SignatureNonce=53e1be9c-8cd8-11e5-9b86-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappreadonly/usr001", "AssumedRoleId": "317446347657426289:usr001" }, "Credentials": { "AccessKeyId": "STS.3mQEbNf******wa180Le", "AccessKeySecret": "B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB", "Expiration": "2015-11-17T04:07:25Z", "SecurityToken": "CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=" }, "RequestId": "8C009F64-F19D-4EC1-A3AD-7A718CD0B49B" } 使用临时凭证来下载文件,这里sts_token就是上面STS返回的SecurityToken。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% The object test.txt is downloaded to test.txt, please check. 0.061(s) elapsed 可见已经可以使用临时凭证来下载文件了,那再试着使用这个凭证来上传。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9A2A1790CF0F53C15C82'), ('date', 'Tue, 17 Nov 2015 03:08:26 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9A2A1790CF0F53C15C82</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!由于扮演的角色只有下载的权限,因此上传失败。 使用临时授权上传 现在可以来试验一下使用STS上传。步骤如下: 获取STS的临时凭证,App用户为usr001。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappwrite RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["acs:oss:*:*:ram-test-app/usr001/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A16%3A10Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappwrite&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3APutObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2Fusr001%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=Y0OPUoL1PrCqX4X6A3%2FJvgXuS6c%3D&Action=AssumeRole&SignatureNonce=8d0798a8-8cd9-11e5-9f49-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappwrite/usr001", "AssumedRoleId": "355407847660029428:usr001" }, "Credentials": { "AccessKeyId": "STS.rtfx13******NlIJlS4U", "AccessKeySecret": "2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM", "Expiration": "2015-11-17T04:16:10Z", "SecurityToken": "CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl" }, "RequestId": "19407707-54B2-41AD-AAF0-FE87E8870B0D" } 试验一下能否使用这个凭证来上传下载。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C31FFFC811F24B6E7E3'), ('date', 'Tue, 17 Nov 2015 03:17:05 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C31FFFC811F24B6E7E3</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C3FB8DE437A91B16772'), ('date', 'Tue, 17 Nov 2015 03:17:19 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C3FB8DE437A91B16772</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!这里出现了问题,上传test.txt失败了。将本小节开始的时候传入的Policy格式化之后如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app/usr001/*" ] } ] }这个Policy的意义是仅允许用户向ram-test-app这个Bucket上传类似usr001/的文件,如果App用户是usr002的时候,就可以修改Policy为仅允许上传类似usr002/这种类型的文件,通过这种对不同的App用户设定不同的Policy的方式,可以做到不同App用户之间拥有独立的存储空间互不干扰的目的。 重新试验,将上传的目标指定为ram-test-app/usr001/test.txt。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/usr001/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Object URL is: http://ram-test-app.oss-cn-hangzhou.aliyuncs.com/usr001%2Ftest.txt Object abstract path is: oss://ram-test-app/usr001/test.txt ETag is "946A0A1AC8245696B9C6A6F35942690B" 0.071(s) elapsed可见上传成功了。 总结 本章主要介绍了使用STS来临时授权用户访问OSS。在典型的移动开发场景中,使用STS可以做到不同的App用户需要访问App的时候,可以通过获取到的临时授权来访问OSS。临时授权可以指定过期时间,因此大大降低了泄露的危害。在获取临时授权的时候,可以根据App用户的不同,传入不同的授权策略来限制用户的访问权限,比如限制用户访问的Object路径,从而达到隔离不同App用户的存储空间的目的。
2019-12-01 23:13:37 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 之前章节只用到了RAM的子账号功能,这些子账号都是可以长期正常使用的,发生泄露之后如果无法及时解除权限的话会很危险。 继续上文的例子,当开发者的app被用户使用之后,用户的数据要上传到OSS的ram-test-app这个Bucket,当app的用户数据很多的时候,需要考虑如何才能安全的授权给众多的app用户上传数据呢,以及如何保证多个用户之间存储的隔离。 类似这种需要临时访问的场景可以使用STS来完成。STS可以指定复杂的策略来对特定的用户进行限制,仅提供最小的权限。 创建角色 继续上一章节的例子,App用户有一个名为ram-test-app的Bucket来保存个人数据。创建角色的步骤如下: 按照上文的流程创建一个子账号ram_test_app,不需要赋予任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。 创建角色。这里创建两个角色,一个用于用户读取等操作,一个用于用户上传文件。 打开访问控制的管理控制台,选择角色管理 > 新建角色。 选择角色类型。这里选择用户角色。 填写类型信息。因为角色是被阿里云账号使用过的,因此选择默认的即可。 配置角色基本信息。 创建完角色之后,角色是没有任何权限的,因此这里和上文所述一样需要新建一个自定义的授权策略。授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }表示对ram-test-app拥有只读权限。 建立完成后,即可在角色管理里面给RamTestAppReadOnly添加上ram-test-app的只读授权。 按照上文同样的方法,建立一个RamTestAppWrite的角色,并且赋予写ram-test-app的自定义授权,授权如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }目前新建的两个角色为:RamTestAppReadOnly和RamTestAppWrite,分别表示了对于ram-test-app的读写权限。 临时授权访问 创建了角色之后,接下来就可以使用临时授权来访问OSS了。 准备工作 在正式使用之前,还有一些工作需要完成。扮演角色也是需要授权的,否则任意子账号都可以扮演这些角色会带来不可预计的风险,因此有扮演对应角色需求的子账号需要显式的配置权限。 在授权管理策略中新建两个自定义的授权策略,分别如下:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappreadonly" } ], "Version": "1" }使用相同的方法创建另一个自定义授权策略:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappwrite" } ], "Version": "1" }这里Resource后面填写的内容表示某个角色ID,角色的ID可以在角色管理 > 角色详情中找到。 将这两个授权赋给ram_test_app这个账号。 使用STS授权访问 现在一切准备就绪,可以正式使用STS来授权访问了。 这里使用一个简单的STS的python命令行工具sts.py。 具体的调用方法如下: $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret RoleArn表示的是需要扮演的角色ID,角色的ID可以在角色管理 > 角色详情中找到。 RoleSessionName是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。 Policy表示的是在扮演角色的时候额外加上的一个权限限制。 DurationSeconds指的是临时凭证的有效期,单位是s,最小为900,最大为3600。 id和secret表示的是需要扮演角色的子账号的AccessKey。 这里需要解释一下Policy,这里传入的Policy是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的Policy的交集。 在扮演角色的时候传入Policy的原因是为了灵活性,比如上传文件的时候可以根据不同的用户添加对于上传文件路径的限制,这点会在下面的例子展示。 现在我们可以来实际试验一下STS的作用,作为试验用的Bucket,先在控制台向ram-test-app传入一个test.txt的文本,内容为ststest。 首先使用ram_test_app这个子账号直接来访问。请将下面的AccessKey换成自己试验用的AccessKey。 [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94D444F4D8B2225E4AFE'), ('date', 'Tue, 17 Nov 2015 02:45:40 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94D444F4D8B2225E4AFE</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA 100% Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94E5B1119B445B9F8C3A'), ('date', 'Tue, 17 Nov 2015 02:45:57 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94E5B1119B445B9F8C3A</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed! 因为ram_test_app这个子账号没有访问权限,因此访问失败。 使用临时授权下载 现在使用STS来下载文件,这里为了简单,传入的Policy和角色的Policy一致,过期时间使用默认的3600s,App的用户假定为usr001。步骤如下: 使用STS来获取临时的凭证。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A07%3A25Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappreadonly&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3AListObjects%22%2C%22oss%3AGetObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%22%2C%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=bshxPZpwRJv5ch3SjaBiXLodwq0%3D&Action=AssumeRole&SignatureNonce=53e1be9c-8cd8-11e5-9b86-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappreadonly/usr001", "AssumedRoleId": "317446347657426289:usr001" }, "Credentials": { "AccessKeyId": "STS.3mQEbNf******wa180Le", "AccessKeySecret": "B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB", "Expiration": "2015-11-17T04:07:25Z", "SecurityToken": "CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=" }, "RequestId": "8C009F64-F19D-4EC1-A3AD-7A718CD0B49B" } 使用临时凭证来下载文件,这里sts_token就是上面STS返回的SecurityToken。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% The object test.txt is downloaded to test.txt, please check. 0.061(s) elapsed 可见已经可以使用临时凭证来下载文件了,那再试着使用这个凭证来上传。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9A2A1790CF0F53C15C82'), ('date', 'Tue, 17 Nov 2015 03:08:26 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9A2A1790CF0F53C15C82</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!由于扮演的角色只有下载的权限,因此上传失败。 使用临时授权上传 现在可以来试验一下使用STS上传。步骤如下: 获取STS的临时凭证,App用户为usr001。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappwrite RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["acs:oss:*:*:ram-test-app/usr001/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A16%3A10Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappwrite&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3APutObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2Fusr001%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=Y0OPUoL1PrCqX4X6A3%2FJvgXuS6c%3D&Action=AssumeRole&SignatureNonce=8d0798a8-8cd9-11e5-9f49-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappwrite/usr001", "AssumedRoleId": "355407847660029428:usr001" }, "Credentials": { "AccessKeyId": "STS.rtfx13******NlIJlS4U", "AccessKeySecret": "2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM", "Expiration": "2015-11-17T04:16:10Z", "SecurityToken": "CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl" }, "RequestId": "19407707-54B2-41AD-AAF0-FE87E8870B0D" } 试验一下能否使用这个凭证来上传下载。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C31FFFC811F24B6E7E3'), ('date', 'Tue, 17 Nov 2015 03:17:05 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C31FFFC811F24B6E7E3</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C3FB8DE437A91B16772'), ('date', 'Tue, 17 Nov 2015 03:17:19 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C3FB8DE437A91B16772</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!这里出现了问题,上传test.txt失败了。将本小节开始的时候传入的Policy格式化之后如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app/usr001/*" ] } ] }这个Policy的意义是仅允许用户向ram-test-app这个Bucket上传类似usr001/的文件,如果App用户是usr002的时候,就可以修改Policy为仅允许上传类似usr002/这种类型的文件,通过这种对不同的App用户设定不同的Policy的方式,可以做到不同App用户之间拥有独立的存储空间互不干扰的目的。 重新试验,将上传的目标指定为ram-test-app/usr001/test.txt。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/usr001/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Object URL is: http://ram-test-app.oss-cn-hangzhou.aliyuncs.com/usr001%2Ftest.txt Object abstract path is: oss://ram-test-app/usr001/test.txt ETag is "946A0A1AC8245696B9C6A6F35942690B" 0.071(s) elapsed可见上传成功了。 总结 本章主要介绍了使用STS来临时授权用户访问OSS。在典型的移动开发场景中,使用STS可以做到不同的App用户需要访问App的时候,可以通过获取到的临时授权来访问OSS。临时授权可以指定过期时间,因此大大降低了泄露的危害。在获取临时授权的时候,可以根据App用户的不同,传入不同的授权策略来限制用户的访问权限,比如限制用户访问的Object路径,从而达到隔离不同App用户的存储空间的目的。
2019-12-01 23:13:36 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 之前章节只用到了RAM的子账号功能,这些子账号都是可以长期正常使用的,发生泄露之后如果无法及时解除权限的话会很危险。 继续上文的例子,当开发者的app被用户使用之后,用户的数据要上传到OSS的ram-test-app这个Bucket,当app的用户数据很多的时候,需要考虑如何才能安全的授权给众多的app用户上传数据呢,以及如何保证多个用户之间存储的隔离。 类似这种需要临时访问的场景可以使用STS来完成。STS可以指定复杂的策略来对特定的用户进行限制,仅提供最小的权限。 创建角色 继续上一章节的例子,App用户有一个名为ram-test-app的Bucket来保存个人数据。创建角色的步骤如下: 按照上文的流程创建一个子账号ram_test_app,不需要赋予任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。 创建角色。这里创建两个角色,一个用于用户读取等操作,一个用于用户上传文件。 打开访问控制的管理控制台,选择角色管理 > 新建角色。 选择角色类型。这里选择用户角色。 填写类型信息。因为角色是被阿里云账号使用过的,因此选择默认的即可。 配置角色基本信息。 创建完角色之后,角色是没有任何权限的,因此这里和上文所述一样需要新建一个自定义的授权策略。授权策略如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }表示对ram-test-app拥有只读权限。 建立完成后,即可在角色管理里面给RamTestAppReadOnly添加上ram-test-app的只读授权。 按照上文同样的方法,建立一个RamTestAppWrite的角色,并且赋予写ram-test-app的自定义授权,授权如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app", "acs:oss:*:*:ram-test-app/*" ] } ] }目前新建的两个角色为:RamTestAppReadOnly和RamTestAppWrite,分别表示了对于ram-test-app的读写权限。 临时授权访问 创建了角色之后,接下来就可以使用临时授权来访问OSS了。 准备工作 在正式使用之前,还有一些工作需要完成。扮演角色也是需要授权的,否则任意子账号都可以扮演这些角色会带来不可预计的风险,因此有扮演对应角色需求的子账号需要显式的配置权限。 在授权管理策略中新建两个自定义的授权策略,分别如下:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappreadonly" } ], "Version": "1" }使用相同的方法创建另一个自定义授权策略:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram::1894189769722283:role/ramtestappwrite" } ], "Version": "1" }这里Resource后面填写的内容表示某个角色ID,角色的ID可以在角色管理 > 角色详情中找到。 将这两个授权赋给ram_test_app这个账号。 使用STS授权访问 现在一切准备就绪,可以正式使用STS来授权访问了。 这里使用一个简单的STS的python命令行工具sts.py。 具体的调用方法如下: $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret RoleArn表示的是需要扮演的角色ID,角色的ID可以在角色管理 > 角色详情中找到。 RoleSessionName是一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。 Policy表示的是在扮演角色的时候额外加上的一个权限限制。 DurationSeconds指的是临时凭证的有效期,单位是s,最小为900,最大为3600。 id和secret表示的是需要扮演角色的子账号的AccessKey。 这里需要解释一下Policy,这里传入的Policy是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的Policy的交集。 在扮演角色的时候传入Policy的原因是为了灵活性,比如上传文件的时候可以根据不同的用户添加对于上传文件路径的限制,这点会在下面的例子展示。 现在我们可以来实际试验一下STS的作用,作为试验用的Bucket,先在控制台向ram-test-app传入一个test.txt的文本,内容为ststest。 首先使用ram_test_app这个子账号直接来访问。请将下面的AccessKey换成自己试验用的AccessKey。 [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94D444F4D8B2225E4AFE'), ('date', 'Tue, 17 Nov 2015 02:45:40 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94D444F4D8B2225E4AFE</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i oOhue******Frogv -k OmVwFJO3qcT0******FhOYpg3p0KnA 100% Error Headers: [('content-length', '229'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A94E5B1119B445B9F8C3A'), ('date', 'Tue, 17 Nov 2015 02:45:57 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>AccessDenied</Message> <RequestId>564A94E5B1119B445B9F8C3A</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed! 因为ram_test_app这个子账号没有访问权限,因此访问失败。 使用临时授权下载 现在使用STS来下载文件,这里为了简单,传入的Policy和角色的Policy一致,过期时间使用默认的3600s,App的用户假定为usr001。步骤如下: 使用STS来获取临时的凭证。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:ListObjects","oss:GetObject"],"Resource":["acs:oss:*:*:ram-test-app","acs:oss:*:*:ram-test-app/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A07%3A25Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappreadonly&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3AListObjects%22%2C%22oss%3AGetObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%22%2C%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=bshxPZpwRJv5ch3SjaBiXLodwq0%3D&Action=AssumeRole&SignatureNonce=53e1be9c-8cd8-11e5-9b86-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappreadonly/usr001", "AssumedRoleId": "317446347657426289:usr001" }, "Credentials": { "AccessKeyId": "STS.3mQEbNf******wa180Le", "AccessKeySecret": "B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB", "Expiration": "2015-11-17T04:07:25Z", "SecurityToken": "CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk=" }, "RequestId": "8C009F64-F19D-4EC1-A3AD-7A718CD0B49B" } 使用临时凭证来下载文件,这里sts_token就是上面STS返回的SecurityToken。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% The object test.txt is downloaded to test.txt, please check. 0.061(s) elapsed 可见已经可以使用临时凭证来下载文件了,那再试着使用这个凭证来上传。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.3mQEbNf******wa180Le -k B1w7rCbR4dzGwNYJ******3PiPqKZ3gjQhAxb6mB --sts_token=CAESvAMIARKAASQQUUTSE+7683CGlhdGsv2/di8uI+X1BxG7MDxM5FTd0fp5wpPK/7UctYH2MJ///c4yMN1PUCcEHI1zppCINmpDG2XeNA3OS16JwS6ESmI50sHyWBmsYkCJW15gXnfhz/OK+mSp1bYxlfB33qfgCFe97Ijeuj8RMgqFx0Hny2BzGhhTVFMuM21RRWJOZnR5Yzl1T3dhMTgwTGUiEjMxNzQ0NjM0NzY1NzQyNjI4OSoGdXNyMDAxMJTrgJ2RKjoGUnNhTUQ1QpsBCgExGpUBCgVBbGxvdxI4CgxBY3Rpb25FcXVhbHMSBkFjdGlvbhogCg9vc3M6TGlzdE9iamVjdHMKDW9zczpHZXRPYmplY3QSUgoOUmVzb3VyY2VFcXVhbHMSCFJlc291cmNlGjYKGGFjczpvc3M6KjoqOnJhbS10ZXN0LWFwcAoaYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwLypKEDE4OTQxODk3Njk3MjIyODNSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzE3NDQ2MzQ3NjU3NDI2Mjg5chJyYW10ZXN0YXBwcmVhZG9ubHk= 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9A2A1790CF0F53C15C82'), ('date', 'Tue, 17 Nov 2015 03:08:26 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9A2A1790CF0F53C15C82</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!由于扮演的角色只有下载的权限,因此上传失败。 使用临时授权上传 现在可以来试验一下使用STS上传。步骤如下: 获取STS的临时凭证,App用户为usr001。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $python ./sts.py AssumeRole RoleArn=acs:ram::1894189769722283:role/ramtestappwrite RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["oss:PutObject"],"Resource":["acs:oss:*:*:ram-test-app/usr001/*"]}]}' --id=oOhue******Frogv --secret=OmVwFJO3qcT0******FhOYpg3p0KnA https://sts.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2015-11-17T03%3A16%3A10Z&RoleArn=acs%3Aram%3A%3A1894189769722283%3Arole%2Framtestappwrite&RoleSessionName=usr001&AccessKeyId=oOhuek56i53Frogv&Policy=%7B%22Version%22%3A%221%22%2C%22Statement%22%3A%5B%7B%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%5B%22oss%3APutObject%22%5D%2C%22Resource%22%3A%5B%22acs%3Aoss%3A%2A%3A%2A%3Aram-test-app%2Fusr001%2F%2A%22%5D%7D%5D%7D&SignatureMethod=HMAC-SHA1&Version=2015-04-01&Signature=Y0OPUoL1PrCqX4X6A3%2FJvgXuS6c%3D&Action=AssumeRole&SignatureNonce=8d0798a8-8cd9-11e5-9f49-008cfa5e4938 { "AssumedRoleUser": { "Arn": "acs:ram::1894189769722283:role/ramtestappwrite/usr001", "AssumedRoleId": "355407847660029428:usr001" }, "Credentials": { "AccessKeyId": "STS.rtfx13******NlIJlS4U", "AccessKeySecret": "2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM", "Expiration": "2015-11-17T04:16:10Z", "SecurityToken": "CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl" }, "RequestId": "19407707-54B2-41AD-AAF0-FE87E8870B0D" } 试验一下能否使用这个凭证来上传下载。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd get oss://ram-test-app/test.txt test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C31FFFC811F24B6E7E3'), ('date', 'Tue, 17 Nov 2015 03:17:05 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C31FFFC811F24B6E7E3</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 get Failed! [admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Error Headers: [('content-length', '254'), ('server', 'AliyunOSS'), ('connection', 'keep-alive'), ('x-oss-request-id', '564A9C3FB8DE437A91B16772'), ('date', 'Tue, 17 Nov 2015 03:17:19 GMT'), ('content-type', 'application/xml')] Error Body: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>AccessDenied</Code> <Message>Access denied by authorizer's policy.</Message> <RequestId>564A9C3FB8DE437A91B16772</RequestId> <HostId>ram-test-app.oss-cn-hangzhou.aliyuncs.com</HostId> </Error> Error Status: 403 put Failed!这里出现了问题,上传test.txt失败了。将本小节开始的时候传入的Policy格式化之后如下:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:ram-test-app/usr001/*" ] } ] }这个Policy的意义是仅允许用户向ram-test-app这个Bucket上传类似usr001/的文件,如果App用户是usr002的时候,就可以修改Policy为仅允许上传类似usr002/这种类型的文件,通过这种对不同的App用户设定不同的Policy的方式,可以做到不同App用户之间拥有独立的存储空间互不干扰的目的。 重新试验,将上传的目标指定为ram-test-app/usr001/test.txt。[admin@NGIS-CWWF344M01C /home/admin/oss_test] $./osscmd put test.txt oss://ram-test-app/usr001/test.txt --host=oss-cn-hangzhou.aliyuncs.com -i STS.rtfx13******NlIJlS4U -k 2fsaM8E2maB2dn******wpsKTyK4ajo7TxFr0zIM --sts_token=CAESkwMIARKAAUh3/Uzcg13YLRBWxy0IZjGewMpg31ITxCleBFU1eO/3Sgpudid+GVs+Olvu1vXJn6DLcvPa8azKJKtzV0oKSy+mwUrxSvUSRVDntrs78CsNfWoOJUMJKjLIxdWnGi1pgxJCBzNZ2YV/6ycTaZySSE1V6kqQ7A+GPwYoBSnWmLpdGhhTVFMucnRmeDEzRFlNVWJjTmxJSmxTNFUiEjM1NTQwNzg0NzY2MDAyOTQyOCoGdXNyMDAxMOPzoJ2RKjoGUnNhTUQ1QnYKATEacQoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOlB1dE9iamVjdBI/Cg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaIwohYWNzOm9zczoqOio6cmFtLXRlc3QtYXBwL3VzcjAwMS8qShAxODk0MTg5NzY5NzIyMjgzUgUyNjg0MloPQXNzdW1lZFJvbGVVc2VyYABqEjM1NTQwNzg0NzY2MDAyOTQyOHIPcmFtdGVzdGFwcHdyaXRl 100% Object URL is: http://ram-test-app.oss-cn-hangzhou.aliyuncs.com/usr001%2Ftest.txt Object abstract path is: oss://ram-test-app/usr001/test.txt ETag is "946A0A1AC8245696B9C6A6F35942690B" 0.071(s) elapsed可见上传成功了。 总结 本章主要介绍了使用STS来临时授权用户访问OSS。在典型的移动开发场景中,使用STS可以做到不同的App用户需要访问App的时候,可以通过获取到的临时授权来访问OSS。临时授权可以指定过期时间,因此大大降低了泄露的危害。在获取临时授权的时候,可以根据App用户的不同,传入不同的授权策略来限制用户的访问权限,比如限制用户访问的Object路径,从而达到隔离不同App用户的存储空间的目的。
2019-12-01 23:13:37 0 浏览量 回答数 0

回答

Nginx是一个轻量级的,高性能的Web服务器以及反向代理和邮箱 (IMAP/POP3)代理服务器。它运行在UNIX,GNU /linux,BSD 各种版本,Mac OS X,Solaris和Windows。根据调查统计,6%的网站使用Nginx Web服务器。Nginx是少数能处理C10K问题的服务器之一。跟传统的服务器不同,Nginx不依赖线程来处理请求。相反,它使用了更多的可扩展的事 件驱动(异步)架构。Nginx为一些高流量的网站提供动力,比如WordPress,人人网,腾讯,网易等。这篇文章主要是介绍如何提高运行在 Linux或UNIX系统的Nginx Web服务器的安全性。 默认配置文件和Nginx端口 /usr/local/nginx/conf/ – Nginx配置文件目录,/usr/local/nginx/conf/nginx.conf是主配置文件 /usr/local/nginx/html/ – 默认网站文件位置 /usr/local/nginx/logs/ – 默认日志文件位置 Nginx HTTP默认端口 : TCP 80 Nginx HTTPS默认端口: TCP 443 你可以使用以下命令来测试Nginx配置文件准确性。 /usr/local/nginx/sbin/nginx -t 将会输出: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok configuration file /usr/local/nginx/conf/nginx.conf test is successful 执行以下命令来重新加载配置文件。 /usr/local/nginx/sbin/nginx -s reload 执行以下命令来停止服务器。 /usr/local/nginx/sbin/nginx -s stop 一、配置SELinux 注意:对于云服务器 ECS,参阅 ECS 使用须知 ,基于兼容性、稳定性考虑,请勿开启 SELinux。 安全增强型 Linux(SELinux)是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制。它可以防御大部分攻击。下面我们来看如何启动基于centos/RHEL系统的SELinux。 安装SELinux rpm -qa | grep selinux libselinux-1.23.10-2 selinux-policy-targeted-1.23.16-6 如果没有返回任何结果,代表没有安装 SELinux,如果返回了类似上面的结果,则说明系统安装了 SELinux。 布什值锁定 运行命令getsebool -a来锁定系统。 getsebool -a | less getsebool -a | grep off getsebool -a | grep o 二、通过分区挂载允许最少特权 服务器上的网页/html/php文件单独分区。例如,新建一个分区/dev/sda5(第一逻辑分区),并且挂载在/nginx。确保 /nginx是以noexec, nodev and nosetuid的权限挂载。以下是我的/etc/fstab的挂载/nginx的信息: LABEL=/nginx /nginx ext3 defaults,nosuid,noexec,nodev 1 2 注意:你需要使用fdisk和mkfs.ext3命令创建一个新分区。 三、配置/etc/sysctl.conf强化Linux安全 你可以通过编辑/etc/sysctl.conf来控制和配置Linux内核、网络设置。 Avoid a smurf attack net.ipv4.icmp_echo_ignore_broadcasts = 1 Turn on protection for bad icmp error messages net.ipv4.icmp_ignore_bogus_error_responses = 1 Turn on syncookies for SYN flood attack protection net.ipv4.tcp_syncookies = 1 Turn on and log spoofed, source routed, and redirect packets net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1 No source routed packets here net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 Turn on reverse path filtering net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 Make sure no one can alter the routing tables net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 Don’t act as a router net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 Turn on execshild kernel.exec-shield = 1 kernel.randomize_va_space = 1 Tuen IPv6 net.ipv6.conf.default.router_solicitations = 0 net.ipv6.conf.default.accept_ra_rtr_pref = 0 net.ipv6.conf.default.accept_ra_pinfo = 0 net.ipv6.conf.default.accept_ra_defrtr = 0 net.ipv6.conf.default.autoconf = 0 net.ipv6.conf.default.dad_transmits = 0 net.ipv6.conf.default.max_addresses = 1 Optimization for port usefor LBs Increase system file descriptor limit fs.file-max = 65535 Allow for more PIDs (to reduce rollover problems); may break some programs 32768 kernel.pid_max = 65536 Increase system IP port limits net.ipv4.ip_local_port_range = 2000 65000 Increase TCP max buffer size setable using setsockopt() net.ipv4.tcp_rmem = 4096 87380 8388608 net.ipv4.tcp_wmem = 4096 87380 8388608 Increase Linux auto tuning TCP buffer limits min, default, and max number of bytes to use set max to at least 4MB, or higher if you use very high BDP paths Tcp Windows etc net.core.rmem_max = 8388608 net.core.wmem_max = 8388608 net.core.netdev_max_backlog = 5000 net.ipv4.tcp_window_scaling = 1 四、删除所有不需要的Nginx模块 你需要直接通过编译Nginx源代码使模块数量最少化。通过限制只允许web服务器访问模块把风险降到最低。你可以只配置安装nginx你所需要的模块。例如,禁用SSL和autoindex模块你可以执行以下命令: ./configure –without-http_autoindex_module –without-http_ssi_module make make install 通过以下命令来查看当编译nginx服务器时哪个模块能开户或关闭: ./configure –help | less 禁用你用不到的nginx模块。 (可选项)更改nginx版本名称。 编辑文件/http/ngx_http_header_filter_module.c: vi +48 src/http/ngx_http_header_filter_module.c 找到行: static char ngx_http_server_string[] = “Server: nginx” CRLF; static char ngx_http_server_full_string[] = “Server: ” NGINX_VER CRLF; 按照以下行修改: static char ngx_http_server_string[] = “Server: Ninja Web Server” CRLF; static char ngx_http_server_full_string[] = “Server: Ninja Web Server” CRLF; 保存并关闭文件。现在你可以编辑服务器了。增加以下代码到nginx.conf文件来关闭nginx版本号的显示。 server_tokens off 五、使用mod_security(只适合后端Apache服务器) mod_security为Apache提供一个应用程序级的防火墙。为后端Apache Web服务器安装mod_security,这会阻止很多注入式攻击。 六、安装SELinux策略以强化Nginx Web服务器 默认的SELinux不会保护Nginx Web服务器,但是你可以安装和编译保护软件。 1、安装编译SELinux所需环境支持 yum -y install selinux-policy-targeted selinux-policy-devel 2、下载SELinux策略以强化Nginx Web服务器。 cd /opt wget ‘http://downloads.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.gz?use_mirror=nchc’ 3、解压文件 tar -zxvf se-ngix_1_0_10.tar.gz 4、编译文件 cd se-ngix_1_0_10/nginx make 将会输出如下: Compiling targeted nginx module /usr/bin/checkmodule: loading policy configuration from tmp/nginx.tmp /usr/bin/checkmodule: policy configuration loaded /usr/bin/checkmodule: writing binary representation (version 6) to tmp/nginx.mod Creating targeted nginx.pp policy package rm tmp/nginx.mod.fc tmp/nginx.mod 5、安装生成的nginx.pp SELinux模块: /usr/sbin/semodule -i nginx.pp 七、基于Iptables防火墙的限制 下面的防火墙脚本阻止任何除了允许: 来自HTTP(TCP端口80)的请求 来自ICMP ping的请求 ntp(端口123)的请求输出 smtp(TCP端口25)的请求输出 #!/bin/bash IPT=”/sbin/iptables” IPS Get server public ip SERVER_IP=$(ifconfig eth0 | grep ‘inet addr:’ | awk -F’inet addr:’ ‘{ print $2}’ | awk ‘{ print $1}’) LB1_IP=”204.54.1.1″ LB2_IP=”204.54.1.2″ Do some smart logic so that we can use damm script on LB2 too OTHER_LB=”" SERVER_IP=”" [[ "$SERVER_IP" == "$LB1_IP" ]] && OTHER_LB=”$LB2_IP” || OTHER_LB=”$LB1_IP” [[ "$OTHER_LB" == "$LB2_IP" ]] && OPP_LB=”$LB1_IP” || OPP_LB=”$LB2_IP” IPs PUB_SSH_ONLY=”122.xx.yy.zz/29″ FILES BLOCKED_IP_TDB=/root/.fw/blocked.ip.txt SPOOFIP=”127.0.0.0/8 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 169.254.0.0/16 0.0.0.0/8 240.0.0.0/4 255.255.255.255/32 168.254.0.0/16 224.0.0.0/4 240.0.0.0/5 248.0.0.0/5 192.0.2.0/24″ BADIPS=$( [[ -f ${BLOCKED_IP_TDB} ]] && egrep -v “^#|^$” ${BLOCKED_IP_TDB}) Interfaces PUB_IF=”eth0″ # public interface LO_IF=”lo” # loopback VPN_IF=”eth1″ # vpn / private net start firewall echo “Setting LB1 $(hostname) Firewall…” DROP and close everything $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP Unlimited lo access $IPT -A INPUT -i ${LO_IF} -j ACCEPT $IPT -A OUTPUT -o ${LO_IF} -j ACCEPT Unlimited vpn / pnet access $IPT -A INPUT -i ${VPN_IF} -j ACCEPT $IPT -A OUTPUT -o ${VPN_IF} -j ACCEPT Drop sync $IPT -A INPUT -i ${PUB_IF} -p tcp ! –syn -m state –state NEW -j DROP Drop Fragments $IPT -A INPUT -i ${PUB_IF} -f -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL FIN,URG,PSH -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL ALL -j DROP Drop NULL packets $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” NULL Packets “ $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,RST SYN,RST -j DROP Drop XMAS $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” XMAS Packets “ $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP Drop FIN packet scans $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” Fin Packets Scan “ $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP Log and get rid of broadcast / multicast and invalid $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type broadcast -j LOG –log-prefix ” Broadcast “ $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type broadcast -j DROP $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type multicast -j LOG –log-prefix ” Multicast “ $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type multicast -j DROP $IPT -A INPUT -i ${PUB_IF} -m state –state INVALID -j LOG –log-prefix ” Invalid “ $IPT -A INPUT -i ${PUB_IF} -m state –state INVALID -j DROP Log and block spoofed ips $IPT -N spooflist for ipblock in $SPOOFIP do $IPT -A spooflist -i ${PUB_IF} -s $ipblock -j LOG –log-prefix ” SPOOF List Block “ $IPT -A spooflist -i ${PUB_IF} -s $ipblock -j DROP done $IPT -I INPUT -j spooflist $IPT -I OUTPUT -j spooflist $IPT -I FORWARD -j spooflist Allow ssh only from selected public ips for ip in ${PUB_SSH_ONLY} do $IPT -A INPUT -i ${PUB_IF} -s ${ip} -p tcp -d ${SERVER_IP} –destination-port 22 -j ACCEPT $IPT -A OUTPUT -o ${PUB_IF} -d ${ip} -p tcp -s ${SERVER_IP} –sport 22 -j ACCEPT done allow incoming ICMP ping pong stuff $IPT -A INPUT -i ${PUB_IF} -p icmp –icmp-type 8 -s 0/0 -m state –state NEW,ESTABLISHED,RELATED -m limit –limit 30/sec -j ACCEPT $IPT -A OUTPUT -o ${PUB_IF} -p icmp –icmp-type 0 -d 0/0 -m state –state ESTABLISHED,RELATED -j ACCEPT allow incoming HTTP port 80 $IPT -A INPUT -i ${PUB_IF} -p tcp -s 0/0 –sport 1024:65535 –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${PUB_IF} -p tcp –sport 80 -d 0/0 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT allow outgoing ntp $IPT -A OUTPUT -o ${PUB_IF} -p udp –dport 123 -m state –state NEW,ESTABLISHED -j ACCEPT $IPT -A INPUT -i ${PUB_IF} -p udp –sport 123 -m state –state ESTABLISHED -j ACCEPT allow outgoing smtp $IPT -A OUTPUT -o ${PUB_IF} -p tcp –dport 25 -m state –state NEW,ESTABLISHED -j ACCEPT $IPT -A INPUT -i ${PUB_IF} -p tcp –sport 25 -m state –state ESTABLISHED -j ACCEPT add your other rules here ####################### drop and log everything else $IPT -A INPUT -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” DEFAULT DROP “ $IPT -A INPUT -j DROP exit 0 八、控制缓冲区溢出攻击 编辑nginx.conf,为所有客户端设置缓冲区的大小限制。 vi /usr/local/nginx/conf/nginx.conf 编辑和设置所有客户端缓冲区的大小限制如下: Start: Size Limits & Buffer Overflows client_body_buffer_size 1K; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k; END: Size Limits & Buffer Overflows 解释: 1、client_body_buffer_size 1k-(默认8k或16k)这个指令可以指定连接请求实体的缓冲区大小。如果连接请求超过缓存区指定的值,那么这些请求实体的整体或部分将尝试写入一个临时文件。 2、client_header_buffer_size 1k-指令指定客户端请求头部的缓冲区大小。绝大多数情况下一个请求头不会大于1k,不过如果有来自于wap客户端的较大的cookie它可能会大于 1k,Nginx将分配给它一个更大的缓冲区,这个值可以在large_client_header_buffers里面设置。 3、client_max_body_size 1k-指令指定允许客户端连接的最大请求实体大小,它出现在请求头部的Content-Length字段。 如果请求大于指定的值,客户端将收到一个”Request Entity Too Large” (413)错误。记住,浏览器并不知道怎样显示这个错误。 4、large_client_header_buffers-指定客户端一些比较大的请求头使用的缓冲区数量和大小。请求字段不能大于一个缓冲区大小,如果客户端发送一个比较大的头,nginx将返回”Request URI too large” (414) 同样,请求的头部最长字段不能大于一个缓冲区,否则服务器将返回”Bad request” (400)。缓冲区只在需求时分开。默认一个缓冲区大小为操作系统中分页文件大小,通常是4k或8k,如果一个连接请求最终将状态转换为keep- alive,它所占用的缓冲区将被释放。 你还需要控制超时来提高服务器性能并与客户端断开连接。按照如下编辑: Start: Timeouts client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5 5; send_timeout 10; End: Timeouts 1、client_body_timeout 10;-指令指定读取请求实体的超时时间。这里的超时是指一个请求实体没有进入读取步骤,如果连接超过这个时间而客户端没有任何响应,Nginx将返回一个”Request time out” (408)错误。 2、client_header_timeout 10;-指令指定读取客户端请求头标题的超时时间。这里的超时是指一个请求头没有进入读取步骤,如果连接超过这个时间而客户端没有任何响应,Nginx将返回一个”Request time out” (408)错误。 3、keepalive_timeout 5 5; – 参数的第一个值指定了客户端与服务器长连接的超时时间,超过这个时间,服务器将关闭连接。参数的第二个值(可选)指定了应答头中Keep-Alive: timeout=time的time值,这个值可以使一些浏览器知道什么时候关闭连接,以便服务器不用重复关闭,如果不指定这个参数,nginx不会在应 答头中发送Keep-Alive信息。(但这并不是指怎样将一个连接“Keep-Alive”)参数的这两个值可以不相同。 4、send_timeout 10; 指令指定了发送给客户端应答后的超时时间,Timeout是指没有进入完整established状态,只完成了两次握手,如果超过这个时间客户端没有任何响应,nginx将关闭连接。 九、控制并发连接 你可以使用NginxHttpLimitZone模块来限制指定的会话或者一个IP地址的特殊情况下的并发连接。编辑nginx.conf: Directive describes the zone, in which the session states are stored i.e. store in slimits. 1m can handle 32000 sessions with 32 bytes/session, set to 5m x 32000 session limit_zone slimits $binary_remote_addr 5m; Control maximum number of simultaneous connections for one session i.e. restricts the amount of connections from a single ip address limit_conn slimits 5; 上面表示限制每个远程IP地址的客户端同时打开连接不能超过5个。 十、只允许我们的域名的访问 如果机器人只是随机扫描服务器的所有域名,那拒绝这个请求。你必须允许配置的虚拟域或反向代理请求。你不必使用IP地址来拒绝。 Only requests to our Host are allowed i.e. nixcraft.in, images.nixcraft.in and www.nixcraft.in if ($host !~ ^(nixcraft.in|www.nixcraft.in|images.nixcraft.in)$ ) { return 444; } 十一、限制可用的请求方法 GET和POST是互联网上最常用的方法。 Web服务器的方法被定义在RFC 2616。如果Web服务器不要求启用所有可用的方法,它们应该被禁用。下面的指令将过滤只允许GET,HEAD和POST方法: Only allow these request methods if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } Do not accept DELETE, SEARCH and other methods 更多关于HTTP方法的介绍 GET方法是用来请求,如文件http://www.moqifei.com/index.php。 HEAD方法是一样的,除非该服务器的GET请求无法返回消息体。 POST方法可能涉及到很多东西,如储存或更新数据,或订购产品,或通过提交表单发送电子邮件。这通常是使用服务器端处理,如PHP,Perl和Python等脚本。如果你要上传的文件和在服务器处理数据,你必须使用这个方法。 十二、如何拒绝一些User-Agents? 你可以很容易地阻止User-Agents,如扫描器,机器人以及滥用你服务器的垃圾邮件发送者。 Block download agents if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; } 阻止Soso和有道的机器人: Block some robots if ($http_user_agent ~* Sosospider|YodaoBot) { return 403; } 十三、如何防止图片盗链 图片或HTML盗链的意思是有人直接用你网站的图片地址来显示在他的网站上。最终的结果,你需要支付额外的宽带费用。这通常是在论坛和博客。我强烈建议您封锁,并阻止盗链行为。 Stop deep linking or hot linking location /images/ { valid_referers none blocked www.example.com example.com; if ($invalid_referer) { return 403; } } 例如:重定向并显示指定图片 valid_referers blocked www.example.com example.com; if ($invalid_referer) { rewrite ^/images/uploads.*.(gif|jpg|jpeg|png)$ http://www.examples.com/banned.jpg last } 十四、目录限制 你可以对指定的目录设置访问权限。所有的网站目录应该一一的配置,只允许必须的目录访问权限。 通过IP地址限制访问 你可以通过IP地址来限制访问目录/admin/: location /docs/ { block one workstation deny 192.168.1.1; allow anyone in 192.168.1.0/24 allow 192.168.1.0/24; drop rest of the world deny all; } 通过密码保护目录 首先创建密码文件并增加“user”用户: mkdir /usr/local/nginx/conf/.htpasswd/ htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd user 编辑nginx.conf,加入需要保护的目录: Password Protect /personal-images/ and /delta/ directories location ~ /(personal-images/.|delta/.) { auth_basic “Restricted”; auth_basic_user_file /usr/local/nginx/conf/.htpasswd/passwd; } 一旦密码文件已经生成,你也可以用以下的命令来增加允许访问的用户: htpasswd -s /usr/local/nginx/conf/.htpasswd/passwd userName 十五、Nginx SSL配置 HTTP是一个纯文本协议,它是开放的被动监测。你应该使用SSL来加密你的用户内容。 创建SSL证书 执行以下命令: cd /usr/local/nginx/conf openssl genrsa -des3 -out server.key 1024 openssl req -new -key server.key -out server.csr cp server.key server.key.org openssl rsa -in server.key.org -out server.key openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 编辑nginx.conf并按如下来更新: server { server_name example.com; listen 443; ssl on; ssl_certificate /usr/local/nginx/conf/server.crt; ssl_certificate_key /usr/local/nginx/conf/server.key; access_log /usr/local/nginx/logs/ssl.access.log; error_log /usr/local/nginx/logs/ssl.error.log; } 重启nginx: /usr/local/nginx/sbin/nginx -s reload 十六、Nginx与PHP安全建议 PHP是流行的服务器端脚本语言之一。如下编辑/etc/php.ini文件: Disallow dangerous functions disable_functions = phpinfo, system, mail, exec Try to limit resources Maximum execution time of each script, in seconds max_execution_time = 30 Maximum amount of time each script may spend parsing request data max_input_time = 60 Maximum amount of memory a script may consume (8MB) memory_limit = 8M Maximum size of POST data that PHP will accept. post_max_size = 8M Whether to allow HTTP file uploads. file_uploads = Off Maximum allowed size for uploaded files. upload_max_filesize = 2M Do not expose PHP error messages to external users display_errors = Off Turn on safe mode safe_mode = On Only allow access to executables in isolated directory safe_mode_exec_dir = php-required-executables-path Limit external access to PHP environment safemode_allowed_env_vars = PHP Restrict PHP information leakage expose_php = Off Log all errors log_errors = On Do not register globals for input data register_globals = Off Minimize allowable PHP post size post_max_size = 1K Ensure PHP redirects appropriately cgi.force_redirect = 0 Disallow uploading unless necessary file_uploads = Off Enable SQL safe mode sql.safe_mode = On Avoid Opening remote files allow_url_fopen = Off 十七、如果可能让Nginx运行在一个chroot监狱 把nginx放在一个chroot监狱以减小潜在的非法进入其它目录。你可以使用传统的与nginx一起安装的chroot。如果可能,那使用FreeBSD jails,Xen,OpenVZ虚拟化的容器概念。 十八、在防火墙级限制每个IP的连接数 网络服务器必须监视连接和每秒连接限制。PF和Iptales都能够在进入你的nginx服务器之前阻止最终用户的访问。 Linux Iptables:限制每次Nginx连接数 下面的例子会阻止来自一个IP的60秒钟内超过15个连接端口80的连接数。 /sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –set /sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –update –seconds 60 –hitcount 15 -j DROP service iptables save 请根据你的具体情况来设置限制的连接数。 十九:配置操作系统保护Web服务器 像以上介绍的启动SELinux.正确设置/nginx文档根目录的权限。Nginx以用户nginx运行。但是根目录(/nginx或者/usr /local/nginx/html)不应该设置属于用户nginx或对用户nginx可写。找出错误权限的文件可以使用如下命令: find /nginx -user nginx find /usr/local/nginx/html -user nginx 确保你更所有权为root或其它用户,一个典型的权限设置 /usr/local/nginx/html/ ls -l /usr/local/nginx/html/ 示例输出: -rw-r–r– 1 root root 925 Jan 3 00:50 error4xx.html -rw-r–r– 1 root root 52 Jan 3 10:00 error5xx.html -rw-r–r– 1 root root 134 Jan 3 00:52 index.html 你必须删除由vi或其它文本编辑器创建的备份文件: find /nginx -name ‘.?’ -not -name .ht -or -name ‘~’ -or -name ‘.bak’ -or -name ‘.old*’ find /usr/local/nginx/html/ -name ‘.?’ -not -name .ht -or -name ‘~’ -or -name ‘.bak’ -or -name ‘.old*’ 通过find命令的-delete选项来删除这些文件。 二十、限制Nginx连接传出 黑客会使用工具如wget下载你服务器本地的文件。使用Iptables从nginx用户来阻止传出连接。ipt_owner模块试图匹配本地产生的数据包的创建者。下面的例子中只允许user用户在外面使用80连接。 /sbin/iptables -A OUTPUT -o eth0 -m owner –uid-owner vivek -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT 通过以上的配置,你的nginx服务器已经非常安全了并可以发布网页。可是,你还应该根据你网站程序查找更多的安全设置资料。例如,wordpress或者第三方程序。
KB小秘书 2019-12-02 02:06:56 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT 阿里云科技驱动中小企业数字化