本ページでは、Alibaba Cloud RAM を使用して、アプリケーションが RAM ロールの動的 STS トークンを取得することによって Alibaba Cloud API にアクセスできるようにする方法について説明します。

シナリオ

ある企業が ECS インスタンスを購入し、そのアプリケーションを ECS にデプロイする必要があります。 AccessKeys を使用してアプリケーションが他の Alibaba Cloud API にアクセスできるようにするには、企業は以下のいずれかの方法を使用できます。
  • AccessKeys をコードに埋め込みます。
  • AccessKeys をアプリケーションの設定ファイルに保存します。
ただし、上記の方法を使用すると以下の問題が発生します。
  • AccessKey の開示 : AccessKey がプレーンテキストで ECS インスタンスに埋め込まれていると、スナップショットの共有、または共有イメージインスタンスを作成するイメージが原因で誤って別のユーザーに公開される可能性があります。
  • O&M の複雑化 : AccessKey が変更 (AccessKey のローテーションまたはユーザー ID の変更により) されると、AccessKey が ECS インスタンスに存在するため、すべてのインスタンスとイメージを更新して再デプロイする必要があります。 その結果、インスタンスとイメージの管理が非常に複雑になります。

ソリューション

上記の問題を解決するため、ECSを RAM のアクセス制御機能と組み合わせることができます。 具体的には、管理者は各 ECS インスタンス (アプリケーションの動作環境) の RAM ロールを作成し、各 RAM ロールに適切な権限を付与します。 アプリケーションは、対応する RAM ロールの動的 STS トークンを使用して他の Alibaba Cloud API を呼び出すことができます。
図 1. プロセス

ECS インスタンスの RAM ロールを設定

  1. 管理者は Alibaba Cloud アカウントを使用して ECS インスタンスの RAM ロールを作成し、適切なポリシーを RAM ロールに添付します。
    ECS インスタンスの RAM ロールは、ユーザーによって作成され、許可後ユーザーの ECS インスタンスによって使用される一種の RAM サービスロールです。
  2. 管理者は ECS インスタンスを起動し、RAM ロールを設定します。
    • (i) ECS は、設定された RAM ロールに従って AssumeRole API を呼び出して STS にアクセスし、RAMロールの STS トークンを取得するリクエストを送信します。
    • (ii) STS は ECS の ID と RAM ロールに添付されるポリシーを検証します。 検証が成功すると、STS トークンが発行されます。 検証に失敗すると、リクエストは拒否されます。

    詳細は、「コンソールでのインスタンス RAM ロールの使用」または「API 呼び出しによるインスタンス RAM ロールの使用」をご参照ください。

  3. STS トークンを取得すると、ECS インスタンスはメタデータサービスを介して STS トークンをアプリケーションに提供します。
    たとえば Linux では、STS トークンやその有効期間などのメタデータ情報の取得時に以下のコマンドを使用できます。
    $ curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<roleName>
    • STS トークンが有効期間内であればアプリケーションは Alibaba Cloud API を呼び出すことができます。 STS トークンは通常 1 時間後に期限切れになります。 ECS は、期限が切れる前に STS トークンを自動的に更新します。
    • STS トークンに対応する権限がない場合、管理者は関連するポリシーを RAM ロールに添付する必要があります。
    • RAM ロールに関連付けられているポリシーが更新された後、STS トークンに関連付けられている権限が即時有効になり、ユーザーは ECS インスタンスを再起動する必要はありません。
  4. アプリケーションは STS トークンを使用して Alibaba Cloud API を呼び出します。
    アプリケーションが Alibaba Cloud SDK を使用している場合、Alibaba Cloud SDK は ECS メタデータサービスから RAM ロールの STS トークンを取得でき、開発者は SDK に AccessKey 関連の機密情報を設定する必要はありません。

    詳細は、「RamRole を設定して ECS インスタンスへの AccesKey 以外のアクセスを実現 (Configure RamRole to achieve non-AccesKey access to ECS instances)」をご参照ください。

管理者と一般ユーザーの権限を分ける

ほとんどのシナリオでは、管理者と一般的な ECS インスタンスユーザーの権限は、異なる RAM ユーザーとして設定されています。 次の図に、管理者と一般ユーザーの権限を分ける方法を示します。
図 2. プロセス
重要
  • ECS は、RAM ユーザー (たとえば ECS へのアクセス権しかなく RAM 権限管理者ではない RAM ユーザー) が ECS インスタンスを作成して RAM ロールを設定する前に、その RAM ユーザーに RAM ロールの ram:PassRole 権限があるかどうかチェックします。 権限が見つからない場合、RAM ユーザーは ECS インスタンスを作成できません。
  • ECS インスタンスの RAM ロールを設定できるのは許可ユーザーだけです。 このように RAM ロールの使用は厳密に管理されているため、権限の悪用を防止できます。

管理者と一般ユーザーの権限を分けるには、ECS インスタンスの RAM ロールを設定し、一般ユーザーに PassRole 権限を付与 (上記の図のステップ 1.5 を参照) する必要があります。

管理者は、カスタマイズポリシーを作成して一般ユーザーに添付することもできます。 例は以下のとおりです。
重要 ロール名は RAM 名に置き換える必要があります。


{
   "Statement": [
    {
      "Effect": "Allow",
      "Action": "ram:PassRole",
      "Resource": "acs:ram:*:*:role/<rolename>"
    }
  ],
  "Version": "1"
}
				

次のステップ

Alibaba Cloud RAM が権限アプリケーションのすべての要件を満たしていない場合は、アクセス制御機能を提供する Function Compute および MaxCompute など他の Alibaba Cloud サービスを使用して、クラウド上のユーザーやアプリケーションの ID と AccessKey を管理できます。