Le SDK Alibaba Cloud utilise l'outil Credentials pour gérer de manière centralisée les identifiants, tels que votre AccessKey et votre STS Token. Cette rubrique décrit les types d'identifiants pris en charge ainsi que leurs méthodes de configuration.
Prérequis
L'outil Credentials nécessite Java 8 ou version ultérieure. Pour plus d'informations, consultez Politique de maintenance du SDK Alibaba Cloud.
Pour le SDK Alibaba Cloud V2.0, reportez-vous à SDK V2.0 et SDK V1.0.
Installer Credentials
Utilisez la dernière version du package de dépendances Credentials pour accéder à toutes les fonctionnalités.
<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>
Pour obtenir la dernière version du package de dépendances Credentials, consultez GitHub ou Maven Repository. Pour la dernière version du package de dépendances Tea, consultez GitHub ou Maven Repository.
Types d'identifiants et paramètres
La classe com.aliyun.credentials.models.Config définit les types d'identifiants et les paramètres de configuration pris en charge par l'outil Credentials. Le paramètre type spécifie le type d'identifiant ; chaque type nécessite des paramètres de configuration spécifiques. Ce tableau présente les valeurs valides pour type et les paramètres associés. Dans ce tableau, indique un paramètre obligatoire, - signale un paramètre facultatif, et signifie que le paramètre n'est pas pris en charge.
Les types d'identifiants et les paramètres non répertoriés dans ce tableau sont obsolètes.
|
Paramètre |
|||||||
|
accessKeyId : ID de la clé d'accès. |
|
|
|
|
|
|
|
|
accessKeySecret : Clé d'accès secrète. |
|
|
|
|
|
|
|
|
securityToken : Jeton de sécurité. |
|
|
- |
|
|
|
|
|
roleArn : ARN du rôle RAM. |
|
|
|
|
|
|
|
|
roleSessionName : Nom de session personnalisé. Le format par défaut est |
|
|
- |
|
- |
|
|
|
roleName : Nom du rôle RAM. |
|
|
|
- |
|
|
|
|
disableIMDSv1 : Indique si le mode de sécurité renforcée doit être utilisé. La valeur par défaut est |
|
|
|
- |
|
|
|
|
bearerToken : Jeton bearer. |
|
|
|
|
|
|
|
|
policy : Politique d'autorisation personnalisée. |
|
|
- |
|
- |
|
|
|
roleSessionExpiration : Durée d'expiration de la session en secondes. La valeur par défaut est 3 600. Cette valeur doit être comprise entre 900 et la durée maximale de session du rôle RAM. |
|
|
- |
|
- |
|
|
|
oidcProviderArn : ARN du fournisseur d'identité OIDC. |
|
|
|
|
|
|
|
|
oidcTokenFilePath : Chemin d'accès au fichier du jeton OIDC. |
|
|
|
|
|
|
|
|
externalId : ID externe pour le rôle RAM. Ce paramètre permet d'éviter le problème du « confused deputy ». Pour plus d'informations, consultez Utiliser un ID externe pour éviter le problème du confused deputy. |
|
|
- |
|
|
|
|
|
credentialsURI : URI de l'identifiant externe. |
|
|
|
|
|
|
|
|
STSEndpoint : Endpoint du service Security Token Service (STS). Ce paramètre prend en charge les endpoints VPC et publics. Pour la liste des valeurs possibles, consultez Endpoints de service. La valeur par défaut est |
|
|
- |
|
- |
|
|
|
timeout : Délai d'attente de lecture en millisecondes. La valeur par défaut est 5 000. |
|
|
- |
- |
- |
- |
|
|
connectTimeout : Délai d'attente de connexion en millisecondes. La valeur par défaut est 10 000. |
|
|
- |
- |
- |
- |
|
Utilisation de l'outil Credentials
La section précédente détaille les types d'identifiants et les paramètres de configuration pris en charge par l'outil Credentials. Les sections suivantes fournissent des exemples de code illustrant l'utilisation de cet outil. Choisissez la méthode la plus adaptée à votre scénario.
Coder en dur un AccessKey dans votre projet engendre des risques de sécurité. Une gestion inadéquate des permissions du dépôt peut exposer toutes les ressources de votre compte. Stockez l'AccessKey dans des variables d'environnement ou des fichiers de configuration.
Adoptez le pattern singleton avec l'outil Credentials. Ce pattern active la mise en cache intégrée des identifiants, évitant ainsi la limitation de débit due aux appels API fréquents et le gaspillage de ressources lié à la création de multiples instances. Pour plus d'informations, consultez Actualisation automatique des identifiants de session.
Méthode 1 : Chaîne d'identifiants par défaut
Il s'agit de la méthode par défaut utilisée dans le code d'exemple du portail OpenAPI.
Si aucun paramètre de configuration n'est transmis lors de l'initialisation de l'outil Credentials, celui-ci récupère les identifiants via la chaîne d'identifiants par défaut. Pour utiliser cette méthode, assurez-vous que l'environnement d'exécution de votre application est configuré avec au moins l'une des méthodes de récupération d'identifiants prises en charge par la chaîne d'identifiants par défaut.
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éthode 2 : AK
L'outil Credentials utilise l'AccessKey fourni comme identifiant d'accès.
Un compte Alibaba Cloud (compte root) dispose de permissions complètes sur toutes ses ressources ; un AK exposé représente donc un risque de sécurité majeur. N'utilisez pas l'AK d'un compte root.
Privilégiez l'AK d'un utilisateur RAM doté de permissions minimales.
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éthode 3 : STS token
L'outil Credentials emploie le STS token statique fourni comme identifiant d'accès.
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éthode 4 : AK et ARN de rôle RAM
L'outil Credentials utilise votre AK et l'ARN du rôle RAM pour appeler l'API AssumeRole et obtenir un STS token servant d'identifiant d'accès. Les identifiants obtenus ainsi prennent en charge l'actualisation automatique. Pour plus d'informations, consultez Actualisation automatique des identifiants de session.
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éthode 5 : Rôle RAM d'instance ECS
Si votre application s'exécute sur une instance Elastic Compute Service (ECS) ou Elastic Container Instance (ECI) associée à un rôle RAM, l'outil Credentials récupère un STS token depuis les métadonnées de l'instance pour l'utiliser comme identifiant d'accès. Lors de l'accès aux métadonnées, l'outil commence par récupérer le nom du rôle RAM attribué à l'instance. Spécifiez ce nom via le paramètre roleName ou la variable d'environnement ALIBABA_CLOUD_ECS_METADATA afin de réduire le temps de récupération et d'améliorer l'efficacité. Les identifiants obtenus par ce biais prennent en charge l'actualisation automatique. Pour plus d'informations, consultez Actualisation automatique des identifiants de session.
Par défaut, l'outil Credentials accède aux métadonnées de l'instance en mode sécurisé (IMDSv2). En cas d'échec, utilisez le paramètre disableIMDSv1 ou la variable d'environnement ALIBABA_CLOUD_IMDSV1_DISABLED pour contrôler le comportement de repli :
Avec la valeur
false(par défaut), l'outil revient au mode normal pour récupérer l'identifiant.Avec la valeur
true, l'outil utilise exclusivement le mode sécurisé et lève une exception si l'accès échoue.
La prise en charge d'IMDSv2 par votre serveur dépend de sa configuration.
Pour désactiver l'accès aux identifiants via les métadonnées de l'instance, définissez la variable d'environnement ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
Pour plus d'informations sur les métadonnées d'instance, consultez Métadonnées d'instance.
Pour savoir comment attribuer un rôle RAM à une instance ECS ou ECI, reportez-vous à Étape 1 : Créer un rôle RAM et à Attribuer un rôle RAM d'instance à une instance ECI.
La version 0.3.10 ou ultérieure de credentials-java est requise pour obtenir des identifiants temporaires en mode sécurisé.
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éthode 6 : ARN de rôle OIDC
Si vous utilisez OIDC pour l'authentification et avez créé un rôle RAM pour un fournisseur d'identité OIDC, fournissez l'ARN du fournisseur OIDC, le chemin du fichier de jeton OIDC et l'ARN du rôle RAM à l'outil Credentials. Celui-ci appelle alors automatiquement l'API AssumeRoleWithOIDC pour obtenir un STS token destiné au rôle RAM, utilisé ensuite comme identifiant d'accès. Ces identifiants prennent en charge l'actualisation automatique. Pour plus d'informations, consultez Actualisation automatique des identifiants de session. Par exemple, si votre application s'exécute dans un cluster Container Service for Kubernetes (ACK) avec RRSA activé, l'outil Credentials peut lire la configuration OIDC depuis les variables d'environnement du pod et appeler l'API AssumeRoleWithOIDC pour obtenir un STS token. Utilisez ensuite ce jeton pour accéder aux services 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éthode 7 : URI d'identifiants
Encapsulez le Security Token Service (STS) derrière une URI de service pour permettre aux services externes d'obtenir un STS token sans exposer d'informations sensibles comme les AK. L'outil Credentials exploite ensuite cette URI pour récupérer un STS token servant d'identifiant d'accès. Les identifiants ainsi obtenus prennent en charge l'actualisation automatique. Pour plus d'informations, consultez Actualisation automatique des identifiants de session.
L'URI doit satisfaire aux conditions suivantes :
Prendre en charge les requêtes GET.
Retourner un code de statut HTTP 2xx.
-
Le corps de la réponse doit contenir un objet JSON structuré comme suit :
{ "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éthode 8 : Bearer token
Actuellement, seul Alibaba Cloud Call Center (CCC) prend en charge l'authentification par bearer token.
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.
}
}
Chaîne de fournisseurs d'identifiants par défaut
La chaîne de fournisseurs d'identifiants par défaut constitue un mécanisme de repli qui recherche un identifiant en parcourant une séquence prédéfinie d'emplacements. La recherche se poursuit jusqu'à la découverte d'un identifiant valide. Si aucun identifiant n'est trouvé après vérification de tous les emplacements, une CredentialException est levée. L'ordre de recherche est le suivant :
1. Propriétés système
La chaîne de fournisseurs vérifie d'abord la présence d'un identifiant dans les propriétés système Java.
Si les propriétés système alibabacloud.accessKeyId et alibabacloud.accessKeySecret sont définies, la chaîne utilise un AccessKey comme identifiant par défaut.
Si les propriétés système alibabacloud.accessKeyId, alibabacloud.accessKeySecret et alibabacloud.sessionToken sont définies, la chaîne utilise un STS token comme identifiant par défaut.
Spécifiez ces valeurs en ajoutant les paramètres JVM suivants lors de l'exécution de votre programme Java :
-Dalibabacloud.accessKeyId=your-access-key-id -Dalibabacloud.accessKeySecret=your-access-key-secret
2. Variables d'environnement
En l'absence d'identifiant dans les propriétés système, la chaîne de fournisseurs examine ensuite les variables d'environnement.
Si ALIBABA_CLOUD_ACCESS_KEY_ID et ALIBABA_CLOUD_ACCESS_KEY_SECRET sont présentes et non vides, la chaîne les utilise comme identifiant par défaut.
Si ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET et ALIBABA_CLOUD_SECURITY_TOKEN sont également définies, la chaîne emploie un STS token comme identifiant par défaut.
3. Rôle RAM OIDC
Si aucun identifiant n'a été trouvé, la chaîne de fournisseurs recherche les variables d'environnement suivantes liées à un rôle RAM OIDC :
ALIBABA_CLOUD_ROLE_ARN : ARN du rôle RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN : ARN du fournisseur OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE : Chemin d'accès au fichier du jeton OIDC.
Lorsque ces trois variables d'environnement sont présentes et non vides, la chaîne de fournisseurs s'en sert pour appeler l'API AssumeRoleWithOIDC du Security Token Service (STS) afin d'obtenir un STS token.
4. Fichier d'identifiants partagé
Cette fonctionnalité requiert la version 0.3.8 ou ultérieure de credentials-java.
Faute d'identifiant trouvé précédemment, la chaîne de fournisseurs tente de charger le fichier d'identifiants partagé, config.json, depuis son emplacement par défaut et utilise l'identifiant qu'il contient.
Linux/macOS :
~/.aliyun/config.jsonWindows :
C:\Users\USER_NAME\.aliyun\config.json
Pour configurer un identifiant de cette manière, utilisez Alibaba Cloud CLI ou créez manuellement un fichier config.json au chemin approprié. L'exemple suivant illustre le format du contenu :
{
"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
}
]
}
|
Paramètre |
Description |
|
current |
Spécifiez le nom de l'identifiant pour récupérer la configuration correspondante. Ce nom correspond à la valeur du paramètre |
|
profiles |
Contient un ensemble de configurations d'identifiants. Le paramètre
|
5. Rôle RAM d'instance
Si aucun identifiant n'a encore été trouvé, la chaîne de fournisseurs tente de récupérer un STS token pour le rôle RAM d'instance depuis les métadonnées de l'instance. Ce jeton sert alors d'identifiant par défaut. Pour ce faire, la chaîne obtient d'abord le nom du rôle RAM attribué à l'instance, puis utilise ce rôle pour récupérer le STS token correspondant. Afin de réduire le temps de récupération et d'améliorer l'efficacité, spécifiez directement le nom du rôle RAM via la variable d'environnement ALIBABA_CLOUD_ECS_METADATA.
Par défaut, la chaîne de fournisseurs accède aux métadonnées de l'instance en mode de sécurité renforcée (IMDSv2). Si une exception survient dans ce mode, la variable d'environnement ALIBABA_CLOUD_IMDSV1_DISABLED permet de contrôler le comportement de repli :
Avec la valeur
false(par défaut), le système tente de basculer vers le mode hérité pour récupérer l'identifiant.Avec la valeur
true, le mode de sécurité renforcée est imposé. Tout échec d'accès dans ce mode déclenche une exception.
Par ailleurs, empêchez la chaîne de fournisseurs d'accéder aux métadonnées de l'instance pour les identifiants en définissant la variable d'environnement ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
Pour plus d'informations sur les métadonnées d'instance, consultez Métadonnées d'instance.
Pour savoir comment attribuer un rôle RAM à une instance ECS ou ECI, reportez-vous à Étape 1 : Créer un rôle RAM et à Attribuer un rôle RAM d'instance à une instance ECI.
L'obtention d'un identifiant temporaire en mode de sécurité renforcée exige la version 0.3.10 ou ultérieure de
credentials-java.
6. CredentialsURI
En l'absence d'identifiant trouvé, la chaîne de fournisseurs vérifie la variable d'environnement ALIBABA_CLOUD_CREDENTIALS_URI. Si cette variable est définie et pointe vers une URI valide, la chaîne accède à cette URI pour récupérer un STS token.
Actualisation automatique des identifiants de session
Les types d'identifiants de session, tels que ram_role_arn, ecs_ram_role, oidc_role_arn et credentials_uri, bénéficient d'une actualisation automatique grâce à un mécanisme intégré au fournisseur d'identifiants. Lorsqu'un client d'identifiants récupère un identifiant pour la première fois, le fournisseur le stocke dans un cache. Lors des opérations suivantes, la même instance cliente récupère automatiquement l'identifiant depuis ce cache. Si l'identifiant mis en cache a expiré, l'instance cliente en obtient un nouveau et met à jour le cache en conséquence.
Pour les identifiants ecs_ram_role, le fournisseur d'identifiants procède à une actualisation proactive 15 minutes avant leur expiration.
L'exemple suivant utilise le pattern singleton pour créer un client d'identifiants. Il illustre le mécanisme d'actualisation en récupérant un identifiant à différents intervalles de temps et en appelant une opération OpenAPI pour vérifier la validité de l'identifiant.
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
Analyse basée sur la sortie des journaux :
Lors du premier appel, le cache est vide. Le système récupère un identifiant selon votre configuration, puis le stocke dans le cache.
Le deuxième appel utilise le même identifiant que le premier, ce qui indique qu'il a été extrait du cache.
Au troisième appel, l'identifiant en cache a expiré. Sa durée d'expiration (
RoleSessionExpiration) est de 3 600 secondes, or cet appel intervient 4 200 secondes après le premier. Par conséquent, le mécanisme d'actualisation automatique du SDK récupère un nouvel identifiant et met à jour le cache.Le quatrième appel reprend le même identifiant que le troisième, confirmant ainsi la mise à jour du cache.
Documents connexes
Pour une vue d'ensemble des concepts fondamentaux de RAM, consultez Concepts de base.
Pour créer un AccessKey, reportez-vous à Créer un AccessKey.
Pour créer par programmation des utilisateurs RAM, des AccessKeys et des rôles RAM, définir des politiques d'autorisation et attribuer des permissions, consultez Vue d'ensemble du SDK RAM.
Pour endosser un rôle par programmation, consultez Vue d'ensemble du SDK STS.
Pour plus de détails sur les API RAM et STS, consultez la référence API.