すべてのプロダクト
Search
ドキュメントセンター

Resource Access Management:STS トークンを使用してモバイルアプリに Alibaba Cloud リソースへのアクセスを承認する

最終更新日:Nov 09, 2025

このトピックでは、Resource Access Management (RAM) ロールの Security Token Service (STS) トークンを使用して、モバイルアプリに Alibaba Cloud リソースへのアクセスを承認する方法について説明します。

背景情報

ある企業がモバイルアプリを開発し、Object Storage Service (OSS) を有効化しました。モバイルアプリはモバイルデバイス上で実行されます。これらのモバイルデバイスは企業によって管理されていません。企業はモバイルアプリに必要な権限を付与する必要があります。そうすることで、モバイルアプリは OSS にデータをアップロードしたり、OSS からデータをダウンロードしたりできるようになります。

この企業には、以下の要件があります。

  • 直接データ転送: 企業 A は、すべてのアプリケーションが企業のサーバー側アプリケーションサーバー (アプリケーションサーバー) を介してデータを転送することを望んでいません。代わりに、OSS に直接接続してデータをアップロードまたはダウンロードしたいと考えています。

  • セキュリティコントロール: 企業 A は、モバイルデバイスがユーザーによって管理され、信頼できない環境で動作するため、AccessKey ペアをモバイルデバイスに保存したくありません。

  • リスクコントロール: セキュリティリスクは最小限に抑えられます。OSS への直接アクセス中、各アプリケーションクライアントは最小権限の原則に基づいて承認され、アクセス期間は厳密に管理されます。

解決策

モバイルアプリが OSS に直接データをアップロードしたり、OSS からデータをダウンロードしたりする前に、アプリサーバーにアクセス認証情報をリクエストする必要があります。アプリサーバーは RAM ユーザー ID を使用して RAM ロールを偽装し、STS API の AssumeRole 操作を呼び出して STS トークンを取得し、そのトークンをモバイルアプリに転送します。その後、モバイルアプリはこの STS トークンを使用して OSS にアクセスできます。

移动设备应用访问阿里云

  1. モバイルアプリはアプリサーバーに STS トークンをリクエストします。

  2. 企業は Alibaba Cloud アカウントを使用して RAM ロールを作成し、そのロールに必要な権限を付与します。

    詳細については、「RAM ロールを作成し、必要なポリシーをロールにアタッチする」をご参照ください。

  3. 企業は Alibaba Cloud アカウントを使用してアプリサーバー用の RAM ユーザーを作成し、アプリサーバーが RAM ロールを偽装できるようにします。

  4. アプリサーバーは STS の AssumeRole 操作を呼び出して、RAM ロールの STS トークンを取得します。

    詳細については、「RAM ロールの STS トークンを取得する」をご参照ください。

  5. アプリサーバーは、RAM ロールにアタッチされたポリシーよりも少ない権限を持つ STS トークンをリクエストできます。これにより、アプリサーバーはモバイルアプリから OSS へのアクセスを制御します。

  6. モバイルアプリは STS トークンを使用して、OSS に直接データをアップロードしたり、OSS からデータをダウンロードしたりします。

    詳細については、「STS トークンを使用して OSS にアクセスする」をご参照ください。

RAM ロールを作成し、必要なポリシーをロールにアタッチする

このセクションで企業が使用する Alibaba Cloud アカウントの ID は 123456789012**** です。

  1. 企業は Alibaba Cloud アカウントを使用して、oss-objectmanager という名前の RAM ロールを作成します。信頼できるエンティティタイプとして Alibaba Cloud アカウントが選択されます。

    説明

    RAM ロールを作成する際、信頼できるエンティティとして [現在の Alibaba Cloud アカウント] を選択します。これは、Alibaba Cloud アカウント A に属する RAM ユーザーのみがこの RAM ロールを偽装できることを意味します。

    詳細については、「信頼できる Alibaba Cloud アカウントの RAM ロールを作成する」をご参照ください。

    RAM ロールが作成された後、企業は基本情報ページでロールに関する情報を表示できます。

    • RAM ロールの ARN は acs:ram::123456789012****:role/oss-objectmanager です。

    • RAM ロールには次のポリシーがアタッチされます。

      説明

      このポリシーは、Alibaba Cloud アカウント A に属する RAM ユーザーのみが RAM ロールを偽装できることを指定します。

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "RAM": [
                "acs:ram::123456789012****:root"
              ]
            }
          }
        ],
        "Version": "1"
      }
  2. 企業は Alibaba Cloud アカウントを使用して、AliyunOSSFullAccess ポリシーを RAM ロール oss-objectmanager にアタッチします。AliyunOSSFullAccess ポリシーは、OSS に対する管理権限を付与します。

    詳細については、「RAM ロールに権限を付与する」をご参照ください。

