すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:アクセス許可

最終更新日:Feb 26, 2024

このトピックでは、Security Token Service (STS) または署名付きURLによって提供される一時的なアクセス資格情報を使用して、Object Storage Service (OSS) リソースへの一時的なアクセスを許可する方法について説明します。

使用上の注意

  • 一時アクセス資格情報と署名付きURLには、有効期間を指定する必要があります。 一時的なアクセス資格情報を使用して、オブジェクトのアップロードやダウンロードなどの操作を実行するために使用される署名付きURLを生成する場合、最小有効期間が優先されます。 たとえば、一時的なアクセス資格情報の有効期間を1,200秒に設定し、資格情報を使用して生成された署名付きURLの有効期間を3,600秒に設定できます。 この場合、STSの一時アクセス資格情報の有効期限が切れた後は、署名付きURLを使用してオブジェクトをアップロードすることはできません。

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。

  • このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。

STS を使用した一時的アクセス許可

STSを使用して、OSSへの一時アクセスを許可できます。 STSは、一時的なアクセストークンを提供するwebサービスです。 STSを使用して、管理されているサードパーティのアプリケーションまたはRAMユーザーに、カスタムの有効期間とカスタムのアクセス許可を持つ一時的なアクセス資格情報を付与できます。 STSの詳細については、「STSの概要」をご参照ください。

STSには次の利点があります。

  • 一時的なアクセストークンを生成し、そのアクセストークンをサードパーティのアプリケーションに送信するだけで済みます。 サードパーティのアプリケーションにAccessKeyペアを提供する必要はありません。 トークンのアクセス権限と有効期間を指定できます。

  • トークンは、有効期間後に自動的に期限切れになります。 したがって、トークンのアクセス権限を手動で取り消す必要はありません。

STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスするには、次の操作を実行します。

ステップ1: RAMユーザーを作成します。

  1. RAM コンソール にログインします。

  2. 左側のナビゲーションウィンドウで、アイデンティティ > [ユーザー] を選択します。

  3. [ユーザー] ページで、ユーザーの作成 をクリックします。

  4. ログイン名 および [表示名] パラメーターを設定します。

  5. アクセスモード セクションで、[OpenAPIアクセス] を選択します。 そして、[OK] をクリックします。

  6. 表示されるページで、[コピー] をクリックしてRAMユーザーのAccessKeyペアを保存します。

ステップ2: RAMユーザーにAssumeRole権限を付与します。

  1. [ユーザー] ページで、作成したRAMユーザーを見つけ、[操作] 列の 権限の追加 をクリックします。

  2. 権限の追加 パネルで、[システムポリシー] タブをクリックし、[AliyunSTSAssumeRoleAccess] ポリシーを選択します。image.png

  3. [OK] をクリックします。

ステップ3: STSから一時的なアクセス資格情報を取得するために使用されるロールを作成します。

  1. 左側のナビゲーションウィンドウで、アイデンティティ > [ロール] を選択します。

  2. ロールの作成 をクリックします。 [ロールの作成] パネルで、[信頼できるエンティティの選択] を Alibaba Cloud アカウント に設定し、[次へ] をクリックします。

  3. ロールの作成 パネルで、RAM ロール名 をRamOssTestに設定し、信頼できる Alibaba Cloud アカウントを選択現在の Alibaba Cloud アカウント に設定します。

  4. [OK] をクリックします。 ロールの作成後、[閉じる] をクリックします。

  5. [ロール] ページで、検索ボックスに [RamOssTest] と入力し、検索結果で [RamOssTest] をクリックします。

  6. RamOssTestページの右側にある [コピー] をクリックして、ロールのAlibaba Cloudリソース名 (ARN) を保存します。arn

