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

シナリオ

エンタープライズ A は、ユーザー自身のデバイス上で動作するモバイルアプリを開発しました。 モバイルアプリを開発したエンタープライズ A は、Alibaba Cloud OSS を使用して、モバイルアプリで OSS にデータをアップロードし、OSS からデータをダウンロードできるようにする必要があります。

エンタープライズ A の要件は以下のとおりです。

  • エンタープライズ A は、アプリによる appServer を使用してデータを伝送するのではなく、 データを直接 OSS にアップロードし OSS からダウンロードするようにする必要があります。
  • アカウントのセキュリティを維持するために、アプリを実行するモバイルデバイスはエンタープライズ A によって直接管理されていないため、エンタープライズ A は AccessKey をモバイルアプリに保存しません。
  • エンタープライズ A は、アプリが OSS への接続に使用できる一時アクセス認証情報(STS トークンを使用)をアプリに付与し、アクセス期間を指定期間に制限することで、セキュリティ上のリスクを最小限に抑えたいと考えています。

ソリューション

  • エンタープライズ A の Alibaba Cloud アカウント(アカウントA)を使用して、RAM 内にロールを作成し、そのロールに適切な権限を付与し、RAM ユーザーとしてログインしている appServer にこのロールの使用権限を付与します。

    詳細は、RAM ロールとユーザーの作成及び権限の付与をご参照ください。

  • アプリが OSS に直接接続してデータをアップロードまたはダウンロードする必要がある場合は、appServer がロールを引き受け (STS AssumeRole API を呼び出す)、一時的な STS トークンを取得してアプリに転送できます。 そして、アプリは一時的な STS セキュリティトークンを使用して OSS API に直接アクセスできます。

    詳細は、ロール STS トークンの取得及び転送、OSS へのアクセスをご参照ください。

  • appServer は、ロールを引き受けるときに一時 STS トークンのリソース操作権限にさらに制限をかけ、各アプリの権限をより適切に管理することができます。

    詳細は、STS トークンの権限への制限をご参照ください。

RAM ロールとユーザーの作成及び権限の付与

アカウント A のアカウント ID が 11223344 であるとします。

  1. アカウント A は RAM ロール oss-readonly を作成し、アカウント A の RAM ユーザーだけがこのロールを引き受けることができるように信頼済みアカウントとして 現行 Alibaba クラウドアカウントを選択します。

    詳細は信頼できる Alibaba Cloud アカウント用 RAM ロールの作成をご参照ください。

    ロールを作成後、エンタープライズ A は基本情報ページ上のロール情報を表示できます。

    • この例では、ロールの Alibaba Cloud リソース名 (ARN) は以下のとおりです。
      acs:ram::11223344:role/oss-readonly
    • ロール内の信頼ポリシー (アカウント A の RAM ユーザーのみ引き受け可能) は、以下のとおりです。
      {
      "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect":"Allow",
       "Principal": {
         "RAM": [
            "acs:ram::11223344:root"// ロールの信頼できるエンティティタイプが Alibaba Cloud アカウントの場合、デフォルトで  'root' が使用されます。
         ]
       }
      }
      ],
      "Version": "1"
      }
  2. アカウント A が、ロール oss-readonly にポリシー AliyunOSSReadOnlyAccess(OSS 読み取り専用権限)をアタッチします。

    詳細は、RAM での権限付与 をご参照ください。

  3. アカウント A は、appServer 用に RAM ユーザー(ここでは、RAM ユーザーを Appserver と呼びます)を作成し、RAM ユーザー用の AccessKey を作成して、ユーザーが STS AssumeRole API を呼び出すことができるように AliyunSTSAssumeRoleAccess システムポリシーを添付します。

ロール STS トークンの取得及び転送、OSS へのアクセス

次の図には、ロール STS トークンを取得し、それを使用して OSS API を呼び出すアプリの操作手順を示します。
図 1. 手順
appServer は、RAM ユーザー (appserver) の AK を使用して STS API ロールの引き受け(AssumeRole) を呼び出します。
appServer の AK が構成されている必要があります。

次は、aliyuncli を使用して AssumeRole API を呼び出す方法の例です。

$ 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 トークンの権限への制限

  1. AssumeRole API を呼び出した後、STS トークンにきめ細かいアクセス権限を付与できます。
    AssumeRole API を呼び出すときにポリシーを指定しない場合、STS トークンには oss-readonly のすべての権限が付与されます。 この問題を解決するには、STS トークンのアクセス権限にさらに制限をかけるポリシーを指定します。例えば、STS トークンから sample-bucket/2015/01/01/*.jpg へのアクセス権限のみを付与します。 例は次のとおりです。
    $ 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"
    }
    STS トークンのデフォルトの有効期間は 3600 秒 (最大制限) です。 DurationSeconds パラメーターを使用して、STS トークンの有効期限を制限できます。
  2. appServer は資格情報を取得して解析します。
    • appServer は、AssumeRole API により返される資格情報の中から AccessKeyId、AccessKeySecret、および SecurityToken を取得します。
    • STS トークンの有効期間が決定されています。 アプリケーションがより長い有効期間を必要とする場合、appServer は 1800 秒ごとに 1 つの STS トークンを発行するなど新しい STS トークンを再発行する必要があります。
  3. appServer は、STS トークンを安全にアプリに転送します。
  4. アプリは STS トークンを使用して Alibaba Cloud サービス (OSS など) API に直接アクセスします。

    以下は、aliyuncli と STS トークンを使用した OSS オブジェクトへのアクセス方法の例です(ここでは、STS トークンは client-002 に発行されます):

    
    Configure the 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==
    OSS オブジェクトへのアクセス
    $ aliyuncli oss Get oss://sample-bucket/2015/01/01/grass.jpg grass.jpg

次のステップ