このトピックでは、Security Token Service (STS) または署名付きURLによって提供される一時的なアクセス資格情報を使用して、Object Storage Service (OSS) リソースへの一時的なアクセスを許可する方法について説明します。
使用上の注意
STSから取得した一時的なアクセス資格情報と署名付きURLには、有効期間を指定する必要があります。 一時的なアクセス資格情報を使用して、オブジェクトのアップロードやダウンロードなどの操作を実行するために使用される署名付きURLを生成する場合、最小有効期間が優先されます。 たとえば、一時的なアクセス資格情報の有効期間を1,200秒に設定し、資格情報を使用して生成された署名付きURLの有効期間を3,600秒に設定できます。 この場合、STSの一時アクセス資格情報の有効期限が切れた後は、署名付きURLを使用してオブジェクトをアップロードすることはできません。
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「OSSリージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。
STSを使用した一時アクセスの許可
STSを使用して、OSSへの一時アクセスを許可できます。 STSは、ユーザーに一時的なアクセストークンを提供するwebサービスです。 STSを使用して、管理されているサードパーティのアプリケーションまたはRAMユーザーに、カスタムの有効期間とカスタムのアクセス許可を持つ一時的なアクセス資格情報を付与できます。 STSの詳細については、「STSとは何ですか?」をご参照ください。
STSには次の利点があります。
一時的なアクセストークンを生成し、そのアクセストークンをサードパーティのアプリケーションに送信するだけで済みます。 サードパーティのアプリケーションにAccessKeyペアを提供する必要はありません。 このトークンのアクセス権限と有効期間を指定できます。
有効期間が終了すると、トークンは自動的に期限切れになります。 したがって、トークンのアクセス権限を手動で取り消す必要はありません。
STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスするには、次の操作を実行します。
ステップ1: RAMユーザーの作成
RAM コンソールにログインします。
左側のナビゲーションウィンドウで、アイデンティティ > [ユーザー] を選択します。
[ユーザー] ページで、ユーザーの作成 をクリックします。
ログイン名 および [表示名] パラメーターを設定します。
アクセスモード セクションで、[OpenAPIアクセス] を選択します。 そして、[OK] をクリックします。
プロンプトに従って完全なセキュリティ検証。
AccessKeyペア (AccessKey IDとAccessKey secret) をコピーします。
重要RAMユーザーのAccessKeyシークレットは、RAMユーザーを作成する場合にのみ取得できます。 認証情報の漏洩を防ぐため、AccessKeyシークレットを安全に保持する必要があります。
ステップ2: RAMユーザーにAssumeRole権限を付与する
[ユーザー] ページで、作成したRAMユーザーを見つけ、[操作] 列の 権限の追加 をクリックします。
[権限付与] パネルの [ポリシー] セクションで、[AliyunSTSAssumeRoleAccess] ポリシーを選択します。
説明AliyunSTSAssumeRoleAccessポリシーを使用すると、RAMユーザーはAssumeRole操作を呼び出すことができます。 ポリシーの権限は、RAMユーザーがSTSから一時的なアクセス資格情報を取得してOSSへのリクエストを開始するために必要な権限とは無関係です。
[権限付与] をクリックします。
ステップ3: STSから一時的なアクセス資格情報を取得するために使用するロールを作成する
左側のナビゲーションウィンドウで、アイデンティティ > [ロール] を選択します。
ロールの作成 をクリックします。 [ロールの作成] ウィザードの [ロールタイプの選択] ステップで、[信頼できるエンティティの選択] を Alibaba Cloud アカウント に設定し、[次へ] をクリックします。
ロールの作成 ウィザードの [ロールの設定] ステップで、RAM ロール名 をRamOssTestに設定し、信頼できる Alibaba Cloud アカウントを選択 を 現在の Alibaba Cloud アカウント に設定します。
[OK] をクリックします。 ロールの作成後、[閉じる] をクリックします。
[ロール] ページで、検索ボックスに [RamOssTest] と入力し、検索アイコンをクリックし、検索結果で [RamOssTest] をクリックします。
RamOssTestページの右側にある [コピー] をクリックして、ロールのAlibaba Cloudリソース名 (ARN) を保存します。
手順4: OSSにオブジェクトをアップロードおよびOSSからオブジェクトをダウンロードする権限をロールに付与する
カスタムポリシーをRAMロールにアタッチすることで、RAMロールによるオブジェクトのアップロードとダウンロードを許可します。
左側のナビゲーションウィンドウで、権限管理 > ポリシー を選択します。
ポリシー ページで ポリシーの作成 をクリックします。
[ポリシーの作成] ページで、[JSON] をクリックします。 ポリシーエディターでスクリプトを変更して、examplebucketという名前のバケットにオブジェクトをアップロードしたり、バケットからオブジェクトをダウンロードしたりする権限をロールに付与します。 次のサンプルコードは、ロールに権限を付与する方法の例を示しています。
警告以下の例は参考情報です。 ユーザーに過度の権限を付与しないように、要件に基づいてきめ細かいRAMポリシーを構成する必要があります。 きめ細かいRAMポリシーを設定する方法の詳細については、「例9: RAMまたはSTSを使用してユーザーにOSSリソースへのアクセスを許可する」をご参照ください。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:examplebucket", "acs:oss:*:*:examplebucket/*" ] } ] }
[次へ] をクリックしてポリシー情報を編集します。
[基本情報] セクションで、[名前] を [RamTestPolicy] に設定し、[OK] をクリックします。
カスタムポリシーをRamOssTestロールにアタッチします。
左側のナビゲーションペインで、[ID] > [ロール] を選択します。
[ロール] ページで、[RamOssTest] ロールを見つけます。
[操作] の [権限付与] をクリックします。
[権限付与] パネルで、[ポリシー] セクションのドロップダウンリストから [カスタムポリシー] を選択し、[RamTestPolicy] ポリシーを選択します。
[権限付与] をクリックします。
ステップ5: STSを使用して一時的なアクセス資格情報を生成する
一時的なアクセス資格情報には、セキュリティトークンと一時的なAccessKeyペアが含まれます。 AccessKey ペアは、AccessKey ID と AccessKey Secret で構成されます。 一時的なアクセス資格情報の有効期間は秒単位です。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。
完全なサンプルコードについては、『GitHub』をご参照ください。
一時的なアクセス資格情報を取得する前に、pip install aliyun-python-sdk-stsコマンドを実行して、Python用の公式STSクライアントをインストールします。
# -*- coding: utf-8 -*-
from aliyunsdkcore import client
from aliyunsdkcore.request import CommonRequest
import json
import oss2
# Specify the AccessKey pair that is created for the RAM user in Step 1.
access_key_id = 'yourAccessKeyId'
access_key_secret = 'yourAccessKeySecret'
# Specify the ARN of the role that is created in Step 3. Example: acs:ram::175708322470****:role/ramtest.
role_arn = 'acs:ram::175708322470****:role/ramtest'
# Create a RAM policy.
# The policy specifies that the PutObject and GetObject operations can be performed only on resources in a bucket named examplebucket.
policy_text = '{"Version": "1", "Statement": [{"Action": ["oss:PutObject","oss:GetObject"], "Effect": "Allow", "Resource": ["acs:oss:*:*:examplebucket/*"]}]}'
clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou')
request = CommonRequest(product="Sts", version='2015-04-01', action_name='AssumeRole')
request.set_method('POST')
request.set_protocol_type('https')
request.add_query_param('RoleArn', role_arn)
# Specify a custom role session name to distinguish different tokens. Example: sessiontest.
request.add_query_param('RoleSessionName', 'sessiontest')
# Specify the validity period of the temporary access credentials. Unit: seconds. Valid values: 900 to 3600.
request.add_query_param('DurationSeconds', '3000')
# If you do not configure the RAM policy, the RAM user is granted all permissions of the role. If you have specific requirements on the permissions, refer to the preceding configurations of policy_text.
request.add_query_param('Policy', policy_text)
request.set_accept_format('JSON')
body = clt.do_action_with_exception(request)
# Use the AccessKey pair of the RAM user to apply for temporary access credentials from STS.
token = json.loads(oss2.to_unicode(body))
# Display the AccessKey ID, the AccessKey secret, the security token, and the expiration time of the temporary access credentials returned by STS.
print('AccessKeyId: ' + token['Credentials']['AccessKeyId'])
print('AccessKeySecret: ' + token['Credentials']['AccessKeySecret'])
print('SecurityToken: ' + token['Credentials']['SecurityToken'])
print('Expiration: ' + token['Credentials']['Expiration'])
手順6: 一時的なアクセス資格情報を使用して、OSSへのオブジェクトのアップロードとOSSからのオブジェクトのダウンロード
一時的なアクセス資格情報を使用してオブジェクトをOSSにアップロードする
# -*- coding: utf-8 -*- import oss2 # 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. endpoint = 'https://oss-cn-hangzhou.aliyuncs.com' # Specify the temporary AccessKey pair obtained from STS. sts_access_key_id = 'yourAccessKeyId' sts_access_key_secret = 'yourAccessKeySecret' # Specify the name of the bucket. bucket_name = 'examplebucket' # Specify the full path of the object and the string that you want to upload. Do not include the bucket name in the full path. object_name = 'exampleobject.txt' # Specify the security token obtained from STS. security_token = 'yourSecurityToken' # Initialize the StsAuth instance based on the authentication information in the temporary access credentials. auth = oss2.StsAuth(sts_access_key_id, sts_access_key_secret, security_token) # Initialize the bucket by using the StsAuth instance. bucket = oss2.Bucket(auth, endpoint, bucket_name) # Upload the object. result = bucket.put_object(object_name, "hello world") print(result.status)
一時的なアクセス資格情報を使用してOSSからオブジェクトをダウンロードする
# -*- coding: utf-8 -*- import oss2 # 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. endpoint = 'https://oss-cn-hangzhou.aliyuncs.com' # Specify the temporary AccessKey pair obtained from STS. sts_access_key_id = 'yourAccessKeyId' sts_access_key_secret = 'yourAccessKeySecret' # Specify the name of the bucket. Example: examplebucket. bucket_name = 'examplebucket' # Specify the full path of the object and the string that you want to download. Do not include the bucket name in the full path. object_name = 'exampleobject.txt' # Specify the security token obtained from STS. security_token = 'yourSecurityToken' # Initialize the StsAuth instance based on the authentication information in the temporary access credentials. auth = oss2.StsAuth(sts_access_key_id, sts_access_key_secret, security_token) # Initialize the bucket by using the StsAuth instance. bucket = oss2.Bucket(auth, endpoint, bucket_name) # Download the object. read_obj = bucket.get_object(object_name) print(read_obj.read())
署名付きURLを使用して一時アクセスを許可する
使用上の注意
OSS SDKを使用して署名付きURLを生成する場合、OSS SDKはローカルコンピューターに保存されているキー情報に基づいて特定のアルゴリズムを使用して署名を計算し、URLに署名を追加してURLの有効性とセキュリティを確保します。 URLを計算し構築するために実行される操作は、クライアント上で完了する。 ネットワーク経由でサーバーにリクエストを送信する必要はありません。 この方法では、署名付きURLを生成するときに、呼び出し元に特定の権限を付与する必要はありません。 ただし、サードパーティのユーザーが署名付きURLによって承認されたリソースに対して関連する操作を実行できるようにするには、API操作を呼び出して署名付きURLを生成するプリンシパルに対応する権限があることを確認する必要があります。
たとえば、プリンシパルが署名付きURLを使用してオブジェクトをアップロードする場合は、プリンシパルにoss:PutObject権限を付与する必要があります。 プリンシパルが署名付きURLを使用してオブジェクトをダウンロードまたはプレビューする場合は、プリンシパルにoss:GetObject権限を付与する必要があります。
署名付きURLを生成し、一時的なアクセスのために訪問者にURLを提供できます。 署名付きURLを生成するときに、URLの有効期間を指定して、訪問者が特定のデータにアクセスできる期間を制限できます。
HTTPS経由でリソースにアクセスするために使用される署名付きURLを生成するには、エンドポイントのプロトコルをHTTPSに設定します。
次のサンプルコードを使用して生成された署名付きURLには、プラス記号 (
+
) が含まれる場合があります。 この場合、URLのプラス記号 (+
) を% 2B
に置き換えます。 そうでない場合、署名付きURLを使用してオブジェクトにアクセスすることはできません。
versionIdヘッダーを含む署名付きURLを生成する
次のサンプルコードは、versionIdヘッダーを含む署名付きURLを生成する方法の例を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import requests
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Specify the endpoint of the region in which the bucket is located. In this example, the endpoint of the China (Hangzhou) region is used.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
region = "cn-hangzhou"
# Specify the name of your bucket.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# Specify the full path of the object. Example: exampledir/exampleobject.txt. Do not include the bucket name in the full path.
object_name = 'exampledir/exampleobject.txt'
# Specify the headers.
headers = dict()
# Specify the version ID of the object.
headers["versionId"] = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****"
# Generate a signed URL that is used to upload the object. Set the validity period of the URL to 60 seconds.
# By default, OSS identifies forward slashes (/) in the full path of an object as escape characters when a signed URL is generated. Therefore, the signed URL cannot be directly used.
# Set the slash_safe parameter to True. This way, OSS does not identify forward slashes (/) in the full path of the object as escape characters. In this case, you can use the generated signed URL to upload the object.
url = bucket.sign_url('PUT', object_name, 60, slash_safe=True, headers=headers)
print ('Signed URL:', url)
署名付き URL を使用したオブジェクトのアップロード
次のサンプルコードは、署名付きURLを使用してオブジェクトをアップロードする方法の例を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import requests
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Specify the endpoint of the region in which the bucket is located. In this example, the endpoint of the China (Hangzhou) region is used.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
region = "cn-hangzhou"
# Specify the name of your bucket.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# Specify the full path of the object. Example: exampledir/exampleobject.txt. Do not include the bucket name in the full path.
object_name = 'exampledir/exampleobject.txt'
# Specify the headers.
headers = dict()
# Specify the Content-Type header.
# headers['Content-Type'] = 'text/txt'
# Specify the storage class of the object.
# headers["x-oss-storage-class"] = "Standard"
# Generate a signed URL that is used to upload the object. Set the validity period of the URL to 60 seconds.
# By default, OSS identifies forward slashes (/) in the full path of an object as escape characters when a signed URL is generated. Therefore, the signed URL cannot be directly used.
# Set the slash_safe parameter to True. This way, OSS does not identify forward slashes (/) in the full path of the object as escape characters. In this case, you can use the generated signed URL to upload the object.
url = bucket.sign_url('PUT', object_name, 60, slash_safe=True, headers=headers)
print ('Signed URL:', url)
# Use the signed URL to upload an object. In this example, requests is used.
# Specify the full path of the local file. Example: D:\\exampledir\\examplefile.txt.
requests.put(url, data=open('D:\\exampledir\\examplefile.txt', 'rb').read(), headers=headers)
署名付き URL を使用してオブジェクトをダウンロード
次のサンプルコードは、署名付きURLを使用してオブジェクトをダウンロードする方法の例を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import requests
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Specify the endpoint of the region in which the bucket is located. In this example, the endpoint of the China (Hangzhou) region is used.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
region = "cn-hangzhou"
# Specify the name of your bucket.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# Specify the full path of the object. Example: exampledir/exampleobject.txt. Do not include the bucket name in the full path.
object_name = 'exampledir/exampleobject.txt'
# Specify the headers.
headers = dict()
# Specify the Accept-Encoding header.
headers['Accept-Encoding'] = 'gzip'
# Specify HTTP query parameters.
params = dict()
# Configure single-connection bandwidth throttling. Unit: bit/s. In this example, the throttling threshold is set to 100 KB/s.
# params['x-oss-traffic-limit'] = str(100 * 1024 * 8)
# Specify the IP address or CIDR block.
# params['x-oss-ac-source-ip'] = "127.0.0.1"
# Specify the number of the digit 1 in the subnet mask.
# params['x-oss-ac-subnet-mask'] = "32"
# Specify the ID of the virtual private cloud (VPC).
# params['x-oss-ac-vpc-id'] = "vpc-t4nlw426y44rd3iq4xxxx"
# Specify whether the request can be forwarded.
# params['x-oss-ac-forward-allow'] = "true"
# Generate a signed URL that is used to download the object. In this example, the validity period of the URL is 60 seconds.
# By default, OSS identifies forward slashes (/) in the full path of an object as escape characters when a signed URL is generated. Therefore, the signed URL cannot be directly used.
# Set the slash_safe parameter to True. This way, OSS does not identify the forward slashes (/) in the full path of the object as escape characters. Then, you can directly use the generated signed URL.
url = bucket.sign_url('GET', object_name, 60, slash_safe=True, headers=headers, params=params)
print ('Signed URL:', url)
# Use the signed URL to download the object. In this example, requests is used.
resp = requests.get(url, headers=headers)
# Specify the full path of the local file. Example: D:\\exampledir\\examplefile.txt.
with open("D:\\exampledir\\examplefile.txt", "wb") as code:
code.write(resp.content)