手順4: OSSにオブジェクトをアップロードおよびOSSからオブジェクトをダウンロードする権限をロールに付与します。

  1. カスタムポリシーを使用して、バケットにオブジェクトをアップロードおよびバケットからオブジェクトをダウンロードする権限をロールに付与します。

    1. 左側のナビゲーションウィンドウで、権限管理 > ポリシー を選択します。

    2. ポリシー ページで ポリシーの作成 をクリックします。

    3. [ポリシーの作成] ページで、[JSON] をクリックします。 ポリシーエディターでスクリプトを変更して、PutObjectおよびGetObjectを呼び出して、examplebucketという名前のバケットにオブジェクトをアップロードおよびバケットからオブジェクトをダウンロードする権限をロールに付与します。 次のサンプルコードは、ロールに権限を付与する方法の例を示しています。

      警告

      以下は参考例です。 ユーザーに過度の権限を与えないように、要件に基づいてきめ細かいRAMポリシーを構成する必要があります。 きめ細かいRAMポリシーを設定する方法の詳細については、「例9: RAMまたはSTSを使用してユーザーにOSSリソースへのアクセスを許可する」をご参照ください。

      {
          "Version": "1",
          "Statement": [
           {
                 "Effect": "Allow",
                 "Action": [
                   "OSS:のputObject"、
                   "oss:GetObject"
                 ],
                 "Resource": [
                   "acs:oss:*:*:examplebucket" 、
                   "acs:oss:*:*:examplebucket/*"
                 ]
           }
          ]
      }
    4. [次へ] をクリックしてポリシー情報を編集します。

    5. [基本情報] セクションで、[名前][RamTestPolicy] に設定し、[OK] をクリックします。

  2. カスタムポリシーをRamOssTestロールにアタッチします。

    1. 左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール] を選択します。

    2. [ロール] ページで、[RamOssTest] ロールを見つけます。

    3. [操作] 列の [権限の追加] をクリックします。

    4. [権限の追加] パネルで、[カスタムポリシー] タブをクリックし、[RamTestPolicy] ポリシーを選択します。

    5. [OK] をクリックします。

ステップ5: STSを使用して一時的なアクセス資格情報を生成します。

一時的なアクセス資格情報には、セキュリティトークンと、AccessKey IDとAccessKeyシークレットで構成される一時的なAccessKeyペアが含まれます。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。

完全なサンプルコードについては、『GitHub』をご参照ください。

重要

一時的なアクセス資格情報を取得する前に、pip install aliyun-python-sdk-stsコマンドを実行して、Python用の公式STSクライアントをインストールします。

# -*-コーディング: utf-8 -*-

aliyunsdkcoreインポートクライアントから
aliyunsdkcore.requestからCommonRequestをインポート
jsonのインポート
oss2のインポート

# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
endpoint = 'https:// oss-cn-hangzhou.aliyuncs.com'
# 手順1でRAMユーザー用に作成したAccessKeyペアを指定します。 
access_key_id = 'yourAccessKeyId'
access_key_secret = 'yourAccessKeySecret'
# 手順3で作成したロールのARNを指定します。 例: acs:ram::175708322470 ****:role/ramtest。 
role_arn = 'acs:ram::175708322470 ****:role/ramtest'

# RAMポリシーを作成します。 
# このポリシーでは、examplebucketという名前のバケット内のリソースに対してのみPutObjectおよびGetObject操作を実行できることを指定しています。 
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 ('http')
request.add_query_param('RoleArn', role_arn)
# さまざまなトークンを区別するために、カスタムロールセッション名を指定します。 例: sessiontest。 
request.add_query_param('RoleSessionName', 'sessiontest')
# 一時アクセス資格情報の有効期間を指定します。 単位は秒です。 有効値:900 〜 3600。 
request.add_query_param('DurationSeconds '、'3000')
# RAMポリシーを指定しない場合、RAMユーザーにはロールのすべての権限が付与されます。 権限に特定の要件がある場合は、上記のpolicy_textの設定を参照してください。 
request.add_query_param('Policy', policy_text)
request.set_accept_format('JSON')

body = clt.do_action_with_exception (リクエスト)

# RAMユーザーのAccessKeyペアを使用して、STSからの一時的なアクセス資格情報を申請します。 
token = json.loads(oss2.to_unicode(body))
# STSによって返される一時的なアクセス資格情報のAccessKey ID、AccessKeyシークレット、セキュリティトークン、および有効期限を表示します。 
print('AccessKeyId: '+ token['Credentials']['AccessKeyId'])
print('AccessKeySecret: '+ token['Credentials']['AccessKeySecret'])
print('SecurityToken: '+ token['Credentials']['SecurityToken'])
print('Expiration: '+ token['Credentials']['Expiration']) 

