本ドキュメントでは、特定のシナリオで RAM ロールトークンを使用してモバイルアプリの一時的な権限付与を制御する方法について説明します。

シナリオの説明

エンタープライズ A は開発したモバイルアプリケーションのために、OSS を購入したとします。 モバイルアプリは OSS との間でデータをアップロードおよびダウンロードする必要があります。モバイルアプリはAの管理下にないユーザー自身の端末デバイスで実行されます。

  • エンタープライズ A は、アプリが AppServer を使用してデータを転送するではなく、 アプリが OSS との間でデータを直接アップロードおよびダウンロードすることを望んでいます。
  • セキュリティ上の理由から、エンタープライズ A はアプリに AccessKey(AK)を保存できません。
  • エンタープライズ A はセキュリティにおけるリスクを最小限に抑えるため、各アプリケーションに OSS に接続するための必要最小限の権限と制限されたアクセス時間(例:30 分)を持つアクセストークンを与えます。

要件分析

上記のシナリオの分析は次のとおりです。

  • モバイルアプリは、データプロキシを使用せず、OSS に直接データを送信する必要があります。
  • モバイルデバイスはユーザーの管理下にあるため、エンタープライズ A はモバイルアプリケーションに AK を渡すことはできません。 ベストプラクティスは、有効期限付きのアクセストークンを使用することです。
  • モバイルアプリのアクセス権限を管理する必要があります。 最小制御粒度は OSS レベルにすることができます。

対応策

要件を満たすために、RAM ロールトークンを使用してユーザーが一時的に OSS にアクセスすることを承認できます

  • アカウント A がロールを作成し、そのロールに適切な権限を付与し、AppServer(RAM ユーザーとして実行される)がこのロールを使用できるようにします。 詳細は、ロールとユーザーの作成及び権限の付与をご参照ください。
  • アプリが OSS に直接接続してデータをアップロードまたはダウンロードする必要がある場合、AppServer はロールを引き受けし、一時セキュリティトークン(STS-Token)を取得してアプリに転送することができます。 アプリはトークンを使用して OSS API に直接アクセスできます。 詳細は、ロールトークンとアクセスリソースの取得と転送をご参照ください。
  • AppServer は、ロールを使用してアプリの権限をより細かく制御しながら、一時セキュリティトークンのリソース操作権限をさらに制限できます。 詳細は、STS トークンの権限への制限をご参照ください。

ロール、ユーザーの作成と権限の付与

アカウント A の ID が 11223344 であるとします。 ロール、ユーザーの作成、および appServer の権限の付与のプロセスは以下のとおりです。

  1. アカウント A はユーザーロール(たとえば、oss-readonly という名前のロール)を作成し、信頼されたアカウントとして現行 Alibaba Cloud アカウント を選択します。 つまり、アカウント A の RAM ユーザーだけがこのロールを引き受けることができます。 詳細は、RAM ロール をご参照ください.

    ロールの詳細ページでロールに関する基本情報を表示できます。

    • この例では、RoleARN は次のとおりです。
      acs:ram::11223344:role/oss-readonly
    • ロールのポリシー(このロールの引き受けができるのはアカウント A の RAM ユーザーのみ)は次のとおりです。
      {
      "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
         "RAM": [
           "acs:ram::11223344:root"//when the role is a user role, it is permanently set to root
         ]
       }
      }
      ],
      "Version": "1"
      }
  2. アカウント A は、ポリシー AliyunOSSReadOnlyAccess をロール oss-readonly に追加します。
  3. アカウントAがAppServer用のRAMユーザー(たとえば、appserverという名前のユーザー)を作成してから、次のようにします。
    • RAM ユーザー用に AK を作成します。 つまり、RAM ユーザー(appserver)は API を呼び出すことができます。
    • AliyunSTSAssumeRoleAccess API を呼び出す許可を与えます。 つまり、RAM ユーザー(appserver)はロールを引き受けることができます。

ロールトークンとアクセスリソースの取得と転送

AppClient がロールトークンを取得、使用して OSS API を呼び出す手順は次のとおりです。

図 1. 手順


