Ao chamar operações de API para gerenciar recursos em nuvem com os SDKs da Alibaba Cloud, configure informações de credenciais válidas. Este tópico descreve como configurar uma credencial de acesso para o Alibaba Cloud SDK V1.0 for Go. As credenciais de acesso aprimoram o controle de acesso durante o desenvolvimento com o SDK.
Informações básicas
Durante o desenvolvimento com os SDKs da Alibaba Cloud, configure um tipo de credencial adequado ao seu cenário de negócios e aos requisitos de controle de permissões. Para ajudar os desenvolvedores a criar aplicações estáveis e confiáveis, defina variáveis de ambiente ou arquivos de configuração apropriados para garantir que o SDK leia e utilize as credenciais corretamente.
Pré-requisitos
Go 1.10.x ou versão posterior instalada.
-
Biblioteca principal do Alibaba Cloud SDK for Go instalada.
go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk
Inicializar um cliente Credentials
Método 1: Usar a cadeia de provedores de credenciais padrão
Se você não especificar um método de inicialização para o cliente do SDK, o sistema usará a cadeia de provedores de credenciais padrão. Para mais detalhes, consulte a seção Cadeia de provedores de credenciais padrão deste tópico.
package main
import (
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider"
)
func main() {
config := sdk.NewConfig()
// No value is specified for this parameter.
credential := credentials.NewDefaultCredentialsProvider()
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Método 2: Usar um par de AccessKey
Crie um par de AccessKey para contas Alibaba Cloud e usuários do Resource Access Management (RAM) para chamar APIs. Use esse par para inicializar um cliente do SDK.
O par de AccessKey de uma conta Alibaba Cloud possui acesso total a todos os recursos dessa conta. O vazamento desse par representa uma ameaça crítica à segurança dos recursos. Recomendamos o uso do par de AccessKey de um usuário RAM e a rotação regular das chaves. Para saber como criar um par de AccessKey para um usuário RAM, consulte Criar um par de AccessKey.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewStaticAKCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"): Obtain the AccessKey ID of the RAM user from an environment variable.
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"): Obtain the AccessKey secret of the RAM user from an environment variable.
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Método 3: Usar um token STS
Para garantir a segurança do seu negócio, solicite credenciais de segurança temporárias (TSC) no Security Token Service (STS) e crie um cliente temporário.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewStaticSTSCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"): Obtain the AccessKey ID of the RAM user from an environment variable.
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"): Obtain the AccessKey secret of the RAM user from an environment variable.
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"): Obtain the STS token from the environment variable.
WithSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN")).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Método 4: Usar um par de AccessKey e uma função RAM
Especifique o Alibaba Cloud Resource Name (ARN) de uma função RAM para inicializar o cliente do SDK. Antes de enviar requisições de API, o cliente deve obter um token STS chamando a API do STS. Para restringir as permissões do token STS, configure uma política personalizada no RAM.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewRAMRoleARNCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"): Required. Obtain the AccessKey ID of the RAM user from the environment variable.
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"): Required. Obtain the AccessKey secret of the RAM user from the environment variable.
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// "<Role_Arn>" Required. The ARN of the RAM role. You can obtain the ARN of a RAM role in the RAM console. Example: acs:ram::123456789012****:role/adminrole.
WithRoleArn("<Role_Arn>").
// "<ROLE_SESSION_NAME>" Required. The name of the role session, which is used to distinguish different sessions. Example: alice.
WithRoleSessionName("<ROLE_SESSION_NAME>").
// "<POLICY>": Specify a custom policy to limit the role session permissions. Example: {\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}.
WithPolicy("<POLICY>").
// "<EXTERNAL_ID>": Specify an external ID for the role, in case it is confused with the deputy. Example: abcd1234.
WithExternalId("<EXTERNAL_ID>").
// <ROLE_SESSION_EXPIRATION>: the validity period of the token. Example: 3600.
WithDurationSeconds(3600).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Método 5: Usar a função RAM de uma instância ECS
Anexe uma função RAM a uma instância ECS ou a uma instância de contêiner elástico. A ferramenta Credentials obtém automaticamente a função RAM associada à instância e utiliza o servidor de metadados para recuperar o token STS correspondente. Em seguida, esse token STS inicializa o cliente Credentials.
O acesso aos metadados da instância pode ocorrer em modo normal ou de reforço de segurança. Por padrão, a ferramenta Credentials obtém as credenciais de acesso no modo de reforço de segurança usando o Instance Metadata Service Version 2 (IMDSv2). Se ocorrer uma exceção nesse modo, configure o parâmetro DisableIMDSv1 para definir a lógica de tratamento de exceções. Valores válidos para o parâmetro DisableIMDSv1:
Se definido como
false(valor padrão), o sistema obtém a credencial de acesso no modo normal.true: O sistema lança a exceção e a ferramenta Credentials continua tentando obter a credencial no modo de reforço de segurança.
As configurações do servidor de metadados determinam se ele suporta o modo de reforço de segurança (IMDSv2).
Para mais informações sobre metadados de instância, consulte Obter metadados da instância.
Para detalhes sobre como anexar uma função RAM a uma instância ECS, veja a seção "Criar uma função RAM de instância e anexá-la a uma instância ECS" no tópico Funções RAM de instância. Para anexar uma função RAM a uma instância de contêiner elástico, consulte a seção "Atribuir a função RAM de instância a uma instância de contêiner elástico" no tópico Usar uma função RAM de instância chamando operações de API.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// Use an STS token to initialize an SDK client. The STS token is obtained by using the RAM role attached to an ECS instance.
// This method is suitable for the programs that run on ECS instances and need to access other Alibaba Cloud resources.
credential, err := credentials.NewECSRAMRoleCredentialsProviderBuilder().
// "<ROLE_NAME>": Specify the name of the RAM role that you want to use. You can specify a default value for the roleName parameter in the environment variable ALIBABA_CLOUD_ECS_METADATA. Example: alice.
WithRoleName(os.Getenv("ALIBABA_CLOUD_ECS_METADATA")).
// A value of true specifies that the security hardening mode is forcibly used. The default value is false, which specifies that the system first tries to obtain the access credential in security hardening mode. If the access credential fails to be obtained, the normal mode is used.
//WithDisableIMDSv1(true).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Método 6: Usar a função RAM de um IdP OIDC
Após anexar uma função RAM a um nó de trabalho em um cluster do Container Service for Kubernetes (ACK), os pods nesse nó podem usar o servidor de metadados para obter um token STS. No entanto, permitir que aplicações não confiáveis (como aquelas cujo código não foi divulgado pelo cliente) acessem tokens STS via serviço de metadados pode gerar riscos de segurança. Para mitigar esses riscos e aplicar o princípio do menor privilégio (PoLP), recomendamos o uso do recurso RAM Roles for Service Account. Ele aumenta a segurança dos recursos em nuvem e permite que aplicações não confiáveis obtenham tokens STS de forma segura. Nesse cenário, o cluster ACK cria um arquivo de token OpenID Connect (OIDC) da conta de serviço, associa-o ao pod e injeta as variáveis de ambiente relevantes. A ferramenta Credentials usa então essas variáveis para chamar a operação AssumeRoleWithOIDC do STS e obter o token STS da função RAM. Para mais informações sobre o recurso RRSA, consulte Usar RRSA para autorizar diferentes pods a acessar diferentes serviços em nuvem. As seguintes variáveis de ambiente são injetadas no pod:
ALIBABA_CLOUD_ROLE_ARN: o ARN da função RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: o ARN do IdP OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE: o caminho do arquivo de token OIDC.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// Use the RAM role of the OIDC identity provider (IdP) to initialize an SDK client.
credential, err := credentials.NewOIDCCredentialsProviderBuilder().
// Specify the ARN of the OIDC IdP by specifying the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable.
WithOIDCProviderARN(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
// Specify the path of the OIDC token file by specifying the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable.
WithOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
// "<Role_Arn>" Required. The ARN of the RAM role. You can obtain the ARN of a RAM role in the RAM console. Example: acs:ram::123456789012****:role/adminrole.
WithRoleArn("<Role_Arn>").
// "<ROLE_SESSION_NAME>" Required. Specify a name for the role session. Example: alice.
WithRoleSessionName("<ROLE_SESSION_NAME>").
// "<POLICY>": Optional. Grant limited permissions for the RAM role. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
WithPolicy("<POLICY>").
// <ROLE_SESSION_EXPIRATION>: Specify a validity period for the session. Example: 3600.
WithDurationSeconds(3600).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Método 7: Usar um bearer token
Somente o Cloud Call Center permite o uso de bearer token para inicializar um cliente do SDK.
package main
import (
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// <BEARER_TOKEN> specifies a type of authentication method for API calls.
credential := credentials.NewBearerTokenCredentialsProvider("<BEARER_TOKEN>")
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Cadeia de provedores de credenciais padrão
Quando se utilizam tipos diferentes de credenciais nos ambientes de desenvolvimento e produção, geralmente é necessário obter informações do ambiente diretamente no código e criar ramificações lógicas para carregar a credencial adequada. A cadeia de provedores de credenciais padrão da ferramenta Credentials permite usar o mesmo código para obter credenciais de diferentes ambientes, baseando-se em configurações externas à aplicação. Ao inicializar um cliente Credentials com credentials.NewDefaultCredentialsProvider() sem especificar um método, a ferramenta busca as informações de credencial na seguinte ordem:
1. Obter as informações de credencial de variáveis de ambiente
Se nenhuma credencial for encontrada na etapa anterior, a ferramenta Credentials tenta obtê-las a partir de variáveis de ambiente.
Caso as variáveis de ambiente de sistema ALIBABA_CLOUD_ACCESS_KEY_ID (AccessKey ID) e ALIBABA_CLOUD_ACCESS_KEY_SECRET (AccessKey secret) estejam definidas, a ferramenta utiliza o par de AccessKey especificado como credencial padrão.**
Se as variáveis de ambiente de sistema ALIBABA_CLOUD_ACCESS_KEY_ID (AccessKey ID), ALIBABA_CLOUD_ACCESS_KEY_SECRET (AccessKey secret) e ALIBABA_CLOUD_SECURITY_TOKEN (token STS) estiverem definidas, a ferramenta utiliza o token STS especificado como credencial padrão.
2. Obter as informações de credencial usando a função RAM de um IdP OIDC
Na ausência de credenciais na etapa anterior, a ferramenta Credentials verifica os valores das seguintes variáveis de ambiente:
ALIBABA_CLOUD_ROLE_ARN: o ARN da função RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: o ARN do IdP OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE: o caminho do arquivo de token OIDC.
Se essas três variáveis estiverem definidas, a ferramenta as utiliza para chamar a operação AssumeRoleWithOIDC do STS e obter um token STS como credencial padrão.
3. Obter as informações de credencial do arquivo config.json
Caso nenhuma credencial tenha sido encontrada, a cadeia de provedores tenta carregar o arquivo de credenciais compartilhadas, config.json, em sua localização padrão e utiliza a credencial nele especificada.
Linux/macOS:
~/.aliyun/config.jsonWindows:
C:\Users\USER_NAME\.aliyun\config.json
Para configurar uma credencial dessa forma, utilize a Alibaba Cloud CLI ou crie manualmente um arquivo config.json no caminho apropriado. O exemplo abaixo mostra o formato do conteúdo:
{
"current": "<PROFILE_NAME>",
"profiles": [
{
"name": "<PROFILE_NAME>",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name": "<PROFILE_NAME1>",
"mode": "StsToken",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>"
},
{
"name":"<PROFILE_NAME2>",
"mode":"RamRoleArn",
"access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"<PROFILE_NAME3>",
"mode":"EcsRamRole",
"ram_role_name":"<RAM_ROLE_ARN>"
},
{
"name":"<PROFILE_NAME4>",
"mode":"OIDC",
"oidc_provider_arn":"<OIDC_PROVIDER_ARN>",
"oidc_token_file":"<OIDC_TOKEN_FILE>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"<PROFILE_NAME5>",
"mode":"ChainableRamRoleArn",
"source_profile":"<PROFILE_NAME>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
}
]
}
|
Parâmetro |
Descrição |
|
current |
Especifique o nome da credencial para recuperar a configuração correspondente. O nome da credencial corresponde ao valor do parâmetro |
|
profiles |
Contém uma coleção de configurações de credenciais. O parâmetro
|
4. Obter as informações de credencial da função RAM da instância ECS
Se nenhuma credencial for encontrada na etapa anterior, a ferramenta Credentials verifica o valor da variável de ambiente ALIBABA_CLOUD_ECS_METADATA, que indica o nome da função RAM de uma instância ECS. Caso a função exista, a aplicação obtém um token STS dessa função como credencial padrão, utilizando o servidor de metadados do ECS no modo de reforço de segurança (IMDSv2). Se ocorrer uma exceção no modo IMDSv2, a ferramenta tentará obter a credencial no modo normal. Também é possível configurar a variável de ambiente ALIBABA_CLOUD_IMDSV1_DISABLED para definir a lógica de tratamento de exceções. Valores válidos:
false(padrão): A ferramenta Credentials continua a obtenção da credencial no modo normal.true: O sistema lança a exceção e a ferramenta persiste na tentativa de obter a credencial no modo de reforço de segurança.
As configurações do servidor de metadados determinam se ele oferece suporte ao modo de reforço de segurança (IMDSv2).
5. Usar uma URI de credencial
Caso nenhuma credencial seja encontrada na etapa anterior, a ferramenta Credentials lê o valor da variável de ambiente ALIBABA_CLOUD_CREDENTIALS_URI, que especifica a URI da credencial. Se essa URI existir, a aplicação a utiliza para obter um token STS como credencial padrão.