文档

使用访问凭证访问阿里云OpenAPI最佳实践

更新时间:

本文为您介绍如何在不同的场景中,实现以非AccessKey硬编码的方式编程,使用访问凭证访问阿里云OpenAPI。

背景信息

AccessKey(简称AK)是阿里云提供给阿里云用户的访问密钥,用于访问阿里云OpenAPI时的身份验证。AccessKey包括AccessKey ID和AccessKey Secret,需妥善保管。

访问阿里云OpenAPI时,如果在代码中硬编码明文AK,容易因代码仓库权限管理不当造成AK泄露,会威胁该账号下所有资源的安全。以非AccessKey硬编码的方式调用阿里云OpenAPI,可有效保证您账号下云资源的安全。

方案总览

方案名称

适用场景

容器实例角色扮演

如果您的应用程序部署在阿里云ACK容器集群上,则可以基于RRSA(RAM Roles for Service Accounts)功能,在容器集群内实现应用隔离的RAM角色功能,各个应用可以扮演独立的RAM角色,访问阿里云OpenAPI。

ECS实例角色扮演

如果您的应用程序部署在阿里云ECS实例上,则可以通过ECS实例RAM(Resource Access Management)角色让ECS实例扮演具有某些权限的角色,访问阿里云OpenAPI。

配置系统环境变量

对于不适用以上方案的场景,建议您使用配置系统环境变量的方式,访问阿里云OpenAPI。

容器实例角色扮演

前提条件

  • 适用于支持RAM的云服务

  • RRSA功能目前仅支持1.22及以上版本的集群,即ACK集群基础版ACK集群Pro版ACK Serverless集群基础版ACK Serverless集群Pro版

  • 使用V2.0版本的阿里云SDK。

  • 自建网关类产品的自研SDK无法使用。

原理介绍

基于RRSA功能,您可以在集群内实现Pod级别隔离的应用关联RAM角色功能。各个应用可以扮演独立的RAM角色并使用获取的临时凭证访问云资源,从而实现应用RAM权限最小化以及无AccessKey访问阿里云OpenAPI避免AccessKey泄露的需求。

3

从用户侧视角来看,RRSA功能的工作流程如下。

  1. 用户提交使用了服务账户令牌卷投影功能的应用Pod。

  2. 集群将为该应用Pod创建和挂载相应的服务账户OIDC Token文件。

  3. Pod内程序使用挂载的OIDC Token文件访问STS服务的AssumeRoleWithOIDC接口,获取扮演指定RAM角色的临时凭证。

    说明

    请提前修改RAM角色配置,允许Pod使用的服务账户扮演该RAM角色。更多信息,请参见AssumeRoleWithOIDC

  4. Pod内程序使用获取到的临时凭证访问云资源OpenAPI。

配置方法

代码示例

目前,部分阿里云官方SDK已经内置了支持使用RRSA OIDC Token进行OpenAPI认证的功能。支持此功能的SDK版本信息和参考代码如下。

编程语言

支持认证的SDK版本

使用示例

Go

Alibaba Cloud Credentials for Go 1.2.6及以上版本。更多信息,请参考使用OIDCRoleArn

GO SDK使用示例

Java

Alibaba Cloud Credentials for Java 0.2.10及以上版本。更多信息,请参考使用OIDCRoleArn

Java SDK使用示例

Python 3

Alibaba Cloud Credentials for Python 0.3.1及以上版本。更多信息,请参考使用OIDCRoleArn

Python 3 SDK使用示例

Node.js和TypeScript

Alibaba Cloud Credentials for TypeScript/Node.js 2.2.6及以上版本。更多信息,请参考使用OIDCRoleArn

Node.js和TypeScript使用示例

ECS实例角色扮演

前提条件

  • 适用于支持阿里云RAM的云服务

  • 使用V2.0版本的阿里云SDK。

  • 自建网关类产品的自研SDK无法使用。

原理介绍

实例RAM角色允许您将一个角色关联到ECS实例,在ECS实例内部基于STS(Security Token Service)临时凭证访问其他云产品的API,临时凭证将周期性更新。既可以保证云账号AccessKey的安全性,也可以借助访问控制RAM实现精细化控制和权限管理。

1

工作流程如下:

  1. 应用程序访问ECS实例元数据获取STS临时凭证。详细信息,请参见ECS实例元数据概述

  2. 使用STS临时凭证访问云资源。详细信息,请参见什么是STS

配置方法

为ECS实例授予RAM角色。详细信息,请参见配置ECS实例RAM角色

示例代码

Alibaba Cloud Credentials是阿里云为阿里云开发者用户提供身份凭证管理工具,使用Credentials工具可以为您提供更加便捷的方式使用ECS实例角色扮演功能,以调用云服务器ECS的DescribeRegions接口为例,参考代码如下。

编程语言

使用示例

Go

Go语言代码示例

Java

Java语言代码示例

Python

Python语言代码示例

PHP

PHP语言代码示例

Node.js

Node.js语言代码示例

.NET

.NET语言代码示例

配置系统环境变量

配置方法

配置环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET

  • Linux和macOS系统配置方法

    执行以下命令:

    export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id>
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>

    <access_key_id>需替换为已准备好的AccessKey ID,<access_key_secret>替换为AccessKey Secret。

  • Windows系统配置方法

    1. 新建环境变量文件,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。

    2. 重启Windows系统。

阿里云SDK代码示例

阿里云SDK支持通过定义ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET环境变量来创建默认的访问凭证。调用接口时,程序直接访问凭证,读取您的访问密钥(即AccessKey)并自动完成鉴权。以调用云服务器ECS的DescribeRegions接口为例,参考代码如下。

编程语言

使用示例

Go

Go语言代码示例

Java

Java语言代码示例

Python

Python语言代码示例

PHP

PHP语言代码示例

Node.js

Node.js语言代码示例

.NET

.NET语言代码示例

通用代码示例

对于自建网关类产品的自研SDK等无法使用阿里云SDK的场景,以Java语言为例,可以采用下面的方式加载环境变量。

import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;

public class DemoTest {
    public static void main(String[] args) throws Exception{
        Config config = new Config();
        // Which type of credential you want
        config.setType("access_key");
        // AccessKeyId of your ram user
        config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // AccessKeySecret of your ram user
        config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        Client client = new Client(config);
    }
}

相关文档

更多云上安全实践,请参阅以下文档:

  • 本页导读 (1)