セキュリティトークンサービス (STS) のトークンは、Resource Access Management (RAM) ユーザーの AccessKey ペアが漏洩した場合に発生するセキュリティリスクを軽減します。STS トークンを取得するには、まず RAM ユーザーおよび RAM ロールを作成し、それぞれに必要な権限を付与した後、RAM ユーザーの AccessKey ペアを用いて AssumeRole 操作を呼び出して RAM ロールを引き受けます。その後、STS サービスから STS トークンを取得できます。
手順 1:RAM ユーザーの作成
RAM ユーザーの作成を行い、以下の点に注意してください。
ログイン名 パラメーターを vod に設定します。本トピックでは、以降のすべての例でログイン名として vod を使用します。
アクセスモード パラメーターを 永続的な AccessKey を使用してアクセス に設定します。
取得した AccessKey ペア を安全に保管してください。
手順 2:RAM ユーザーに STS の AssumeRole 操作を呼び出す権限を付与
RAM コンソールで、ユーザー ページに移動します。RAM ユーザー名が vod のユーザーを検索し、操作 列の 権限の付与 をクリックします。
権限の付与 パネルで、RAM ユーザーに権限を付与します。
説明vod ユーザーに AliyunSTSAssumeRoleAccess ポリシーをアタッチします。このポリシーにより、ユーザーは STS の AssumeRole 操作を呼び出せるようになります。ポリシーを検索するには、システムポリシー を選択し、検索ボックスに
AliyunSTSAssumeRoleAccessを入力します。
リソース範囲 を選択します。
アカウントレベル:権限は現在の Alibaba Cloud アカウント全体に適用されます。
リソースグループレベル:権限は特定のリソースグループに適用されます。RAM ユーザーにリソースグループレベルの権限を付与する場合、ユーザーはコンソールにログイン後に、上部ナビゲーションバーでリソース範囲を該当のリソースグループに切り替える必要があります。そのうえで初めて、当該グループ内のリソースへのアクセスおよび管理が可能になります。
説明AdministratorAccess や AliyunRAMFullAccess などの高リスクなシステムポリシーは、システムによって自動的に警告表示されます。これらのポリシーは、クラウドリソース全体に対する完全制御または Resource Access Management (RAM) の完全管理を許可することが多いです。付与には十分に注意してください。
リソースグループによる権限付与の例については、「リソースグループを用いて RAM ユーザーを特定の ECS インスタンスのみの管理に制限する」をご参照ください。
プリンシパル を選択します。
プリンシパルとは、権限を受領する RAM ユーザーを指します。 ユーザー ページから開始した場合は、システムが自動的に現在の RAM ユーザーを選択します。一方、権限の付与 ページから開始した場合は、手動で 1 人以上の RAM ユーザーを選択します。
権限ポリシー を選択します。
システムポリシー:検索して直接選択します。検索のヒント:検索ボックスを活用して、ポリシーを素早く見つけましょう。プロダクト名(例:
ECSやOSS)、権限レベル(例:ReadOnlyやFullAccess)、またはポリシー名全体で検索できます。カスタムポリシー:事前にカスタムポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。
権限の付与を確定 をクリックします。
権限付与結果を確認し、閉じる をクリックします。
手順 3:RAM ロールの作成
以下の手順 5 で、ロール名 パラメーターを vodrole に設定します。本トピックでは、以降のすべての例でロール名として vodrole を使用します。
Resource Access Management (RAM) コンソール に RAM 管理者としてログインします。
左側ナビゲーションウィンドウで、 を選択します。
ロール ページで、ロールの作成 をクリックします。

ロールの作成 ページで、信頼エンティティの種類 を Alibaba Cloud アカウント に設定します。次に、Alibaba Cloud アカウントを設定し、OK をクリックします。

現在の Alibaba Cloud アカウント:すべての RAM ユーザーおよび RAM ロールがこのロールを引き受けられるようにするには、現在の Alibaba Cloud アカウント を選択します。
他の Alibaba Cloud アカウント:別の Alibaba Cloud アカウントのすべての RAM ユーザーおよび RAM ロールがこの RAM ロールを引き受けられるようにするには、他の Alibaba Cloud アカウント を選択し、そのアカウント ID を入力します。このオプションは、クロスアカウント間のリソースアクセスに使用されます。詳細については、「Alibaba Cloud アカウント間でのリソースアクセス」をご参照ください。Alibaba Cloud アカウント ID は、セキュリティ設定 ページで確認できます。
(任意)信頼される Alibaba Cloud アカウント内において、特定の RAM ユーザーまたは RAM ロールのみが当該 RAM ロールを引き受けられるようにする場合は、エディターの切り替え をクリックして信頼ポリシーを編集します。
エディターは、ビジュアルエディターとスクリプトエディターの 2 つのモードをサポートしています。以下に、現在の Alibaba Cloud アカウント(AccountID=100******0719)内の RAM ユーザー
Aliceのみが当該 RAM ロールを引き受けられるように設定する例を示します。ビジュアルエディター
プリンシパル セクションで、RAM ユーザー名を指定します。