ステップ6: 一時的なアクセス資格情報を使用して、OSSにオブジェクトをアップロードし、OSSからオブジェクトをダウンロードします。

  • 一時的なアクセス資格情報を使用してオブジェクトをOSSにアップロードする

    # -*-コーディング: utf-8 -*-
    oss2のインポート
    
    # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
    endpoint = 'https:// oss-cn-hangzhou.aliyuncs.com'
    # STSから取得した一時的なAccessKeyペアを指定します。 
    sts_access_key_id = 'yourAccessKeyId'
    sts_access_key_secret = 'yourAccessKeySecret'
    # バケットの名前を指定します。 
    bucket_name = 'examplebucket'
    # オブジェクトのフルパスとアップロードする文字列を指定します。 バケット名をフルパスに含めないでください。 
    object_name = 'exampleobject.txt'
    # STSから取得したセキュリティトークンを指定します。 
    security_token = 'yourSecurityToken'
    
    
    # 一時アクセス資格情報の認証情報に基づいて、StsAuthインスタンスを初期化します。 
    auth = oss2.StsAuth(sts_access_key_id、
                        sts_access_key_secret、
                        security_token)
    
    # StsAuthインスタンスに基づいてバケットを初期化します。 
    bucket = oss2.Bucket(auth、endpoint、bucket_name)
    
    # オブジェクトをアップロードします。 
    result = bucket.put_object(object_name, "hello world")
    プリント (result.status) 
  • 一時的なアクセス資格情報を使用してOSSからオブジェクトをダウンロードする

    # -*-コーディング: utf-8 -*-
    oss2のインポート
    
    # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
    endpoint = 'https:// oss-cn-hangzhou.aliyuncs.com'
    # STSから取得した一時的なAccessKeyペアを指定します。 
    sts_access_key_id = 'yourAccessKeyId'
    sts_access_key_secret = 'yourAccessKeySecret'
    # バケットの名前を指定します。 例: examplebucket. 
    bucket_name = 'examplebucket'
    # オブジェクトのフルパスとダウンロードする文字列を指定します。 バケット名をフルパスに含めないでください。 
    object_name = 'exampleobject.txt'
    # STSから取得したセキュリティトークンを指定します。 
    security_token = 'yourSecurityToken'
    
    # 一時アクセス資格情報の認証情報に基づいて、StsAuthインスタンスを初期化します。 
    auth = oss2.StsAuth(sts_access_key_id、
                        sts_access_key_secret、
                        security_token)
    
    # StsAuthインスタンスに基づいてバケットを初期化します。 
    bucket = oss2.Bucket(auth、endpoint、bucket_name)
    
    # オブジェクトをダウンロードします。 
    read_obj = bucket.get_object(object_name)
    print(read_obj.read()) 

一時的なアクセス許可に署名付きURLを使用する

次のセクションでは、署名付きURLを使用してOSSへの一時アクセスを許可する方法の例を示します。

署名付きURLを生成し、一時的なアクセスのためのURLを訪問者に提供できます。 署名付きURLを生成するときに、URLの有効期間を指定して、訪問者が指定されたデータにアクセスできる期間を制限できます。

重要

次のサンプルコードを使用して生成された署名付きURLには、プラス記号 (+) が含まれる場合があります。 この場合、URLのプラス記号 (+) を % 2Bに置き換える必要があります。 そうでない場合、署名付きURLにアクセスできない可能性があります。

URLに署名情報を追加し、サードパーティのユーザーに許可されたアクセス権を提供できます。 詳細については、「URLへの署名の追加」をご参照ください。

versionIdヘッダーを含む署名付きURLを生成する

次のサンプルコードは、versionIdヘッダーを含む署名付きURLを生成する方法の例を示しています。

# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
インポートリクエスト

# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())

# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
# バケットの名前を指定します。 例: examplebucket. 
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
object_name = 'exampledir/exampleobject.txt'

# ヘッダーを指定します。 
headers = dict()
# オブジェクトのバージョンIDを指定します。 
headers["versionId"] = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3 ****"

