1. OSS之AccessKey
OSS提供了对象存储服务,在访问OSS资源时,根据访问者的信息可分为匿名访问和带签名访问。 在OSS中签名涉及的AccessKey主要有三种:
- 阿里云账号AccessKey:云账号AccessKey对拥有的资源有完全的权限,每个阿里云账号能够同时拥有不超过5个active或者inactive的AK对(AccessKeyId和AccessKeySecret);
- RAM子账号AccessKey:RAM (Resource Access Management) 是阿里云提供的资源访问控制服务;RAM账号AK指的是通过RAM被授权的AK,这组AK只能按照RAM定义的规则去访问Bucket里的资源;通过RAM,您可以集中管理您的用户(比如员工、系统或应用程序),以及控制用户可以访问您名下哪些资源的权限;
- STS账号AccessKey:STS(Security Token Service)是阿里云提供的临时访问凭证服务,STS账号AK指的是通过STS颁发的AK;
相应有三种验签方式:AK验证/RAM验证/STS验证;
2. OSS之权限控制
OSS提供了多种形式的权限控制:Bucket级别权限/Object级别权限/账号级别权限(RAM)/临时账号权限(STS),具体如下:
Bucket级别权限:三种访问权限:public-read-write/public-read/private
Object级别权限:四种访问权限:private/public-read/public-read-write/default,具体如下:
账号级别权限(RAM):阿里云账号通过RAM创建自己AccessKey的子用户时,可通过Policy的配置方式指定授权内容,Policy具体见下节;
- 临时账号权限(STS):通过阿里云STS (Security Token Service) 服务为阿里云账号(或RAM用户)提供的短期访问权限,通过STS生成的凭证包括安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret),可通过Policy的配置方式指定授权内容,Policy具体见下节;
3. OSS之Policy
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:GetBucketAcl",
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:1775305056529849:mybucket"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:UserAgent": "java-sdk",
"oss:Prefix": "foo"
},
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
},
{
"Action": [
"oss:PutObject",
"oss:GetObject",
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:1775305056529849:mybucket/file*"
],
"Effect": "Allow",
"Condition": {
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
}
]
}
这是一个授权的Policy,用户用这样的一个Policy通过RAM或STS服务向其他用户授权。Policy当中有一个Statement(一条Policy当中可以有多条Statement)。Statement里面规定了相应的Action、Resource、Effect和Condition。
这条Policy把用户自己名下的mybucket和mybucket/file*这些资源授权给相应的用户,并且支持GetBucketAcl、GetBucket、PutObject、GetObject和DeleteObject这几种操作。Condition中的条件表示UserAgent为“java-sdk”,源ip为“192.168.0.1”的时候鉴权才能通过,被授权的用户才能访问相关的资源。Prefix这个Condtion是在GetBucket(ListObjects)的时候起作用的,关于这个字段的解释详见OSS的API文档。
具体项含义请转官网:访问控制
4. OSS之访问实例
使用AppServer来做数据中转和数据隔离:
如上图所示,只有AppServer能访问云服务,ClientApp的每次读写数据都需要通过AppServer,AppServer来保证不同用户数据的隔离访问,对于该种使用方式,使用阿里云账号或者RAM账号提供的密钥来进行签名验证访问;避免出现安全问题,通常不使用阿里云账号;使用STS让用户直接访问OSS:
- App用户登录。App用户和云账号无关,它是App的终端用户,AppServer支持App用户登录。对于每个有效的App用户来说,需要AppServer能定义出每个App用户的最小访问权限;
- AppServer请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,AppServer需要确定App用户的最小访问权限(用Policy语法描述)以及授权的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌,角色管理与使用相关内容请参考RAM用户指南中的角色管理;
- STS返回给AppServer一个有效的访问凭证,包括一个安全令牌;(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)以及过期时间;
- AppServer将访问凭证返回给ClientApp。ClientApp可以缓存这个凭证。当凭证失效时,ClientApp需要向AppServer申请新的有效访问凭证。比如,访问凭证有效期为1小时,那么ClientApp可以每30分钟向AppServer请求更新访问凭证;
- ClientApp使用本地缓存的访问凭证去请求Aliyun Service API。云服务会感知STS访问凭证,并会依赖STS服务来验证访问凭证,正确响应用户请求;