Lorsque vous appelez des opérations d'API pour gérer des ressources cloud via les SDK Alibaba Cloud, vous devez configurer des informations d'identification valides. Cette rubrique explique comment configurer un identifiant d'accès pour Alibaba Cloud SDK V1.0 for Go. Ces identifiants renforcent le contrôle d'accès lors du développement avec le SDK.
Informations générales
Lorsque vous utilisez les SDK Alibaba Cloud pour vos développements, configurez un type d'identifiant adapté à votre scénario métier et à vos exigences de contrôle des autorisations. Pour garantir la stabilité et la fiabilité de votre application, définissez correctement les variables d'environnement ou les fichiers de configuration afin que le SDK puisse lire et utiliser ces identifiants.
Prérequis
Go 1.10.x ou version ultérieure est installé.
-
La bibliothèque principale d'Alibaba Cloud SDK for Go est installée.
go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk
Initialiser un client Credentials
Méthode 1 : Utiliser la chaîne de fournisseurs d'identifiants par défaut
Si aucune méthode d'initialisation n'est spécifiée pour le client SDK, la chaîne de fournisseurs d'identifiants par défaut s'applique automatiquement. Pour plus d'informations, consultez la section Chaîne de fournisseurs d'identifiants par défaut de cette rubrique.
package main
import (
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials/provider"
)
func main() {
config := sdk.NewConfig()
// No value is specified for this parameter.
credential := credentials.NewDefaultCredentialsProvider()
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Méthode 2 : Utiliser une paire d'AccessKey
Vous pouvez créer une paire d'AccessKey pour les comptes Alibaba Cloud et les utilisateurs Resource Access Management (RAM) afin d'appeler des API. Cette paire d'AccessKey permet d'initialiser un client SDK.
Une paire d'AccessKey associée à un compte Alibaba Cloud dispose d'un accès complet à toutes les ressources de ce compte. La fuite d'une telle paire représente une menace critique pour la sécurité de vos ressources. Nous vous recommandons d'utiliser la paire d'AccessKey d'un utilisateur RAM et de la renouveler régulièrement. Pour savoir comment créer une paire d'AccessKey pour un utilisateur RAM, consultez Créer une paire d'AccessKey.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewStaticAKCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"): Obtain the AccessKey ID of the RAM user from an environment variable.
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"): Obtain the AccessKey secret of the RAM user from an environment variable.
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Méthode 3 : Utiliser un token STS
Pour sécuriser vos activités, demandez des identifiants de sécurité temporaires (TSC) auprès du Security Token Service (STS) afin de créer un client temporaire.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewStaticSTSCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"): Obtain the AccessKey ID of the RAM user from an environment variable.
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"): Obtain the AccessKey secret of the RAM user from an environment variable.
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"): Obtain the STS token from the environment variable.
WithSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN")).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Méthode 4 : Utiliser une paire d'AccessKey et un rôle RAM
Spécifiez l'ARN (Alibaba Cloud Resource Name) d'un rôle RAM pour initialiser un client SDK. Avant d'envoyer des requêtes API, le client doit obtenir un token STS en appelant l'API STS. Pour restreindre les autorisations associées au token STS, configurez une politique personnalisée dans RAM.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
credential, err := credentials.NewRAMRoleARNCredentialsProviderBuilder().
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"): Required. Obtain the AccessKey ID of the RAM user from the environment variable.
WithAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
// os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"): Required. Obtain the AccessKey secret of the RAM user from the environment variable.
WithAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
// "<Role_Arn>" Required. The ARN of the RAM role. You can obtain the ARN of a RAM role in the RAM console. Example: acs:ram::123456789012****:role/adminrole.
WithRoleArn("<Role_Arn>").
// "<ROLE_SESSION_NAME>" Required. The name of the role session, which is used to distinguish different sessions. Example: alice.
WithRoleSessionName("<ROLE_SESSION_NAME>").
// "<POLICY>": Specify a custom policy to limit the role session permissions. Example: {\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}.
WithPolicy("<POLICY>").
// "<EXTERNAL_ID>": Specify an external ID for the role, in case it is confused with the deputy. Example: abcd1234.
WithExternalId("<EXTERNAL_ID>").
// <ROLE_SESSION_EXPIRATION>: the validity period of the token. Example: 3600.
WithDurationSeconds(3600).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Méthode 5 : Utiliser le rôle RAM d'une instance ECS
Attachez un rôle RAM à une instance ECS ou à une instance de conteneur élastique. L'outil Credentials récupère automatiquement le rôle RAM associé à l'instance et utilise le serveur de métadonnées pour obtenir le token STS correspondant. Ce token sert ensuite à initialiser un client Credentials.
L'accès aux métadonnées de l'instance s'effectue en mode normal ou en mode renforcé. Par défaut, l'outil Credentials obtient les identifiants en mode renforcé via Instance Metadata Service Version 2 (IMDSv2). Si une exception survient dans ce mode, configurez le paramètre DisableIMDSv1 pour définir la logique de gestion des exceptions. Valeurs possibles pour DisableIMDSv1 :
Si le paramètre est défini sur
false(valeur par défaut), l'identifiant d'accès est obtenu en mode normal.true: L'exception est levée et l'outil Credentials continue d'obtenir l'identifiant d'accès en mode renforcé.
La prise en charge du mode renforcé (IMDSv2) dépend de la configuration du serveur de métadonnées.
Pour plus d'informations sur les métadonnées d'instance, consultez Obtenir les métadonnées d'instance.
Pour savoir comment attacher un rôle RAM à une instance ECS, reportez-vous à la section « Créer un rôle RAM d'instance et l'attacher à une instance ECS » de la rubrique Rôles RAM d'instance. Concernant les instances de conteneur élastique, consultez la section « Attribuer le rôle RAM d'instance à une instance de conteneur élastique » de la rubrique Utiliser un rôle RAM d'instance via des appels d'API.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// Use an STS token to initialize an SDK client. The STS token is obtained by using the RAM role attached to an ECS instance.
// This method is suitable for the programs that run on ECS instances and need to access other Alibaba Cloud resources.
credential, err := credentials.NewECSRAMRoleCredentialsProviderBuilder().
// "<ROLE_NAME>": Specify the name of the RAM role that you want to use. You can specify a default value for the roleName parameter in the environment variable ALIBABA_CLOUD_ECS_METADATA. Example: alice.
WithRoleName(os.Getenv("ALIBABA_CLOUD_ECS_METADATA")).
// A value of true specifies that the security hardening mode is forcibly used. The default value is false, which specifies that the system first tries to obtain the access credential in security hardening mode. If the access credential fails to be obtained, the normal mode is used.
//WithDisableIMDSv1(true).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Méthode 6 : Utiliser le rôle RAM d'un IdP OIDC
Après avoir attaché un rôle RAM à un nœud de travail dans un cluster Container Service for Kubernetes (ACK), les pods de ce nœud peuvent obtenir un token STS via le serveur de métadonnées. Toutefois, autoriser des applications non approuvées (dont le code n'est pas divulgué par le client, par exemple) à accéder aux tokens STS via ce service présente des risques de sécurité. Pour prévenir ces risques et appliquer le principe du moindre privilège (PoLP), nous recommandons d'utiliser la fonctionnalité RAM Roles for Service Account. Elle renforce la sécurité des ressources cloud tout en permettant aux applications non approuvées d'obtenir des tokens STS de manière sécurisée. Dans ce cas, le cluster ACK crée un fichier de token OpenID Connect (OIDC) de compte de service, l'associe au pod, puis injecte les variables d'environnement correspondantes. L'outil Credentials exploite ensuite ces variables pour appeler l'opération AssumeRoleWithOIDC de STS et récupérer le token STS du rôle RAM. Pour en savoir plus sur la fonctionnalité RRSA, consultez Utiliser RRSA pour autoriser différents pods à accéder à différents services cloud. Les variables d'environnement suivantes sont injectées dans le pod :
ALIBABA_CLOUD_ROLE_ARN : l'ARN du rôle RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN : l'ARN de l'IdP OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE : le chemin du fichier de token OIDC.
package main
import (
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// Use the RAM role of the OIDC identity provider (IdP) to initialize an SDK client.
credential, err := credentials.NewOIDCCredentialsProviderBuilder().
// Specify the ARN of the OIDC IdP by specifying the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable.
WithOIDCProviderARN(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
// Specify the path of the OIDC token file by specifying the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable.
WithOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
// "<Role_Arn>" Required. The ARN of the RAM role. You can obtain the ARN of a RAM role in the RAM console. Example: acs:ram::123456789012****:role/adminrole.
WithRoleArn("<Role_Arn>").
// "<ROLE_SESSION_NAME>" Required. Specify a name for the role session. Example: alice.
WithRoleSessionName("<ROLE_SESSION_NAME>").
// "<POLICY>": Optional. Grant limited permissions for the RAM role. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
WithPolicy("<POLICY>").
// <ROLE_SESSION_EXPIRATION>: Specify a validity period for the session. Example: 3600.
WithDurationSeconds(3600).
Build()
if err != nil {
panic(err)
}
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Méthode 7 : Utiliser un bearer token
Seul Cloud Call Center permet d'utiliser un bearer token pour initialiser un client SDK.
package main
import (
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
)
func main() {
config := sdk.NewConfig()
// <BEARER_TOKEN> specifies a type of authentication method for API calls.
credential := credentials.NewBearerTokenCredentialsProvider("<BEARER_TOKEN>")
// <REGION_ID>: Specify the Alibaba Cloud region that the SDK client needs to access. Example: cn-hangzhou.
client, err := sdk.NewClientWithOptions("<REGION_ID>", config, credential)
if err != nil {
panic(err)
}
// The step of calling an API operation is omitted.
}
Chaîne de fournisseurs d'identifiants par défaut
Pour utiliser différents types d'identifiants selon les environnements de développement et de production, il faut généralement détecter l'environnement depuis le code et implémenter des branches conditionnelles pour récupérer l'identifiant approprié. La chaîne de fournisseurs d'identifiants par défaut de l'outil Credentials permet d'utiliser un code unique pour obtenir les identifiants adaptés à chaque environnement, grâce à une configuration externe à l'application. Si vous initialisez un client Credentials avec credentials.NewDefaultCredentialsProvider() sans préciser de méthode spécifique, l'outil recherche les informations d'identification dans l'ordre suivant :
1. Récupération des identifiants depuis les variables d'environnement
En l'absence d'identifiant trouvé à l'étape précédente, l'outil Credentials interroge les variables d'environnement.
Si les variables d'environnement système ALIBABA_CLOUD_ACCESS_KEY_ID (AccessKey ID) et ALIBABA_CLOUD_ACCESS_KEY_SECRET (AccessKey secret) sont définies, l'outil utilise la paire d'AccessKey correspondante comme identifiant par défaut.**
Si les variables d'environnement système ALIBABA_CLOUD_ACCESS_KEY_ID (AccessKey ID), ALIBABA_CLOUD_ACCESS_KEY_SECRET (AccessKey secret) et ALIBABA_CLOUD_SECURITY_TOKEN (token STS) sont définies, l'outil utilise le token STS spécifié comme identifiant par défaut.
2. Récupération des identifiants via le rôle RAM d'un IdP OIDC
Si aucun identifiant n'a été trouvé précédemment, l'outil Credentials vérifie les variables d'environnement suivantes :
ALIBABA_CLOUD_ROLE_ARN : l'ARN du rôle RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN : l'ARN de l'IdP OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE : le chemin du fichier de token OIDC.
Lorsque ces trois variables sont présentes, l'outil appelle l'opération AssumeRoleWithOIDC de STS pour obtenir un token STS utilisé comme identifiant par défaut.
3. Récupération des identifiants depuis le fichier config.json
Faute d'identifiant disponible, la chaîne de fournisseurs tente de charger le fichier d'identifiants partagés config.json depuis son emplacement par défaut et applique 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é. Le format du contenu est illustré ci-dessous :
{
"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 l'ensemble des configurations d'identifiants. Le paramètre
|
4. Récupération des identifiants depuis le rôle RAM de l'instance ECS
Si aucune étape précédente n'a abouti, l'outil Credentials lit la variable d'environnement ALIBABA_CLOUD_ECS_METADATA qui indique le nom du rôle RAM d'une instance ECS. Lorsque ce rôle existe, l'application obtient son token STS comme identifiant par défaut via le serveur de métadonnées ECS en mode renforcé (IMDSv2). En cas d'exception dans ce mode, l'outil bascule automatiquement vers le mode normal. Vous pouvez également définir la variable d'environnement ALIBABA_CLOUD_IMDSV1_DISABLED pour contrôler la gestion des exceptions. Valeurs possibles :
false(par défaut) : L'outil Credentials poursuit la récupération de l'identifiant en mode normal.true: L'exception est levée et l'outil continue d'obtenir l'identifiant en mode renforcé.
La compatibilité avec le mode renforcé (IMDSv2) dépend de la configuration du serveur de métadonnées.
5. Utilisation d'un URI d'identifiant
À défaut d'identifiant trouvé auparavant, l'outil Credentials consulte la variable d'environnement ALIBABA_CLOUD_CREDENTIALS_URI contenant l'URI de l'identifiant. Si cet URI est valide, l'application l'utilise pour obtenir un token STS servant d'identifiant par défaut.