手順は以下のとおりです。

  1. appServerは、RAM ユーザー (appserver) の AK を使用して STS ロールの引き受け(AssumeRole) を呼び出します。 次は、aliyuncli を使用して AssumeRole API を呼び出す方法の例です。
    アカウント A の AK を使用せず、AppServer の AK を構成する必要があります。
    $ aliyuncli sts AssumeRole --RoleArn acs:ram::11223344:role/oss-readonly --RoleSessionName client-001
     {
         "AssumedRoleUser": {
             "AssumedRoleId": "391578752573972854:client-001", 
             "Arn": "acs:ram::11223344:role/oss-readonly/client-001"
         }, 
         "Credentials": {
             "AccessKeySecret": "93ci2umK1QKNEja6WGqi1Ba7Q2Fv9PwxZqtVF2VynUvz", 
             "SecurityToken": "CAES6AIIARKAAUiwSHpkD3GXRMQk9stDr3YSVbyGqanqkS+fPlEEkjZ+dlgFnGdCI2PV93jksole8ijH8dHJrHRA5JA1YCGsfX5hrzcNM37Vr4eVdWFVQhoCw0DXBpHv//ZcITp+ELRr4MHsnyGiErnDsXLkI7q/sbuWg6PACZ/jzQfEWQb/f7Y1Gh1TVFMuRjEzR2pza1hUamszOGRCWTZZeEp0WEFaayISMzkxNTc4NzUyNTczOTcyODU0KgpjbGllbnQtMDAxMKT+lIHBKjoGUnNhTUQ1QkoKATEaRQoFQWxsb3cSGwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aAwoBKhIfCg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaAwoBKkoFNDMyNzRSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzkxNTc4NzUyNTczOTcyODU0cgllY3MtYWRtaW544Mbewo/26AE=", 
             "Expiration": "2016-01-13T15:02:37Z", 
             "AccessKeyId": "STS.F13GjskXTjk38dBY6YxJtXAZk"
         }, 
         "RequestId": "E1779AAB-E7AF-47D6-A9A4-53128708B6CE"
     }
    STS トークンのアクセス許可を制限する
    • 前回 AssumeRole の呼び出し時に Policy パラメーターが指定されていないため、STS トークンは oss-readonly のすべての権限を持っています。
    • sample-bucket/2015/01/01/*.jpg へのアクセスのみを許可するなど、トークンのアクセス許可をさらに制限する必要がある場合は、Policy パラメータを設定して、トークンのアクセス許可をより細かく制限できます。 以下はコマンドの例です。
      $ aliyuncli sts AssumeRole --RoleArn acs:ram::11223344:role/oss-readonly --RoleSessionName client-002 --Policy "{\"Version\":\"1\", \"Statement\": [{\"Effect\":\"Allow\", \"Action\":\"oss:GetObject\", \"Resource\":\"acs:oss:*:*:sample-bucket/2015/01/01/*.jpg\"}]}"
      {
         "AssumedRoleUser": {
             "AssumedRoleId": "391578752573972854:client-002", 
             "Arn": "acs:ram::11223344:role/oss-readonly/client-002"
         }, 
         "Credentials": {
             "AccessKeySecret": "28Co5Vyx2XhtTqj3RJgdud4ntyzrSNdUvNygAj7xEMow", 
             "SecurityToken": "CAESnQMIARKAASJgnzMzlXVyJn4KI+FsysaIpTGm8ns8Y74HVEj0pOevO8ZWXrnnkz4a4rBEPBAdFkh3197GUsprujsiU78FkszxhnQPKkQKcyvPihoXqKvuukrQ/Uoudk31KAJEz5o2EjlNUREcxWjRDRSISMzkxNTc4NzUyNTczOTcyODU0KgpjbGllbnQtMDAxMKmZxIHBKjoGUnNhTUQ1Qn8KATEaegoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOkdldE9iamVjdBJICg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaLAoqYWNzOm9zczoqOio6c2FtcGxlLWJ1Y2tldC8yMDE1LzAxLzAxLyouanBnSgU0MzI3NFIFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzOTE1Nzg3NTI1NzM5NzI4NTRyCWVjcy1hZG1pbnjgxt7Cj/boAQ==", 
             "Expiration": "2016-01-13T15:03:39Z", 
             "AccessKeyId": "STS.FJ6EMcS1JLZgAcBJSTDG1Z4CE"
         }, 
         "RequestId": "98835D9B-86E5-4BB5-A6DF-9D3156ABA567"
      }

    また、トークンのデフォルトの有効期間は 3,600 秒です。 DurationSeconds パラメーターを使用して、トークンの有効期限を制限することができます(3,600 秒以内)。

  2. appServer は資格情報を取得して解析します。
    • appServer は、AssumeRole API が返す資格情報の中から AccessKeyId、AccessKeySecret、および SecurityToken を取得します。
    • トークンの有効期間は比較的短いため、アプリでより長い有効期間が必要な場合、AppServer は新しいトークンを再発行する必要があります(たとえば、AppServe は 1,800 秒ごとにトークンを発行します)。
  3. AppServer はトークンを安全に AppClient に送信します。
  4. AppClient はトークンを使用してクラウドサービス API(OSS API など)に直接アクセスします。 以下は、aliyuncli がトークン(client-002 に対して発行)を使用して OSS オブジェクトにアクセスするためのコマンドの例です。
    
    Configure STS-Token syntax: aliyuncli oss Config --host --accessid --accesskey --sts_token 
    $ aliyuncli oss Config --host oss.aliyuncs.com --accessid STS.FJ6EMcS1JLZgAcBJSTDG1Z4CE --accesskey 28Co5Vyx2XhtTqj3RJgdud4ntyzrSNdUvNygAj7xEMow --sts_token CAESnQMIARKAASJgnzMzlXVyJn4KI+FsysaIpTGm8ns8Y74HVEj0pOevO8ZWXrnnkz4a4rBEPBAdFkh3197GUsprujsiU78FkszxhnQPKkQKcyvPihoXqKvuukrQ/Uoudk31KAJEz5o2EjlNUREcxWjRDRSISMzkxNTc4NzUyNTczOTcyODU0KgpjbGllbnQtMDAxMKmZxIHBKjoGUnNhTUQ1Qn8KATEaegoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOkdldE9iamVjdBJICg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaLAoqYWNzOm9zczoqOio6c2FtcGxlLWJ1Y2tldC8yMDE1LzAxLzAxLyouanBnSgU0MzI3NFIFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzOTE1Nzg3NTI1NzM5NzI4NTRyCWVjcy1hZG1pbnjgxt7Cj/boAQ==
    Access OSS objects
    $ aliyuncli oss Get oss://sample-bucket/2015/01/01/grass.jpg grass.jpg

参考資料

モバイルアプリケーションでの直接接続の詳細については、以下をご参照ください。