O Alibaba Cloud SDK usa a ferramenta Credentials para gerenciar credenciais centralmente, como AccessKey e STS Token. Este tópico descreve os tipos de credencial compatíveis e seus métodos de configuração.
Pré-requisitos
A ferramenta Credentials requer Java 8 ou posterior. Para mais informações, consulte Política de manutenção do Alibaba Cloud SDK.
Para o Alibaba Cloud SDK V2.0, consulte SDK V2.0 e SDK V1.0.
Instale o Credentials
Use o pacote de dependência mais recente do Credentials para acessar todos os recursos.
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>latest-version</version>
</dependency>
<!-- If you use credentials-java alone, you must also include the Tea dependency package. -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea</artifactId>
<version>latest-version</version>
</dependency>
Para obter a versão mais recente do pacote de dependência Credentials, consulte o GitHub ou o Repositório Maven. Para a versão mais recente do pacote de dependência Tea, consulte o GitHub ou o Repositório Maven.
Tipos de credencial e parâmetros
A classe com.aliyun.credentials.models.Config define os tipos de credencial e os parâmetros de configuração compatíveis com a ferramenta Credentials. O parâmetro type especifica o tipo de credencial, e cada tipo exige diferentes parâmetros de configuração. Esta tabela descreve os valores válidos para type e seus respectivos parâmetros compatíveis. Na tabela, indica um parâmetro obrigatório, - indica um parâmetro opcional e indica que o parâmetro não é compatível.
Os tipos de credencial e parâmetros não listados nesta tabela estão obsoletos.
|
Parâmetro |
|||||||
|
accessKeyId: O ID da chave de acesso. |
|
|
|
|
|
|
|
|
accessKeySecret: A chave secreta de acesso. |
|
|
|
|
|
|
|
|
securityToken: O token de segurança. |
|
|
- |
|
|
|
|
|
roleArn: O ARN da função RAM. |
|
|
|
|
|
|
|
|
roleSessionName: Um nome de sessão personalizado. O formato padrão é |
|
|
- |
|
- |
|
|
|
roleName: O nome da função RAM. |
|
|
|
- |
|
|
|
|
disableIMDSv1: Especifique se deve usar o modo de segurança aprimorada. O valor padrão é |
|
|
|
- |
|
|
|
|
bearerToken: O token bearer. |
|
|
|
|
|
|
|
|
policy: A política de permissão personalizada. |
|
|
- |
|
- |
|
|
|
roleSessionExpiration: O tempo de expiração da sessão em segundos. O valor padrão é 3.600. O valor deve estar entre 900 e a duração máxima da sessão da função RAM. |
|
|
- |
|
- |
|
|
|
oidcProviderArn: O ARN do provedor de identidade OIDC. |
|
|
|
|
|
|
|
|
oidcTokenFilePath: O caminho do arquivo para o token OIDC. |
|
|
|
|
|
|
|
|
externalId: O ID externo para a função RAM. Este parâmetro ajuda a prevenir o problema de "confused deputy". Para mais informações, consulte Usar um ID externo para prevenir o problema de confused deputy. |
|
|
- |
|
|
|
|
|
credentialsURI: O URI da credencial externa. |
|
|
|
|
|
|
|
|
STSEndpoint: O endpoint de serviço para o Security Token Service (STS). Este parâmetro é compatível com endpoints de VPC e endpoints públicos. Para uma lista de valores possíveis, consulte Endpoints de serviço. O valor padrão é |
|
|
- |
|
- |
|
|
|
timeout: O tempo limite de leitura em milissegundos. O valor padrão é 5.000. |
|
|
- |
- |
- |
- |
|
|
connectTimeout: O tempo limite de conexão em milissegundos. O valor padrão é 10.000. |
|
|
- |
- |
- |
- |
|
Uso da ferramenta Credentials
A seção anterior descreveu os tipos de credencial e os parâmetros de configuração compatíveis com a ferramenta Credentials. As seções a seguir fornecem exemplos de código mostrando como usar a ferramenta. Selecione o método mais adequado ao seu cenário.
Codificar um AccessKey diretamente no projeto gera riscos de segurança. Permissões de repositório mal gerenciadas podem expor todos os recursos da sua conta. Recomendamos armazenar o AccessKey em variáveis de ambiente ou arquivos de configuração.
Adote o padrão singleton com a ferramenta Credentials. Esse padrão permite que o cache interno de credenciais da ferramenta evite limitações de taxa devido a chamadas frequentes de API e previna desperdício de recursos causado pela criação de múltiplas instâncias. Para mais informações, consulte Atualização automática de credenciais de sessão.
Método 1: Cadeia de credenciais padrão
Este é o método padrão usado nos códigos de exemplo do Portal OpenAPI.
Se você não passar nenhum parâmetro de configuração ao inicializar a ferramenta Credentials, ela recuperará as credenciais da cadeia de credenciais padrão. Para usar este método, garanta que o ambiente de execução da sua aplicação esteja configurado com pelo menos um dos métodos de recuperação de credenciais compatíveis com a cadeia de credenciais padrão.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
// If no configuration parameters are specified, the tool retrieves credentials from the default credential chain.
Client credentialClient = new Client();
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// The code for initializing the cloud product client with the config object is omitted.
}
}
Método 2: AK
A ferramenta Credentials usa o AccessKey fornecido por você como credencial de acesso.
Uma conta Alibaba Cloud (conta raiz) possui permissões totais sobre todos os seus recursos, portanto, um AK exposto representa um risco significativo de segurança. Não use o AK de uma conta raiz.
Use o AK de um usuário RAM com permissões de privilégio mínimo.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("access_key");
// Required. This example retrieves the AccessKey ID from an environment variable.
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// Required. This example retrieves the AccessKey secret from an environment variable.
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// The code for initializing the cloud product client with the config object is omitted.
}
}
Método 3: Token STS
A ferramenta Credentials usa o token STS estático fornecido por você como credencial de acesso.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) {
Config credentialConfig = new Config();
credentialConfig.setType("sts");
// Required. This example retrieves the AccessKey ID from an environment variable.
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// Required. This example retrieves the AccessKey secret from an environment variable.
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Required. This example retrieves the temporary security token from an environment variable.
credentialConfig.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// The code for initializing the cloud product client with the config object is omitted.
}
}
Método 4: AK e ARN de função RAM
A ferramenta Credentials usa seu AK e o ARN da função RAM para chamar a API AssumeRole e obter um token STS, que serve como credencial de acesso. As credenciais obtidas dessa forma são compatíveis com atualização automática. Para mais informações, consulte Atualização automática de credenciais de sessão.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("ram_role_arn");
// Required. This example retrieves the AccessKey ID from an environment variable.
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// Required. This example retrieves the AccessKey secret from an environment variable.
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Optional. Allows the use of temporary credentials to assume another RAM role.
credentialConfig.setSecurityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
// Required. The ARN of the RAM role to assume. Example: acs:ram::123456789012****:role/adminrole. You can also set this by using the ALIBABA_CLOUD_ROLE_ARN environment variable.
credentialConfig.setRoleArn("<RoleArn>");
// Optional. The role session name. Default format: credentials-java-. You can also set this by using the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
credentialConfig.setRoleSessionName("<RoleSessionName>");
// Optional. A more restrictive permission policy. Not required. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
credentialConfig.setPolicy("<Policy>");
// Optional. An external ID to prevent the confused deputy problem.
credentialConfig.setExternalId("<ExternalId>");
// Optional. The session expiration time in seconds. Default value: 3600.
credentialConfig.setRoleSessionExpiration(3600);
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// The code for initializing the cloud product client with the config object is omitted.
}
}
Método 5: Função RAM de instância ECS
Se sua aplicação for executada em uma instância Elastic Compute Service (ECS) ou Elastic Container Instance (ECI) com uma função RAM atribuída, a ferramenta Credentials recupera um token STS dos metadados da instância para usar como credencial de acesso. Ao acessar os metadados da instância, a ferramenta primeiro recupera o nome da função RAM atribuída à instância. Você pode especificar o nome da função RAM usando o parâmetro roleName ou a variável de ambiente ALIBABA_CLOUD_ECS_METADATA para reduzir o tempo de recuperação e melhorar a eficiência. As credenciais obtidas dessa forma são compatíveis com atualização automática. Para mais informações, consulte Atualização automática de credenciais de sessão.
Por padrão, a ferramenta Credentials acessa os metadados da instância no modo seguro (IMDSv2). Se esse acesso falhar, use o parâmetro disableIMDSv1 ou a variável de ambiente ALIBABA_CLOUD_IMDSV1_DISABLED para controlar o comportamento de fallback:
Se definido como
false(padrão), a ferramenta retorna ao modo normal para recuperar a credencial.Se definido como
true, a ferramenta usa apenas o modo seguro e lança uma exceção se o acesso falhar.
O suporte do seu servidor ao IMDSv2 depende da configuração dele.
Para desativar o acesso a credenciais via metadados da instância, defina a variável de ambiente ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
Para mais informações sobre metadados de instância, consulte Metadados da instância.
Para saber como conceder uma função RAM a uma instância ECS ou ECI, consulte Etapa 1: Criar uma função RAM e Conceder uma função RAM de instância a uma instância ECI.
É necessária a versão 0.3.10 ou posterior do credentials-java para obter credenciais temporárias no modo seguro.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("ecs_ram_role");
// Optional. The name of the RAM role granted to the ECS instance. If not specified, the tool retrieves it automatically. We recommend setting this parameter to reduce the number of requests. You can also set this by using the ALIBABA_CLOUD_ECS_METADATA environment variable.
credentialConfig.setRoleName("<RoleName>");
// Optional. Set to true to enforce secured mode. Default value: false. The tool first attempts to get credentials in secured mode. If it fails, it falls back to normal mode.
credentialConfig.setDisableIMDSv1(false);
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// The code for initializing the cloud product client with the config object is omitted.
}
}
Método 6: ARN de função OIDC
Se você usar OIDC para autenticação e tiver criado uma função RAM para um provedor de identidade OIDC, poderá fornecer o ARN do provedor OIDC, o caminho do arquivo de token OIDC e o ARN da função RAM para a ferramenta Credentials. A ferramenta então chama automaticamente a API AssumeRoleWithOIDC para obter um token STS para a função RAM, que é usado como credencial de acesso. As credenciais obtidas dessa forma são compatíveis com atualização automática. Para mais informações, consulte Atualização automática de credenciais de sessão. Por exemplo, se sua aplicação for executada em um cluster Container Service for Kubernetes (ACK) com RRSA ativado, a ferramenta Credentials pode ler a configuração OIDC das variáveis de ambiente do pod e chamar a API AssumeRoleWithOIDC para obter um token STS. Em seguida, você pode usar esse token STS para acessar serviços da Alibaba Cloud.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("oidc_role_arn");
// Required. The RAM role ARN. You can also set this by using the ALIBABA_CLOUD_ROLE_ARN environment variable.
credentialConfig.setRoleArn("<RoleArn>");
// Required. The ARN of the OIDC identity provider. You can also set this by using the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable.
credentialConfig.setOidcProviderArn("<OidcProviderArn>");
// Required. The OIDC token file path. You can also set this by using the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable.
credentialConfig.setOidcTokenFilePath("<OidcTokenFilePath>");
// Optional. The role session name. You can also set this by using the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
credentialConfig.setRoleSessionName("<RoleSessionName>");
// Optional. A more restrictive permission policy. Not required. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
credentialConfig.setPolicy("<Policy>");
// Optional. The session expiration time in seconds. Default value: 3600.
credentialConfig.setRoleSessionExpiration(3600);
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// The code for initializing the cloud product client with the config object is omitted.
}
}
Método 7: URI de Credenciais
Você pode encapsular o Security Token Service (STS) atrás de um URI de serviço, permitindo que serviços externos obtenham um token STS sem expor informações sensíveis como AKs. A ferramenta Credentials pode então usar esse URI para buscar um token STS e utilizá-lo como credencial de acesso. As credenciais obtidas dessa forma são compatíveis com atualização automática. Para mais informações, consulte Atualização automática de credenciais de sessão.
O URI deve atender às seguintes condições:
Ser compatível com requisições GET.
Retornar um código de status HTTP 2xx.
-
O corpo da resposta deve retornar um objeto JSON com a seguinte estrutura:
{ "Code": "Success", "AccessKeySecret": "yourAccessKeySecret", "AccessKeyId": "STS.****************", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "yourSecurityToken" }
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("credentials_uri");
// Required. The URI for retrieving external credentials. Format: http://local_or_remote_uri/. You can also set this by using the ALIBABA_CLOUD_CREDENTIALS_URI environment variable.
credentialConfig.setCredentialsUri("<CredentialsUri>");
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// If you are using a cloud product V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// The code for initializing the cloud product client with the config object is omitted.
}
}
Método 8: Token Bearer
Atualmente, apenas o Alibaba Cloud Call Center (CCC) é compatível com autenticação via token bearer.
import com.aliyun.credentials.Client;
import com.aliyun.credentials.models.Config;
import com.aliyun.credentials.models.CredentialModel;
public class DemoTest {
public static void main(String[] args) throws Exception {
Config credentialConfig = new Config();
credentialConfig.setType("bearer");
// Required. Enter your bearer token.
credentialConfig.setBearerToken("<BearerToken>");
Client credentialClient = new Client(credentialConfig);
CredentialModel credential = credentialClient.getCredential();
String accessKeyId = credential.getAccessKeyId();
String accessKeySecret = credential.getAccessKeySecret();
String securityToken = credential.getSecurityToken();
// If you are using the CCC V2.0 SDK, use com.aliyun.teaopenapi.models.Config to pass the credential.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.setCredential(credentialClient);
config.setEndpoint("<Endpoint>");
// The code for initializing the cloud product client with the config object is omitted.
}
}
Cadeia de provedores de credenciais padrão
A cadeia de provedores de credenciais padrão é um mecanismo de fallback que busca uma credencial verificando uma sequência predefinida de locais. A busca continua até que uma credencial seja encontrada. Se nenhuma credencial for encontrada após verificar todos os locais, uma CredentialException será lançada. A ordem de busca é a seguinte:
1. Propriedades do sistema
A cadeia de provedores verifica primeiro se há uma credencial nas propriedades do sistema Java.
Se as propriedades de sistema alibabacloud.accessKeyId e alibabacloud.accessKeySecret estiverem definidas, a cadeia de provedores usará um AccessKey como credencial padrão.
Se as propriedades de sistema alibabacloud.accessKeyId, alibabacloud.accessKeySecret e alibabacloud.sessionToken estiverem definidas, a cadeia de provedores usará um token STS como credencial padrão.
Você pode especificar esses valores adicionando os seguintes parâmetros JVM ao executar seu programa Java:
-Dalibabacloud.accessKeyId=your-access-key-id -Dalibabacloud.accessKeySecret=your-access-key-secret
2. Variáveis de ambiente
Se nenhuma credencial for encontrada nas propriedades do sistema, a cadeia de provedores verificará as variáveis de ambiente.
Se ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET estiverem presentes e não vazias, a cadeia de provedores as usará como credencial padrão.
Se ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET e ALIBABA_CLOUD_SECURITY_TOKEN também estiverem definidas, a cadeia de provedores usará um token STS como credencial padrão.
3. Função RAM OIDC
Se nenhuma credencial tiver sido encontrada, a cadeia de provedores verifica as seguintes variáveis de ambiente relacionadas a uma função RAM OIDC:
ALIBABA_CLOUD_ROLE_ARN: O ARN da função RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: O ARN do provedor OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE: O caminho do arquivo do token OIDC.
Se todas as três variáveis de ambiente estiverem presentes e não vazias, a cadeia de provedores usa esses valores para chamar a API AssumeRoleWithOIDC do Security Token Service (STS) e obter um token STS.
4. Arquivo de credenciais compartilhado
Este recurso requer a versão 0.3.8 ou posterior do credentials-java.
Se nenhuma credencial tiver sido encontrada, a cadeia de provedores tenta carregar o arquivo de credenciais compartilhado, config.json, de seu local padrão e usa a credencial especificada no arquivo.
Linux/macOS:
~/.aliyun/config.jsonWindows:
C:\Users\USER_NAME\.aliyun\config.json
Para configurar uma credencial dessa maneira, você pode usar a Alibaba Cloud CLI ou criar manualmente um arquivo config.json no caminho apropriado. O exemplo a seguir 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 é o valor do parâmetro |
|
profiles |
Contém uma coleção de configurações de credenciais. O parâmetro
|
5. Função RAM de instância
Se nenhuma credencial tiver sido encontrada, a cadeia de provedores tenta recuperar um token STS para a função RAM da instância a partir dos metadados da instância. Esse token é então usado como credencial padrão. Para isso, a cadeia primeiro recupera o nome da função RAM atribuída à instância e depois usa essa função para obter o token STS correspondente. Para reduzir o tempo de recuperação de credenciais e melhorar a eficiência, você pode especificar o nome da função RAM diretamente usando a variável de ambiente ALIBABA_CLOUD_ECS_METADATA.
Por padrão, a cadeia de provedores acessa os metadados da instância no modo de segurança reforçada (IMDSv2). Se ocorrer uma exceção no modo de segurança reforçada, você pode usar a variável de ambiente ALIBABA_CLOUD_IMDSV1_DISABLED para controlar o comportamento de fallback:
Quando o valor é
false(padrão), o sistema tenta alternar para o modo legado para recuperar a credencial.Quando o valor é
true, o modo de segurança reforçada é imposto. Se o acesso falhar neste modo, uma exceção será lançada.
Além disso, você pode impedir que a cadeia de provedores acesse os metadados da instância em busca de credenciais definindo a variável de ambiente ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
Para mais informações sobre metadados de instância, consulte Metadados da instância.
Para saber como conceder uma função RAM a uma instância ECS ou ECI, consulte Etapa 1: Criar uma função RAM e Conceder uma função RAM de instância a uma instância ECI.
Para obter uma credencial temporária no modo de segurança reforçada, você deve usar a versão 0.3.10 ou posterior do
credentials-java.
6. CredentialsURI
Se nenhuma credencial tiver sido encontrada, a cadeia de provedores verifica a variável de ambiente ALIBABA_CLOUD_CREDENTIALS_URI. Se esta variável estiver definida e apontar para um URI válido, a cadeia acessa o URI para recuperar um token STS.
Atualização automática de credenciais de sessão
Os tipos de credencial de sessão, como ram_role_arn, ecs_ram_role, oidc_role_arn e credentials_uri, são compatíveis com atualização automática por meio de um mecanismo integrado no provedor de credenciais. Quando um cliente de credenciais recupera uma credencial pela primeira vez, o provedor a armazena em um cache. Nas operações subsequentes, a mesma instância do cliente recupera automaticamente a credencial desse cache. Se a credencial em cache tiver expirado, a instância do cliente busca uma nova e atualiza o cache adequadamente.
Para credenciais do tipo ecs_ram_role, o provedor de credenciais as atualiza proativamente 15 minutos antes da expiração.
O exemplo a seguir usa o padrão singleton para criar um cliente de credenciais. Ele demonstra o mecanismo de atualização buscando uma credencial em intervalos de tempo diferentes e chamando uma operação OpenAPI para verificar se a credencial é utilizável.
import com.aliyun.credentials.models.CredentialModel;
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import java.util.Date;
import java.util.concurrent.*;
public class Sample {
/**
* The Credential class uses the singleton pattern to manage the Alibaba Cloud credential client instance.
*/
private static class Credential {
private static volatile com.aliyun.credentials.Client instance;
private Credential() {
}
public static com.aliyun.credentials.Client getInstance() {
if (instance == null) {
synchronized (Credential.class) {
if (instance == null) {
try {
com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
config.setType("ram_role_arn");
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.setRoleArn(System.getenv("ALIBABA_CLOUD_ROLE_ARN"));
config.setRoleSessionName("RamRoleArnTest");
config.setRoleSessionExpiration(3600);
instance = new com.aliyun.credentials.Client(config);
} catch (Exception e) {
throw new RuntimeException("Credential initialization failed: " + e.getMessage(), e);
}
}
}
}
return instance;
}
}
/**
* The EcsClient class uses the singleton pattern to manage the ECS client.
*/
private static class EcsClient {
private static volatile Client instance;
private EcsClient() {
}
public static Client getInstance(com.aliyun.credentials.Client credentialClient) {
if (instance == null) {
synchronized (EcsClient.class) {
if (instance == null) {
try {
Config ecsConfig = new Config();
ecsConfig.setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
ecsConfig.setCredential(credentialClient);
instance = new Client(ecsConfig);
} catch (Exception e) {
throw new RuntimeException("ECS client initialization failed: " + e.getMessage(), e);
}
}
}
}
return instance;
}
}
public static void main(String[] args) {
// Initializes a scheduled thread pool.
ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(
1,
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
scheduler.setKeepAliveTime(0L, TimeUnit.SECONDS);
scheduler.allowCoreThreadTimeOut(false); // Do not allow core threads to time out.
// Defines the execution logic as a Runnable task.
Runnable task = () -> {
try {
com.aliyun.credentials.Client credentialClient = Credential.getInstance();
CredentialModel credential = credentialClient.getCredential();
System.out.println(new Date());
System.out.printf("AK ID:%s, AK Secret:%s, STS Token:%s%n", credential.accessKeyId, credential.accessKeySecret, credential.securityToken);
// This example calls an ECS operation to verify that the credential is usable. You can adapt this for your use case.
Client ecsClient = EcsClient.getInstance(credentialClient);
DescribeRegionsRequest request = new DescribeRegionsRequest();
RuntimeOptions runtime = new RuntimeOptions();
DescribeRegionsResponse response = ecsClient.describeRegionsWithOptions(request, runtime);
System.out.printf("Invoke result:%s%n", response.statusCode);
} catch (Exception e) {
throw new RuntimeException("ECS client execution failed: " + e.getMessage(), e);
}
};
try {
// Run the task for the first time (immediately).
scheduler.execute(task);
// Schedule the second task to run after a 600-second delay.
scheduler.schedule(task, 600, TimeUnit.SECONDS);
// Schedule the third task to run after 4,200 seconds.
scheduler.schedule(task, 4200, TimeUnit.SECONDS);
// Schedule the fourth task to run after 4,300 seconds.
scheduler.schedule(task, 4300, TimeUnit.SECONDS);
} finally {
// Shut down the thread pool after all tasks complete.
scheduler.shutdown();
try {
if (!scheduler.awaitTermination(4500, TimeUnit.SECONDS)) {
scheduler.shutdownNow();
}
} catch (InterruptedException e) {
scheduler.shutdownNow();
Thread.currentThread().interrupt();
}
}
}
}
Wed May 28 13:33:43 CST 2025
AK ID:STS.NWWcxxx2xbcw, AK Secret:5p3FMoRjxxx7KPm9k5mNf89, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5TiJI7/vapF1IaoR6vcqFAsebcel6fIlTz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VtLjwYFIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAITxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxX9IIPPt3pm4K8Qdpz0agAEZc36x
/FgKbLSDQh4DZiv0gPracQVKbiHF7snw5rRXtu4PJHyGSOZfR8a3H7sxxxp0GR7TbZwX48kHARr95UXTTVi0bn+kS6UfjCJASAA
Invoke result:200
Wed May 28 13:43:39 CST 2025
AK ID:STS.NWWcxxx2xbcw, AK Secret:5p3FMoRjxxx7KPm9k5mNf89, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5TiJI7/vapF1IaoR6vcqFAsebcel6fIlTz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VtLjwYFIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAIxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxX9IIPPt3pm4K8Qdpz0agAEZc36x
/FgKbLSDQh4DZiv0gPracQVKbiHF7snw5rRXtu4PJHyGSOZfR8a3H7sxxxp0GR7TbZwX48kHARr95UXTTVi0bn+kS6UfjCJASAA
Invoke result:200
Wed May 28 14:43:40 CST 2025
AK ID:STS.NXF5xxxbMWQ9b, AK Secret:8sLqjJ39PyxxxG65t6onfid7, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5vzfovNrLLVwpinMHSDkmoQQu1huJSSgDz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VsbkQYHIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAIxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxE7NJKbtm6l6aMQdpz0agAFkyTyo8rjEFLKPKG6DdLq7fkrBDqe7PtCiBD
+dZVf1xhPof9i8DluMHBXNp6m13SbpKR5ROYta43jKyzqQaiI3oE64kxxxBbHAti3yAA
Invoke result:200
Wed May 28 14:45:19 CST 2025
AK ID:STS.NXF5xxxbMWQ9b, AK Secret:8sLqjJ39PyxxxG65t6onfid7, STS
Token:CAISxAJ1q6Ft5B2yfSJIr5vzfovNrLLVwpinMHSDkmoQQu1huJSSgDz2IHhMeXZoA+4YsPw2mmFW6/sdlqdJQpp
/QkjJRNF20plM7VsbkQYHIpbng4YfgbiJREKxaXeiruKwDsz9SNTCAIxxxFly6Ee4CFdkf3jm5bHu0WB0qCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVYk900xxxE7NJKbtm6l6aMQdpz0agAFkyTyo8rjEFLKPKG6DdLq7fkrBDqe7PtCiBD
+dZVf1xhPof9i8DluMHBXNp6m13SbpKR5ROYta43jKyzqQaiI3oE64kxxxBbHAti3yAA
Invoke result:200
Análise baseada na saída do log:
Na primeira chamada, o cache está vazio. O sistema recupera uma credencial com base na sua configuração e a armazena no cache.
A segunda chamada usa a mesma credencial da primeira, indicando que ela foi recuperada do cache.
Na terceira chamada, a credencial em cache expirou. Seu tempo de expiração (
RoleSessionExpiration) é de 3.600 segundos, mas esta chamada é feita 4.200 segundos após a primeira. Consequentemente, o mecanismo de atualização automática do SDK busca uma nova credencial e atualiza o cache.A quarta chamada usa a mesma credencial da terceira, confirmando que o cache foi atualizado.
Documentos relacionados
Para uma visão geral dos conceitos básicos do RAM, consulte Conceitos básicos.
Para criar um AccessKey, consulte Criar um AccessKey.
Para criar programaticamente usuários RAM, AccessKeys e funções RAM; definir políticas de permissão; e conceder permissões, consulte Visão geral do SDK do RAM.
Para assumir uma função programaticamente, consulte Visão geral do SDK do STS.
Para detalhes sobre as APIs do RAM e STS, consulte a Referência de API.
Melhores práticas para usar credenciais de acesso ao chamar a OpenAPI da Alibaba Cloud