このトピックでは、Alibaba Cloud Security Token Service (STS) と署名付き URL を使用して、Object Storage Service (OSS) リソースへの一時的なアクセスを許可する方法について説明します。
注意事項
STS の一時的な認証情報と署名付き URL の両方に有効期間を設定する必要があります。 STS の一時的な認証情報を使用して署名付き URL を生成する場合、2 つの有効期間のうち短い方が有効になります。 たとえば、STS の一時的な認証情報の有効期間を 1,200 秒に設定し、署名付き URL の有効期間を 3,600 秒に設定した場合、署名付き URL は 1,200 秒後に有効期限が切れます。
このトピックでは、例として中国 (杭州) リージョンのパブリックエンドポイントを使用します。 同じリージョン内の他の Alibaba Cloud プロダクトから OSS にアクセスする場合は、内部エンドポイントを使用してください。 OSS がサポートするリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS ドメイン名を使用してクライアントを作成する例を示します。 カスタムドメイン名または STS を使用して OSSClient を作成する方法については、「クライアントの初期化」をご参照ください。
STS を使用した一時的な権限付与
Alibaba Cloud Security Token Service (STS) を使用して、OSS への一時的なアクセスを許可できます。 STS は、クラウドコンピューティングユーザーに一時的なアクセストークンを提供する Web サービスです。 STS を使用すると、カスタムの有効期間と権限を持つ一時的なアクセス認証情報を発行して、サードパーティアプリケーションまたはサブユーザーに提供できます。 サブユーザーとは、ID を管理するユーザーのことです。 STS の詳細については、「STS とは」をご参照ください。
STS の利点は次のとおりです。
長期的な AccessKey ペアをサードパーティアプリケーションに公開する必要はありません。 代わりに、カスタムのアクセス権限と特定の有効期間を持つ一時的なアクセストークンを生成して、アプリケーションに提供できます。
手動で権限を取り消す必要はありません。 トークンの有効期限が切れると、アクセスは自動的に取り消されます。
次の手順では、STS を使用して OSS への一時的なアクセスを許可する方法について説明します。
一時的なアクセス認証情報の取得
一時的なアクセス認証情報には、一時的な AccessKey ペア (AccessKey ID と AccessKey Secret) とセキュリティトークンが含まれます。 有効期間は秒単位で測定されます。 最小値は 900 秒です。 最大値は、RAM ロールに設定されている最大セッション期間です。 詳細については、「RAM ロールの最大セッション期間の設定」をご参照ください。
一時的なアクセス認証情報は、次の 2 つの方法のいずれかで取得できます。
方法 1
STS の AssumeRole 操作を呼び出します。
方法 2
STS ソフトウェア開発キット (SDK) を使用します。
一時的なアクセス認証情報を使用したファイルのアップロード
require 'aliyun/sts'
require 'aliyun/oss'
sts = Aliyun::STS::Client.new(
# 環境変数からアクセス認証情報を取得します。 このサンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# ロールの ARN とカスタムセッション名を指定します。
token = sts.assume_role('role-arn', 'session-name')
client = Aliyun::OSS::Client.new(
# 例として、中国 (杭州) リージョンのエンドポイントを使用します。 実際にご利用のリージョンに基づいてエンドポイントを指定してください。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# STS から取得した一時的な AccessKey ペア (AccessKey ID と AccessKey Secret)。
access_key_id: 'token.access_key_id',
access_key_secret: 'token.access_key_secret',
# STS から取得したセキュリティトークン。
sts_token: 'token.security_token')
# バケット名を指定します。 例: examplebucket。
bucket = client.get_bucket('examplebucket')
# ファイルをアップロードします。
bucket.put_object('exampleobject.txt', :file => 'D:\\localpath\\examplefile.txt')署名付き URL を使用した一時的な権限付与
注意事項
SDK が署名付き URL を生成する際、ローカルに保存されたキー情報を使用して特定のアルゴリズムに基づいて署名を計算します。 その後、SDK はこの署名を URL に追加して、その有効性とセキュリティを確保します。 この署名の計算と URL の構築プロセスはクライアント上で完了し、ネットワークリクエストを伴いません。 したがって、呼び出し元は署名付き URL を生成するために特定の権限を必要としません。 ただし、サードパーティユーザーが署名付き URL を使用してリソースに対して意図した操作を実行できるようにするには、URL の生成に使用された ID が必要な権限を持っていることを確認する必要があります。
たとえば、署名付き URL を使用してファイルをダウンロードまたはプレビューするには、`oss:GetObject` 権限が必要です。
署名付き URL を生成し、その URL を訪問者に提供して一時的なアクセスを許可できます。 署名付き URL を生成する際に、URL の有効期間を指定して、訪問者が特定のデータにアクセスできる期間を制限できます。
HTTPS 経由でリソースにアクセスするために使用される署名付き URL を生成するには、エンドポイントのプロトコルを HTTPS に設定します。
次のサンプルコードを使用して生成された署名付き URL には、プラス記号 (
+) が含まれる場合があります。 この場合、URL 内のプラス記号 (+) を%2Bに置き換えてください。 そうしないと、署名付き URL を使用して期待どおりにオブジェクトにアクセスできない場合があります。
署名付き URL の生成とファイルダウンロードへの利用
ファイルダウンロード用の署名付き URL の生成
require 'aliyun/oss' client = Aliyun::OSS::Client.new( # 例として、中国 (杭州) リージョンのエンドポイントを使用します。 実際にご利用のリージョンに基づいてエンドポイントを指定してください。 endpoint: 'https://oss-cn-hangzhou.aliyuncs.com', # 環境変数からアクセス認証情報を取得します。 このサンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。 access_key_id: ENV['OSS_ACCESS_KEY_ID'], access_key_secret: ENV['OSS_ACCESS_KEY_SECRET'] ) # バケット名を指定します。 例: examplebucket。 bucket = client.get_bucket('examplebucket') # 署名付き URL を生成し、その有効期間を 1 時間 (3600 秒) に設定します。 puts bucket.object_url('my-object', true, 3600)- モバイルデバイスまたはブラウザで署名付き URL を使用したオブジェクトのダウンロード
// 生成された署名付き URL を入力します。 String url = ""; OkHttpClient client = new OkHttpClient(); // 署名付き URL を使用してオブジェクトをダウンロードします。 Request getRequest = new Request.Builder() .url(url) .get() .build(); client.newCall(getRequest).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.code() == 203 || response.code() >= 300) { Log.d("download", "fail"); Log.d("download", response.body().string()); return; } // オブジェクトがダウンロードされます。 InputStream inputStream = response.body().byteStream(); byte[] buffer = new byte[2048]; int len; while ((len = inputStream.read(buffer)) != -1) { // ダウンロードしたデータを処理します。 たとえば、画像を表示したり、オブジェクトへの書き込み操作を実行したりします。 } } });// 署名付き URL を使用してオブジェクトをダウンロードします。 NSURL * url = [NSURL URLWithString:urlString]; NSURLRequest * request = [NSURLRequest requestWithURL:url]; NSURLSession * session = [NSURLSession sharedSession]; NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@"download error: %@", error); return; } else if (((NSHTTPURLResponse*)response).statusCode == 203 || ((NSHTTPURLResponse*)response).statusCode >= 300) { NSString *body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"download error: %@", body); return; } NSLog(@"download success"); }]; [sessionTask resume];// HTML ページの <a> タグの download 属性や、Web API の window.open を使用してオブジェクト URL を取得することもできます。
関連ドキュメント
STS を使用した一時的なアクセス許可の詳細な使用方法とパラメーターの説明については、API ドキュメントをご参照ください。
URL に署名情報を追加し、署名付き URL をサードパーティに提供して承認されたアクセスを許可する方法の詳細については、「署名バージョン 1」をご参照ください。