身份验证配置
本文介绍如何通过阿里云提供的Credentials工具,配置访问接口时的身份验证。
背景信息
AccessKey(简称AK)是阿里云提供给阿里云用户的访问密钥,用于访问阿里云OpenAPI时的身份验证。AccessKey包括AccessKey ID和AccessKey Secret,需妥善保管。AK如果泄露,会威胁该账号下所有资源的安全。访问阿里云OpenAPI时,如果在代码中硬编码明文AK,容易因代码仓库权限管理不当造成AK泄露。
Alibaba Cloud Credentials是阿里云为阿里云开发者用户提供的身份凭证管理工具。配置了Credentials默认凭据链后,访问阿里云OpenAPI时,您无需在代码中硬编码明文AK,可有效保证您账号下云资源的安全。
前提条件
已获取RAM用户账号的AccessKey ID和AccessKey Secret。相关操作,请参见查看RAM用户的AccessKey信息。
重要阿里云账号(即主账号)的AccessKey泄露会威胁该账号下所有资源的安全。为保证账号安全,强烈建议您为RAM用户创建AccessKey,非必要情况下请勿为阿里云主账号创建AccessKey。
RAM用户的AccessKey Secret只能在创建AccessKey时显示,创建完成后不支持查看。请在创建好AccessKey后,及时并妥善保存AccessKey Secret。
已安装阿里云SDK Credentials工具。
安装命令:
pip install alibabacloud_credentials
Python版本为3.0及以上。
配置方案
您可以选用以下任意一种方案。
使用配置文件的方案时,请确保您系统中不存在环境变量ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_CLOUD_ACCESS_KEY_SECRET
。否则,配置文件将不生效。
配置环境变量
阿里云SDK支持通过定义ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_CLOUD_ACCESS_KEY_SECRET
环境变量来创建默认的访问凭证。调用接口时,程序直接访问凭证,读取您的访问密钥(即AccessKey)并自动完成鉴权。
配置方法
配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_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系统配置方法
新建环境变量文件,添加环境变量
ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_CLOUD_ACCESS_KEY_SECRET
,并写入已准备好的AccessKey ID和AccessKey Secret。重启Windows系统。
接口调用方法
通过默认凭据提供链自动创建访问凭证,并在不提供AccessKey的情况下成功调用云产品OpenAPI接口。
调用单个云产品的接口需要云产品依赖。本示例以调用云服务器ECS的DescribeRegions接口为例,因此需先安装ECS Python SDK。
from alibabacloud_credentials.client import Client as CredClient # Credentials和云产品SDK都需引入Client,此处为创建别名。
from alibabacloud_ecs20140526.client import Client as EcsClient # 引入阿里云ECS SDK,此处以ECS产品为例。
from alibabacloud_ecs20140526.models import DescribeRegionsRequest # 使用ECS DescribeRegions接口发起调用请求。
from alibabacloud_tea_openapi.models import Config # 引入阿里云SDK核心包。
from alibabacloud_tea_util.models import RuntimeOptions
cred=CredClient() # 使用默认凭证初始化Credentials Client。
config=Config(credential=cred)
config.endpoint='ecs.aliyuncs.com' # 配置云产品服务接入地址(endpoint)。
client=EcsClient(config) # 使用Credentials Client初始化ECS Client。
request=DescribeRegionsRequest() # 初始化DescribeRegions请求。
runtime_options=RuntimeOptions() # 初始化运行时配置。
response=client.describe_regions_with_options(request, runtime_options) # 调用DescribeRegions接口并获得响应。
print(response.to_map())
配置文件
通过配置credentials
文件创建默认的访问凭证,调用接口时,程序直接访问凭证,读取您的访问密钥(即AccessKey)并自动完成鉴权。
配置方法
创建
credentials
文件。Linux/macOS系统:
执行以下命令(默认安装路径为
.alibabacloud/credentials.ini
):sudo vi ~/.alibabacloud/credentials.ini
Windows系统:
新建文件,并将文件存放在
C:\Users\<user_name>\.alibabacloud\credentials.ini
。说明如果您想将
credentials
文件安装到其他指定目录,您需要先配置环境变量ALIBABA_CLOUD_CREDENTIALS_FILE
。以Linux和macOS系统为例,执行命令export ALIBABA_CLOUD_CREDENTIALS_FILE=~/<example_path>/credentials.ini
。配置
credentials
文件。Credentials工具支持以下几类鉴权方式:
通过自动生成长期有效的STS凭证进行鉴权
通过您已获取的AccessKey,SDK将自动调用AsumeRole获取STS Token并定期刷新凭证。适用于希望通过阿里云SDK自动更新STS凭证,避免临时凭证失效后还需手动更新STS凭证。
阿里云STS(Security Token Service)是阿里云提供的一种临时访问权限管理服务,仅支持通过RAM用户使用,不支持通过阿里云主账号使用。
;凭证配置名称。 [default] ;鉴权方式为ram_role_arn。 type=ram_role_arn ;选填,为STS凭证指定权限策略,进一步限制STS Token的权限,请参见https://help.aliyun.com/document_detail/371864.html。 policy=<test_policy> ;已准备好的AccessKeyID。 access_key_id=<access_key_id> ;已准备好的AccessKeySecret。 access_key_secret=<access_key_secret> ;您阿里云RAM用户的角色Arn,请参见https://help.aliyun.com/document_detail/39744.html。 role_arn=<ram_role_arn> ;自定义的角色会话名称,用于日志审计时识别对应的操作者。通常设置为调用阿里云访问控制AssumeRole接口时使用的用户身份。 role_session_name=<session_name>
通过ECS实例RAM角色鉴权
适用于希望免创建AccessKey、通过为阿里云ECS实例授予RAM角色,来调用云产品接口。
使用该鉴权方式前,您需要先为ECS实例授予RAM角色。详细信息,请参见授予实例RAM角色。
使用以下配置文件,将默认启用ECS实例RAM角色鉴权方式。
; 默认配置。 [default] ; 鉴权方式为ecs_ram_role。 type = ecs_ram_role ; ECS实例的RAM角色名称。 role_name = <ecs_ram_role_name>
通过RSA密钥对配置访问凭证
适用于支持RSA密钥对鉴权的接口。
; 默认配置。 [default] ; 鉴权方式为rsa_key_pair。 type=rsa_key_pair ; Public Key ID public_key_id=<public_key_id> ; Private Key 文件 private_key_file=<private_key_file>
通过
credentials
文件保存访问凭证仅需配置一次AccessKey信息,适用于希望快速接入Credentials工具的用户。
; 默认配置。 [default] ; 鉴权方式为access_key。 type=access_key ; 已准备好的AccessKeyID。 access_key_id=<access_key_id> ; 已准备好的AccessKeySecret。 access_key_secret=<access_key_secret>
需要不定期切换凭证类型
如果您配置了多个凭证类型,需要不定期启用其中某个凭证,您需要先变更
ALIBABA_CLOUD_PROFILE
环境变量,将环境变量的值设置为待启用凭证的配置名称。export ALIBABA_CLOUD_PROFILE = client1
运行以下示例代码,启用指定的凭证:
[default] type=access_key access_key_id=<access_key_id> access_key_secret=<access_key_secret> [client1] type=ecs_ram_role role_name=<ecs_ram_role_name> [client2] type=ram_role_arn policy=<policy_name> access_key_id=<access_key_id> access_key_secret=<access_key_secret> role_arn=<ram_role_arn> role_session_name=<role_session_name> [client3] type=rsa_key_pair public_key_id=<public_key_id> private_key_file=<file_name>
接口调用方法
通过已配置的Credentials文件自动创建访问凭证,并在不提供AccessKey的情况下成功调用云产品OpenAPI接口。
调用单个云产品的接口需要云产品依赖。本示例以调用云服务器ECS的DescribeRegions接口为例,因此需先安装ECS Python SDK。
from alibabacloud_credentials.client import Client as CredClient # Credentials和云产品SDK都需引入Client,此处为创建别名。
from alibabacloud_ecs20140526.client import Client as EcsClient # 引入阿里云ECS SDK,此处以ECS产品为例。
from alibabacloud_ecs20140526.models import DescribeRegionsRequest # 使用ECS DescribeRegions接口发起调用请求。
from alibabacloud_tea_openapi.models import Config # 引入阿里云SDK核心包。
from alibabacloud_tea_util.models import RuntimeOptions
cred=CredClient() # 使用默认凭证初始化Credentials Client。
config=Config(credential=cred)
config.endpoint='ecs.aliyuncs.com' # 配置云产品服务接入地址(endpoint)。
client=EcsClient(config) # 使用Credentials Client初始化ECS Client。
request=DescribeRegionsRequest() # 初始化DescribeRegions请求。
runtime_options=RuntimeOptions() # 初始化运行时配置。
response=client.describe_regions_with_options(request, runtime_options) # 调用DescribeRegions接口并获得响应。
print(response.to_map())
配置访问令牌(Token)
本章节介绍SDK支持的三种令牌鉴权能力:
STS Token:通过调用AsumeRole接口扮演角色获取令牌凭证并调用openapi,临时凭证有过期时间,需要用户更新凭证。
RamRoleArn:通过您已获取的AccessKey,SDK将自动调用AsumeRole获取STS Token并定期刷新凭证。
Bearer Token:使用OAuth协议进行用户认证和应用授权,当前仅有极少数产品支持,例如云呼叫中心,您可以前往OpenAPI门户查看。
STS Token
有权限的RAM用户可以使用自己的访问密钥调用AssumeRole接口,以获取某个RAM角色的STS Token,实现通过Credentials工具读取临时安全令牌(STS Token),访问云产品接口。
STS Token具有时效性,到期后会自动失效。相比于AK硬编码方式访问接口,使用STS Token可有效减少因长期访问AK导致AK泄露的风险。
本配置方案仅适用于支持阿里云STS的云服务。
配置方法
调用AssumeRole接口,获取STS Token和临时访问密钥。
如果调用接口报错,根据界面提示跳转至诊断页面,查看具体的解决方案。
{ "RequestId": "EA7A3526-F7DB-54A5-8300-9B742CFAA5EA", "AssumedRoleUser": { "Arn": "acs:ram::125499367423****:role/STStokenTestRole/STSsessionName", "AssumedRoleId": "35219123109646****:STSsessionName" }, "Credentials": { "SecurityToken": "exampleToken", "AccessKeyId": "STS.exampleAccessKeyID", "AccessKeySecret": "exampleAccessKeySecret", "Expiration": "2023-03-26T05:26:06Z" } }
配置访问凭证。
运行以下代码示例,传入步骤1中返回的
SecurityToken
、AccessKeyId
、AccessKeySecret
值。from alibabacloud_credentials.client import Client from alibabacloud_credentials.models import Config config = Config( type='sts', # 凭证类型。 access_key_id='<access_key_id>', # 设置为调用AssumeRole接口时返回的AccessKeyId值。 access_key_secret='<access_key_secret>', # 设置为调用AssumeRole接口时返回的AccessKeySecret值。 security_token='<security_token>' # 设置为调用AssumeRole接口时返回的SecurityToken值。 ) cred = Client(config) access_key_id = cred.get_access_key_id() access_key_secret = cred.get_access_key_secret() security_token = cred.get_security_token() cred_type = cred.get_type()
由于STS Token仅为临时凭证,后续再次通过STS Token方式访问云产品SDK代码时,请调用AssumeRole接口获取新的临时身份凭证。
接口调用方法
通过Credentials工具读取临时安全令牌(STS Token)完成云产品OpenAPI接口的调用。
调用单个云产品的接口需要云产品依赖。本示例以调用云服务器ECS的DescribeRegions接口为例,因此需先安装ECS Python SDK。
# Credentials和云产品SDK都需引入Client,此处为创建别名。
from alibabacloud_credentials.client import Client as CredClient
# 引入阿里云ECS SDK,此处以ECS产品为例。
from alibabacloud_ecs20140526.client import Client as EcsClient
# 使用ECS DescribeRegions接口发起调用请求。
from alibabacloud_ecs20140526.models import DescribeRegionsRequest
# Credentials和云产品SDK都需引入Config
from alibabacloud_tea_openapi.models import Config
from alibabacloud_credentials.models import Config as CreConfig
from alibabacloud_tea_util.models import RuntimeOptions
# 使用默认凭证初始化Credentials Client。
config = CreConfig(
type='sts', # 凭证类型。
access_key_id='<access_key_id>', # 设置为调用AssumeRole接口时返回的AccessKeyId值。
access_key_secret='<access_key_secret>', # 设置为调用AssumeRole接口时返回的AccessKeySecret值。
security_token='<security_token>' # 设置为调用AssumeRole接口时返回的STS Token值。
)
cred = CredClient(config)
config=Config(credential=cred)
# 配置云产品服务接入地址(endpoint)。
config.endpoint='ecs.aliyuncs.com'
# 使用Credentials Client初始化ECS Client。
client=EcsClient(config)
# 初始化DescribeRegions请求。
request=DescribeRegionsRequest()
# 初始化运行时配置。
runtime_options=RuntimeOptions()
# 调用DescribeRegions接口并获得响应。
response=client.describe_regions_with_options(request, runtime_options)
print(response.to_map())
RamRoleArn
通过指定具体的RAM角色,实现Credentials凭证自动更新STS Token,避免使用AK硬编码的方式访问云产品接口。
本配置方案仅适用于支持阿里云STS的云服务。
配置方法
为该RAM用户授予AliyunRAMFullAccess权限、AliyunSTSAssumeRoleAccess权限。详细操作,请参见为为RAM用户授权。
配置访问凭证。
运行以下代码示例,
AccessKeyId
、AccessKeySecret
、SecurityToken
、Arn
等值。from alibabacloud_credentials.client import Client from alibabacloud_credentials.models import Config config = Config( type='ram_role_arn', # 凭证类型。 access_key_id='<access_Key_id>', # 设置为AccessKey Id值。 access_key_secret='<access_key_secret>', # 设置为AccessKey Secret值。 role_arn='<ram_role_arn>', # 阿里云RAM用户的角色ARN,格式为:acs:ram::userID:role/roleName。 role_session_name='<session_name>', # 自定义的角色会话名称。 policy='<policy>', # 可选, 限制STS Token的权限。 ) cred = Client(config) access_key_id = cred.get_access_key_id() access_key_secret = cred.get_access_key_secret() security_token = cred.get_security_token() cred_type = cred.get_type()
接口调用方法
通过Credentials工具读取并自动更新临时安全令牌(STS Token),完成云产品OpenAPI接口的调用。
调用单个云产品的接口需要云产品依赖。本示例以调用云服务器ECS的DescribeRegions接口为例,因此需先安装ECS Python SDK。
# Credentials和云产品SDK都需引入Client,此处为创建别名。
from alibabacloud_credentials.client import Client as CredClient
# 引入阿里云ECS SDK,此处以ECS产品为例。
from alibabacloud_ecs20140526.client import Client as EcsClient
# 使用ECS DescribeRegions接口发起调用请求。
from alibabacloud_ecs20140526.models import DescribeRegionsRequest
# 引入阿里云SDK核心包。
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions
# 使用默认凭证初始化Credentials Client。
config = Config(
type='ram_role_arn', # 凭证类型。
access_key_id='<access_key_id>', # 设置为AccessKey Id值。
access_key_secret='<access_key_ecret>', # 设置为AccessKey Secret值。
role_arn='<role_arn>', # 阿里云RAM用户的角色ARN,格式为acs:ram::userID:role/roleName。
role_session_name='<role_session_same>', # 角色会话名称。
policy='<policy>', # 可选, 限制STS Token的权限。
)
cred = Client(config)
config=Config(credential=cred)
# 配置云产品服务接入地址(endpoint)。
config.endpoint='ecs.aliyuncs.com'
# 使用Credentials Client初始化ECS Client。
client=EcsClient(config)
# 初始化DescribeRegions请求。
request=DescribeRegionsRequest()
# 初始化运行时配置。
runtime_options=RuntimeOptions()
# 调用DescribeRegions接口并获得响应。
response=client.describe_regions_with_options(request, runtime_options)
print(response.to_map())
Bearer Token
通过指定的Bearer Token,实现免创建AK和Token的方式访问云产品接口。
配置方案
运行以下示例代码,配置访问凭证。
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
config = Config(
type='bearer', # 凭证类型。
bearer_token='<bearer_token>', # 服务器端自动生成的Bearer Token,带有效期。
)
cred = Client(config)
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
security_token = cred.get_security_token()
cred_type = cred.get_type()
接口调用方法
通过指定的Bearer Token,实现免创建AK和Token的方式访问云产品接口。
调用单个云产品的接口需要云产品依赖。本示例以调用云服务器ECS的DescribeRegions接口为例,因此需先安装ECS Python SDK。
# Credentials和云产品SDK都需引入Client,此处为创建别名。
from alibabacloud_credentials.client import Client as CredClient
# 引入阿里云ECS SDK,此处以ECS产品为例。
from alibabacloud_ecs20140526.client import Client as EcsClient
# 使用ECS DescribeRegions接口发起调用请求。
from alibabacloud_ecs20140526.models import DescribeRegionsRequest
# 引入阿里云SDK核心包。
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions
# 使用默认凭证初始化Credentials Client。
config = Config(
type='bearer', # 凭证类型。
bearer_token='<bearer_token>', # 服务器端自动生成的Bearer Token,带有效期。
)
cred = Client(config)
config=Config(credential=cred)
# 配置云产品服务接入地址(endpoint)。
config.endpoint='ecs.aliyuncs.com'
# 使用Credentials Client初始化ECS Client。
client=EcsClient(config)
# 初始化DescribeRegions请求。
request=DescribeRegionsRequest()
# 初始化运行时配置。
runtime_options=RuntimeOptions()
# 调用DescribeRegions接口并获得响应。
response=client.describe_regions_with_options(request, runtime_options)
print(response.to_map())
免创建AK和Token
通过EcsRamRole配置访问凭证
指定具体的ECS角色名称,通过免手动创建AK和Token的方式配置访问凭证。
本方案仅适用于支持阿里云RAM的云服务。
前提条件
使用该鉴权方式前,您需要先为ECS实例授予RAM角色。详细信息,请参见授予实例RAM角色。
配置方法
运行以下示例代码,配置访问凭证。
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
config = Config(
type='ecs_ram_role', # 凭证类型。
role_name='<ecs_ram_role_name>' # 非必填,不填则自动获取,建议设置,可以减少请求。
)
cred = Client(config)
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
security_token = cred.get_security_token()
cred_type = cred.get_type()
接口调用方法
通过指定ECS角色名称,实现免手动创建AK和Token的方式访问云产品接口。
调用单个云产品的接口需要云产品依赖。本示例以调用云服务器ECS的DescribeRegions接口为例,因此需先安装ECS Python SDK。
# Credentials和云产品SDK都需引入Client,此处为创建别名。
from alibabacloud_credentials.client import Client as CredClient
# 引入阿里云ECS SDK,此处以ECS产品为例。
from alibabacloud_ecs20140526.client import Client as EcsClient
# 使用ECS DescribeRegions接口发起调用请求。
from alibabacloud_ecs20140526.models import DescribeRegionsRequest
# 引入阿里云SDK核心包。
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions
# 使用默认凭证初始化Credentials Client。
config = Config(
type='ecs_ram_role', # 凭证类型。
role_name='<ecs_ram_role_name>' # ECS RAM Role名称,建议设置该项。
)
cred = Client(config)
config=Config(credential=cred)
# 配置云产品服务接入地址(endpoint)。
config.endpoint='ecs.aliyuncs.com'
# 使用Credentials Client初始化ECS Client。
client=EcsClient(config)
# 初始化DescribeRegions请求。
request=DescribeRegionsRequest()
# 初始化运行时配置。
runtime_options=RuntimeOptions()
# 调用DescribeRegions接口并获得响应。
response=client.describe_regions_with_options(request, runtime_options)
print(response.to_map())
Credentials URI
指定Credentials提供地址,实现通过本地或远程的URI来获取并自动更新Token。
配置方法
运行以下示例代码,配置访问凭证。
from alibabacloud_credentials.client import Client
from alibabacloud_credentials.models import Config
config = Config(
type='credentials_uri', # 凭证类型。
credentials_uri='local_or_remote_uri', # Credentials URI,格式为http://local_or_remote_uri/。
)
cred = Client(config)
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
security_token = cred.get_security_token()
cred_type = cred.get_type()
接口调用方法
指定Credentials提供地址,实现通过本地或远程的URI来获取并自动更新Token,完成云产品接口的调用。
调用单个云产品的接口需要云产品依赖。本示例以调用云服务器ECS的DescribeRegions接口为例,因此需先安装ECS Python SDK。
# Credentials和云产品SDK都需引入Client,此处为创建别名。
from alibabacloud_credentials.client import Client as CredClient
# 引入阿里云ECS SDK,此处以ECS产品为例。
from alibabacloud_ecs20140526.client import Client as EcsClient
# 使用ECS DescribeRegions接口发起调用请求。
from alibabacloud_ecs20140526.models import DescribeRegionsRequest
# 引入阿里云SDK核心包。
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions
# 使用默认凭证初始化Credentials Client。
config = Config(
type='credentials_uri', # 凭证类型。
credentials_uri='local_or_remote_uri', # Credentials URI,格式为http://local_or_remote_uri/。
)
cred = Client(config)
config=Config(credential=cred)
# 配置云产品服务接入地址(endpoint)。
config.endpoint='ecs.aliyuncs.com'
# 使用Credentials Client初始化ECS Client。
client=EcsClient(config)
# 初始化DescribeRegions请求。
request=DescribeRegionsRequest()
# 初始化运行时配置。
runtime_options=RuntimeOptions()
# 调用DescribeRegions接口并获得响应。
response=client.describe_regions_with_options(request, runtime_options)
print(response.to_map())