Le SDK Alibaba Cloud utilise l'outil Credentials pour gérer centralisément les identifiants, tels que votre AccessKey et votre STS Token. Cette rubrique décrit les types d'identifiants pris en charge et leurs méthodes de configuration.
Contexte
Un identifiant est un ensemble d'informations permettant de vérifier l'identité d'un utilisateur. Pour se connecter à un système, l'utilisateur doit fournir des identifiants valides. Les types d'identifiants courants sont les suivants :
L'AccessKey est un identifiant à long terme associé à un compte Alibaba Cloud ou à un utilisateur RAM. Il s'agit d'une paire de clés composée d'un AccessKey ID et d'un AccessKey secret.
Le STS token est un identifiant d'accès temporaire attribué à un rôle RAM. Il inclut une période de validité configurable et des autorisations d'accès spécifiques. Pour plus d'informations, consultez Qu'est-ce que STS.
Le bearer token est un identifiant utilisé pour l'authentification et l'autorisation.
Prérequis
L'outil Credentials nécessite Go 1.10.x ou version ultérieure.
Vous devez utiliser la version V2.0 du SDK Alibaba Cloud. Pour plus d'informations, consultez Utiliser le SDK Alibaba Cloud Go avec un IDE.
Installer Alibaba Cloud Credentials
Si Alibaba Cloud Credentials est déjà installé, ignorez cette étape. Nous vous recommandons d'utiliser la dernière dépendance d'Alibaba Cloud Credentials afin de garantir la prise en charge complète de tous les types d'identifiants. Pour obtenir la liste de toutes les versions publiées, consultez Alibaba Cloud Credentials.
Installez Alibaba Cloud Credentials selon l'une des méthodes suivantes :
-
Méthode 1 : Utilisez
go getpour installer Alibaba Cloud Credentials :$ go get -u github.com/aliyun/credentials-go -
Méthode 2 : Si vous utilisez
deppour gérer les dépendances, exécutez la commande suivante :dep ensure -add github.com/aliyun/credentials-go
Outil Credentials : Paramètres
La structure Config du package github.com/aliyun/credentials-go/credentials définit les paramètres de configuration de l'outil Credentials. Utilisez le paramètre obligatoire type pour spécifier le type d'identifiant, puis configurez les paramètres correspondants. Le tableau suivant répertorie les valeurs valides pour le paramètre type ainsi que les paramètres pris en charge par chaque type d'identifiant. Dans ce tableau, √ indique un paramètre obligatoire, - indique un paramètre facultatif, et × signifie que le paramètre n'est pas pris en charge.
Évitez d'utiliser des types d'identifiants ou des paramètres non répertoriés dans le tableau ci-dessous.
|
Type |
access_key |
sts |
ram_role_arn |
ecs_ram_role |
oidc_role_arn |
credentials_uri |
bearer |
|
AccessKeyId : L'AccessKey ID. |
√ |
√ |
√ |
× |
× |
× |
× |
|
AccessKeySecret : L'AccessKey secret. |
√ |
√ |
√ |
× |
× |
× |
× |
|
SecurityToken : Le STS token. |
× |
√ |
- |
× |
× |
× |
× |
|
RoleArn : L'Alibaba Cloud Resource Name (ARN) du rôle RAM. |
× |
× |
√ |
× |
√ |
× |
× |
|
RoleSessionName : Le nom de session personnalisé. Le format par défaut est |
× |
× |
- |
× |
- |
× |
× |
|
RoleName : Le nom du rôle RAM. |
× |
× |
× |
- |
× |
× |
× |
|
DisableIMDSv1 : Définissez sur true pour activer le mode de renforcement de la sécurité. La valeur par défaut est |
× |
× |
× |
- |
× |
× |
× |
|
BearerToken : Le bearer token. |
× |
× |
× |
× |
× |
× |
√ |
|
Policy : La politique personnalisée. |
× |
× |
- |
× |
- |
× |
× |
|
RoleSessionExpiration : La durée d'expiration de la session, en secondes. La valeur par défaut est 3 600. |
× |
× |
- |
× |
- |
× |
× |
|
OIDCProviderArn : L'Alibaba Cloud Resource Name (ARN) du fournisseur d'identité OpenID Connect (OIDC) (IdP). |
× |
× |
× |
× |
√ |
× |
× |
|
OIDCTokenFilePath : Le chemin vers le fichier de jeton OIDC. |
× |
× |
× |
× |
√ |
× |
× |
|
ExternalId : L'ID externe du rôle. Cet ID permet d'éviter le problème du « confused deputy ». Pour plus d'informations, consultez Utiliser ExternalId pour éviter le problème du confused deputy. |
× |
× |
- |
× |
× |
× |
× |
|
Url : L'URI de l'identifiant. Cette valeur est définie via la méthode SetURLCredential(v string). |
× |
× |
× |
× |
× |
√ |
× |
|
STSEndpoint : L'endpoint STS. Ce paramètre prend en charge les endpoints VPC et publics. Pour la liste des valeurs valides, consultez Endpoints. La valeur par défaut est |
× |
× |
- |
× |
- |
× |
× |
|
Timeout : Le délai d'attente de lecture HTTP, en millisecondes. La valeur par défaut est 5 000. |
× |
× |
- |
- |
- |
- |
× |
|
ConnectTimeout : Le délai d'attente de connexion HTTP, en millisecondes. La valeur par défaut est 10 000. |
× |
× |
- |
- |
- |
- |
× |
Initialiser un client d'identifiants
La section précédente décrit 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. Sélectionnez 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 autorisations du dépôt peut exposer toutes les ressources de votre compte. Il est recommandé de stocker l'AccessKey dans des variables d'environnement ou des fichiers de configuration.
Adoptez le modèle singleton avec l'outil Credentials. Ce modèle active la mise en cache intégrée des identifiants, évitant ainsi la limitation de débit due à des appels API fréquents et prévenant 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 : Utilisation de la chaîne de fournisseurs d'identifiants par défaut
Si vous initialisez le client Credentials sans paramètres, celui-ci utilise la chaîne de fournisseurs d'identifiants par défaut. Pour comprendre comment les identifiants par défaut sont chargés, consultez Chaîne de fournisseurs d'identifiants par défaut.
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
// Pass nil to use the default credential provider chain.
credential, err := credentials.NewCredential(nil)
config := &openapi.Config{}
config.Credential = credential
// The code to initialize a cloud product client is omitted. See the API call example for details.
}
Exemple d'appel API
Méthode 2 : AccessKey
L'outil Credentials utilise l'AccessKey que vous fournissez comme identifiant d'accès.
Un compte Alibaba Cloud (compte racine) dispose d'autorisations complètes sur toutes ses ressources ; par conséquent, un AK exposé représente un risque de sécurité majeur. N'utilisez pas l'AK d'un compte racine.
Privilégiez l'AK d'un utilisateur RAM doté d'autorisations minimales (principe du moindre privilège).
package main
import (
"os"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
credentialsConfig := new(credentials.Config).
SetType("access_key").
SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
akCredential, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = akCredential
// Code to initialize a cloud product client is omitted. See the API call example for details.
}
Exemple d'API
Méthode 3 : STS token
L'outil Credentials utilise le STS token statique que vous fournissez comme identifiant d'accès.
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials"
"os"
)
func main() {
credentialsConfig := new(credentials.Config).
SetType("sts").
// Get the AccessKey ID from the environment variable.
SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// Get the AccessKey secret from the environment variable.
SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// Get the security token from the environment variable.
SetSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))
stsCredential, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = stsCredential
// The initialization code for the cloud product client is omitted. For details, see the API call examples.
}
Appel API
Méthode 4 : AK et RamRoleArn
Cette méthode utilise un STS token en interne. En spécifiant l'ARN (Alibaba Cloud Resource Name) d'un rôle RAM, l'outil Credentials obtient un STS token auprès du service STS. Vous pouvez également utiliser SetPolicy pour restreindre le rôle RAM à un ensemble d'autorisations plus limité.
package main
import (
"fmt"
"os"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
credentialsConfig := new(credentials.Config).
SetType("ram_role_arn").
SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// Specifies the ARN of the RAM role to assume, such as `acs:ram::123456789012****:role/adminrole`. You can also set this with the `ALIBABA_CLOUD_ROLE_ARN` environment variable.
SetRoleArn("<RoleArn>").
// A custom name for the role session. You can also set this with the `ALIBABA_CLOUD_ROLE_SESSION_NAME` environment variable.
SetRoleSessionName("<RoleSessionName>").
// Optional. An inline policy that further restricts the permissions of the temporary credentials. For example, `{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}`
SetPolicy("<Policy>").
// Optional. The session expiration time in seconds.
SetRoleSessionExpiration(3600).
// Optional. The external ID used to prevent the confused deputy problem.
SetExternalId("ExternalId").
// Optional. The STS endpoint. The default is sts.aliyuncs.com. For better network performance, use a region-specific endpoint closer to your application.
SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
arnCredential, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = arnCredential
// This example omits the client initialization code. For more information, see the API call example.
}
Pour en savoir plus sur l'ID externe, consultez Éviter le problème du confused deputy avec les ID externes.
Exemple d'API
Méthode 5 : Rôle RAM d'instance ECS
Vous pouvez attacher un rôle RAM d'instance aux instances ECS et ECI. Les applications s'exécutant sur ces instances peuvent alors utiliser l'outil Credentials pour obtenir automatiquement un STS token et initialiser le client d'identifiants.
Par défaut, l'outil Credentials accède au serveur de métadonnées ECS en mode de renforcement de la sécurité (IMDSv2). En cas d'erreur, l'outil bascule automatiquement en mode normal pour obtenir l'identifiant d'accès. Vous pouvez contrôler ce comportement de basculement en définissant le paramètre disableIMDSv1 ou la variable d'environnement ALIBABA_CLOUD_IMDSV1_DISABLE :
Si la valeur est
false(par défaut), l'outil bascule en mode normal.Si la valeur est
true, l'outil utilise exclusivement le mode de renforcement de la sécurité et lève une exception en cas d'échec.
La prise en charge d'IMDSv2 dépend de la configuration du serveur.
De plus, vous pouvez désactiver l'accès aux identifiants via les métadonnées d'instance ECS en définissant la variable d'environnement ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
L'utilisation du mode de renforcement de la sécurité pour obtenir un STS token requiert la version 1.3.10 ou ultérieure de
credentials-go.Pour plus d'informations sur les métadonnées d'instance ECS, consultez Métadonnées d'instance.
Pour attribuer un rôle RAM à une instance ECS ou ECI, consultez Étape 1 : Créer un rôle RAM et Attribuer un rôle RAM d'instance à une instance ECI.
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials"
)
func _main(args []*string) {
// Initialize a credentials client using an ECS RAM role.
credentialsConfig := new(credentials.Config).
// The credential type.
SetType("ecs_ram_role").
// Optional. The name of the ECS RAM role. If left empty, the name is automatically retrieved. Set this parameter to reduce API calls. You can also set it using the ALIBABA_CLOUD_ECS_METADATA environment variable.
SetRoleName("<RoleName>")
// Optional, defaults to false. A value of `true` enforces security hardening mode (IMDSv2). When set to `false`, the SDK first attempts to retrieve credentials in security hardening mode and falls back to normal mode (IMDSv1) if the attempt fails.
// credentialsConfig.SetDisableIMDSv1(true)
credentialClient, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = credentialClient
// The code to initialize a cloud product client with this config object is omitted. For details, see the API call example.
}
Exemple d'appel API
Méthode 6 : Utilisation d'OIDCRoleArn
Si vous utilisez OIDC pour l'authentification et que vous avez créé un rôle RAM pour un fournisseur d'identité OIDC, vous pouvez fournir l'ARN du fournisseur OIDC, le chemin du fichier de jeton OIDC et l'ARN du rôle RAM à l'outil Credentials. L'outil appelle alors automatiquement l'API AssumeRoleWithOIDC pour obtenir un STS token pour le rôle RAM, qui sert ensuite 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. 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. Vous pouvez ensuite utiliser ce STS token pour accéder aux services Alibaba Cloud.
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.comcom/aliyun/credentials-go/credentials"
"os"
)
func main() {
credentialsConfig := new(credentials.Config).
SetType("oidc_role_arn").
// The OIDC provider ARN. You can set this using the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable.
SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
// The OIDC token file path. You can set this using the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable.
SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
// The RAM role ARN. You can set this using the ALIBABA_CLOUD_ROLE_ARN environment variable.
SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
// The role session name. You can set this using the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
// Optional. Specifies an inline policy to further restrict permissions. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
SetPolicy("<Policy>").
// Optional. Specifies the session expiration in seconds.
SetRoleSessionExpiration(3600).
// Optional. The STS endpoint. The default is sts.aliyuncs.com. For improved network connectivity, use a region-specific endpoint.
SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
oidcCredential, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = oidcCredential
// Code for initializing a cloud product client with the config object is omitted. For more information, see the API call example.
}
Exemple d'API
Méthode 7 : Utilisation d'un identifiant URI
Vous pouvez encapsuler le Security Token Service (STS) derrière une URI de service, permettant ainsi à des services externes d'obtenir un STS token sans exposer d'informations sensibles comme les AK. L'outil Credentials peut ensuite utiliser cette URI pour récupérer 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.
package main
import (
"github.com/aliyun/credentials-go/credentials"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
)
func main() {
credentialsConfig := new(credentials.Config).
SetType("credentials_uri").
// The credential URI. Format: http://local_or_remote_uri/. You can also set this by using the ALIBABA_CLOUD_CREDENTIALS_URI environment variable.
SetURLCredential("<CredentialsUri>")
uriCredential, err := credentials.NewCredential(credentialsConfig)
config := &openapi.Config{}
config.Credential = uriCredential
// The client initialization code for the cloud product is omitted for brevity. For more information, see the API call example.
}
L'URI doit respecter les conditions suivantes :
Prendre en charge les requêtes GET.
-
Le corps de la réponse doit avoir la structure suivante :
{ "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
Exemple d'API
Méthode 8 : Utilisation d'un bearer token
Seul Cloud Call Center (CCC) prend en charge l'initialisation des identifiants avec un bearer token.
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
credentialsConfig := new(credentials.Config).
SetType("bearer").
// Enter your bearer token.
SetBearerToken("<BearerToken>")
bearerCredential, err := credentials.NewCredential(credentialsConfig)
if err != nil {
return
}
config := &openapi.Config{}
config.Credential = bearerCredential
// This example omits the client initialization code. See the API call example for the complete implementation.
}
Exemple d'API
Méthode 9 : Utilisation de CLIProfileCredentialsProvider
Récupère les identifiants d'accès depuis le fichier de configuration des identifiants de l'CLI Alibaba Cloud, config.json.
package main
import (
"github.com/aliyun/credentials-go/credentials"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/aliyun/credentials-go/credentials/providers"
)
func main() {
// CLIProfileCredentialsProvider
provider, err := providers.NewCLIProfileCredentialsProviderBuilder().
// Optional. Specifies the profile name. The resolution precedence is: explicit profileName > ALIBABA_CLOUD_CONFIG_FILE environment variable > 'current' profile in config.json.
WithProfileName("<PROFILE_NAME>").
// Optional. Specifies the path to the configuration file (which must be a .json file). The resolution precedence is: the specified profileFile > the ALIBABA_CLOUD_CONFIG_FILE environment variable > the default path ~/.aliyun/config.json.
WithProfileFile("<PROFILE_FILE_PATH>").
Build()
if err != nil {
return
}
credential := credentials.FromCredentialsProvider("cli_profile", provider)
config := &openapi.Config{}
config.Credential = credential
// The code for initializing a cloud product client with the config object is omitted for brevity.
}
Vous pouvez configurer les identifiants via la CLI Alibaba Cloud, ou créer manuellement le fichier de configuration config.json au chemin suivant :
Linux :
~/.aliyun/config.jsonWindows :
C:\Users\USER_NAME\.aliyun\config.json
Le contenu du fichier doit respecter le format suivant :
{
"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
},
{
"name": "<PROFILE_NAME6>",
"mode": "CloudSSO",
"cloud_sso_sign_in_url": "https://******/login",
"access_token": "eyJraWQiOiJiYzViMzUwYy******",
"cloud_sso_access_token_expire": 1754316142,
"cloud_sso_access_config": "ac-00s1******",
"cloud_sso_account_id": "151266******"
}
]
}
Dans le fichier config.json, utilisez le paramètre mode pour spécifier le type d'identifiant :
AK : Utilise une Access Key.
StsToken : Utilise un STS token.
RamRoleArn : Endosse un rôle RAM via son ARN pour obtenir l'identifiant.
EcsRamRole : Endosse le rôle RAM attaché à une instance ECS pour obtenir l'identifiant.
OIDC : Utilise un ARN de fournisseur OIDC et un jeton OIDC pour obtenir l'identifiant.
ChainableRamRoleArn : Utilise une chaîne de rôles, où
source_profilespécifie le nom d'autres identifiants dans le fichier de configurationconfig.jsonafin de récupérer de nouveaux identifiants.-
CloudSSO : Utilise l'identifiant obtenu par un utilisateur Cloud SSO via la CLI Alibaba Cloud.
RemarqueLes identifiants CloudSSO nécessitent la version 1.4.7 ou ultérieure de
github.com/aliyun/credentials-go, et la configuration ne peut être obtenue que via la CLI Alibaba Cloud. Pour plus d'informations, consultez Utiliser la CLI pour se connecter à CloudSSO et accéder aux ressources Alibaba Cloud.
Une fois la configuration terminée, le fournisseur initialise un identifiant basé sur le nom de profil spécifié.
Exemple d'appel API
Chaîne de fournisseurs d'identifiants par défaut
Lorsque les environnements de développement et de production nécessitent différents types d'identifiants, il est courant d'écrire du code conditionnel pour récupérer les identifiants selon l'environnement actuel. La chaîne de fournisseurs d'identifiants par défaut simplifie ce processus, vous permettant d'utiliser une base de code unique et de contrôler la récupération des identifiants via une configuration externe. Lorsque vous initialisez un client d'identifiants en appelant NewCredential() sans aucun paramètre, le SDK Alibaba Cloud recherche les identifiants dans l'ordre suivant.
1. Variables d'environnement
Si aucun identifiant n'est trouvé dans les propriétés système, la chaîne de fournisseurs vérifie ensuite les variables d'environnement.
Si ALIBABA_CLOUD_ACCESS_KEY_ID et ALIBABA_CLOUD_ACCESS_KEY_SECRET sont présents et non vides, la chaîne de fournisseurs 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éfinis, la chaîne de fournisseurs utilise un STS token comme identifiant par défaut.
2. Rôle RAM OIDC
Si aucun identifiant n'a été trouvé, la chaîne de fournisseurs vérifie les variables d'environnement suivantes liées à un rôle RAM OIDC :
ALIBABA_CLOUD_ROLE_ARN : L'ARN du rôle RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN : L'ARN du fournisseur OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE : Le chemin du fichier de jeton OIDC.
Si ces trois variables d'environnement sont présentes et non vides, la chaîne de fournisseurs utilise ces valeurs pour appeler l'API AssumeRoleWithOIDC du Security Token Service (STS) afin d'obtenir un STS token.
3. Fichier config.json
Si aucun identifiant de priorité supérieure n'est trouvé, l'outil Credentials charge le fichier config.json. Les chemins par défaut pour ce fichier sont les suivants :
Linux/macOS :
~/.aliyun/config.jsonWindows :
C:\Users\USER_NAME\.aliyun\config.json
À partir de la version github.com/aliyun/credentials-go@1.4.4, vous pouvez personnaliser le chemin du fichier config.json via la variable d'environnement ALIBABA_CLOUD_CONFIG_FILE. Cette variable d'environnement prévaut sur le chemin par défaut.
Pour configurer les identifiants avec cette méthode, vous pouvez utiliser la CLI Alibaba Cloud ou créer manuellement un fichier config.json au chemin approprié. L'exemple suivant montre le format du fichier :
{
"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
},
{
"name": "<PROFILE_NAME6>",
"mode": "CloudSSO",
"cloud_sso_sign_in_url": "https://******/login",
"access_token": "eyJraWQiOiJiYzViMzUwYy******",
"cloud_sso_access_token_expire": 1754316142,
"cloud_sso_access_config": "ac-00s1******",
"cloud_sso_account_id": "151266******"
},
{
"name": "<PROFILE_NAME7>",
"mode": "OAuth",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>",
"region_id": "<REGION_ID>",
"output_format": "json",
"language": "<zh|en>",
"sts_expiration": "<STS_EXPIRATION>",
"oauth_access_token": "<OAUTH_ACCESS_TOKEN>",
"oauth_refresh_token": "<OAUTH_REFRESH_TOKEN>",
"oauth_access_token_expire": 1754316142,
"oauth_site_type": "<CN|EN>"
}
]
}
Dans le fichier config.json, vous pouvez utiliser le paramètre mode pour spécifier différents types d'identifiants :
AK : Utilise la clé d'accès d'un utilisateur comme identifiant.
StsToken : Utilise un STS token comme identifiant.
RamRoleArn : Utilise un ARN de rôle RAM pour obtenir les identifiants.
EcsRamRole : Utilise le rôle RAM attaché à une instance ECS pour obtenir les identifiants.
OIDC : Utilise un ARN de fournisseur OIDC et un jeton OIDC pour obtenir les identifiants.
ChainableRamRoleArn : Implémente une chaîne de rôles. Utilisez le paramètre
source_profilepour spécifier un autre profil dans le fichierconfig.jsonà partir duquel obtenir de nouveaux identifiants.OAuth : Utilise les identifiants obtenus en se connectant via OAuth à l'aide de la CLI Alibaba Cloud.
CloudSSO : Utilise les identifiants obtenus par un utilisateur CloudSSO via la CLI Alibaba Cloud.
Les identifiants OAuth nécessitent la version 1.4.8 ou ultérieure de
github.com/aliyun/credentials-go. La configuration ne peut être obtenue que via la CLI Alibaba Cloud. Pour plus d'informations, consultez Utiliser la CLI pour obtenir des identifiants OAuth.Les identifiants CloudSSO nécessitent la version 1.4.7 ou ultérieure de
github.com/aliyun/credentials-go. La configuration ne peut être obtenue que via la CLI Alibaba Cloud. Pour plus d'informations, consultez Utiliser la CLI Alibaba Cloud pour se connecter à CloudSSO et accéder aux ressources Alibaba Cloud.
Après la configuration, Credentials initialise le client en utilisant le profil spécifié dans le champ current du fichier de configuration. Vous pouvez également spécifier un profil en définissant la variable d'environnement ALIBABA_CLOUD_PROFILE. Par exemple, définissez la valeur de ALIBABA_CLOUD_PROFILE sur client1.
4. Rôle RAM d'instance ECS
Si aucun identifiant de priorité supérieure n'est trouvé, Credentials les obtient à partir du rôle RAM attaché à une instance ECS. Par défaut, Credentials utilise IMDSv2 pour accéder au service de métadonnées ECS et récupérer un STS token pour le rôle RAM d'instance ECS. Ce processus implique deux requêtes : la première pour obtenir le nom du rôle depuis le service de métadonnées, et la seconde pour récupérer les identifiants. Pour réduire cela à une seule requête, vous pouvez spécifier directement le nom du rôle RAM d'instance en définissant la variable d'environnement ALIBABA_CLOUD_ECS_METADATA. Si une erreur survient lors de l'utilisation d'IMDSv2, Credentials bascule automatiquement vers IMDSv1. Vous pouvez contrôler ce comportement de basculement en définissant la variable d'environnement ALIBABA_CLOUD_IMDSV1_DISABLE :
Lorsque la valeur est
false, l'outil bascule vers IMDSv1 pour récupérer les identifiants si la requête IMDSv2 échoue.Lorsque la valeur est
true, l'outil utilise uniquement IMDSv2. Si la requête échoue, une exception est levée.
La prise en charge d'IMDSv2 par le serveur dépend de votre configuration serveur.
Vous pouvez également désactiver l'accès aux identifiants depuis le service de métadonnées ECS en définissant la variable d'environnement ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
Pour plus d'informations sur les métadonnées d'instance ECS, consultez Métadonnées d'instance.
Pour savoir comment attribuer un rôle RAM à une instance ECS ou ECI, consultez Étape 1 : Créer un rôle RAM et Attribuer un rôle RAM d'instance à une instance ECI.
5. URI d'identifiants
Si aucun identifiant n'a été 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 à l'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, prennent en charge l'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 de client récupère automatiquement l'identifiant depuis ce cache. Si l'identifiant mis en cache a expiré, l'instance de client en récupère un nouveau et met à jour le cache en conséquence.
Pour les identifiants ecs_ram_role, le fournisseur d'identifiants les actualise de manière proactive 15 minutes avant leur expiration.
L'exemple suivant utilise le modèle singleton pour créer un client d'identifiants. Il démontre 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 que l'identifiant est utilisable.
package main
import (
"fmt"
"log"
"os"
"sync"
"time"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/client"
util "github.comcom/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
"github.com/aliyun/credentials-go/credentials"
)
// Credential manages the singleton instance of Alibaba Cloud credentials.
type Credential struct {
instance credentials.Credential
once sync.Once
}
var credentialInstance = &Credential{}
func GetCredentialInstance() credentials.Credential {
credentialInstance.once.Do(func() {
cfg := &credentials.Config{
Type: tea.String("ram_role_arn"),
AccessKeyId: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
RoleArn: tea.String(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")),
RoleSessionName: tea.String("RamRoleArnTest"),
RoleSessionExpiration: tea.Int(3600),
}
var err error
credentialInstance.instance, err = credentials.NewCredential(cfg)
if err != nil {
log.Fatalf("Credential initialization failed: %v", err)
}
})
return credentialInstance.instance
}
// EcsClient manages the singleton instance of the ECS client.
type EcsClient struct {
instance *ecs20140526.Client
once sync.Once
}
var ecsClientInstance = &EcsClient{}
func GetEcsClientInstance(cred credentials.Credential) *ecs20140526.Client {
ecsClientInstance.once.Do(func() {
cfg := &openapi.Config{
Endpoint: tea.String("ecs.cn-hangzhou.aliyuncs.com"),
Credential: cred,
}
var err error
ecsClientInstance.instance, err = ecs20140526.NewClient(cfg)
if err != nil {
log.Fatalf("ECS client initialization failed: %v", err)
}
})
return ecsClientInstance.instance
}
// Run the main task.
func runTask() {
cred := GetCredentialInstance()
credentialModel, err := cred.GetCredential()
if err != nil {
log.Printf("Failed to get credential: %v", err)
return
}
fmt.Println(time.Now())
fmt.Printf("AK ID: %s, AK Secret: %s, STS Token: %s\n",
*credentialModel.AccessKeyId,
*credentialModel.AccessKeySecret,
*credentialModel.SecurityToken)
ecsClient := GetEcsClientInstance(cred)
req := &ecs20140526.DescribeRegionsRequest{}
runtime := &util.RuntimeOptions{}
resp, err := ecsClient.DescribeRegionsWithOptions(req, runtime)
if err != nil {
log.Printf("ECS API call failed: %v", err)
return
}
fmt.Printf("Invoke result: %d\n", *resp.StatusCode)
}
func main() {
done := make(chan bool)
// Start a goroutine to run scheduled tasks.
go func() {
tick := time.NewTicker(1 * time.Second)
defer tick.Stop()
executionCount := 0
delays := []time.Duration{0, 600, 3600, 100} // Delay in seconds.
for {
select {
case <-tick.C:
if executionCount < len(delays) {
delay := delays[executionCount]
time.Sleep(delay * time.Second)
runTask()
executionCount++
} else {
close(done)
return
}
}
}
}()
<-done
fmt.Println("All tasks completed. Exiting...")
}
2025-05-29 10:56:24.7142698 +0800 CST m=+1.418627901
AK ID: STS.NXFN xxx 33d7Da, AK Secret: 3QdoQASHSyt xxx UGNjZaHsEGXZXc, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5vZBf3Biotj1o6MQGjFgTI2eLwfi/Lvgzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7VsDs194Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx m5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAvw3VhNiQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx D2hT+Bi3HLQztLtlrnMQdpz0agAFDeioHfrugVbFZyY9ggw28Pyx4ckcndsp1cWIU/kwT5HYClH6X7ArciY+H1V01Nh1W7dDFIiwn5htgzQkn1K2xXKA1SNzCjy076rXe7F+BNGES3mUPuTTk
irb467Kb6f3SHj7 xxx J6DPHSj/VzDSAA
Invoke result: 200
2025-05-29 11:06:25.3225563 +0800 CST m=+602.026914401
AK ID: STS.NXFN xxx 33d7Da, AK Secret: 3QdoQASHSyt xxx UGNjZaHsEGXZXc, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5vZBf3Biotj1o6MQGjFgTI2eLwfi/Lvgzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7VsDs194Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx m5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAvw3VhNiQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx D2hT+Bi3HLQztLtlrnMQdpz0agAFDeioHfrugVbFZyY9ggw28Pyx4ckcndsp1cWIU/kwT5HYClH6X7ArciY+H1V01Nh1W7dDFIiwn5htgzQkn1K2xXKA1SNzCjy076rXe7F+BNGES3mUPuTTk
irb467Kb6f3SHj7 xxx J6DPHSj/VzDSAA
Invoke result: 200
2025-05-29 12:06:26.039859 +0800 CST m=+4202.744217101
AK ID: STS.NWDS xxx 73kVg5u, AK Secret: C3tJCLkszB3 xxx PHGcUroGruw8D, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5TxGOKBjrYY1ZCEWmrFr2YUO7xHuaKelzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7Vtz5F96Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx 5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAsQnUp9tQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx 2hT+Bi3HLQztcMoybMQdpz0agAExoac2PSXrXSXyh4J+ekl0xNIztOFEAJJ2qTkuUgP1AKZIsZYdnX+yHJ1XJpD/yd6pKCEmUSzBwR+Q+S1BmhDANmVRzwUG8QJwxD6bTEvjUwhpGUOKLJL6b
FoBpJJ4WDZRliiw0 xxx y8sGj81a/iiAA
Invoke result: 200
2025-05-29 12:08:06.3556621 +0800 CST m=+4303.060020201
AK ID: STS.NWDS xxx 73kVg5u, AK Secret: C3tJCLkszB3 xxx PHGcUroGruw8D, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5TxGOKBjrYY1ZCEWmrFr2YUO7xHuaKelzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7Vtz5F96Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx 5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAsQnUp9tQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx 2hT+Bi3HLQztcMoybMQdpz0agAExoac2PSXrXSXyh4J+ekl0xNIztOFEAJJ2qTkuUgP1AKZIsZYdnX+yHJ1XJpD/yd6pKCEmUSzBwR+Q+S1BmhDANmVRzwUG8QJwxD6bTEvjUwhpGUOKLJL6b
FoBpJJ4WDZRliiw0 xxx y8sGj81a/iiAA
Invoke result: 200
All tasks completed. Exiting...
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, indiquant qu'il a été récupéré depuis le cache.
Lors du troisième appel, l'identifiant mis en cache a expiré. Sa durée d'expiration (
RoleSessionExpiration) est de 3 600 secondes, mais cet appel est effectué 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 utilise le même identifiant que le troisième, confirmant que le cache a bien été mis à jour.
Documents connexes
Pour une vue d'ensemble des concepts de base de RAM, consultez Concepts de base.
Pour créer un AccessKey, consultez Créer un AccessKey.
Pour créer programmatiquement des utilisateurs RAM, des AccessKeys et des rôles RAM, définir des politiques d'autorisation et attribuer des autorisations, consultez Vue d'ensemble du SDK RAM.
Pour endosser un rôle programmatiquement, consultez Vue d'ensemble du SDK STS.
Pour plus de détails sur les API RAM et STS, consultez la référence API.