STS (Security Token Service) は、RAMユーザーに一時的なアクセス資格情報を発行することにより、OSS (Object Storage Service) 内の指定されたリソースへの時間制限付きアクセスをRAMユーザーに付与できます。 一時アクセス資格情報の有効期限が切れると、RAMユーザーは一時アクセス資格情報を使用してリソースにアクセスできなくなります。 STSは、アクセス制御の柔軟性と適時性を向上させます。
前提条件
バケット作成についての 詳細は、「バケットの作成」をご参照ください。
ステップ1: RAMユーザーの作成
RAM コンソールにログインします。
左側のナビゲーションウィンドウで、アイデンティティ > [ユーザー] を選択します。
[ユーザー] ページで、ユーザーの作成 をクリックします。
ログイン名 および [表示名] パラメーターを設定します。
アクセスモード セクションで、[OpenAPIアクセス] を選択します。 そして、[OK] をクリックします。
プロンプトに従って完全なセキュリティ検証。
AccessKeyペア (AccessKey IDとAccessKey secret) をコピーします。
重要RAMユーザーのAccessKeyシークレットは、RAMユーザーを作成する場合にのみ取得できます。 認証情報の漏洩を防ぐため、AccessKeyシークレットを安全に保持する必要があります。
手順2: AssumeRole操作を呼び出す権限をRAMユーザーに付与する
RAMユーザーを作成したら、STSのAssumeRole操作を呼び出す権限をRAMユーザーに付与します。
[ユーザー] ページで、作成したRAMユーザーを見つけ、[操作] 列の 権限の追加 をクリックします。
[権限付与] パネルの [ポリシー] セクションで、[AliyunSTSAssumeRoleAccess] ポリシーを選択します。
説明AliyunSTSAssumeRoleAccessポリシーを使用すると、RAMユーザーはAssumeRole操作を呼び出すことができます。 ポリシーの権限は、RAMユーザーがSTSから一時的なアクセス資格情報を取得してOSSへのリクエストを開始するために必要な権限とは無関係です。
[権限付与] をクリックします。
ステップ3: RAMロールの作成
RAMロールを作成して、RAMロールが引き受けられたときにRAMロールの権限を宣言します。
左側のナビゲーションウィンドウで、アイデンティティ > [ロール] を選択します。
ロールの作成 をクリックします。 [ロールの作成] ウィザードの [ロールタイプの選択] ステップで、[信頼できるエンティティの選択] を Alibaba Cloud アカウント に設定し、[次へ] をクリックします。
ロールの作成 ウィザードの [ロールの設定] ステップで、RAM ロール名 をRamOssTestに設定し、信頼できる Alibaba Cloud アカウントを選択 を 現在の Alibaba Cloud アカウント に設定します。
[OK] をクリックします。 ロールの作成後、[閉じる] をクリックします。
[ロール] ページで、検索ボックスに [RamOssTest] と入力し、検索アイコンをクリックし、検索結果で [RamOssTest] をクリックします。
RamOssTestページの右側にある [コピー] をクリックして、ロールのAlibaba Cloudリソース名 (ARN) を保存します。
手順4: OSSにオブジェクトをアップロードする権限をRAMロールに付与する
1つ以上のポリシーをRAMロールにアタッチして、RAMロールが引き受けられたときにOSSリソースに対する操作を実行する権限をRAMロールに付与します。 たとえば、RAMユーザーがこのRAMロールを引き受け、特定のOSSバケットにのみオブジェクトをアップロードする場合は、RAMロールに書き込み権限を付与するポリシーをアタッチする必要があります。
オブジェクトをアップロードする権限をロールに付与するカスタムポリシーを作成します。
左側のナビゲーションウィンドウで、権限管理 > ポリシー を選択します。
ポリシー ページで ポリシーの作成 をクリックします。
ポリシーの作成 ページで、[JSON] をクリックします。 コードエディターに次のスクリプトを入力して、RAMロールにexamplebucketバケットにオブジェクトをアップロードする権限を付与します。
警告以下の例は参考情報です。 ユーザーに過度の権限を付与しないように、要件に基づいてきめ細かいRAMポリシーを構成する必要があります。 きめ細かいRAMポリシーを設定する方法の詳細については、「例9: RAMまたはSTSを使用してユーザーにOSSリソースへのアクセスを許可する」をご参照ください。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:examplebucket/*" ] } ] }
説明Action要素は、RAMロールに付与する権限を指定します。 たとえば、oss:PutObjectを指定した場合、RAMロールを引き受けるRAMユーザーは、簡易アップロード、フォームアップロード、追加アップロード、マルチパートアップロード、再開可能アップロードなどのさまざまなアップロード方法を使用して、指定したバケットにオブジェクトをアップロードできます。 詳細については、「OSSのRAMポリシーのアクション要素」をご参照ください。
[次へ] をクリックしてポリシー情報を編集します。
[基本情報] セクションで、[名前] を [RamTestPolicy] に設定し、[OK] をクリックします。
カスタムポリシーをRamOssTestロールにアタッチします。
左側のナビゲーションペインで、
を選択します。[ロール] ページで、[RamOssTest] ロールを見つけます。
[操作] の [権限付与] をクリックします。
[権限付与] パネルで、[ポリシー] セクションのドロップダウンリストから [カスタムポリシー] を選択し、[RamTestPolicy] ポリシーを選択します。
[権限付与] をクリックします。
手順5: RAMユーザーを使用してRAMロールを引き受け、一時的なアクセス資格情報を取得する
オブジェクトをOSSにアップロードする権限をRAMロールに付与すると、RAMユーザーはRAMロールを引き受けて一時的なアクセス資格情報を取得します。 一時的なアクセス資格情報には、セキュリティトークン (SecurityToken) 、一時的なAccessKeyペア (AccessKey IDとAccessKey secret) 、および有効期間 (Expiration) が含まれます。
STS SDKの使用
STS SDKを使用して、一時的なアクセス資格情報を取得できます。
次のサンプルコードは、STS SDK for Javaを使用して、単純なアップロード (oss:PutObject
) 権限を持つ一時的なアクセス資格情報を取得する方法の例を示しています。 他のプログラミング言語でSTS SDKを使用して一時的なアクセス資格情報を取得する方法の詳細については、「STS SDKの概要」をご参照ください。 STSエンドポイントの一覧については、「エンドポイント」をご参照ください。
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.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
public class StsServiceSample {
public static void main(String[] args) {
// Specify the endpoint of STS. Example: sts.cn-hangzhou.aliyuncs.com. You can access STS over the Internet or a virtual private cloud (VPC).
String endpoint = "sts.cn-hangzhou.aliyuncs.com";
// Obtain the AccessKey ID and AccessKey secret of the RAM user generated in Step 1 from environment variables.
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
// Obtain the ARN of the RAM role generated in Step 3 from environment variables.
String roleArn = System.getenv("OSS_STS_ROLE_ARN");
// Specify a custom role session name to distinguish different tokens. Example: SessionTest.
String roleSessionName = "yourRoleSessionName";
// Specify that the temporary access credentials have all permissions of the RAM role.
String policy = null;
// Specify the validity period of the temporary access credentials. Unit: seconds. The minimum validity period is 900 seconds. The maximum validity period is the same as the maximum session duration specified for the current role. The maximum session duration of the current role ranges from 3,600 seconds to 43,200 seconds. The default maximum session duration of the current role is 3,600 seconds.
// In large object upload or other time-consuming scenarios, we recommend that you set the validity period of temporary access credentials to a reasonable value to ensure that you do not need to repeatedly call the STS API operation to obtain temporary access credentials before the task is complete.
Long durationSeconds = 3600L;
try {
// Specify the region of STS. We recommend that you keep the default value. The default value is an empty string ("").
String regionId = "";
// Specify the endpoint. You can specify this parameter by using STS SDK for Java 3.12.0 or later.
DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
// Specify the endpoint. You can specify this parameter by using STS SDK for Java that is earlier than 3.12.0.
// DefaultProfile.addEndpoint("",regionId, "Sts", endpoint);
// Create a default profile.
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
// Use the profile to create a client.
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
// You can specify this parameter by using STS SDK for Java 3.12.0 or later.
request.setSysMethod(MethodType.POST);
// You can specify this parameter by using STS SDK for Java that is earlier than 3.12.0.
// request.setMethod(MethodType.POST);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
request.setPolicy(policy);
request.setDurationSeconds(durationSeconds);
final AssumeRoleResponse response = client.getAcsResponse(request);
System.out.println("Expiration: " + response.getCredentials().getExpiration());
System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
System.out.println("RequestId: " + response.getRequestId());
} catch (ClientException e) {
System.out.println("Failed:");
System.out.println("Error code: " + e.getErrCode());
System.out.println("Error message: " + e.getErrMsg());
System.out.println("RequestId: " + e.getRequestId());
}
}
}
一時的なアクセス資格情報がRAMロールから権限を取得した後、一時的なアクセス資格情報の権限をさらに制限できます。 たとえば、一時的なアクセス資格情報にexamplebucketバケットにオブジェクトをアップロードする権限がある場合、次のサンプルポリシーを参照して、アクセス資格情報を使用してバケット内の特定のディレクトリにのみデータをアップロードできるように指定できます。
// The following policy specifies that the temporary access credentials can be used to upload objects only to the src directory of the examplebucket bucket.
// The final permissions granted to the temporary access credentials are the intersection of the role permissions that are specified in Step 4 and the permissions that are specified in the policy. This allows you to upload objects only to the src directory in the examplebucket bucket.
String policy = "{\n" +
" \"Version\": \"1\", \n" +
" \"Statement\": [\n" +
" {\n" +
" \"Action\": [\n" +
" \"oss:PutObject\"\n" +
" ], \n" +
" \"Resource\": [\n" +
" \"acs:oss:*:*:examplebucket/src/*\" \n" +
" ], \n" +
" \"Effect\": \"Allow\"\n" +
" }\n" +
" ]\n" +
"}";
RESTful APIの使用
STSのAssumeRole操作を呼び出して、一時的なアクセス資格情報を取得できます。
ステップ6: 一時的なアクセス資格情報を使用してオブジェクトをOSSにアップロードする
一時的なアクセス資格情報の有効期間 (Expiration) が終了する前に、一時的なアクセス資格情報を使用してローカルファイルをOSSにアップロードします。
一時的なアクセス資格情報の有効期限はUTCです。これは、中国で使用されているUTC + 8タイムゾーンよりも8時間早くなっています。 たとえば、一時的なアクセス資格情報の有効期限が2024-04-18T11:33:40Zの場合、一時的なアクセス資格情報は4月18日2024の19:33:40 (UTC + 8) に期限切れになります。
一時的なアクセス資格情報は、有効期限が切れる前に複数回使用できます。 たとえば、一時的なアクセス資格情報が期限切れになる前に、アップロード操作を繰り返し呼び出して複数のファイルをアップロードしたり、ファイルのパッケージをアップロードしたりできます。
次のサンプルコードは、OSS SDK for Java 3.12.0を使用して、exampletest.txtファイルをローカルパスD :\\ localpath
からexamplebucketバケットにアップロードする方法の例を示しています。 他のプログラミング言語のOSS SDKを使用して一時的なアクセス資格情報を使用してデータをアップロードする方法の詳細については、「概要」をご参照ください。
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyuncs.exceptions.ClientException;
import java.io.File;
public class Demo {
public static void main(String[] args) throws ClientException {
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Obtain the temporary AccessKey pair generated in Step 5 from environment variables.
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
// Obtain the security token generated in Step 5 from environment variables.
String securityToken = System.getenv("OSS_SESSION_TOKEN");
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken);
// Upload a local file named exampletest.txt to examplebucket.
PutObjectRequest putObjectRequest = new PutObjectRequest("examplebucket", "exampletest.txt", new File("D:\\localpath\\exampletest.txt"));
// ObjectMetadata metadata = new ObjectMetadata();
// Specify the storage class of the uploaded object.
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// Specify the access control list (ACL) of the uploaded object.
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
try {
// Upload the local file.
ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
よくある質問
どうすればよいですかこのアクションを実行する権限がありません。 あなたはRAMによって承認されるべきです。エラーメッセージが返されますか?
DurationSecondsの最小 /最大値は15Min /1hrです。What do I do error message.返されますか?
エラーメッセージの場合はどうすればよいですか指定したセキュリティトークンが無効です。 返されますか?
エラーメッセージの場合はどうすればよいですか指定したOSSアクセスキーIdはレコードに存在しません。 返されますか?
私は何をしますか?AccessDenied: この操作では匿名アクセスが禁止されています。 エラーメッセージが返されますか?
NoSuchBucketエラーコードが返された場合はどうすればよいですか?
私は何をしますか?バケットaclのため、このオブジェクトにアクセスする権利はありません。 一時的なアクセス資格情報を使用してOSSリソースにアクセスすると、エラーメッセージが返されますか。
私は何をしますか?承認者のポリシーによってアクセスが拒否されました。 STSから取得した一時的なアクセス資格情報を使用してOSSリソースで操作を実行すると、エラーメッセージが返されますか。
エラーメッセージの場合はどうすればよいですかアクセスしようとするバケットは、指定されたエンドポイントを使用してアドレス指定する必要があります。 返されますか?
複数の一時的なアクセス資格情報を同時に取得できますか?
時間形式エラーが発生した場合はどうすればよいですか?
0003 0000301のエラーコードが返された場合はどうすればよいですか?
関連ドキュメント
一時的なアクセス資格情報を使用して、クライアントから直接OSSにデータをアップロードし、ファイルサイズ、ファイルタイプ、宛先ディレクトリなどのアップロード条件を指定できます。 詳細については、「直接クライアントのアップロード」をご参照ください。
署名付きURLを使用して、一時的なアクセス資格情報を使用してアップロードされたオブジェクトを共有できます。 詳細については、「オブジェクトとオブジェクトURLの共有」をご参照ください。