スクリプトエディター
Principal要素のRAMフィールドに、RAM ユーザーを指定します。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Principal": { "RAM": "acs:ram::100******0719:user/Alice" }, "Action": "sts:AssumeRole" } ] }
ロールの作成 ダイアログボックスで、ロール名 を入力し、OK をクリックします。
手順 4:RAM ロールに ApsaraVideo VOD の管理権限を付与
RAM コンソールで、ロールページに移動します。RAM ロール名が vodrole のロールを検索し、操作 列の 権限の付与 をクリックします。
権限の付与 パネルで、RAM ロールに権限を付与します。
説明リスクを低減するため、最小権限の原則を適用してください。
vodrole ロールが ApsaraVideo VOD リソースにアクセス・管理する必要がある場合、システムポリシー AliyunVODFullAccess をロールにアタッチします。このポリシーにより、すべての ApsaraVideo VOD リソースに対する完全なアクセス権が付与されます。ポリシーを検索するには、システムポリシー を選択し、検索ボックスに
AliyunVODFullAccessを入力します。ApsaraVideo VOD のシステムポリシーおよびその権限について詳しくは、「システムポリシー」をご参照ください。

リソース範囲 を選択します。
アカウントレベル:権限は現在の Alibaba Cloud アカウント全体に適用されます。
リソースグループレベル:権限は特定のリソースグループに適用されます。RAM ユーザーにリソースグループレベルの権限を付与する場合、ユーザーはコンソールにログイン後に、上部ナビゲーションバーでリソース範囲を該当のリソースグループに切り替える必要があります。そのうえで初めて、当該グループ内のリソースへのアクセスおよび管理が可能になります。
説明AdministratorAccess や AliyunRAMFullAccess などの高リスクなシステムポリシーは、システムによって自動的に警告表示されます。これらのポリシーは、クラウドリソース全体に対する完全制御または Resource Access Management (RAM) の完全管理を許可することが多いです。付与には十分に注意してください。
リソースグループによる権限付与の例については、「リソースグループを用いて RAM ユーザーを特定の ECS インスタンスのみの管理に制限する」をご参照ください。
プリンシパル を選択します。
プリンシパルとは、権限を受領する RAM ユーザーを指します。 ユーザー ページから開始した場合は、システムが自動的に現在の RAM ユーザーを選択します。一方、権限の付与 ページから開始した場合は、手動で 1 人以上の RAM ユーザーを選択します。
権限ポリシー を選択します。
システムポリシー:検索して直接選択します。検索のヒント:検索ボックスを活用して、ポリシーを素早く見つけましょう。プロダクト名(例:
ECSやOSS)、権限レベル(例:ReadOnlyやFullAccess)、またはポリシー名全体で検索できます。カスタムポリシー:事前にカスタムポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。
権限の付与を確定 をクリックします。
権限付与が完了すると、成功レコードが表示されます。

