Une application mobile peut utiliser un jeton STS associé à un rôle RAM pour accéder de manière sécurisée aux ressources Alibaba Cloud, sans intégrer d'identifiants à long terme.
Informations générales
Une entreprise développe une application mobile qui utilise Object Storage Service (OSS). L'application doit se connecter directement à OSS pour téléverser ou télécharger des données, mais elle s'exécute sur les appareils mobiles des utilisateurs finaux, que l'entreprise ne contrôle pas.
L'entreprise répond aux exigences suivantes :
Transfert direct des données : l'entreprise souhaite que l'application se connecte directement à OSS pour les téléversements et les téléchargements, plutôt que de faire transiter les données par le serveur d'applications backend.
Gestion sécurisée des identifiants : l'entreprise doit éviter d'intégrer des identifiants à long terme, tels qu'un AccessKey, dans l'application mobile. Les appareils des utilisateurs finaux constituent des environnements d'exécution non fiables.
Maîtrise des risques : conformément au principe du moindre privilège, chaque application doit disposer d'autorisations minimales et d'une session de courte durée lors de la connexion à OSS.
Solution
Lorsque l'application mobile doit téléverser ou télécharger des données depuis OSS, elle demande des identifiants au serveur d'applications. Ce dernier, en tant qu'utilisateur RAM, assume un rôle RAM en appelant l'opération STS AssumeRole et transmet le jeton STS renvoyé à l'application, qui l'utilise ensuite pour accéder à OSS.

