开发者社区> 问答> 正文

如何将业务服务器接入



前提条件

  • 必选:已开通智能云相册服务并创建PhotoStore。
  • 可选:了解阿里云资源访问控制(下文简称RAM)服务的相关概念。本文也会在必要的地方介绍其相关概念。访问控制的相关内容,请参考:https://help.aliyun.com/document_detail/28645.html


开始接入


业务服务器需要对接阿里云访问控制服务(RAM),为客户端生成访问智能云相册服务访问凭证。具体包含两个步骤:权限配置和编写代码。

1. 权限配置


在开始操作前我们先介绍一些基本概念,如果您已经了解了这些概念,可以直接进入操作步骤。

什么是子用户/子账号


主账号是指注册阿里云时创建的账号,该账号具有操作您所有资源的所有权限(类似于Linux中的root账号,Windows中管理员账号)。
子账号是您用主账号登录后创建出的账号,该账号没有任何权限,您可授权子账号只拥有它需要的权限。因此,最佳实践是建立一个子用户专门用于业务服务器接入。

什么是角色


做个类比,老板在休假前对一个下属讲,“我休假几天,在这期间你临时负责下项目管理(PM)工作,直到我休假回来”。在这个例子中,老板有个PM角色,该角色有查看和修改项目进度等权限。老板授权其下属扮演了PM的角色,因此下属在老板休假期间就具备了PM的相关权限,直到老板休假回来(扮演角色是有有效期的)。注意,老板除了有项目管理的权限外,还有其他权限。老板只授权了下属扮演他的PM的角色,下属并没有老板的其他权限(比如升职、加薪)。
获取智能云相册服务的访问凭证的过程其实是业务服务器扮演了一个特定的角色后并临时获得了该角色的权限。扮演角色后获得的权限的表现形式为Security Token。Security Token将被返回给客户端,这样客户端就凭借Security Token具备了临时访问云相册服务的权限。

注:扮演角色在RAM中对应的操作是AssumeRole。

需要注意的是:业务服务器需要用其自身的鉴权机制要验证客户端的合法性,Security Token只能返回给验证通过的客户端。再次回顾和类比租赁办公室的例子:公司行政部需要验证前来领取门卡的人是否为本公司员工。只有确认TA是该公司的员工后,行政部才能将写字楼的门卡给TA。
因此,权限配置需要做的是在RAM的控制台中:
  • 定义一个角色和定义这个角色拥有访问智能云相册服务的权限
  • 新建一个子用户,授予该子用户具有扮演上述角色的权限


