このトピックでは、Security Token Service (STS) と署名付き URL を使用して、Object Storage Service (OSS) への一時的なアクセスをそれぞれ承認する方法について説明します。
注意事項
一時的なアクセス認証情報と署名付き URL には有効期間を指定する必要があります。一時的なアクセス認証情報を使用して、オブジェクトのアップロードやダウンロードなどの操作を実行するために使用される署名付き URL を生成する場合、最小の有効期間が優先されます。たとえば、一時的なアクセス認証情報の有効期間を 1,200 秒に設定し、その認証情報を使用して生成された署名付き URL の有効期間を 3,600 秒に設定できます。この場合、署名付き URL が有効期間内であっても、STS の一時的なアクセス認証情報の有効期限が切れた後は、署名付き URL を使用してオブジェクトをアップロードすることはできません。
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントが使用されています。OSS と同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
この例では、OSS ドメイン名を使用して OSSClient インスタンスが作成されます。カスタムドメイン名または STS を使用して OSSClient インスタンスを作成する方法の詳細については、「初期化」をご参照ください。
STS を使用した一時的なアクセスの承認
STS を使用して、OSS リソースへの一時的なアクセスを承認できます。STS は、一時的なアクセストークンを生成できる Web サービスです。STS を使用すると、カスタムの有効期間とカスタムの権限を持つアクセス認証情報を、サードパーティアプリケーションまたは管理対象の RAM ユーザーに付与できます。詳細については、「STS とは」をご参照ください。
STS のメリット:
アクセストークンを生成してサードパーティアプリケーションに送信するだけで済みます。AccessKey ペアをサードパーティアプリケーションに公開する必要はありません。トークンのアクセス権限と有効期間を指定できます。
アクセストークンの権限を手動で取り消す必要はありません。トークンは有効期限が切れると自動的に期限切れになります。
STS で生成された一時的なアクセス認証情報を使用して OSS にアクセスするには、次の手順を実行します。
一時的なアクセス認証情報を取得する
一時的なアクセス認証情報は、AccessKey ペアとセキュリティトークンで構成されます。AccessKey ペアは、AccessKey ID と AccessKey Secret で構成されます。一時的なアクセス認証情報の最小有効期間は 900 秒です。一時的なアクセス認証情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。詳細については、「RAM ロールの最大セッション期間を指定する」をご参照ください。
次のいずれかの方法を使用して、一時的なアクセス認証情報を取得できます。
方法 1:
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 ペアは、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 を使用した一時的なアクセスの承認
使用上の注意
OSS SDK を使用して署名付き URL を生成する場合、OSS SDK は特定のアルゴリズムとローカルコンピュータに保存されているキー情報を使用して署名を計算し、その署名を URL に追加して、URL の有効性とセキュリティを確保します。署名の計算と URL の構築はクライアント側で行われます。ネットワーク経由でサーバーにリクエストを送信する必要はありません。したがって、署名付き URL を生成するために特定の権限を付与される必要はありません。ただし、サードパーティユーザーが署名付き URL によって承認された操作を実行できないようにするには、対応する権限を持っている必要があります。
たとえば、オブジェクトのダウンロードまたはプレビュー用の署名付き URL を生成するには、oss:PutObject 権限が必要です。
署名付き 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 を生成し、その有効期間を 3,600 秒に設定します。 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 を使用した一時的なアクセスの承認方法の詳細については、「Alibaba Cloud OSS SDK for Ruby」をご参照ください。
署名付き URL を作成する方法の詳細については、「URL に V1 署名を含める」をご参照ください。