権限付与結果を確認し、閉じる をクリックします。
手順 5:RAM ロールの引き受けと STS トークンの取得
RAM ユーザーを使用して、STS の AssumeRole – ロールを引き受けるための一時的な資格情報を取得 操作を呼び出します。これにより、RAM ロールの STS トークンが返されます。この STS トークンは、ApsaraVideo VOD の API 操作を直接呼び出す際に使用したり、クライアントに配布して、クライアント直アップロードなどのタスクを実行させたりできます。本トピックでは Java SDK の例を提供します。他の言語の例については、「STS SDK の概要」をご参照ください。
SDK V1.0
Maven で、以下の依存関係情報を追加します。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-sts</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.7.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.16.32</version>
</dependency>package pop;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
public class TestStsService {
public static void main(String[] args) {
// 手順 1 で作成した RAM ユーザーの AccessKey ペア(AccessKey ID および AccessKey Secret)を環境変数から取得します。
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// AssumeRole 操作のリクエストパラメーター(RoleArn、RoleSessionName、Policy、DurationSeconds)を設定します。
// RoleArn の値は、手順 3 に基づき RAM コンソールから取得します。
String roleArn = "<role-arn>";
// RoleSessionName には任意の値を設定します。RoleSessionName はロールセッションの名前を指定します。
String roleSessionName = "session-name";
// ポリシーをカスタマイズします。
String policy = "{\n" +
" \"Version\": \"1\",\n" +
" \"Statement\": [\n" +
" {\n" +
" \"Action\": \"vod:*\",\n" +
" \"Resource\": \"*\",\n" +
" \"Effect\": \"Allow\"\n" +
" }\n" +
" ]\n" +
"}";
try {
AssumeRoleResponse response = assumeRole(accessKeyId, accessKeySecret, roleArn, roleSessionName, policy);
System.out.println("有効期限: " + response.getCredentials().getExpiration());
System.out.println("Access Key ID: " + response.getCredentials().getAccessKeyId());
System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
System.out.println("セキュリティトークン: " + response.getCredentials().getSecurityToken());
System.out.println("リクエスト ID: " + response.getRequestId());
} catch (ClientException e) {
System.out.println("トークンの取得に失敗しました。");
System.out.println("エラーコード: " + e.getErrCode());
System.out.println("エラーメッセージ: " + e.getErrMsg());
}
}
static AssumeRoleResponse assumeRole(String accessKeyId, String accessKeySecret, String roleArn, String roleSessionName, String policy) throws ClientException {
try {
// デフォルトプロファイルを構築します。regionId パラメーターは空のままにします。
/*
注:SysEndpoint を sts.aliyuncs.com に設定した場合、regionId パラメーターは省略可能です。それ以外の場合は、regionId をサービスのリージョン(例:cn-shanghai)に設定する必要があります。
各 STS リージョンのエンドポイントについては、公式ドキュメントをご参照ください。
*/
IClientProfile profile = DefaultProfile.getProfile("", accessKeyId, accessKeySecret);
// プロファイルを使用してクライアントを構築します。
DefaultAcsClient client = new DefaultAcsClient(profile);
// AssumeRoleRequest を作成し、リクエストパラメーターを設定します。
final AssumeRoleRequest request = new AssumeRoleRequest();
request.setSysEndpoint("sts.aliyuncs.com");
request.setSysMethod(MethodType.POST);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
request.setPolicy(policy);
// リクエストを送信し、応答を取得します。
final AssumeRoleResponse response = client.getAcsResponse(request);
return response;
} catch (ClientException e) {
throw e;
}
}
}SDK V2.0
Maven で、以下の依存関係情報を追加します。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>sts20150401</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>vod20170321</artifactId>
<version>3.6.4</version>
</dependency>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;
public class TestStsService {
public static void main(String[] args) {
// 手順 1 で作成した RAM ユーザーの AccessKey ペア(AccessKey ID および AccessKey Secret)を環境変数から取得します。
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// AssumeRole 操作のリクエストパラメーター(RoleArn、RoleSessionName、Policy、DurationSeconds)を設定します。
// RoleArn の値は、手順 3 に基づき RAM コンソールから取得します。
String roleArn = "<role-arn>";
// RoleSessionName には任意の値を設定します。
String roleSessionName = "session-name";
// ポリシーをカスタマイズします。
String policy = "{\n" +
" \"Version\": \"1\",\n" +
" \"Statement\": [\n" +
" {\n" +
" \"Action\": \"vod:*\",\n" +
" \"Resource\": \"*\",\n" +
" \"Effect\": \"Allow\"\n" +
" }\n" +
" ]\n" +
"}";
try {
AssumeRoleResponse assumeRoleResponse = assumeRole(accessKeyId, accessKeySecret, roleArn, roleSessionName, policy);
System.out.println("有効期限: " + assumeRoleResponse.getBody().getCredentials().getExpiration());
System.out.println("Access Key ID: " + assumeRoleResponse.getBody().getCredentials().getAccessKeyId());
System.out.println("Access Key Secret: " + assumeRoleResponse.getBody().getCredentials().getAccessKeySecret());
System.out.println("セキュリティトークン: " + assumeRoleResponse.getBody().getCredentials().getSecurityToken());
System.out.println("リクエスト ID: " + assumeRoleResponse.getRequestId());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static AssumeRoleResponse assumeRole(String accessKeyId, String accessKeySecret, String roleArn, String roleSessionName, String policy) throws Exception {
Config config = new Config()
// 環境変数から AccessKey ID を取得します。
.setAccessKeyId(accessKeyId)
// 環境変数から AccessKey Secret を取得します。
.setAccessKeySecret(accessKeySecret);
config.endpoint = "sts.cn-hangzhou.aliyuncs.com";
Client client = new Client(config);
AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
.setRoleArn(roleArn)
.setRoleSessionName(roleSessionName)
.setPolicy(policy);
RuntimeOptions runtime = new RuntimeOptions();
return client.assumeRoleWithOptions(assumeRoleRequest, runtime);
}
}