使用访问凭证访问华为云OpenAPI最佳实践
应用访问云服务OpenAPI需要进行认证,常用的方式是在应用程序中维护一个访问密钥,使用访问密钥签名并调用云服务的OpenAPI。但访问密钥一旦生成,除非主动禁用或删除,否则长期有效。一旦泄露,攻击者可以长期利用,并访问访问密钥所属用户有权限操作的所有云资源。为避免访问密钥泄露,应用程序需要对其进行安全防护,比如限制使用范围,加密存储、定期轮转等,无形中增加了访问密钥的使用门槛和使用成本。
访问凭证类型
访问凭证分为访问密钥和临时安全凭证:
典型的访问凭证泄露场景
- 公开资料中存在明文的访问凭证。
- 将包含访问凭证的代码上传至公开的GitHub等公共代码仓。
- 业务代码中有硬编码的明文访问凭证,并交给第三方员工使用。
访问凭证的安全使用方案
常见场景下,为了降低访问凭证泄露,对应的访问凭证安全使用方案如下表所示。
|
方案名称 |
适用场景 |
|---|---|
|
在华为云命令行工具(KooCLI)中使用配置项参数设置访问凭证 |
您需要通过KooCLI调用云服务时,可以在KooCLI配置项中配置临时安全凭证、ecsAgency(当在被委托的ECS服务器中使用KooCLI调用云服务时,会根据ECS委托自动获取临时认证信息)、SSO登录的方式设置身份凭证,代替访问密钥。详细方案请参考操作指导。 |
|
在ECS上通过委托的临时访问密钥访问其他云服务 |
客户开发的应用程序运行的ECS实例上,该应用程序需要调用OpenAPI访问云服务资源,此时需要为应用程序配置访问凭证进行身份验证。您可以创建ECS云服务委托,授权ECS服务从IAM获取临时安全凭证,应用程序无需关注访问凭证的管理和维护,直接从ECS元数据服务获取临时安全凭证,即可签名后调用云服务OpenAPI。ECS会为您自动轮换这些临时安全凭证,从而确保每次申请的临时安全凭证安全有效。详细方案请参考操作指导。 |
|
在CCE集群中使用工作负载Identity的安全配置建议 |
客户开发的应用程序运行的CCE容器上,该应用程序需要调用OpenAPI访问云服务资源,此时需要为应用程序配置访问凭证进行身份验证。您可以创建OIDC身份提供商,将应用程序的ServiceAccount和IAM用户组做映射,从而获取OpenID Connect ID token模拟IAM用户访问云服务。CCE会为您自动轮转OpenID Connect ID token,保证每次获取的IAM Token安全有效。详细方案请参考操作指导。 |
|
FunctionGraph函数获取委托的临时安全凭证 |
您的FunctionGraph函数需要访问其他云服务资源,可以通过为函数配置委托,在函数中即可通过环境变量获取临时安全凭证,避免在函数中配置明文的访问密钥。 |
|
其他场景 |
若以上方案均不适用于您的场景,建议您合理配置并保存访问凭证,并定期轮转。 |
在华为云命令行工具(KooCLI)中使用配置项参数设置访问凭证
- 场景描述
客户在命令行工具(KooCLI)上调用云服务,可以通过增加配置项的方式,设置访问凭证。已配置多个配置项的情况下,您可在命令中以“--cli-profile”指定要操作或使用的配置项的名称,以“--cli-mode”指定认证模式。
认证模式取值范围:- AK/SK:分为访问密钥和临时安全凭证。访问密钥即为永久AK/SK,临时安全凭证即为临时AK/SK和SecurityToken。
- ecsAgency:当委托给ECS服务器时,在ECS服务器中使用KooCLI调用云服务时自动获取临时认证信息。建议使用该方式设置访问凭证,避免在命令行的历史信息中可查询到明文的访问凭证。
- SSO:开通IAM身份中心并完成配置后,允许用户使用特定用户名和密码登录统一的用户门户网站,访问为其分配的多个账号下的资源。认证信息有效期内,无需多次登录。
- 设置访问凭证
- 设置认证模式为AK/SK的配置项,其中认证参数为临时安全凭证,即临时AK(cli-access-key),SK(cli-secret-key)和SecurityToken(cli-security-token),使用临时安全凭证相比访问密钥,降低了凭证的暴露时间:
hcloud configure set --cli-profile=testAKSKST --cli-mode=AKSK --cli-region=cn-north-4 --cli-access-key=******** --cli-secret-key=******** --cli-security-token=******** --cli-project-id=068119468****************af89d2e --cli-domain-id=094518e46****************cfbc4c0 --cli-read-timeout=10 --cli-connect-timeout=5
- 当配置项的认证模式为AK/SK时,若该配置项中同时配置了cli-security-token参数值,则默认其中cli-access-key和cli-secret-key为临时AK/SK,否则为永久AK/SK。
- 设置认证模式为ecsAgency的配置项,无需添加认证参数:
hcloud configure set --cli-profile=testEcsAgency --cli-mode=ecsAgency --cli-region=cn-north-4 --cli-read-timeout=10 --cli-connect-timeout=5
- 当在被委托的ECS服务器中使用KooCLI调用云服务时,会根据ECS委托自动获取临时认证信息。
- 设置认证模式为SSO的配置项,其中认证参数为用户门户URL(cli-sso-start-url),开通IAM身份中心实例所在的区域(cli-sso-region),账号名(cli-sso-account-name),权限集名称(cli-sso-permission-set-name),其中参数cli-sso-account-name与cli-sso-permission-set-name非必填:
- 先新增认证模式为SSO的配置项:
hcloud configure set --cli-profile=testSSO --cli-mode=SSO --cli-region=cn-north-4 --cli-sso-start-url=https://idcenter.huaweicloud.com/d-3********6/portal --cli-sso-region=cn-north-4 --cli-sso-account-name=ACCOUNT_01 --cli-sso-permission-set-name=PERMISSION_01
- 进行SSO登录,若第一步中未配置cli-sso-account-name与cli-sso-permission-set-name参数,登录过程中需按照提示选择账号名与权限集名称:
hcloud configure sso --cli-profile=testSSO
- 先新增认证模式为SSO的配置项:
- 设置认证模式为AK/SK的配置项,其中认证参数为临时安全凭证,即临时AK(cli-access-key),SK(cli-secret-key)和SecurityToken(cli-security-token),使用临时安全凭证相比访问密钥,降低了凭证的暴露时间:
在ECS上通过委托的临时访问密钥访问其他云服务
- 场景描述
假如您是一位开发者,开发了一个应用程序,这个应用程序运行在ECS实例上,应用程序的代码中涉及调用OpenAPI访问华为云服务。您的应用程序若想要以更安全的方式访问云服务,需要获取临时访问凭证,而IAM的委托功能,则支持通过ECS委托获取临时访问密钥。图1 通过ECS委托获取临时访问密钥
- 操作步骤
通过ECS委托获取临时访问密钥的操作流程如下图所示。详细操作步骤请参见在ECS上通过委托的临时访问密钥访问其他云服务。图2 通过ECS委托获取临时访问密钥的操作流程
在CCE集群中使用工作负载Identity的安全配置建议
- 场景描述
假如您是一位开发者,开发了一个应用程序,这个应用程序运行在CCE集群中,可以模拟IAM用户来访问云服务,从而无需直接使用IAM账号的AK/SK等信息,降低安全风险。图3 在CCE集群中使用工作负载Identity的安全配置建议
- 操作步骤
详细操作步骤详见在CCE集群中使用OIDC实现工作负载身份认证。
FunctionGraph函数获取委托的临时安全凭证
- 场景描述
客户在FunctionGraph函数上部署的应用程序需要携带访问凭证并访问其他云服务,常见做法是在函数代码或配置文件中明确指定访问密钥,但是该做法容易导致凭证泄露,且需要定期轮转访问密钥,维护困难。通过将FunctionGraph函数和IAM 委托关联,并使用临时安全凭证访问云资源,可以解决永久凭证可能导致的安全风险问题。
- 操作步骤
- 创建函数的委托并授权,授予其工作所需的最小权限。
图4 填写基本信息
- 创建Functiongraph函数并关联步骤一中创建的IAM委托(Functiongraph就可以使用该委托获取账号的临时安全凭证,调用OpenAPI,避免使用永久凭证AK/SK的安全风险)。
图5 创建Functiongraph函数
- 在functiongraph函数代码中,使用context类的context.getSecurityAccessKey()、context.getSecuritySecretKey()、context.getSecurityToken()方法获取临时安全凭证的临时AK/SK和securitytoken。以下为Python代码示例。
#- * -coding: utf - 8 - * - import json import os from huaweicloudsdkcore.auth.credentials import GlobalCredentials from huaweicloudsdkiam.v3.region.iam_region import IamRegion from huaweicloudsdkcore.exceptions import exceptions from huaweicloudsdkiam.v3 import * def handler(event, context): credentials = GlobalCredentials( ak = context.getSecurityAccessKey(), sk = context.getSecuritySecretKey() ).with_security_token(context.getSecurityToken()) client = IamClient.new_builder()\ .with_credentials(credentials)\ .with_region(IamRegion.value_of("cn-north-4"))\ .build() ...
- 创建函数的委托并授权,授予其工作所需的最小权限。
其他场景
若以上方案均不适用,必须使用访问密钥时,建议按照以下最佳实践妥善管理:
- 不为华为账号创建访问密钥。
- 不为仅需要访问控制台的IAM用户创建访问密钥。
- 不将访问密钥明文嵌入代码。
- 妥善保管访问密钥,不随意分享,不记录在公开文档中。
- 为IAM用户仅授予最小必要权限。
- 访问密钥停用后,及时删除。
- 定期轮转访问密钥:一个IAM用户启用一对访问密钥后,另一对仅用于轮转。