L'application demande des identifiants au serveur d'applications.
-
Créez un rôle RAM et accordez-lui les autorisations requises.
Pour plus d'informations, consultez la rubrique Créer un rôle RAM et accorder des autorisations .
-
Créez un utilisateur RAM pour le serveur d'applications et autorisez cet utilisateur à assumer le rôle RAM.
Pour plus d'informations, consultez la rubrique Créer un utilisateur RAM et autoriser l'utilisateur à assumer un rôle RAM .
-
Le serveur d'applications appelle l'opération STS AssumeRole pour obtenir un jeton STS pour le rôle RAM.
Pour plus d'informations, consultez la rubrique Obtenir un jeton STS sur le serveur d'applications .
-
Le serveur d'applications peut restreindre davantage les autorisations du jeton STS afin d'offrir un contrôle plus granulaire pour chaque client d'application.
Pour plus d'informations, consultez la rubrique Limiter les autorisations d'un jeton STS .
-
Lorsque l'application doit téléverser ou télécharger directement des données, elle utilise le jeton STS pour accéder à OSS.
Pour plus d'informations, consultez la rubrique Utiliser un jeton STS pour accéder à OSS depuis l'application .
Créer un rôle RAM et accorder des autorisations
Supposons que l'ID de votre compte Alibaba Cloud soit 123456789012****.
-
Utilisez votre compte Alibaba Cloud pour créer un rôle RAM nommé
oss-objectmanageret sélectionnez Cloud Account comme type de principal.RemarqueLors de la création du rôle RAM, sélectionnez Current Account comme principal de confiance. Seuls les utilisateurs RAM appartenant au même compte Alibaba Cloud pourront ainsi assumer ce rôle RAM.
Pour plus d'informations, consultez la rubrique Créer un rôle RAM pour un compte Alibaba Cloud.
Une fois le rôle RAM créé, vous pouvez consulter son ARN et sa stratégie de confiance sur la page des détails du rôle.
L'ARN du rôle RAM est
acs:ram::123456789012****:role/oss-objectmanager.-
La stratégie de confiance du rôle RAM est la suivante.
RemarqueLa stratégie de confiance ci-dessous autorise tout principal authentifié au sein du compte Alibaba Cloud
123456789012****à assumer le rôle.{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::123456789012****:root" ] } } ], "Version": "1" }
-
Associez la stratégie système
AliyunOSSFullAccessau rôle RAMoss-objectmanager.Pour plus d'informations, consultez la rubrique Accorder des autorisations à un rôle RAM.
Créer un utilisateur RAM et autoriser l'assomption de rôle
-
Créez un utilisateur RAM nommé
appserverpour le serveur d'applications.Pour plus d'informations, consultez la rubrique Créer un utilisateur RAM.
-
Accordez l'autorisation
AliyunSTSAssumeRoleAccessà l'utilisateur RAMappserverafin de lui permettre d'assumer des rôles.Pour plus d'informations, consultez la rubrique Accorder des autorisations à un utilisateur RAM.
Obtenir un jeton STS
-
Le serveur d'applications utilise l'AccessKey de l'utilisateur RAM pour appeler l'opération STS AssumeRole.
RemarqueAvant d'utiliser Alibaba Cloud Command Line Interface (CLI), vous devez l'installer sur votre serveur d'applications et le configurer avec les identifiants de l'utilisateur RAM. Pour plus d'informations, consultez la rubrique Référence CLI STS.
Dans cet exemple, le paramètre
Policyn'est pas spécifié. Par conséquent, le jeton STS renvoyé hérite de toutes les autorisations du rôle RAMoss-objectmanager. Pour limiter davantage les autorisations du jeton STS, consultez la rubrique Limiter les autorisations d'un jeton STS.
L'exemple suivant montre comment utiliser Alibaba Cloud CLI pour appeler l'opération AssumeRole :
aliyun sts AssumeRole --RoleArn 'acs:ram::123456789012****:role/oss-objectmanager' --RoleSessionName 'client-001' -
STS renvoie un jeton STS au serveur d'applications. Le jeton STS comprend un
AccessKeyId, unAccessKeySecretet unSecurityToken.Le code suivant présente un exemple de réponse :
{ "AssumedRoleUser": { "AssumedRoleId": "391578752573****:client-001", "Arn": "acs:ram::123456789012****:role/oss-objectmanager/client-001" }, "Credentials": { "AccessKeySecret": "yourAccessKeySecret", "SecurityToken": "yourSecurityToken", "Expiration": "2016-01-13T15:02:37Z", "AccessKeyId": "yourAccessKeyId" }, "RequestId": "E1779AAB-E7AF-47D6-A9A4-53128708B6CE" }RemarqueLe
SecurityTokenpossède une durée de validité courte. Si une session plus longue est nécessaire, le serveur d'applications doit régénérer le jeton STS périodiquement, par exemple toutes les 1 800 secondes.
Limiter les autorisations du jeton STS
Vous pouvez utiliser le paramètre Policy dans l'appel AssumeRole pour restreindre les autorisations d'un jeton STS en fonction de l'utilisateur ou de l'appareil, réduisant ainsi le risque d'élévation de privilèges.
L'exemple suivant accorde l'autorisation de télécharger des objets correspondant au chemin sample-bucket/2015/01/01/*.jpg.
-
Exemple de requête
aliyun sts AssumeRole --RoleArn 'acs:ram::123456789012****:role/oss-objectmanager' --RoleSessionName 'client-002' --Policy '{"Version":"1", "Statement": [{"Effect":"Allow", "Action":"oss:GetObject", "Resource":"acs:oss:*:*:sample-bucket/2015/01/01/*.jpg"}]}'RemarqueLa durée d'expiration par défaut d'un jeton STS est de 3 600 secondes. Vous pouvez définir une durée d'expiration différente à l'aide du paramètre
DurationSeconds. Pour plus d'informations, consultez la rubrique AssumeRole. -
Exemple de réponse
{ "AssumedRoleUser": { "AssumedRoleId": "391578752573****:client-002", "Arn": "acs:ram::123456789012****:role/oss-objectmanager/client-002" }, "Credentials": { "AccessKeySecret": "yourAccessKeySecret", "SecurityToken": "yourSecurityToken", "Expiration": "2016-01-13T15:03:39Z", "AccessKeyId": "yourAccessKeyId" }, "RequestId": "98835D9B-86E5-4BB5-A6DF-9D3156ABA567" }
Utiliser un jeton STS pour accéder à OSS
Le serveur d'applications transmet le jeton STS à l'application mobile.
-
L'application mobile utilise le jeton STS pour accéder à OSS.
L'exemple suivant utilise le SDK Android OSS pour télécharger un fichier depuis OSS à l'aide d'un jeton STS.
// Replace yourEndpoint with the endpoint of the region where your bucket is located. For example, for the China (Hangzhou) region, the endpoint is https://oss-cn-hangzhou.aliyuncs.com. String endpoint = "yourEndpoint"; // Replace yourRegion with the ID of the region where your bucket is located. For example, for the China (Hangzhou) region, the region ID is cn-hangzhou. String region = "yourRegion"; // The temporary AccessKey ID and AccessKey Secret obtained from STS. String accessKeyId = "yourAccessKeyId"; String accessKeySecret = "yourAccessKeySecret"; // The security token obtained from STS. String securityToken = "yourSecurityToken"; OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken); ClientConfiguration config = new ClientConfiguration(); config.setSignVersion(SignVersion.V4); // Create an OSSClient instance. OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider); oss.setRegion(region); // Construct a download request. GetObjectRequest get = new GetObjectRequest("sample-bucket", "2015/01/01/grass.jpg"); OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() { @Override // On success, the GetObject request returns a GetObjectResult containing an input stream. You must process the stream. public void onSuccess(GetObjectRequest request, GetObjectResult result) { // The request is successful. Log.d("asyncGetObject", "DownloadSuccess"); Log.d("Content-Length", "" + result.getContentLength()); try (InputStream inputStream = result.getObjectContent()) { byte[] buffer = new byte[2048]; int len; while ((len = inputStream.read(buffer)) != -1) { // Process the data. } } catch (IOException e) { e.printStackTrace(); } } @Override // The onFailure callback is triggered if the request fails. Handle the exception. public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { if (clientExcepion != null) { // Handle client-side exceptions, such as network errors. clientExcepion.printStackTrace(); } if (serviceException != null) { // Handle service-side exceptions. Log.e("ErrorCode", serviceException.getErrorCode()); Log.e("RequestId", serviceException.getRequestId()); Log.e("HostId", serviceException.getHostId()); Log.e("RawMessage", serviceException.getRawMessage()); } } }); // Cancel the task. // task.cancel(); // Wait for the task to complete. // task.waitUntilFinished();