第1章 现有云API的访问控制机制
目前两个常用的云API为REST(Representational State Transfer)和SOAP(Simple Object Access Protocol),REST基于JSON(JavaScript Object Notation)格式,SOAP基于XML格式。现在主流云平台均支持REST风格的API,Amazon EC2和S3已经将SOAP API标为deprecated,因此本文重点研究REST API的访问控制。
1.1 腾讯云API
官方API文档:
http://www.qcloud.com/wiki/v2/API
腾讯云API严格来说属于Query API,并不属于REST API。
1.1.1 创建实例例子
如下面创建实例的例子:
https://cvm.api.qcloud.com/v2/index.php?Action=RunInstances &imageId=img-12345678 &bandwidth=1 &cpu=1 &mem=2 &storageType=1 &storageSize=50 &period=12 &goodsNum=1 &COMMON_PARAMS |
---|
1.1.2 访问控制策略
腾讯云没有单独的访问控制组件,也没有文本格式的访问控制策略。通过”用户中心”的”权限设置”能够进行简单的权限管理。
如根QQ账户的角色是:创建者,权限是:全局(管理云资源、管理财务、管理协作者)。并且根账户可以创建子用户,设置以下4种默认的权限:管理全部用户、管理财务、管理所有云资源、接受消息。
1.2 阿里云API
阿里云(
http://develop.aliyun.com/api
)的主要服务有两个:弹性计算服务(Elastic Compute Service, ECS)对象存储服务(Object Storage Service, OSS),分别对应AWS的EC2和S3。ECS主要提供的是Query API。
1.2.1 创建实例例子
如下面创建实例的例子:
https://help.aliyun.com/document_detail/ecs/open-api/instance/createinstance.html
https://ecs.aliyuncs.com/?Action=CreateInstance&RegionId=cn-hangzhou&ImageId=_32_23c472_20120822172155_aliguest.vhd&SecurityGroupId=sg-c0003e8b9&HostName=Bctest01&InstanceType=ecs.t1.small& <公共请求参数> |
---|
OSS服务则支持REST API,如下面追加写文件的例子:(Append Object以追加写的方式上传文件。通过Append Object操作创建的Object类型为Appendable Object)
POST /ObjectName?append&position=Position HTTP/1.1Content-Length:ContentLengthContent-Type: ContentTypeHost: BucketName.oss.aliyuncs.comDate: GMT DateAuthorization: SignatureValue |
---|
1.2.2 访问控制策略
https://help.aliyun.com/document_detail/ram/intro/intro.html?spm=5176.product8315075_ram.4.2.1d58g5
阿里云通过RAM (Resource Access Management)服务进行资源访问服务。通过RAM,您可以集中管理您的用户(比如员工、系统或应用程序),以及控制用户可以访问您名下哪些资源的权限。
阿里云RAM与Amazon AWS的IAM非常类似,唯一区别就在于Amazon AWS在支持user-based policies之外,还支持resource-based policies,而阿里云只支持user-based policies。
- .账号ID:16位十进制数字,例如:1381146476737651
- .资源:acs::::
格式说明:
acs: 它是Aliyun Cloud Service的首字母缩写,表示阿里云的公有云平台
service-name: 阿里云提供的Open Service的名字,如ecs, oss, ots, odps等
region: 地区信息。如果不支持该项,可以使用通配符”*”号来代替
account-id: 账号ID,比如1234567890123456
relative-id: 与service相关的资源描述部分,其语义由具体service指定。这部分的格式描述支持类似于一个文件路径的树状结构。以odps为例,relative-id = “projects/sampleproject/tables/sampletable”表示:sampleproject项目空间下的sampletable表
- .操作::
格式说明:
service-name: 阿里云产品名称,如ecs, odps, oss, ots等。
action-name: service相关的api操作接口名称。
策略例子:AliyunECSFullAccess(管理云服务器服务(ECS)的权限)
{ “Version”: “1”, “Statement”: [ { “Action”: “ecs:*”, “Resource”: “*”, “Effect”: “Allow” }, { “Action”: [ “vpc:DescribeVpcs”, “vpc:DescribeVSwitches” ], “Resource”: “*”, “Effect”: “Allow” } ]} |
---|
1.2.2.1.RAM要解决的问题
如果您购买了云资源,您的组织里有多个用户需要使用这些云资源。如果这些用户共享使用您的云账号密钥,那么存在两个问题:(1) 您的密钥由多人共享,泄露的风险很高;(2) 您无法限制用户的访问权限,容易出现误操作导致安全风险。RAM将帮助客户管理用户对资源的访问权限控制。
1.2.2.2.RAM解决问题的方法
RAM允许您在云账号下创建并管理多个用户。RAM用户是代表任意的通过控制台或OpenAPI操作阿里云资源的人、系统或应用程序。在您的云账户下,每个用户都有唯一的用户名、登录密码或访问密钥,这样您就不需要与他人共享密钥了。通过RAM,您还可以控制您的用户对基础设施云服务的访问权限,支持角色分离和最小特权的安全最佳实践。
1.2.2.3.云账户与RAM用户的关系
从归属关系上看,云账户与RAM用户是一种主子关系。云账户是阿里云资源归属、资源使用计量计费的基本主体。RAM用户只能存在于某个云账户下的RAM实例中。RAM用户不拥有资源,在被授权操作时所创建的资源归属于主账户;RAM用户不拥有账单,被授权操作时所发生的费用也计入主账户账单。
从权限角度看,云账户与RAM用户是一种root与user的关系(类比Linux系统)。Root对资源拥有一切操作控制权限,而user只能拥有被root所授予的某些权限,而且root在任何时刻都可以撤销user身上的权限。
RAM用户是否能自己设置权限
1.2.2.4.RAM服务与其它云服务的关系
RAM是阿里云为客户提供的集中式用户身份与访问控制管理服务。与阿里云提供的其它服务类似,RAM被抽象成云账户下的一种资源,但在每个云账户下只允许存在一个RAM实例。下面是一个云账户下的资源关系图,它展现了RAM与其它云服务之间的关系。
1.2.2.5.RAM功能
集中控制RAM用户及其密钥——您可以管理每个用户及其访问密钥,为用户绑定/解绑多因素认证设备
集中控制RAM用户的访问权限——您可以控制每个用户可以访问您名下哪些资源的操作权限
集中控制RAM用户的资源访问方式——您可以确保用户必须使用安全信道(如SSL)、在指定时间、以及在指定的网络环境下请求访问特定的云服务
集中控制云资源——您可以对用户创建的实例或数据进行集中控制。当用户离开您的组织时,这些实例或数据不会丢失
统一账单——您的账户将收到包括所有用户的资源操作所发生的费用的单一账单
1.2.2.6.RAM控制台地址
RAM的控制台地址是
https://ram.console.aliyun.com
1.2.2.7.支持RAM的云产品
所有阿里云产品都会与RAM集成,查阅目前支持哪些服务与RAM集成,请参考支持RAM的云服务
1.2.2.8.RAM服务费用
RAM服务是阿里云账户的一个基础功能,使用RAM无需额外付费。
1.3 360安全云
正在账号审核中。
1.4 AWS API
https://gehrcke.de/2009/06/aws-about-api/
AWS所提供的各种服务的API并不统一,共采用了3种API形式:REST API,Query API,SOAP API。其中SOAP API基本已经deprecated,不予考虑。因此主要有两种:REST API和Query API。
图1 AWS各子服务支持的API列表
1.4.1 创建实例例子
http://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html
1.4.2 查询实例例子
http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html
1.4.3 访问控制策略
http://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html
Amazon AWS使用IAM(Identity and Access Management)对云资源进行访问控制。支持用户、组、角色等概念,在IAM里组仅仅是用户的集合,不能作为策略中的内容出现。角色则是拥有独立ID的概念。可以出现在策略中,并且可以跨账号授权。
- .根账号ID:12位10进制数字,如129697535497
- .用户ID:arn:aws:iam::account-ID-without-hyphens:user/Bob
- .操作:每个AWS都有一系列动作。比如你可能希望允许一个用户使用Amazon S3 ListBucket动作,这个动作用来返回bucket里的信息。没有显式允许的动作是禁止。如:s3:ListBucket
AWS操作列表:
http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_actionsconditions.html
- .资源:需要操作的资源。如arn:aws:s3:::example_bucket
- .效果:只有Allow和Deny两种取值。
策略例子:AmazonEC2FullAccess(提供对EC2的所有权限)
ARN(Amazon Resource Name)为arn:aws:iam::aws:policy/AmazonEC2FullAccess
{ “Version”: “2012-10-17”, “Statement”: [ { “Action”: “ec2:*”, “Effect”: “Allow”, “Resource”: “*” }, { “Effect”: “Allow”, “Action”: “elasticloadbalancing:*”, “Resource”: “*” }, { “Effect”: “Allow”, “Action”: “cloudwatch:*”, “Resource”: “*” }, { “Effect”: “Allow”, “Action”: “autoscaling:*”, “Resource”: “*” } ]} |
---|
同时,对于Amazon S3 bucket这样的基于资源的策略,IAM也支持在策略中设置主体(principle),例子策略如下:
{ “Version”: “2012-10-17”, “Id”: “S3-Account-Permissions”, “Statement”: [{ “Sid”: “1”, “Effect”: “Allow”, “Principal”: {“AWS”: [“arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:root”]}, “Action”: “s3:*”, “Resource”: [ “arn:aws:s3:::mybucket”, “arn:aws:s3:::mybucket/*” ] }]} |
---|
IAM还支持在策略中使用request context的属性,如使用username属性来匹配资源:
“Resource”: [ “arn:aws:s3:::mybucket/${aws:username}/*” ] |
---|
1.4.4 策略评估与集成
http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html
AWS的IAM采用以下机制:
- 1)默认所有请求都是禁止的(根账户对所有资源则允许操作);
- 2)显式的Allow策略则覆盖1)中的默认规则;
- 3)显式的Deny策略则覆盖所有Allow策略。
策略评估的结果与策略的顺序无关,所有符合的策略都会被评估,最终结果不是Allow就是Deny。
IAM采用的策略集成机制是Deny-overrides拒绝优先机制,一旦有策略显式拒绝某请求,则该请求一定会被拒绝。
以下是策略评估示意图:
图2 IAM策略评估示意图
1.5 Microsoft Azure API
http://blog.csdn.net/chszs/article/details/7851794
微软的Azure服务总线提供了一整套REST风格的API,其中包括服务运行时API(Service Runtime API)和服务管理API(Service Management API),分别用于运行时操作和管理操作。
但是大多数API还是采用GUI或者Azure PowerShell才能操作,不具备Rest接口,如虚拟机相关的操作。
1.5.1 Windows Azure安全概述
1.6 华为企业云API
http://support.hwclouds.com/usermanual/iam/hlp/IAM/p_hlp_create_usergroup.html
华为企业云是基于OpenStack开发的。采用统一身份认证服务(Identity and Access Management)来提供适合企业组织结构的用户管理机制,为企业成员分配不同的资源及操作权限,通过访问密钥以OpenAPI的方式访问公有云资源。
华为IAM没有文本格式的访问控制策略,只有通过图形界面,可以选择一些系统预置的权限。
http://developer.hwclouds.com/endpoint.html
虽然华为云是基于OpenStack实现的,但是其已经用主机名来区分服务了,而不是OpenStack默认的端口号,具体的主机名如下图所示。
服务名称 | 区域名称 | 区域 | Endpoint | 协议类型 |
---|---|---|---|---|
弹性云主机(ECS) | 中国华北区1 | cn-north-1 | ecs.cn-north-1.myhwclouds.com | cn |
镜像服务(IMS) | 中国华北区1 | cn-north-1 | ims.cn-north-1.myhwclouds.com | cn |
云硬盘(EVS) | 中国华北区1 | cn-north-1 | evs.cn-north-1.myhwclouds.com | cn |
云硬盘备份(VBS) | 中国华北区1 | cn-north-1 | vbs.cn-north-1.myhwclouds.com | cn |
对象存储服务(OBS) | 中国华北区1 | cn-north-1 | obs.cn-north-1.myhwclouds.com | cn |
虚拟私有云(VPC) | 中国华北区1 | cn-north-1 | vpc.cn-north-1.myhwclouds.com | cn |
弹性负责均衡(ELB) | 中国华北区1 | cn-north-1 | elb.cn-north-1.myhwclouds.com | cn |
云监控服务(CES) | 中国华北区1 | cn-north-1 | ces.cn-north-1.myhwclouds.com | cn |
弹性大数据(BigData) | 中国华北区1 | cn-north-1 | bigdata.cn-north-1.myhwclouds.com | cn |
1.6.1 查询实例例子
http://support.hwclouds.com/api-ecs/zh-cn_topic_0020212690.html
根据云主机ID,查询云主机的详细信息。
GET
ecs.cn-north-1.myhwclouds.com/v1/{project_id}/servers/{server_id}
1.7 OpenStack API
OpenStack API完全遵守REST风格规范。
1.7.1 查询实例例子
http://developer.openstack.org/api-ref-compute-v2.1.html
显示一个虚拟机的详细信息
GET
http://controller/v2.1/
{tenant_id}/servers/{server_id}
1.8 CloudStack API
CloudStack API是基于Web的API,但是并不完全遵守REST规范。比如REST规范要求使用CRUD操作,但CloudStack API只支持GET和POST动词。详细信息如下:
http://blog.csdn.net/sjun2014/article/details/27320513
所有的CloudStack API请求是以HTTP GET / POST有一个关联的命令和任何参数的形式提交的。无论在HTTP或HTTPS中请求都由一下组成:
CloudStack API URL:这是Web服务的API入口点(例如,http://域名:8080/client/api)。
命令(Command):Web服务命令要执行,如启动虚拟机或创建一个磁盘卷。
参数(Parameters):任何额外的要求或命令的可选参数。
1.8.1 创建实例例子
一个API GET请求示例如下:
或如下一个更可读的示例:
http://localhost:8080/client/api?2 . command=deployVirtualMachine3. &serviceOfferingId=14. &diskOfferingId=15. &templateId=26. &zoneId=47.&apiKey=miVr6X7u6bN_sdahOBpjNejPgEsT35eXqjB8CG20YI3yaxXcgpyuaIRmFI_EJTVwZ0nUkkJbPmY3y2bciKwFQ8. &signature=Lxx1DM40AjcXU%2FcaiK8RAP0O1hU%3D%3D |
---|
第1行是的CloudStackAPI URL。这是你希望进行交互的云实例。
第2行是指你要执行的命令。在我们的例子中,我们试图部署一个新的虚拟机。通过前面的一个(?)将要执行的命令从CloudStack API URL中分离出来。
第3-6行是此命令的参数。要查看命令和请求参数,请参阅在CloudStack API文档的相应部分。每个参数字段-值对(field =value)通过前面的字符(&)分隔开。
第7行是可以唯一标识帐户的APIkey。请参阅第9页上的签名API请求。
第8行是创建的签名哈希来验证用户帐户执行的API命令。
请参阅第9页上的签名API请求。
1.9 Hadoop API
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/WebHDFS.html
Hadoop提供了对FileSystem/FileContext接口的REST API。
1.9.1 写入文件例子
以下提供了一个创建并写入文件的例子:
Step 1: Submit a HTTP PUT request without automatically following redirects and without sending the file data. curl -i -X PUT “http://:/webhdfs/v1/?op=CREATE [&overwrite= | false>][&blocksize=][&replication=] [&permission=][&buffersize=]”The request is redirected to a datanode where the file data is to be written: HTTP/1.1 307 TEMPORARY_REDIRECTLocation: http://:/webhdfs/v1/?op=CREATE…Content-Length: 0Step 2: Submit another HTTP PUT request using the URL in the Location header with the file data to be written. curl -i -X PUT -T “http://:/webhdfs/v1/?op=CREATE…”The client receives a 201 Created response with zero content length and the WebHDFS URI of the file in the Location header: HTTP/1.1 201 CreatedLocation: webhdfs://:/Content-Length: 0 |
---|
1.10 总结
目前业界的云API事实标准是Amazon AWS,因此云平台访问控制的事实标准也是Amazon AWS的IAM。阿里云提供的RAM (Resource Access Management)服务几乎与AWS的IAM完全相同,唯一区别在于Amazon AWS在支持user-based policies之外,还支持resource-based policies,而阿里云只支持user-based policies。
腾讯云没有独立的访问控制组件(至少官方没有显式说明),华为则提出了IAM服务。但是两者都没有提供文本格式的访问控制策略,也做不到action级别的访问控制,只有预置的几个权限可以选择。
360安全云和Microsoft Azure申请还没有获得批准。
第2章 其他类型系统的Rest API整理
2.1 Up云API
http://docs.upyun.com/api/rest_api/
2.2 Dropbox写入文件
2.3 WordPress API