# オブジェクトのアップロードに使用される署名付きURLを生成します。 署名付きURLの有効期間を60に設定します。 単位は秒です。 
# デフォルトでは、署名付きURLが生成されると、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別します。 したがって、署名付きURLを直接使用することはできません。 
# slash_safeパラメーターをTrueに設定します。 このように、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別しません。 この場合、生成された署名付きURLを使用してオブジェクトをアップロードできます。 
url = bucket.sign_url('PUT', object_name, 60, slash_safe=True, headers=headers)
print ('The signed URL:', url) 

署名付き URL を使用したオブジェクトのアップロード

次のサンプルコードは、署名付きURLを使用してオブジェクトをアップロードする方法の例を示しています。

# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
インポートリクエスト

# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())

# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
# バケットの名前を指定します。 例: examplebucket. 
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
object_name = 'exampledir/exampleobject.txt'

# ヘッダーを指定します。 
headers = dict()
# コンテンツタイプを指定します。 
# headers['Content-Type'] = 'text/txt'
# オブジェクトのストレージクラスを指定します。 
# headers["x-oss-storage-class"] = "Standard"

# オブジェクトのアップロードに使用される署名付きURLを生成します。 署名付きURLの有効期間を60に設定します。 単位は秒です。 
# デフォルトでは、署名付きURLが生成されると、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別します。 したがって、署名付きURLを直接使用することはできません。 
# slash_safeパラメーターをTrueに設定します。 このように、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別しません。 この場合、生成された署名付きURLを使用してオブジェクトをアップロードできます。 
url = bucket.sign_url('PUT', object_name, 60, slash_safe=True, headers=headers)
print('The signed URL:', url)

# 署名付きURLを使用してオブジェクトをアップロードします。 要求は例として使用されます。 
# ローカルファイルのフルパスを指定します。 例: D :\\ exampledir\\examplefile.txt。 
requests.put(url, data=open('D :\\ exampledir\\examplefile.txt ', 'rb').read(), headers=headers) 

署名付き URL を使用してオブジェクトをダウンロード

次のサンプルコードは、署名付きURLを使用してオブジェクトをダウンロードする方法の例を示しています。

# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
インポートリクエスト

# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())

# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
# バケットの名前を指定します。 例: examplebucket. 
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 
object_name = 'exampledir/exampleobject.txt'

# ヘッダーを指定します。 
headers = dict()
# Accept-Encodingを指定します。 
ヘッダー ['Accept-Encoding'] = 'gzip'

# HTTPクエリパラメータを指定します。 
params = dict()
# シングル接続帯域幅調整を設定します。 単位:bit/s。 この例では、最大帯域幅は100 KB/sに設定されています。 
# params['x-oss-traffic-limit'] = str(100*1024*8)
# IPアドレスまたはCIDRブロックを指定します。 
# params['x-oss-ac-source-ip'] = "127.0.0.1"
# サブネットマスクの1桁の数字を指定します。 
# params['x-oss-ac-subnet-mask'] = "32"
# 仮想プライベートクラウド (VPC) のIDを指定します。 
# params['x-oss-ac-vpc-id'] = "vpc-t4nlw426y44rd3iq4 ****"
# リクエストを転送できるかどうかを指定します。 
# params['x-oss-ac-forward-allow'] = "true"

# オブジェクトのダウンロードに使用される署名付きURLを生成します。 URLの有効期間は60秒です。 
# デフォルトでは、署名付きURLが生成されると、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別します。 したがって、署名付きURLを直接使用することはできません。 
# slash_safeパラメーターをTrueに設定します。 このように、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別しません。 この場合、生成された署名付きURLを使用してオブジェクトをアップロードできます。 
url = bucket.sign_url('GET', object_name, 60, slash_safe=True, headers=headers, params=params)
print('The signed URL:', url)

# 署名付きURLを使用してオブジェクトをダウンロードします。 要求は例として使用されます。 
resp = requests.get(url、headers=headers)

# ローカルファイルのフルパスを指定します。 例: D :\\ exampledir\\examplefile.txt。 
コードとしてopen("D :\\ exampledir\\examplefile.txt", "wb") を持つ:
    code.write(resp.content)