Alibaba Cloud の Resource Access Management (RAM) ロールは、企業で訪問者に発行される一時的なアクセスバッジに似ています。RAM ロールを使用すると、ユーザーは一時的な ID を偽装して、特定の範囲内で管理操作を実行できます。これは、アカウント間のアクセス、ロールベースのシングルサインオン (SSO)、一時的な権限付与などのシナリオで役立ちます。
ユースケース
このトピックでは、一般的なアカウント間のアクセスシナリオを使用してプロセスを説明します。たとえば、あなたの会社が Alibaba Cloud Elastic Compute Service (ECS) にデプロイされた e コマース Web サイトを運営しているとします。IT 部門が日常の運用およびメンテナンス (O&M) を担当しています。特定の技術的な問題や特別なメンテナンス作業について、外部パートナーの支援が必要になる場合があります。クラウドリソースのセキュリティを維持するために、Alibaba Cloud アカウントや RAM ユーザーなどの長期的な認証情報を外部パートナーと共有したくありません。
次の図は、RAM ロールを使用してアカウント間のアクセス権限を付与する方法を示しています。
アカウント A: あなたの会社の Alibaba Cloud アカウント。
アカウント B: 外部パートナーの Alibaba Cloud アカウント。
アカウント A は RAM ロールを作成し、アカウント B にそのロールを偽装する権限を付与します。
アカウント B は RAM ユーザーを作成し、そのユーザーにロールを偽装する権限を付与します。
アカウント B の RAM ユーザーは、アカウント A の RAM ロールを偽装して、アカウント A のリソースを管理します。
手順
アカウント A での RAM ロールの作成と権限の付与
1. RAM ロールの作成
アカウント A を使用して RAM コンソール にログインします。RAM ロールを作成し、信頼できるエンティティを Alibaba Cloud アカウントに設定します。[ロールの作成] ページで、[プリンシパル名] に [他のアカウント] を選択し、アカウント B の UID を入力します。詳細については、「信頼できる Alibaba Cloud アカウントの RAM ロールを作成する」をご参照ください。
2. RAM ロールへの権限の付与
ユーザーがインスタンス情報を表示し、Workbench を使用して ECS インスタンスにログインできるようにするアクセスポリシーを作成します。次に、そのアクセスポリシーを RAM ロールにアタッチします。詳細については、「カスタムポリシーの作成」をご参照ください。
アカウント B での RAM ユーザーの作成と権限の付与
1. RAM ユーザーの作成
アカウント B を使用して RAM コンソール にログインします。RAM ユーザーを作成します。RAM ユーザーを作成する際、[コンソールアクセス] と [永続的な AccessKey を使用してアクセス] を選択します。詳細については、「RAM ユーザーの作成」をご参照ください。
2. RAM ユーザーへの権限の付与
RAM ユーザーが RAM ロールを偽装する前に、そのユーザーに必要な権限を付与する必要があります。アカウント B を使用して、AliyunSTSAssumeRoleAccess ポリシーを RAM ユーザーにアタッチします。このポリシーにより、RAM ユーザーはすべての RAM ロールを偽装できます。詳細については、「RAM ユーザーへの権限付与」をご参照ください。
RAM ユーザーが特定の RAM ロールのみを偽装できるようにするには、「RAM ユーザーが偽装できる RAM ロールを指定できますか?
RAM ロールの偽装
コンソールでロールを引き受ける
アカウント B 用に作成した RAM ユーザーを使用して、RAM ユーザーログインページ にログインします。
右上隅のプロファイル画像にカーソルを合わせ、[ID の切り替え] をクリックします。
[ロールの切り替え] ページで、必要な情報を入力し、[送信] をクリックします。この例では、アカウント A の UID と RAM ロールの名前を入力します。
アクセス権限を確認します。
ECS コンソール にログインし、Alibaba Cloud ECS インスタンスに関する情報を表示します。
検証 1: RAM ユーザーはアカウント A の RAM ロールを偽装して ECS インスタンス情報を表示でき、リモート接続ツールの Workbench を使用してインスタンスにログインすることもできます。
検証 2: アカウント A が権限付与を取り消すと、RAM ユーザーはアカウント A の ECS インスタンス情報を表示できなくなります。
プログラム呼び出し時のロールの偽装
プログラムコードを使用してアカウント A のリソースにアクセスすることもできます。一般的なプロセスは次のとおりです。
アカウント B の RAM ユーザーを作成したときに取得した AccessKey にシステム環境変数を設定します。環境変数の設定方法はオペレーティングシステムによって異なります。詳細については、「Linux、macOS、Windows で環境変数を設定する」をご参照ください。
アカウント B の RAM ユーザーを使用して
AssumeRoleAPI を呼び出します。アカウント A の RAM ロールの ARN を渡して、一時的なセキュリティトークンサービス (STS) トークンを取得します。取得した STS トークンを使用して、関連する Alibaba Cloud サービスの API を呼び出し、アカウント A のクラウドリソースを表示します。
Java サンプルコード
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>ecs20140526</artifactId>
<version>5.4.4</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>sts20150401</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.10</version>
</dependency>import com.aliyun.ecs20140526.models.DescribeInstancesRequest;
import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.sts20150401.Client;
import com.aliyun.sts20150401.models.AssumeRoleRequest;
import com.aliyun.sts20150401.models.AssumeRoleResponse;
import com.aliyun.sts20150401.models.AssumeRoleResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.google.gson.Gson;
/**
* RAM ロールを偽装して一時的なアクセス認証情報を取得し、その認証情報を使用して ECS リソースにアクセスします。
*/
public class Sample {
public static void main(String[] args) {
// これはデモンストレーションのみを目的としています。実際のビジネスニーズに基づいて、リージョン固有のエンドポイントを選択してください。
String stsEndpoint = "sts.cn-shanghai.aliyuncs.com";
String ecsEndpoint = "ecs.cn-shanghai.aliyuncs.com";
// cn-shanghai の ECS インスタンスの情報をクエリします。
String regionId = "cn-shanghai";
// 偽装する RAM ロールの ARN。
String ramRoleArn = "acs:ram::14************16:role/cooperativepartnerrole";
// アカウント B の RAM ユーザーを使用してアカウント A の RAM ロールを偽装し、一時的なアクセス認証情報を取得します。
AssumeRoleResponse assumeRoleResponse = playRamRole(stsEndpoint, ramRoleArn);
// Alibaba Cloud サービスが提供する API を呼び出して、アカウント A のクラウドリソースを表示します。
accessResources(assumeRoleResponse, ecsEndpoint, regionId);
}
/**
* 一時的なアクセス認証情報を使用してクラウドリソースにアクセスします。
*
* @param assumeRoleResponse 一時的なアクセス認証情報を含む応答オブジェクト。
*/
private static void accessResources(AssumeRoleResponse assumeRoleResponse, String ecsEndpoint, String regionId) {
try {
// 一時的なアクセス認証情報を抽出します。
AssumeRoleResponseBody.AssumeRoleResponseBodyCredentials assumeRoleResponseBodyCredentials = assumeRoleResponse.body.credentials;
com.aliyun.credentials.models.Config credentialsConfig = new com.aliyun.credentials.models.Config()
.setType("sts") // 認証情報のタイプ。
.setAccessKeyId(assumeRoleResponseBodyCredentials.accessKeyId)
.setAccessKeySecret(assumeRoleResponseBodyCredentials.accessKeySecret)
.setSecurityToken(assumeRoleResponseBodyCredentials.securityToken);
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client(credentialsConfig);
// ECS クライアントを作成します。
Config ecsConfig = new Config()
.setEndpoint(ecsEndpoint)
.setCredential(credentialClient);
com.aliyun.ecs20140526.Client ecsClient = new com.aliyun.ecs20140526.Client(ecsConfig);
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
.setRegionId(regionId);
RuntimeOptions runtimeOptions = new RuntimeOptions();
// DescribeInstances API を呼び出して応答を取得します。
DescribeInstancesResponse response = ecsClient.describeInstancesWithOptions(describeInstancesRequest, runtimeOptions);
// 応答を出力します。
System.out.println(new Gson().toJson(response.body));
} catch (Exception e) {
throw new RuntimeException("AccessResources failed: " + e.getMessage());
}
}
/**
* RAM ロールを偽装して一時的なアクセス認証情報を取得します。
*
* @return 一時的なアクセス認証情報を含む応答オブジェクト。
*/
private static AssumeRoleResponse playRamRole(String stsEndpoint, String ramRoleArn) {
try {
// StsClient オブジェクトを作成し、assumeRole 操作を呼び出して STS トークンを取得します。
Config config = new Config()
// System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") は環境変数から AccessKey ID の値を取得します。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") は環境変数から AccessKey Secret の値を取得します。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = stsEndpoint;
Client client = new Client(config);
// AssumeRoleRequest オブジェクトを作成し、偽装する RAM ロールの ARN とロールセッション名を指定します。
AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
.setRoleArn(ramRoleArn)
.setRoleSessionName("CooperativePartner");
RuntimeOptions runtime = new RuntimeOptions();
return client.assumeRoleWithOptions(assumeRoleRequest, runtime);
} catch (Exception e) {
throw new RuntimeException("play RAM role failed: " + e.getMessage());
}
}
}
結果: プログラムは、中国 (上海) リージョンにあるアカウント A に属する ECS リソースのリストを返します。
{
"instances":{
"instance":[
{
"creationTime":"2024-10-23T09:12Z",
"expiredTime":"2099-12-31T15:59Z",
"hostName":"iZ********************pZ",
"imageId":"m-uf****************jf",
"instanceChargeType":"PostPaid",
"instanceId":"i-uf****************ap",
"instanceName":"launch-advisor-20241023-c6",
"instanceNetworkType":"vpc",
"instanceType":"ecs.c6.xlarge",
...
// 一部のパラメーターは省略されています。
...
"vpcAttributes":{
"natIpAddress":"",
"privateIpAddress":{
"ipAddress":[
"17*.**.**.*15"
]
},
"vSwitchId":"vsw-uf*****************tk",
"vpcId":"vpc-uf*****************kr"
},
"zoneId":"cn-shanghai-b"
}
]
},
"nextToken":"",
"pageNumber":1,
"pageSize":10,
"requestId":"C1468F7E********************7A3A712",
"totalCount":1
}参考資料
RAM は、ユーザー ID とリソースアクセス権限を管理するために使用できる Alibaba Cloud サービスです。詳細については、「RAM とは」をご参照ください。
RAM ユーザーが RAM ロールを偽装する方法の詳細については、「RAM ロールの偽装」をご参照ください。
ロールベース SSO の詳細については、「ロールベース SSO」をご参照ください。