Object Storage Service (OSS) SDK for Pythonを使用してリクエストを開始するには、アクセス資格情報を設定する必要があります。 Alibaba Cloudサービスは、アクセス資格情報を使用してID情報とアクセス許可を検証します。 認証と承認の要件に基づいて、さまざまなタイプのアクセス資格情報を選択できます。
前提条件
OSS SDK for Pythonがインストールされています。 詳細については、「インストール」をご参照ください。
alibabacloud-credentialsのバージョンは0.3.5以降です。 以前のバージョンを使用するとエラーが発生する可能性があります。
初期化方法の選択
資格情報プロバイダーの選択
OSSは、資格情報プロバイダーを初期化する複数の方法をサポートしています。 実際のシナリオの認証と承認の要件に基づいて、適切な方法を選択できます。
初期化メソッド | シナリオ | AccessKeyペアまたはセキュリティトークンが必要 | 基本的なロジック | 資格情報の有効期間 | 資格情報のローテーションまたは更新方法 |
アプリケーションは、外部からの攻撃に対して脆弱ではなく、頻繁な資格情報のローテーションなしに長期間クラウドサービスにアクセスする必要がある、安全で安定した環境でデプロイおよび実行されます。 | 可 | AccessKey ペア | 長期 | 手動ローテーション | |
アプリケーションは、AccessKeyペアが漏洩のリスクが高く、クラウドサービスに長期間アクセスするためにアクセス資格情報を頻繁にローテーションする必要がある環境でデプロイおよび実行されます。 | 不可 | AccessKey ペア | 長期 | 自動回転 | |
アプリケーションは信頼できない環境でデプロイされ、実行されます。この場合、資格情報の有効期間とアクセス可能なリソースを管理します。 | 可 | セキュリティトークン | 一時的 | 手動更新 | |
アプリケーションは、クロスアカウントアクセスなどのクラウドサービスへのアクセスを許可されている必要があります。 | 可 | セキュリティトークン | 一時的 | 自動更新 | |
アプリケーションは、Elastic Compute Service (ECS) インスタンス、elasticコンテナインスタンス、およびcontainer Service for Kubernetes (ACK) ワーカーノードでデプロイされ、実行されます。 | 不可 | セキュリティトークン | 一時的 | 自動更新 | |
信頼できないアプリケーションは、ACKワーカーノードにデプロイされ、実行されます。 | 不可 | セキュリティトークン | 一時的 | 自動更新 | |
アプリケーションの関数はFunction Computeにデプロイされ、実行されます。 | 不可 | セキュリティトークン | 一時的 | 更新する必要はありません | |
アプリケーションには、外部システムからのアクセス資格情報が必要です。 | 不可 | セキュリティトークン | 一時的 | 自動更新 | |
上記の方法のいずれも要件を満たしていない場合は、カスタム方法を指定してアクセス資格情報を取得できます。 | Custom | Custom | Custom | Custom |
方法1: AccessKeyペアの使用
アプリケーションが、外部攻撃に対して脆弱ではなく、OSSへの長期アクセスを必要とする安全で安定した環境にデプロイされている場合、Alibaba CloudアカウントまたはRAMユーザーのAccessKeyペアを使用して、認証情報プロバイダーを初期化できます。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 この方法では、AccessKeyペアを手動で維持する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 AccessKeyペアを取得する方法の詳細については、「CreateAccessKey」をご参照ください。
環境変数
Alibaba Cloudアカウントは、アカウントのすべてのリソースにフルアクセスできます。 Alibaba CloudアカウントのAccessKeyペアの漏洩は、システムに重大な脅威をもたらします。 したがって、資格情報プロバイダーを初期化するために最低限必要な権限が付与されているRAMユーザーのAccessKeyペアを使用することを推奨します。
AccessKeyペアを使用して環境変数を指定します。
Mac OS X/Linux/Unix
export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
Windows
set OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
環境変数を使用して資格情報を渡します。
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # Use the AccessKey pair of the RAM user obtained from the environment variables to configure the access credentials. auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # Use auth for subsequent operations.
静的な資格情報
コードで変数を指定して資格情報を使用できます。 ランタイム環境では、環境変数、構成ファイル、または他の外部データソースからの実際の資格証明値によって変数を渡すことができる。
次の手順では、構成ファイルを使用して資格情報を渡す方法について説明します。
config.ini
という名前の設定ファイルを作成します。[configName] alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID> alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET>
設定ファイルを使用して資格情報を渡します。
# -*- coding: utf-8 -*- import oss2 import configparser # Read the configuration file. config = configparser.ConfigParser() # For example, the config.ini configuration file is stored in the same directory as the script. config.read('config.ini') # Obtain the AccessKey ID and AccessKey secret from the configuration file. access_key_id = config.get('configName', 'alibaba_cloud_access_key_id') access_key_secret = config.get('configName', 'alibaba_cloud_access_key_secret') # Use the AccessKey pair of the RAM user to configure the access credentials. auth = oss2.AuthV4(access_key_id, access_key_secret) # Use auth for subsequent operations.
方法2: 自動的にローテーションするAccessKeyペアを使用する
アプリケーションがOSSに長期間アクセスする必要があるが、ランタイム環境がAccessKeyペアのリークのリスクに直面している場合は、AccessKeyペアを手動でローテーションする必要があります。 この場合、クライアントキーを使用して資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、AccessKeyペアを使用してOSSリソースにアクセスすることです。 クライアントキーを使用すると、key Management Service (KMS) は、マネージRAMユーザーのAccessKeyペアを自動的かつ定期的にローテーションし、RAMユーザーの静的AccessKeyペアを動的に変更できます。 これにより、AccessKeyペアがリークするリスクが軽減されます。 KMSは、漏洩したAccessKeyペアを迅速に置き換えるための即時ローテーションもサポートしています。 これにより、AccessKeyペアを手動で保守する必要がなくなり、セキュリティリスクと保守の複雑さが軽減されます。 クライアントキーの取得方法の詳細については、「AAPの作成」をご参照ください。
クライアントに資格情報の依存関係を追加します。
pip install aliyun-secret-manager-client
secretsmanager.properties
という名前の構成ファイルを作成します。# Set the credential type to client_key. credentials_type=client_key # Specify the decryption password of the client key. You can obtain the decryption password from environment variables or the configuration file. client_key_password_from_env_variable=<your client key private key password environment variable name> client_key_password_from_file_path=<your client key private key password file path> # Specify the path of the private key file of the client key. client_key_private_key_path=<your client key private key file path> # Specify the ID of the region in which you want to use KMS. cache_client_region_id=[{"regionId":"<regionId>"}]
設定ファイルを使用して資格情報を渡します。
# -*- coding: utf-8 -*- import json import oss2 from oss2 import CredentialsProvider from oss2.credentials import Credentials from alibaba_cloud_secretsmanager_client.secret_manager_cache_client_builder import SecretManagerCacheClientBuilder class CredentialProviderWrapper(CredentialsProvider): def get_credentials(self): secret_cache_client = SecretManagerCacheClientBuilder.new_client() secret_info = secret_cache_client.get_secret_info("<secretName>") secret_value_json = json.loads(secret_info.secret_value) return Credentials(secret_value_json["AccessKeyId"], secret_value_json["AccessKeySecret"]) credentials_provider = CredentialProviderWrapper() auth = oss2.ProviderAuthV4(credentials_provider) # Use auth for subsequent operations.
方法3: セキュリティトークンの使用
アプリケーションがOSSに一時的にアクセスし、データのセキュリティと柔軟性を向上させるためにリアルタイムできめ細かい方法でアクセス制御を管理する必要がある場合は、security token Service (STS) から取得したAccessKeyペアとセキュリティトークンで構成される一時的なアクセス資格情報を使用して、資格情報プロバイダーを初期化できます。 この方法では、セキュリティトークンを手動で管理する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 セキュリティトークンの取得方法の詳細については、「AssumeRole」をご参照ください。
一時的なアクセス資格情報を使用して環境変数を指定します。
Mac OS X/Linux/Unix
export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> export OSS_SESSION_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>
Windows
set OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> set OSS_SESSION_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>
一時的なアクセス資格情報を渡す環境変数を指定します。
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # Use the security token obtained from the environment variable to configure the access credentials. auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # Use auth for subsequent operations.
方法4: RAMRoleARNを使用する
データのセキュリティと柔軟性を確保するために、アプリケーションに別のAlibaba CloudアカウントのOSSリソースへのアクセスを許可し、RAMロールを引き受ける必要がある場合は、RAMRoleARNを使用して資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 RAMロールのAlibaba Cloud Resource Name (ARN) を指定すると、CredentialsツールはSTSからセキュリティトークンを取得し、セッションの有効期限が切れる前にセキュリティトークンを自動的に更新します。 policy
パラメーターに値を割り当てて、RAMロールの権限を制限できます。 この方法では、AccessKeyペアを手動で提供する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 AccessKeyペアを取得する方法の詳細については、「CreateAccessKey」をご参照ください。 RAMロールARNを取得する方法の詳細については、「CreateRole」をご参照ください。
alibabacloud_credentials依存関係を追加します。
pip install alibabacloud_credentials
AccessKeyペアとRAMRoleARNをアクセス資格情報として設定します。
# -*- coding: utf-8 -*- import oss2 from alibabacloud_credentials.client import Client from alibabacloud_credentials.models import Config from oss2 import CredentialsProvider from oss2.credentials import Credentials import os class CredentialProviderWrapper(CredentialsProvider): def __init__(self, client): self.client = client def get_credentials(self): credential = self.client.get_credential() access_key_id = credential.access_key_id access_key_secret = credential.access_key_secret security_token = credential.security_token return Credentials(access_key_id, access_key_secret, security_token) config = Config( # Obtain the AccessKey pair (AccessKey ID and AccessKey secret) of the RAM user from environment variables. access_key_id=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), access_key_secret=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), type='ram_role_arn', # Specify the ARN of the RAM role that you want your application to assume by specifying the ALIBABA_CLOUD_ROLE_ARN environment variable. Example: acs:ram::123456789012****:role/adminrole. role_arn='<RoleArn>', # Specify the role session name by specifying the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable. role_session_name='<RoleSessionName>', # Optional. Specify limited permissions for the RAM role. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}. policy='<Policy>', # Optional. Specify the validity period of the role session. role_session_expiration=3600 ) cred = Client(config) credentials_provider = CredentialProviderWrapper(cred) auth = oss2.ProviderAuthV4(credentials_provider) # Use auth for subsequent operations.
方法5: ECSRAMRoleを使用する
アプリケーションがECSインスタンス、エラスティックコンテナインスタンス、またはACKワーカーノードで実行されている場合、ECSRAMRoleを使用して資格情報プロバイダーを初期化することを推奨します。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 ECSRAMRoleを使用すると、ECSインスタンス、エラスティックコンテナインスタンス、またはACKワーカーノードにRAMロールをアタッチして、インスタンスのセキュリティトークンを自動的に更新できます。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 ECSRAMRoleロールの取得方法の詳細については、「CreateRole」をご参照ください。
alibabacloud_credentials依存関係を追加します。
pip install alibabacloud_credentials
アクセス資格情報としてECSRAMRoleを設定します。
# -*- coding: utf-8 -*- import oss2 from alibabacloud_credentials.client import Client from alibabacloud_credentials.models import Config from oss2 import CredentialsProvider from oss2.credentials import Credentials class CredentialProviderWrapper(CredentialsProvider): def __init__(self, client): self.client = client def get_credentials(self): credential = self.client.get_credential() access_key_id = credential.access_key_id access_key_secret = credential.access_key_secret security_token = credential.security_token return Credentials(access_key_id, access_key_secret, security_token) config = Config( type='ecs_ram_role', # Set the credential type to ecs_ram_role. role_name='<RoleName>' # Specify the name of the RAM role that is attached to the ECS instance. This parameter is optional. If you do not configure this parameter, the system automatically searches for a RAM role. We recommend that you configure this parameter to reduce the number of requests. ) cred = Client(config) credentials_provider = CredentialProviderWrapper(cred) auth = oss2.ProviderAuthV4(credentials_provider) # Use auth for subsequent operations.
方法6: OIDCRoleARNを使用する
ACKワーカーノードでRAMロールを設定すると、ノードのポッド内のアプリケーションは、ECSインスタンスにデプロイされたアプリケーションと同じ方法でメタデータサーバーを使用して、アタッチされたロールのセキュリティトークンを取得できます。 ただし、信頼されていないアプリケーション (顧客によって送信され、コードを使用できないアプリケーションなど) がワーカーノードにデプロイされている場合、アプリケーションがメタデータサーバーを使用してワーカーノードにアタッチされているRAMロールのセキュリティトークンを取得することはできません。 クラウドリソースのセキュリティを確保し、信頼できないアプリケーションが必要なセキュリティトークンを安全に取得できるようにし、アプリケーションレベルの権限を最小限に抑えるために、サービスアカウントのRAMロール (RRSA) 機能を使用できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 ACKは、さまざまなアプリケーションポッドの対応するOpenID Connect (OIDC) トークンファイルを作成およびマウントし、関連する構成情報を環境変数に渡します。 資格情報ツールは、環境変数の構成情報を取得し、STSのAssumeRoleWithOIDC操作を呼び出して、アタッチされたロールのセキュリティトークンを取得します。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 詳細については、「RRSAを使用して異なるポッドに異なるクラウドサービスへのアクセスを許可する」をご参照ください。
alibabacloud_credentials依存関係を追加します。
pip install alibabacloud_credentials
OIDCRoleARNをアクセス資格情報として設定します。
# -*- coding: utf-8 -*- import oss2 from alibabacloud_credentials.client import Client from alibabacloud_credentials.models import Config from oss2 import CredentialsProvider from oss2.credentials import Credentials import os class CredentialProviderWrapper(CredentialsProvider): def __init__(self, client): self.client = client def get_credentials(self): credential = self.client.get_credential() access_key_id = credential.access_key_id access_key_secret = credential.access_key_secret security_token = credential.security_token return Credentials(access_key_id, access_key_secret, security_token) config = Config( # Set the credential type to oidc_role_arn. type='oidc_role_arn', # Specify the ARN of the RAM role by specifying the ALIBABA_CLOUD_ROLE_ARN environment variable. role_arn=os.environ.get('<RoleArn>'), # Specify the ARN of the OIDC IdP by specifying the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable. oidc_provider_arn=os.environ.get('<OidcProviderArn>'), # Specify the path of the OIDC token file by specifying the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable. oidc_token_file_path=os.environ.get('<OidcTokenFilePath>'), # Specify the role session name by specifying the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable. role_session_name='<RoleSessionName>', # Optional. Specify limited permissions for the RAM role. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}. policy='<Policy>', # Specify the validity period of the session. role_session_expiration=3600 ) cred = Client(config) credentials_provider = CredentialProviderWrapper(cred) auth = oss2.ProviderAuthV4(credentials_provider) # Use auth for subsequent operations.
方法7: Function ComputeのコンテキストでCredentialsパラメーターを使用する
アプリケーションの関数がfunction Computeにデプロイされて実行されている場合、Function ComputeのコンテキストでCredentialsパラメーターを使用して、資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 Function Computeは、関数に設定されたロールに基づいてサービスロールを引き受けることによってセキュリティトークンを取得します。 次に、Function ComputeのコンテキストでCredentialsパラメーターを使用して、セキュリティトークンがアプリケーションに渡されます。 セキュリティトークンは36時間有効です。 有効期間は変更できません。 関数の最大実行時間は24時間です。 したがって、関数の実行時に有効期限が切れないため、セキュリティトークンを更新する必要はありません。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 Function ComputeにOSSへのアクセスを許可する方法の詳細については、「他のAlibaba Cloudサービスへのアクセス権限の付与」をご参照ください。
Function ComputeコンテキストのCredentialsパラメーターを使用して、資格情報プロバイダーを初期化します。
# -*- coding: utf-8 -*- import oss2 from oss2 import CredentialsProvider from oss2.credentials import Credentials def handler(event, context): class CredentialProviderWrapper(CredentialsProvider): def get_credentials(self): creds = context.credentials return Credentials(creds.access_key_id, creds.access_key_secret, creds.security_token) credentials_provider = CredentialProviderWrapper() auth = oss2.ProviderAuthV4(credentials_provider) # Use auth for subsequent operations. return 'success'
方法8: CredentialsURIの使用
アプリケーションが外部システムからAlibaba Cloudの資格情報を取得して、柔軟な資格情報管理とキーレスアクセスを実装する必要がある場合は、CredentialsURIを使用して資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 Credentialsツールは、クライアントでOSSClientインスタンスを初期化するために指定したURIを使用してセキュリティトークンを取得します。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 CredentialsURI応答を提供するバックエンドサービスは、アプリケーションが常に有効な資格情報を取得できるように、セキュリティトークンを自動的に更新する必要があることに注意してください。
資格情報ツールがセキュリティトークンを正しく解析して使用できるようにするには、URIが次の応答プロトコルに準拠している必要があります。
応答ステータスコード: 200
レスポンスボディの構造:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
alibabacloud_credentials依存関係を追加します。
pip install alibabacloud_credentials
URIをアクセス資格情報として設定します。
# -*- coding: utf-8 -*- import oss2 from alibabacloud_credentials.client import Client from alibabacloud_credentials.models import Config from oss2 import CredentialsProvider from oss2.credentials import Credentials class CredentialProviderWrapper(CredentialsProvider): def __init__(self, client): self.client = client def get_credentials(self): credential = self.client.get_credential() access_key_id = credential.access_key_id access_key_secret = credential.access_key_secret security_token = credential.security_token return Credentials(access_key_id, access_key_secret, security_token) config = Config( type='credentials_uri', # Specify the URI of the credential in the http://local_or_remote_uri/ format by specifying the ALIBABA_CLOUD_CREDENTIALS_URI environment variable. credentials_uri='<CredentialsUri>', ) cred = Client(config) credentials_provider = CredentialProviderWrapper(cred) auth = oss2.ProviderAuthV4(credentials_provider) # Use auth for subsequent operations.
方法9: カスタムアクセス資格情報を使用する
上記のメソッドのいずれも要件を満たしていない場合は、CredentialsProvider操作を呼び出して、アクセス資格情報を取得するカスタムメソッドを指定できます。 基になるロジックがセキュリティトークンの場合は、資格情報の更新サポートを提供する必要があります。
# -*- coding: utf-8 -*-
import oss2
from oss2 import CredentialsProvider
from oss2.credentials import Credentials
class CredentialProviderWrapper(CredentialsProvider):
def get_credentials(self):
# TODO
# Specify the method used to obtain the custom access credentials.
# Return long-term access credentials, which consists of an AccessKey ID and an AccessKey secret.
return Credentials('<access_key_id>', '<access_key_secrect>')
# Return temporary access credentials, which consists of an AccessKey ID, an AccessKey secret, and a security token.
# Refresh the temporary access credentials based on the validity period.
# return Credentials('<access_key_id>', '<access_key_secrect>', '<token>');
credentials_provider = CredentialProviderWrapper()
auth = oss2.ProviderAuthV4(credentials_provider)
# Use auth for subsequent operations.
次に何をすべきか
アクセス資格情報を設定した後、OSSClientインスタンスを初期化する必要があります。 詳細については、「初期化」をご参照ください。