RAM ユーザーを作成し、ユーザーが RAM ロールを偽装できるようにする

  1. 企業は Alibaba Cloud アカウントを使用して、appserver という名前の RAM ユーザーを作成します。

    詳細については、「RAM ユーザーの作成」をご参照ください。

  2. 企業は Alibaba Cloud アカウントを使用して、AliyunSTSAssumeRoleAccess ポリシーを RAM ユーザーにアタッチします。これにより、RAM ユーザーは RAM ロールを偽装できるようになります。

    詳細については、「RAM ユーザーへの権限付与」をご参照ください。

RAM ロールの STS トークンを取得する

  1. アプリサーバーは RAM ユーザーの AccessKey ペアを使用して、STS の AssumeRole 操作を呼び出します。

    説明
    • Alibaba Cloud CLI を使用する前に、CLI ツールをアプリサーバーにインストールし、RAM ユーザーの AccessKey ペアを使用して認証情報を設定する必要があります。詳細については、「STS CLI リファレンス」をご参照ください。

    • この CLI の例では、Policy パラメーターは指定されていません。したがって、返される STS トークンは RAM ロール oss-objectmanager のすべての権限を持ちます。アプリサーバーは、RAM ロールにアタッチされたポリシーよりも少ない権限を持つ STS トークンをリクエストすることもできます。詳細については、「RAM ロールにアタッチされたポリシーよりも少ない権限を持つ STS トークンをリクエストする」をご参照ください。

    次の例は、Alibaba Cloud CLI を使用して AssumeRole 操作を呼び出す方法を示しています。

    aliyun sts AssumeRole --RoleArn 'acs:ram::123456789012****:role/oss-objectmanager' --RoleSessionName 'client-001'
  2. STS サービスは STS トークンをアプリサーバーに送信します。STS トークンには、AccessKeyIdAccessKeySecret、および SecurityToken の要素が含まれています。

    次の出力が返されます。

    {
         "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"
     }
    説明

    STS トークン SecurityToken は短期間のみ有効です。モバイルアプリが長期間 OSS にアクセスする必要がある場合、アプリサーバーは定期的に新しい STS トークンをリクエストする必要があります。たとえば、アプリサーバーは 1,800 秒ごとに新しい STS トークンをリクエストできます。

RAM ロールにアタッチされたポリシーよりも少ない権限を持つ STS トークンをリクエストする

Policy パラメーターを使用して、ユーザーやデバイスに基づいて異なる STS トークンの権限を制限し、不正アクセスを防ぐことができます。

この例では、返される STS トークンは、sample-bucket/2015/01/01/*.jpg パターンに一致するオブジェクトのみをダウンロードする権限を持ちます。

  • リクエストの例

    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"}]}'
    説明

    STS トークンのデフォルトの有効期間は 3,600 秒です。DurationSeconds パラメーターを指定して、STS トークンの有効期間を制限できます。詳細については、「AssumeRole - ロールの一時的な ID 認証情報を取得する」をご参照ください。

  • レスポンスの例

    {
       "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"
    }

STS トークンを使用して OSS にアクセスする

  1. アプリケーションサーバーは、一時的なセキュリティトークンをアプリケーションに渡します。

  2. モバイルアプリは STS トークンを使用して OSS にアクセスします。

    この例では、Android アプリケーションに OSS Android SDK を統合し、STS トークンを使用して OSS にアクセスし、リモートファイルをローカルデバイスにダウンロードする方法を示します。次のサンプルコードに例を示します。

    // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
    String endpoint = "yourEndpoint";
    // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
    String region = "yourRegion";
    
    // STS サービスから取得した一時的な AccessKey ペア (AccessKeyID と AccessKeySecret)。
    String accessKeyId = "yourAccessKeyId";
    String accessKeySecret = "yourAccessKeySecret";
    // STS サービスから取得した一時的なセキュリティトークン (SecurityToken)。
    String securityToken = "yourSecurityToken";
    
    OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken);
    ClientConfiguration config = new ClientConfiguration();
    config.setSignVersion(SignVersion.V4);
    // OSSClient インスタンスを作成します。
    OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
    oss.setRegion(region);
    // オブジェクトダウンロードリクエストを構築します。
    GetObjectRequest get = new GetObjectRequest("sample-bucket", "2015/01/01/grass.jpg");
    
    OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
        @Override
        public void onSuccess(GetObjectRequest request, GetObjectResult result) {
            // オブジェクトがダウンロードされます。
            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) {
                // データを処理します
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        // GetObject リクエストが成功すると、GetObjectResult が返されます。GetObjectResult には入力ストリームのインスタンスが含まれています。返された入力ストリームを処理する必要があります。
        public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
            // リクエストの例外を処理します。
            if (clientExcepion != null) {
                // ネットワーク例外などのクライアント例外を処理します。
                clientExcepion.printStackTrace();
            }
            if (serviceException != null) {
                // サービス例外を処理します。
                Log.e("ErrorCode", serviceException.getErrorCode());
                Log.e("RequestId", serviceException.getRequestId());
                Log.e("HostId", serviceException.getHostId());
                Log.e("RawMessage", serviceException.getRawMessage());
            }
        }
    });
    // ダウンロードタスクをキャンセルします。
    // task.cancel(); 
    // オブジェクトがダウンロードされるまで待ちます。
    // task.waitUntilFinished();