Security Token Service (STS) を使用して一時的なアクセス資格情報を生成し、特定の期間内にObject Storage Service (OSS) リソースにアクセスする権限をユーザーに付与できます。 この方法では、AccessKeyペアを共有する必要はありません。 これにより、データのセキュリティが向上します。
前提条件
AliyunRAMFullAccess
ポリシーがアタッチされているAlibaba CloudアカウントまたはRAM (Resource Access Management) ユーザーのいずれかのアカウントを使用できます。 RAMユーザーに権限を付与する方法の詳細については、「RAMユーザーに権限を付与する」をご参照ください。
シナリオ
モバイルアプリ開発者で、アプリのユーザーデータをOSSに保存する予定であるとします。 各ユーザーのデータは、ユーザーが他のユーザーのデータを取得できないように分離する必要があります。 この場合、STSを使用して、OSSバケット内の独自のデータにアクセスする権限をユーザーに付与できます。
次の図は、STSを使用してユーザーにOSSへのアクセスを許可する方法を示しています。
アプリユーザーがアプリサーバーにログオンします。 アプリユーザーがログインに使用するユーザー名とパスワードは、OSSへのアクセスに使用するAlibaba CloudアカウントのAccessKeyペアとは異なります。 アプリサーバーは、有効なアプリユーザーごとの最小アクセス許可を決定する必要があります。
アプリサーバーは、セキュリティトークンを取得するためにSTSにリクエストを送信します。 アプリサーバーがSTSにリクエストを送信する前に、アプリサーバーは、アプリユーザーがOSSにアクセスするために必要な最小アクセス権限と資格情報の有効期間を決定する必要があります。 RAMポリシーを設定して、最小アクセス権限をカスタマイズできます。 次に、アプリサーバーはAssumeRoleを呼び出して、ロールを示すセキュリティトークンを取得します。
STSは、一時的なアクセス資格情報をアプリサーバーに返します。 資格情報は、有効期間内にOSSにアクセスするために使用できるセキュリティトークンと一時的なAccessKeyペアで構成されます。 一時的なAccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。
アプリサーバーは、一時的なアクセス資格情報をアプリクライアントに返します。 アプリクライアントは資格情報をキャッシュできます。 資格情報の有効期限が切れると、アプリクライアントはアプリサーバーから新しい一時的なアクセス資格情報を申請する必要があります。 たとえば、一時的なアクセス資格情報が1時間有効である場合、アプリクライアントは30分ごとに資格情報を更新するようにアプリサーバーに要求を送信できます。
アプリクライアントは、ローカルにキャッシュされた一時的なアクセス資格情報を使用して、OSS API操作を呼び出す要求を開始します。 OSSがリクエストを受信すると、OSSはSTSを使用してリクエストのアクセス資格情報を検証し、リクエストに応答します。
ステップ1: RAMユーザーの作成
RAM コンソール にログインします。
左側のナビゲーションウィンドウで、アイデンティティ > [ユーザー] を選択します。
[ユーザー] ページで、ユーザーの作成 をクリックします。
ログイン名 および [表示名] パラメーターを設定します。
アクセスモード セクションで、[OpenAPIアクセス] を選択します。 そして、[OK] をクリックします。
表示されるページで、[コピー] をクリックしてRAMユーザーのAccessKeyペアを保存します。
手順2: AssumeRole操作を呼び出す権限をRAMユーザーに付与する
[ユーザー] ページで、作成したRAMユーザーを見つけ、[操作] 列の 権限の追加 をクリックします。
権限の追加 パネルで、[システムポリシー] タブをクリックし、[AliyunSTSAssumeRoleAccess] ポリシーを選択します。
[OK] をクリックします。
ステップ3: STSから一時的なアクセス資格情報を取得するために使用するロールを作成する
左側のナビゲーションウィンドウで、アイデンティティ > [ロール] を選択します。
ロールの作成 をクリックします。 [ロールの作成] パネルで、[信頼できるエンティティの選択] を Alibaba Cloud アカウント に設定し、[次へ] をクリックします。
ロールの作成 パネルで、RAM ロール名 をRamOssTestに設定し、信頼できる Alibaba Cloud アカウントを選択 を 現在の Alibaba Cloud アカウント に設定します。
[OK] をクリックします。 ロールの作成後、[閉じる] をクリックします。
[ロール] ページで、検索ボックスに [RamOssTest] と入力し、検索結果で [RamOssTest] をクリックします。
RamOssTestページの右側にある [コピー] をクリックして、ロールのAlibaba Cloudリソース名 (ARN) を保存します。
手順4: OSSにオブジェクトをアップロードする権限をロールに付与する
オブジェクトをアップロードする権限をロールに付与するカスタムポリシーを作成します。
左側のナビゲーションウィンドウで、権限管理 > ポリシー を選択します。
ポリシー ページで ポリシーの作成 をクリックします。
ポリシーの作成 ページで、[JSON] をクリックします。 ポリシーエディターでスクリプトを編集して、examplebucketバケットのsrcおよびdestディレクトリにオブジェクトをアップロードする権限をロールに付与します。 次のコードは、ロールに権限を付与する方法の例を示しています。
警告以下は参考例です。 ユーザーに過度の権限を与えないように、要件に基づいてきめ細かいRAMポリシーを構成する必要があります。 きめ細かいRAMポリシーを設定する方法の詳細については、「例9: RAMまたはSTSを使用してユーザーにOSSリソースへのアクセスを許可する」をご参照ください。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:examplebucket/src/*" 、 "acs:oss:*:*:examplebucket/dest/*" ] } ] }
[次へ] をクリックしてポリシー情報を編集します。
[基本情報] セクションで、[名前] を [RamTestPolicy] に設定し、[OK] をクリックします。
カスタムポリシーをRamOssTestロールにアタッチします。
左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール] を選択します。
[ロール] ページで、[RamOssTest] ロールを見つけます。
[操作] 列の [権限の追加] をクリックします。
[権限の追加] パネルで、[カスタムポリシー] タブをクリックし、[RamTestPolicy] ポリシーを選択します。
[OK] をクリックします。
ステップ5: 一時的なアクセス資格情報の取得
STS SDKの使用
STS SDKを使用して、一時的なアクセス資格情報を取得できます。
次のサンプルコードは、STS SDK for Javaを使用して、単純なアップロード (oss:PutObject
) 権限を持つ一時的なアクセス資格情報を取得する方法の例を示しています。 他のプログラミング言語でSTS SDKを使用して、単純なアップロード (oss:PutObject) 権限を持つ一時的なアクセス資格情報を取得する方法の詳細については、「STS SDKの概要」をご参照ください。
com.aliyuncs.DefaultAcsClientをインポートします。com.aliyuncs.exceptions.ClientExceptionをインポートします。com.aliyuncs.http.MethodTypeをインポートします。com.aliyuncs.profile.DefaultProfileをインポートします。com.aliyuncs.profile.IClientProfileをインポートします。com.aliyuncs.auth.sts.AssumeRoleRequestをインポートします。com.aliyuncs.auth.sts.AssumeRoleResponseをインポートします。public class StsServiceSample {
public static void main(String[] args) {
// STSのエンドポイントを指定します。 例: sts.cn-hangzhou.aliyuncs.com。
String endpoint = "yourStsEndpoint";
// 手順1で生成したRAMユーザーのAccessKey IDとAccessKey secretを環境変数から取得します。
文字列accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
文字列accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
// 手順3で生成されたRAMロールのARNを環境変数から取得します。
文字列roleArn = System.getenv("OSS_STS_ROLE_ARN");
// さまざまなトークンを区別するために、カスタムロールセッション名を指定します。 例: SessionTest。
String roleSessionName = "yourRoleSessionName";
// 次のポリシーでは、一時的なアクセス資格情報のみを使用して、examplebucketバケットのsrcディレクトリにオブジェクトをアップロードできます。
// 一時的なアクセス資格情報の権限は、手順4で設定されたロールの権限とRAMポリシーで指定された権限の共通部分です。 ユーザーは一時的なアクセス資格情報を使用して、examplebucketバケットのsrcディレクトリにのみオブジェクトをアップロードできます。
// ポリシーが空の場合、ユーザーにはロールのすべての権限が付与されます。
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" +
"}";
// 一時的なアクセス資格情報の有効期間を3,600秒に設定します。
長いdurationSeconds = 3600L;
try {
// regionIdは、RAMユーザーのリージョンIDを指定します。 たとえば、RAMユーザーが中国 (杭州) リージョンにある場合、regionIdをcn-Hangzhouに設定します。 空の文字列 ("") であるデフォルト設定を保持することもできます。
文字列regionId = "";
// エンドポイントを追加します。 このパラメーターは、STS SDK for Java V3.12.0以降を使用して指定できます。
DefaultProfile.addEndpoint(regionId、"Sts" 、エンドポイント);
// エンドポイントを追加します。 このパラメーターは、V3.12.0より前のSTS SDK for Javaを使用して指定できます。
// DefaultProfile.addEndpoint("",regionId, "Sts", endpoint);
// デフォルトのプロファイルを作成します。
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
// プロファイルを使用してクライアントを作成します。
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
// STS SDK for Java V3.12.0以降を使用してこのパラメーターを指定できます。
request.setSysMethod(MethodType.POST);
// このパラメーターは、V3.12.0より前のSTS SDK for Javaを使用して指定できます。
// 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());
}
}
}
パラメーター | 例 | 説明 |
エンドポイント | sts.cn-hangzhou.aliyuncs.com | STSのエンドポイント。 インターネットまたは仮想プライベートクラウド (VPC) 経由でSTSにアクセスできます。 STSエンドポイントの詳細については、「エンドポイント」をご参照ください。 |
accessKeyId | LTAI5tJHezdULrXcczCW **** | 手順1でRAMユーザーに対して生成されたAccessKey ID。 |
accessKeySecret | CTkGhP9xUpMR5IWj4WRZTQ2SR **** | 手順1でRAMユーザー用に生成されたAccessKeyシークレット。 |
roleArn | acs:ram::137918634 ****:role/ramosstest | ステップ3で取得した役割ARN。 |
roleSessionName | SessionTest | ロールセッションの名前。 このパラメーターは、ビジネス要件に基づいて指定できます。 ほとんどの場合、このパラメーターをAPI操作を呼び出すユーザーのIDに設定できます。 名前は2 ~ 64文字で、英数字、ピリオド (.) 、アットサイン (@) 、ハイフン (-) 、アンダースコア (_) を使用できます。 |
policy |
| 返されたSTSトークンの権限を指定するポリシー。 これにより、よりきめ細かいアクセス制御を実装できます。 以下の説明は、詳細を提供します。
ポリシーの要素を構成する方法の詳細については、「概要」をご参照ください。 マルチパートアップロードや追加アップロードなどの特定の操作を実行するために使用できる一時的なアクセス資格情報を取得する場合は、操作に基づいてポリシーのAction要素を構成します。 Action要素の詳細については、「概要」をご参照ください。 |
durationSeconds | 3600 | 一時的なアクセス資格情報の有効期間。 単位は秒です。 最小値: 900。 最大値は、現在のロールの最大セッション期間に基づいています。 現在のロールの最大セッション期間は、3,600秒から43,200秒です。 現在のロールのデフォルトの最大セッション期間は3,600秒です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。 時間のかかるシナリオや大きなオブジェクトをアップロードする必要がある場合は、一時的なアクセス資格情報に長い有効期間を指定することをお勧めします。 このように、一時的なアクセス資格情報を生成するためにSTSを頻繁に使用する必要はありません。 |
RESTful APIの使用
AssumeRole操作を呼び出して、一時的なアクセス資格情報を取得できます。
ステップ6: 一時的なアクセス資格情報を使用してオブジェクトをOSSにアップロードする
次のサンプルコードは、OSS SDK for Java 3.12.0を使用して、exampletest.txtという名前のローカルファイルをD :\\ localpath
からexamplebucketという名前のバケットのsrcディレクトリにアップロードする方法の例を示しています。
com.aliyun.oss.OSSをインポートします。com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo del.PutObjectRequestをインポートします。com.aliyuncs.exceptions.ClientExceptionをインポートします。java.io. ファイルをインポートします。public classデモ {
public static void main(String[] args) throws ClientException {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 手順5で生成された一時的なAccessKeyペアを環境変数から取得します。
文字列accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
文字列accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
// 手順5で生成されたセキュリティトークンを環境変数から取得します。
String securityToken = System.getenv("OSS_SESSION_TOKEN");
// OSSClientインスタンスを作成します。
OSS ossClient = new OSSClientBuilder().build(endpoint、accessKeyId、accessKeySecret、securityToken);
// exampletest.txtファイルをexamplebucketバケットのsrcディレクトリにアップロードします。
PutObjectRequest putObjectRequest = new PutObjectRequest("examplebucket", "src/exampletest.txt", new File("D :\\ localpath\\exampletest.txt"));
// ObjectMetadata metadata=新しいObjectMetadata();
// ファイルをアップロードするときにストレージクラスを指定します。
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// ファイルをアップロードするときにアクセス制御リスト (ACL) を指定します。
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata (メタデータ);
try {
// ローカルファイルをアップロードします。
ossClient.putObject(putObjectRequest);
} catch (Exception e) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "しかし、何らかの理由でエラー応答で拒否されました。");
System.out.println("エラーメッセージ:" + oe.getErrorMessage());
System.out.println("エラーコード:" + oe.getErrorCode());
System.out.println("リクエストID:" + oe.getRequestId());
System.out.println("ホストID:" + oe.getHostId());
} 最後に{
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
オブジェクトをアップロードするときにオブジェクトに指定できるストレージクラスの詳細については、「概要」をご参照ください。 オブジェクトをアップロードするときにオブジェクトに指定できるACLの詳細については、「オブジェクトACL」をご参照ください。
他のプログラミング言語のOSS SDKの例の詳細については、以下のトピックを参照してください。
アップロードされたオブジェクトのURLを取得する方法の詳細については、「署名付きURLでオブジェクトを共有する」をご参照ください。
よくある質問
提供したセキュリティトークンが無効な場合の対処方法. エラーメッセージが返されますか?
手順5で取得したセキュリティトークンを必ず指定してください。
指定したOSSアクセスキーIdがレコードに存在しない場合はどうすればよいですか。 エラーメッセージが返されますか?
現在の一時的なアクセス資格情報の有効期限が切れているため、一時的なAccessKeyペアを使用して、アプリサーバーから新しい一時的なアクセス資格情報を申請します。 詳細については、「ステップ5」をご参照ください。
AccessDenied: Anonymousアクセスがこの操作で禁止されている場合はどうすればよいですか。 エラーメッセージが返されますか?
ステップ5で特定の方法を使用して一時的なアクセス資格情報を取得すると、Alibaba CloudアカウントのAccessKey IDとAccessKey secretを指定したため、エラーメッセージが返されます。 手順1でRAMユーザーに対して生成されたAccessKey IDとAccessKeyシークレットを指定します。
NoSuchBucketエラーが発生した場合はどうすればよいですか?
指定されたバケットが存在しないため、エラーが発生します。 指定されたバケットが存在するかどうかを確認します。 指定したバケットが存在しない場合は、既存のバケットを指定します。
バケットaclのためにこのオブジェクトにアクセスする権利がありません。 STSの一時的なアクセス資格情報を使用してOSSリソースにアクセスすると、エラーメッセージが返されますか。
ポリシーが正しく設定されているかどうかを確認します。 例えば、リソースフィールドの構成が完全でない場合がある。 ポリシーの要素の詳細については、「概要」をご参照ください。
承認者のポリシーによってアクセスが拒否された場合はどうすればよいですか。 STSの一時的なアクセス資格情報を使用してOSSリソースで操作を実行すると、エラーメッセージが返されますか。
関連する操作を実行する権限がないため、エラーメッセージが返されます。 一時的なアクセス資格情報の権限は、ステップ4で設定されたロール権限と、ステップ5でRAMポリシーで指定された権限の共通部分です。 次の例を参照して、これら2つの手順で付与された権限の間で必要な権限が重複しているかどうかを確認します。
例 1
手順4で
AliyunOSSFullAccess
ポリシーがロールにアタッチされ、手順5でoss:PutObject
権限が設定されている場合、一時的なアクセス資格情報にはoss:PutObject
権限が設定されます。 つまり、指定されたバケットにのみオブジェクトをアップロードできます。例 2
手順4でロールに
oss:PutObject
システム権限が付与され、手順5でoss:GetObject
権限が設定されている場合、一時的なアクセス資格情報には権限がありません。 つまり、指定されたバケットに対して操作を実行できません。
アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレス指定する必要があります。 エラーメッセージが返されますか?
手順6でEndpointパラメーターに指定した値が無効な場合、エラーメッセージが返されます。 バケットが配置されているリージョンに基づいてEndpointパラメーターを指定します。 リージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
複数の一時的なアクセス資格情報を同時に取得できますか?
はい、複数の一時的なアクセス資格情報を同時に取得できます。 STSにリクエストを送信することで、一時的なアクセス資格情報のセットを取得できます。 STSから複数の一時的なアクセス資格情報を取得する場合は、複数のリクエストをSTSに送信します。 一時的なアクセス資格情報の有効期間内に複数のリクエストをSTSに送信することで取得される一時的なアクセス資格情報の複数のセットを同時に使用できます。
無効な時間形式エラーが発生した場合はどうすればよいですか?
無効な時間形式エラーが返された場合、考えられる原因は、Timestampパラメーターの値の文字間の不要なスペースです。
時刻を ISO 8601 規格 (yyyy-MM-ddTHH:mm:ssZ) の形式で指定します。 時間は UTC である必要があります。 たとえば、2014-05-26T12:00:00Zを使用して、May 26, 2014 20:00:00 (UTC + 8) を指定します。