定义角色和定义角色的权限

  1. 登录RAM控制台
  2. 单击左边的[backcolor=transparent]角色管理,然后单击[backcolor=transparent]新建角色

  3. 在下图中选择用户角色,然后单击[backcolor=transparent]下一步

  4. 在下图中选择当前云账号,然后单击[backcolor=transparent]下一步
  5. 在下图中给这个角色起个名字,比如CloudPhotoAccessRole,然后单击[backcolor=transparent]创建

  6. 这样这个角色就创建出来了,但是它还没有任何权限,单击[backcolor=transparent]授权

  7. 在授权对话框中找到[backcolor=transparent]AliyunCloudPhotoFullAccess这个授权策略,并将其添加进去,然后单击[backcolor=transparent]确定。这样就定义好了一个角色,并且该角色有访问智能云相册的所有权限。

    注意:
    • 这里将AliyunCloudPhotoFullAccess策略授予给新建的角色,只是表示扮演该角色可以获得的最大权限。STS凭证中拥有的权限还需要在生成时指定,详见下面的示例代码。
    • 这里为了方便我们将AliyunCloudPhotoFullAccess授予给新建的角色。在您熟悉了授权策略的定义后,您也可以根据您的业务情况自行定义授权策略,并通过类似的方式授予给新建的角色。

  • 最后,我们需要记录下该角色的ARN(可以理解为角色的ID,后面会用到)。单击[backcolor=transparent]角色管理,找到刚刚创建的角色并单击[backcolor=transparent]管理。ARN如下图所示:


  • 新建子用户和授权

    1. 单击左边的[backcolor=transparent]用户管理,然后单击[backcolor=transparent]新建用户按钮

    2. 在弹出的对话框中输入相关信息,选中[backcolor=transparent]为该用户生成AccessKey,这里生成的AccessKey需要记录下来并安全保存,不可泄露。如下图所示:

    3. 定义一个授权策略,使其具有扮演刚刚新建的角色的权限。单击左侧导航栏的[backcolor=transparent]策略管理

    4. 新建授权策略,选择基于空白模板创建,如下图所示:

      其中,授权策略名称为该策略的名称(比如:AssumeCloudPhotoAccessRolePolicy),Resource需要替换为您新建的角色的ARN(每个账号建立的角色的ARN名称是不一样的)。您可参考下面的模板进行修改:{
    5. "Statement": [
    6. {
    7. "Action": "sts:AssumeRole",
    8. "Effect": "Allow",
    9. "Resource": "acs:ram::xxxxxxxxxxxxx:role/cloudphotoaccessrole"
    10. }
    11. ],
    12. "Version": "1"
    13. }




    授权新建的子用户拥有AssumeCloudPhotoAccessRolePolicy的权限。
    1. 在用户管理中,找到您新建的用户,然后单击[backcolor=transparent]授权

    2. 选择所需的权限并单击[backcolor=transparent]确定,如下图所示:

    所有权限配置就完成了。

    2. 编写代码


    本节我们将以Java为例来编写代码获取访问智能云相册Security Token。

    引入相关的SDK


    在maven的pom.xml中引入RAM SDK,如下: <dependencies>
    <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-sts</artifactId>
    <version>2.1.6</version>
    </dependency>
    <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>3.2.6</version>
    </dependency>
    </dependencies>




    示例代码import java.text.MessageFormat;
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.http.MethodType;
    import com.aliyuncs.http.ProtocolType;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.profile.IClientProfile;
    import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
    import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
    import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse.Credentials;
    public class TokenProxy {
    private static final String REGION_ID = "cn-shanghai";
    private static final long DEFAULT_TOKEN_TIMEOUT = 3600; // max timeout is 1 hour
    // 这里指定了Security Token所具有的权限,限制为只能访问指定PhotoStore指定照片库的数据
    // 同时禁止其访问SetQuota接口
    static final String POLICY_PATTERN = "'{'\n"
    + " \"Version\": \"1\",\n"
    + " \"Statement\": [\n"
    + " '{'\n"
    + " \"Effect\": \"Allow\",\n"
    + " \"Action\": \"*\",\n"
    + " \"Resource\": \"acs:cloudphoto:*:*:photostores/{0}/libraries/{1}\"\n"
    + " '}',\n"
    + " '{'\n"
    + " \"Effect\": \"Deny\",\n"
    + " \"Action\": \"cloudphoto:SetQuota\",\n"
    + " \"Resource\": \"acs:cloudphoto:*:*:photostores/{0}/libraries/{1}\"\n"
    + " '}'\n"
    + " ]\n"
    + "'}'";
    private String roleArn;
    private DefaultAcsClient acsClient;
    public TokenProxy(String roleArn, String accessKeyId, String accessKeySecret) {
    IClientProfile profile = DefaultProfile.getProfile(REGION_ID, accessKeyId, accessKeySecret);
    this.acsClient = new DefaultAcsClient(profile);
    this.roleArn = roleArn;
    }
    public Credentials createCredentialForClient(String storeName, String libraryId) throws ClientException {
    AssumeRoleRequest request = new AssumeRoleRequest();
    request.setMethod(MethodType.POST);
    request.setProtocol(ProtocolType.HTTPS);
    request.setRoleArn(roleArn);
    // 智能云相册利用Security Token中的RoleSessionName来传递需要访问的照片库的ID,
    // 因此,将RoleSessionName设置为LibraryId
    request.setRoleSessionName(libraryId);
    request.setDurationSeconds(DEFAULT_TOKEN_TIMEOUT);
    String policy = MessageFormat.format(POLICY_PATTERN, storeName, libraryId);
    System.out.println(policy);
    request.setPolicy(policy);
    AssumeRoleResponse response = acsClient.getAcsResponse(request);
    return response.getCredentials();
    }
    public static void main(String[] args) throws ClientException {
    // 设置相关参数
    // 1. accessKeyId 和 accessKeySecret是上面创建子用户时为其生成的。
    String accessKeyId = "";
    String accessKeySecret = "";
    // 2. ARN是上面创建角色时记录下的ARN
    String roleArn = "";
    // 3. 需要访问的photostore的名称
    String storeName = "your_store_name";
    // 4. 需要访问的照片库的Id
    String libraryId = "";
    TokenProxy proxy = new TokenProxy(roleArn, accessKeyId, accessKeySecret);
    Credentials credentials = proxy.createCredentialForClient(storeName, libraryId);
    // 以下三个参数即是为客户端生成临时访问智能云相册的STS凭证。
    System.out.println("tmp accessKeyId = " + credentials.getAccessKeyId());
    System.out.println("tmp accessKeySecret = " + credentials.getAccessKeySecret());
    System.out.println("sts token = " + credentials.getSecurityToken());
    }
    }




    说明:
    • 创建角色时定义角色拥有访问智能云相册的权限。在构建AssumeRoleRequest时,设置Policy的目的是设置返回的Security Token的权限,使其只能访问指定照片库的权限。Security Token所拥有的权限是角色的权限和AssumeRoleRequest中指定的Policy权限的交集。因此,设置此处的Policy非常重要。如果设置得不当,可能会导致数据泄露。请参考子用户授权映射表中来自定义您需要的授权策略,或者参考其中的常见授权策略模板。
    • 示例代码最后输出的Credentials对象中的AccessKeyId,AccessKeySecret和SecurityToken即为临时访问智能云相册的访问凭证,需要返回给客户端,客户端将通过它们具有访问智能云相册的权限(有效期最长为1个小时,可以通过AssumeRoleRequest.setDurationSeconds来调整)。
    • 智能云相册根据Security Token中的RoleSessionName来确定需要访问的照片库的Id。因此,在构建AssumeRoleRequest时,请一定确保传入的RoleSessionName是期望访问的照片库的Id,否则可能导致数据错乱等问题。

    最后,如果您需要使用其他语言的SDK来获取访问凭证,请参考访问控制的相关文档: https://help.aliyun.com/document_detail/28645.html

    展开
    收起
    云栖大讲堂 2017-10-26 16:23:24 2155 0
    0 条回答
    写回答
    取消 提交回答
    问答排行榜
    最热
    最新

    相关电子书

    更多
    新浪微博混合云创新:15分钟自动扩容1000台服务器 立即下载
    固守服务器的第一道防线——美联集团堡垒机的前世今生 立即下载
    大规模无服务器计算服务的挑战和实践 立即下载