Un compte Alibaba Cloud peut accorder à un autre compte Alibaba Cloud des autorisations spécifiques sur ses ressources en créant et en autorisant un rôle Resource Access Management (RAM). L'autre compte Alibaba Cloud accorde ensuite l'autorisation AssumeRole à un utilisateur RAM qui lui appartient. Cet utilisateur RAM appelle une opération d'API Security Token Service (STS) pour obtenir une paire de clés AccessKey temporaire et un jeton, puis appelle les opérations d'API Simple Log Service.
Présentation de la solution
Supposons que l'entreprise A possède le compte Alibaba Cloud A et que l'entreprise B possède le compte Alibaba Cloud B. Pour répondre à des exigences telles que l'isolation des activités ou la sous-traitance de projets, l'entreprise A souhaite autoriser l'entreprise B à gérer une partie de ses activités Simple Log Service. Les exigences sont les suivantes :
Le compte Alibaba Cloud B dispose des autorisations nécessaires pour écrire des données dans Simple Log Service du compte Alibaba Cloud A et pour utiliser des groupes de consommateurs.
L'utilisateur RAM spécifié du compte Alibaba Cloud B dispose également des autorisations d'écriture et de groupe de consommateurs sur Simple Log Service.
-
Le compte Alibaba Cloud B peut obtenir des identifiants STS temporaires pour accéder aux opérations d'API Simple Log Service. Pour plus d'informations, consultez Qu'est-ce que STS ?.
Sur la base des exigences précédentes, effectuez les étapes suivantes pour terminer la configuration :
Étape 1 : Le compte Alibaba Cloud A crée et autorise un rôle RAM pour le compte Alibaba Cloud B
Étape 2 : Le compte Alibaba Cloud B crée et autorise l'utilisateur RAM user-b
-
Étape 3 : L'utilisateur RAM user-b obtient des identifiants STS temporaires
Un exemple Java complet appelant l'opération AssumeRole, puis écrivant des données dans Simple Log Service, est fourni dans Exemple de code.
Prérequis
Comptes Alibaba Cloud — Le compte Alibaba Cloud A possède les ressources Simple Log Service, et le compte Alibaba Cloud B est le compte autorisé par le compte Alibaba Cloud A.
Ressources Simple Log Service — Un projet et un LogStore existent dans le compte Alibaba Cloud A. L'utilisateur RAM du compte Alibaba Cloud B écrit des données dans ce projet et ce LogStore.
Limites
Avant de configurer l'accès intercomptes à Simple Log Service, tenez compte des limites suivantes :
Identité de l'appelant — Seul un utilisateur RAM (sous-compte) peut appeler l'opération AssumeRole. La paire de clés AccessKey d'un compte Alibaba Cloud ne peut pas appeler AssumeRole.
Validité des identifiants — La paire de clés AccessKey temporaire et le jeton de sécurité expirent au bout d'une heure. Appelez à nouveau l'opération AssumeRole après leur expiration.
Région — STS prend actuellement en charge uniquement
cn-hangzhou. Par conséquent, le projet dans lequel vous écrivez des données doit se trouver dans la région cn-hangzhou.
Étape 1 : Le compte Alibaba Cloud A crée et autorise un rôle RAM pour le compte Alibaba Cloud B
Dans le compte Alibaba Cloud A, créez un rôle RAM, spécifiez le compte Alibaba Cloud B comme compte assumant le rôle et accordez au rôle les autorisations Simple Log Service spécifiées.
Créez le rôle RAM dans la console RAM. Les étapes suivantes décrivent en détail la méthode via la console. Pour créer le rôle RAM par programmation, appelez plutôt l'opération CreateRole de l'API RAM. Pour plus de détails, consultez CreateRole. Pour savoir comment créer des identités RAM et leur accorder des autorisations, consultez Créer un utilisateur RAM et accorder des autorisations.
Utilisez le compte Alibaba Cloud A pour vous connecter à la console RAM.
Créez un rôle RAM et spécifiez le compte Alibaba Cloud B comme compte assumant le rôle. Pour obtenir des instructions, consultez Créer un rôle RAM pour un compte Alibaba Cloud de confiance. Notez l'ARN du rôle. L'étape 3 utilise l'ARN comme valeur de
RoleArn. Vous pouvez obtenir l'ARN sur la page des détails du rôle dans la console RAM :https://ram.console.alibabacloud.com/#/role/detail/<specified_rolename>/info.-
Créez une stratégie personnalisée. Dans l'onglet JSON de la page Créer une stratégie, remplacez le script existant dans l'éditeur de code par le document de stratégie suivant. Pour plus d'informations, consultez Utilisation de l'éditeur de script.
Sélectionnez le script d'autorisation en fonction des autorisations que vous accordez au rôle RAM :
Écriture de données uniquement — Utilisez le script de l'onglet Écriture de données uniquement.
Obtention de données à l'aide de la bibliothèque de consommateurs — Utilisez le script de l'onglet Obtention de données à l'aide de la bibliothèque de consommateurs.
(Recommandé pour le scénario de cette rubrique) Autorisations d'écriture et de groupe de consommateurs — Fusionnez les deux scripts en un seul document de stratégie : conservez
"Version": "1","Effect": "Allow"et"Resource": "*"inchangés, et listez l'action de l'onglet Écriture de données uniquement ainsi que les sept actions de l'onglet Obtention de données à l'aide de la bibliothèque de consommateurs dans un seul tableauAction. Le scénario de cette rubrique nécessite des autorisations d'écriture et des autorisations de groupe de consommateurs.
Écriture de données uniquement
Écriture de données uniquement
{ "Version": "1", "Statement": [ { "Action": "log:PostLogStoreLogs", "Resource": "*", "Effect": "Allow" } ] }Obtention de données à l'aide de la bibliothèque de consommateurs
Obtention de données à l'aide de la bibliothèque de consommateurs
{ "Version": "1", "Statement": [ { "Action": [ "log:GetCursorOrData", "log:CreateConsumerGroup", "log:ListConsumerGroup", "log:ConsumerGroupUpdateCheckPoint", "log:ConsumerGroupHeartBeat", "log:GetConsumerGroupCheckPoint", "log:UpdateConsumerGroup" ], "Resource": "*", "Effect": "Allow" } ] } Attachez la stratégie personnalisée créée au rôle RAM. Pour plus d'informations, consultez Gérer les autorisations d'un rôle RAM.
Étendue des ressources
Les deux scripts d'autorisation précédents définissent "Resource": "*", ce qui accorde des autorisations sur tous les projets et LogStores de l'utilisateur spécifié. Pour accorder des autorisations sur un projet ou un LogStore spécifique, remplacez "Resource": "*" par l'une des valeurs suivantes :
Pour accorder des autorisations sur un projet spécifique :
acs:log::{projectOwnerAliUid}:project/{projectName}/.-
Pour accorder des autorisations sur un LogStore spécifique :
acs:log::{projectOwnerAliUid}:project/{projectName}/logstore/{logstoreName}/.Pour la description complète des ressources, consultez Ressources.
Étape 2 : Le compte Alibaba Cloud B crée et autorise l'utilisateur RAM user-b
Dans le compte Alibaba Cloud B, créez l'utilisateur RAM user-b et accordez-lui la stratégie système AliyunSTSAssumeRoleAccess, qui permet à l'utilisateur d'appeler l'opération AssumeRole de STS.
Utilisez le compte Alibaba Cloud B pour vous connecter à la console RAM.
Créez un utilisateur RAM nommé
user-b. Pour Access Mode, sélectionnez Console Access et Using permanent AccessKey to access. Pour plus d'informations, consultez Créer un utilisateur RAM. Notez l'ID de clé AccessKey et le secret de clé AccessKey deuser-b. L'étape 3 les utilise pour appeler l'opération AssumeRole.Attachez la AliyunSTSAssumeRoleAccess stratégie à l'utilisateur RAM. Ainsi, l'utilisateur RAM peut assumer le rôle RAM pour obtenir des jetons Security Token Service (STS). Pour plus d'informations, consultez Gérer les autorisations des utilisateurs RAM.
Étape 3 : L'utilisateur RAM user-b obtient des identifiants STS temporaires
Dans le compte Alibaba Cloud B, utilisez la paire de clés AccessKey de l'utilisateur RAM user-b pour obtenir des identifiants STS temporaires, puis utilisez ces identifiants pour accéder aux ressources Simple Log Service du compte Alibaba Cloud A. Cette étape nécessite l'ARN du rôle RAM de l'étape 1 et la paire de clés AccessKey de user-b de l'étape 2.
-
Appelez l'opération STS AssumeRole pour obtenir une paire de clés AccessKey temporaire et un jeton. Pour plus de détails, consultez AssumeRole.
Appelez l'opération à l'aide d'un kit SDK STS. Pour plus de détails, consultez Présentation du kit SDK STS.
Appelez les opérations d'API Simple Log Service avec les identifiants temporaires. Pour plus d'informations sur les kits SDK Simple Log Service, consultez Référence des kits SDK. Pour un exemple appelant AssumeRole puis écrivant des données, consultez Exemple de code.
Exemple de code
L'exemple de code suivant est basé sur le kit SDK Java. Il utilise comme exemple le scénario dans lequel l'utilisateur RAM user-b écrit des données dans un projet du compte Alibaba Cloud A en utilisant STS. L'exemple utilise le kit SDK Java Simple Log Service (les packages com.aliyun.openservices.log) et le kit SDK STS (les packages com.aliyuncs). Avant d'exécuter l'exemple, remplacez la paire de clés AccessKey, l'ARN du rôle, le nom du projet et le nom du LogStore par vos propres valeurs.
L'exemple code en dur la paire de clés AccessKey de l'utilisateur RAM dans le code source et imprime la paire de clés AccessKey temporaire et le jeton de sécurité sur la sortie standard. Ces deux pratiques sont uniquement destinées à la démonstration.
package com.aliyun.openservices.log.sample;
import java.util.Date;
import java.util.Vector;
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.LogItem;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.PutLogsRequest;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
public class StsSample {
// STS currently supports only "cn-hangzhou".
public static final String REGION_CN_HANGZHOU = "cn-hangzhou";
// The current STS API version.
public static final String STS_API_VERSION = "2015-04-01";
static AssumeRoleResponse assumeRole(String accessKeyId, String accessKeySecret,
String roleArn, String roleSessionName, String policy,
ProtocolType protocolType) throws ClientException {
try {
// Construct an Alibaba Cloud AcsClient to call OpenAPI.
IClientProfile profile = DefaultProfile.getProfile(REGION_CN_HANGZHOU, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
// Create an AssumeRoleRequest object.
final AssumeRoleRequest request = new AssumeRoleRequest();
request.setVersion(STS_API_VERSION);
request.setMethod(MethodType.POST);
request.setProtocol(protocolType);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
request.setPolicy(policy);
// Send the request.
final AssumeRoleResponse response = client.getAcsResponse(request);
return response;
} catch (ClientException e) {
throw e;
}
}
public static void main(String[] args) {
// Only a RAM user (sub-account) can call the AssumeRole operation.
// The AccessKey pair of an Alibaba Cloud account cannot call AssumeRole.
// Create a RAM user in the RAM console (https://ram.console.alibabacloud.com) and create an AccessKey pair for this RAM user.
String accessKeyId = "<subaccountaccesskey>";
String accessKeySecret = "<subaccountaccesssecret>";
// The AssumeRole API parameters are RoleArn, RoleSessionName, Policy, and DurationSeconds.
// You can obtain the RoleArn in the RAM console.
// https://ram.console.alibabacloud.com/#/role/detail/<specified_rolename>/info
String roleArn = "<rolearn found in web console>";
// RoleSessionName is the name of the temporary token, which is mainly used for auditing.
String roleSessionName = "bluemix-001";
String policy = "{\n" +
" \"Version\": \"1\", \n" +
" \"Statement\": [\n" +
" {\n" +
" \"Action\": \"log:PostLogStoreLogs\",\n" +
" \"Resource\": \"*\",\n" +
" \"Effect\": \"Allow\"\n" +
" }\n" +
" ]\n" +
"}";
System.out.println(policy);
// Only HTTPS is supported here.
ProtocolType protocolType = ProtocolType.HTTPS;
AssumeRoleResponse response = new AssumeRoleResponse();
try {
response = assumeRole(accessKeyId, accessKeySecret,
roleArn, roleSessionName, policy, protocolType);
System.out.println("Expiration: " + response.getCredentials().getExpiration());
System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
} catch (ClientException e) {
System.out.println("Failed to get a token.");
System.out.println("Error code: " + e.getErrCode());
System.out.println("Error message: " + e.getErrMsg());
}
// Simple Log Service parameters.
// For information about Simple Log Service endpoints, see https://www.alibabacloud.com/help/en/sls/developer-reference/api-sls-2020-12-30-endpoint
String logServiceEndpoint = "cn-hangzhou.log.aliyuncs.com";
// This means that the project must reside in the cn-hangzhou region.
String project = "<log service project name>";
String logstore = "<log service logstore name>";
// Construct a Simple Log Service client object.
Client client = new Client(logServiceEndpoint,
response.getCredentials().getAccessKeyId(),
response.getCredentials().getAccessKeySecret());
// Note: The AccessKey pair and the security token expire in one hour.
// You must call the AssumeRole operation again after they expire.
client.SetSecurityToken(response.getCredentials().getSecurityToken());
Vector<LogItem> logGroup = new Vector<LogItem>();
LogItem logItem = new LogItem((int) (new Date().getTime() / 1000));
logItem.PushBack("StsSample", "Send Data");
logGroup.add(logItem);
PutLogsRequest req2 = new PutLogsRequest(project, logstore, "", "", logGroup);
try {
client.PutLogs(req2);
} catch (LogException e) {
System.out.println("Failed to send data.");
System.out.println("Error code: " + e.GetErrorCode());
System.out.println("Error message: " + e.GetErrorMessage());
}
}
}
Lorsque l'appel AssumeRole réussit, l'exemple imprime l'heure d'expiration des identifiants, l'ID de clé AccessKey temporaire, le secret de clé AccessKey et le jeton de sécurité. Si l'appel échoue, l'exemple imprime Failed to get a token. avec le code d'erreur et le message d'erreur. Si l'écriture des données échoue, l'exemple imprime Failed to send data. avec le code d'erreur et le message d'erreur de Simple Log Service.