API操作を呼び出してAlibaba cloud SDKを使用してクラウドリソースを管理する場合、有効な資格情報を設定する必要があります。 Alibaba Cloud Credentialsツールは、アクセス資格情報を簡単に取得および管理できる強力な機能セットを提供します。 このトピックでは、Credentialsツールを使用して、デフォルトの資格情報、AccessKeyペア、Security Token Service (STS) トークンなどのさまざまな種類の資格情報を設定する方法について説明します。 このトピックでは、Credentialsツールが既定の資格情報を取得する順序についても説明します。 Alibaba Cloud SDKでの資格情報の設定と管理に関する十分な知識を身に付けることができます。 これにより、クラウドリソースに対する操作が効率的かつ安全になります。
背景情報
資格情報は、ユーザーの身元を証明するために使用される情報のセットです。 システムにログオンするときは、有効な資格情報を使用してID認証を完了する必要があります。 以下のタイプの資格情報が一般的に使用されます。
Alibaba CloudアカウントまたはRAM (Resource Access Management) ユーザーのAccessKeyペア。 AccessKeyペアは永続的に有効です。 AccessKey IDとAccessKeyシークレットで構成されています。
RAMロールのSTSトークン。 STSトークンは一時的な資格情報です。 STSトークンの有効期間とアクセス許可を指定できます。 詳細については、「」をご参照ください。STSとは何ですか?
ベアラトークン。 ID認証と承認に使用されます。
前提条件
Python 3.0以降がインストールされます。
Alibaba Cloud SDK V2.0がインストールされています。
自己管理ゲートウェイを使用するサービスの社内SDKはインストールされていません。
資格情報ツールのインストール
pip
を使用して、Alibaba Cloud Credentials for Pythonをインストールすることを推奨します。 pip
がインストールされていることを確認します。 詳細については、「pip documentation」をご参照ください。
pip install alibabacloud_資格情報
最新バージョンのAlibaba Cloud Credentials for Pythonを使用することを推奨します。
リリースされたすべてのバージョンのAlibaba Cloud Credentials For Pythonの詳細については、「ChangeLog.md」をご参照ください。
Credentialsクライアントの初期化
次のいずれかの方法を使用して、ビジネス要件に基づいて資格情報クライアントを初期化できます。
方法1: デフォルトの資格情報プロバイダーチェーンを使用する
Credentialsクライアントを初期化するメソッドを指定しない場合、デフォルトの資格情報プロバイダーチェーンが使用されます。 詳細については、このトピックの「デフォルトの資格情報プロバイダーチェーン」をご参照ください。
alibabacloud_credentials.clientからのCredClientとしてのインポートクライアント
alibabacloud_tea_rpc.modelsからのインポートConfig
# Credentialsクライアントを初期化するメソッドを指定しないでください。
credentialsClient = CredClient()
config = Config(credential=credentialsClient)
呼び出し例
方法2: AccessKeyペアを使用する
Alibaba CloudアカウントまたはRAMユーザーのAPI操作を呼び出すために使用されるAccessKeyペアを作成できます。 詳細については、「AccessKey の作成」をご参照ください。 次に、AccessKeyペアを使用して資格情報クライアントを初期化できます。
Alibaba Cloudアカウントは、アカウントのすべてのリソースにフルアクセスできます。 Alibaba CloudアカウントのAccessKeyペアリークは、システムに重大な脅威をもたらします。
したがって、資格情報クライアントを初期化するために必要最小限の権限が付与されたRAMユーザーのAccessKeyペアを使用することを推奨します。
osのインポート
からalibabacloud_credentials.client importクライアント
alibabacloud_credentials.modelsからのインポートConfig
config = Config (
type='access_key' 、access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID ') 、access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET ') 、)
cred=クライアント (設定)
呼び出し例
方法3: STSトークンを使用する
STSのAssumeRole操作をRAMユーザーとして呼び出して、STSトークンを取得できます。 STSトークンの最大有効期間を指定できます。 次のサンプルコードは、STSトークンを使用して資格情報クライアントを初期化する方法の例を示しています。 この例では、STSトークンの取得方法は示されていません。
{
"RequestId": "EA7A3526-F7DB-54A5-8300-9B742CFAA5EA" 、
"AssumedRoleUser": {
"Arn": "acs:ram::125499367423 ****:role/STStokenTestRole/STSsessionName" 、
"AssumedRoleId": "35219123109646 ****:STSsessionName"
},
"Credentials": {
"SecurityToken": "exampleToken" 、
"AccessKeyId": "STS.exampleAccessKeyID" 、
"AccessKeySecret": "exampleAccessKeySecret" 、
"有効期限": "2023-03-26T05:26:06Z"
}
}
from alibabacloud_credentials.client import Client
alibabacloud_credentials.modelsからのインポートConfig
config = Config (
type='sts' 、
# <ALIBABA_CLOUD_ACCESS_KEY_ID> をAssumeRole操作への応答から取得した一時的なAccessKey IDに置き換えます。
access_key_id='<ALIBABA_CLOUD_ACCESS_KEY_ID>' 、
# <ALIBABA_CLOUD_ACCESS_KEY_SECRET> を、AssumeRole操作への応答から取得した一時的なAccessKeyシークレットに置き換えます。
access_key_secret='<ALIBABA_CLOUD_ACCESS_KEY_SECRET>' 、
# <ALIBABA_CLOUD_SECURITY_TOKEN> をAssumeRole操作への応答から取得したSTSトークンに置き換えます。
security_token='<security_token>'
)
credClient=クライアント (設定)
呼び出し例
方法4: AccessKeyペアとRAMロールを使用する
このメソッドの基本的なロジックは、STSトークンを使用してCredentialsクライアントを初期化することです。 RAMロールのARNを指定すると、資格情報ツールはSTSからSTSトークンを取得できます。 policy
パラメーターを使用して、RAMロールの権限を制限することもできます。
osのインポート
alibabacloud_credentials.clientからCredClientとしてのインポートクライアント
alibabacloud_credentials.modelsからConfigをCredConfigとしてインポートする
credentialsConfig = CredConfig (
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID ') 、
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET ') 、
type='ram_role_arn '、
# 仮定するRAMロールのARNを指定します。 例: acs:ram::123456789012 ****:role/adminrole。
role_arn='<RoleArn>' 、
# ロールセッションの名前を指定します。
role_session_name='<RoleSessionName>' 、
# Optional. RAMロールの制限付き権限を指定します。 例: {"Statement": [{"Action": ["*"]] 、"Effect": "Allow" 、"Resource": ["*"]}] 、"Version": "1"} 。
policy='<Policy>' 、
role_session_expailation=3600
)
credentialsClient = CredClient(credentialsConfig)
呼び出し例
方法5: ECSインスタンスのRAMロールを使用し、通常モードでECSインスタンスのメタデータにアクセスする
このメソッドの基本的なロジックは、STSトークンを使用してCredentialsクライアントを初期化することです。 資格情報ツールは、ECSインスタンスにアタッチされたRAMロールを自動的に取得し、ECSのメタデータサーバーを使用してSTSトークンを取得します。 STSトークンは、Credentialsクライアントを初期化するために使用されます。 Container Service for KubernetesクラスターのエラスティックコンテナインスタンスまたはワーカーノードにRAMロールをアタッチすることもできます。
alibabacloud_credentials.clientからのCredClientとしてのインポートクライアント
alibabacloud_credentials.modelsからConfigをCredConfigとしてインポートする
credentialsConfigig = CredConfig (
type='ecs_ram_role '、# オプション。 ECSインスタンスのRAMロールの名前を指定します。 このパラメーターを指定しない場合、その値は自動的に取得されます。 リクエスト数を減らすには、このパラメーターを指定することを推奨します。
role_name='<RoleName>'
)
credentialsClient = CredClient(CredConfig)
呼び出し例
方法6: ECSインスタンスのRAMロールを使用し、セキュリティ強化モードでECSインスタンスのメタデータにアクセスする
セキュリティ強化モードでECSインスタンスのメタデータにアクセスし、ECSインスタンスにアタッチされているRAMロールの初期認証情報を取得できます。 通常モードと比較して、セキュリティ強化モードは、より厳密な次のセキュリティロジックを実装します。まず、有効期間を持つトークンがECSインスタンス内で自動的に生成されます。 次に、このトークンを資格情報として使用して、メタデータサーバーからSTSトークンを要求します。 これらの操作は、資格証明クライアントの安全な初期化プロセスも構成します。
セキュリティ強化モードでは、ECSインスタンス内で生成されたトークンは動的であり、有効期間があります。 この場合、外部の攻撃者は、トークンを予測または偽造してメタデータサーバーに不正にアクセスすることはできません。 これにより、サーバー側の要求偽造 (SSRF) などのネットワークセキュリティリスクが効果的に回避されます。 セキュリティ強化モードは、ID検証に追加の保護層を追加するだけでなく、システム全体のセキュリティを大幅に向上させます。 このモードは、クラウドリソースへの安全なアクセスと管理を保証します。
alibabacloud_credentials.client import Clientからのalibabacloud_credentials.modelsからのインポートConfig
credConfig=設定 (
type='ecs_ram_role '、# 資格情報タイプ
role_name='roleName' 、# 'role_name' はオプションです。 設定されていない場合は自動的に取得されます。 リクエストを減らすために設定することを強くお勧めします。
enable_imds_v2=True # 'enable_imds_v2 'はオプションで、オンにすることをお勧めします。 環境変数を設定することで置き換えることができます:
)
credClient=クライアント (credConfig)
access_key_id = credClient.get_access_key_id()
access_key_secret = credClient.get_access_key_secret()
security_token = credClient.get_security_token()
cred_type = credClient.get_type()
enable_imds_v2
パラメーターのデフォルト値はFalse
です。これは、ECSインスタンスのメタデータが通常モードでアクセスされることを指定します。セキュリティ強化モードでECSインスタンスのメタデータにアクセスする場合は、
enable_imds_v2
パラメーターをTrue
に設定します。
呼び出し例
次のサンプルコードは、ECSのDescribeRegions操作を呼び出す方法の例を示しています。 この操作を呼び出す前に、 ECS SDK for Python
# 資格情報クライアントをインポートし、エイリアスを作成します。
alibabacloud_credentials.clientからCredClientとしてのインポートクライアント
alibabacloud_credentials.clientからCredConfigとしてConfigをインポート
# ECS SDKクライアントをインポートし、エイリアスを作成します。
alibabacloud_ecs20140526.clientからEcsClientとしてのインポートクライアント
# ECSのDescribeRegions操作を呼び出すリクエストを開始します。
alibabacloud_ecs20140526.modelsからDescribeRegionsRequestをインポート
# コアAlibaba Cloud SDKパッケージをインポートします。
alibabacloud_tea_openapi.modelsからのインポートConfig
alibabacloud_tea_util.modelsからRuntimeOptionsをインポート
# ECSインスタンスのRAMロールを使用して、資格情報クライアントを初期化します。
credentialsConfig = CredConfig (
type='ecs_ram_role ', # 資格情報の種類を指定します。
role_name='<ecs_ram_role_name>', # ECSインスタンスにアタッチされているRAMロールの名前を指定します。 このパラメーターを指定することを推奨します。
enable_imds_v2=True# セキュリティ強化モードでECSインスタンスのメタデータにアクセスするには、このパラメーターをTrueに設定します。
)
credentialsClient = CredClient(credentialsConfig)
ecsConfig = Config(credential=credentialsClient)
# ECSのエンドポイントを指定します。
ecsConfig.endpoint = 'ecs .aliyuncs.com'
# Credentialsクライアントを使用してECS SDKクライアントを初期化します。
ecsClient = EcsClient(ecsConfig)
# DescribeRegions操作を呼び出す要求を初期化します。
request = DescribeRegionsRequest()
# ランタイム設定を初期化します。
runtime_options = RuntimeOptions()
# DescribeRegions操作を呼び出し、応答を取得します。
response = ecsClient.de scribe_regions_with_options(request, runtime_options)
print(response.to_map())
方法7: OIDC IdPのRAMロールを使用する
Container Service for KubernetesのワーカーノードにRAMロールをアタッチした後、ワーカーノードのポッドのアプリケーションは、ECSインスタンスのアプリケーションと同じ方法でメタデータサーバーを使用してSTSトークンを取得できます。 ただし、信頼されていないアプリケーション (顧客によって送信され、コードを使用できないアプリケーションなど) がワーカーノードにデプロイされている場合、アプリケーションがメタデータサーバーを使用してワーカーノードにアタッチされているRAMロールのSTSトークンを取得することはできません。 クラウドリソースのセキュリティを確保し、信頼できないアプリケーションが必要なSTSトークンを安全に取得できるようにするには、サービスアカウントのRAMロール (RRSA) 機能を使用して、アプリケーションに必要最小限の権限を付与します。 この場合、ACKクラスターはサービスアカウントOpenID Connect (OIDC) トークンファイルを作成し、トークンファイルをポッドに関連付けてから、関連する環境変数をポッドに挿入します。 次に、資格情報ツールは環境変数を使用してSTSのAssumeRoleWithOIDC操作を呼び出し、RAMロールのSTSトークンを取得します。 RRSA機能の詳細については、「RRSAを使用して異なるポッドに異なるクラウドサービスへのアクセスを許可する」をご参照ください。
次の環境変数がポッドに注入されます。
ALIBABA_CLOUD_ROLE_ARN: RAMロールのARN。
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: OIDC IDプロバイダー (IdP) のARN。
ALIBABA_CLOUD_OIDC_TOKEN_FILE: OIDCトークンファイルのパス。
osのインポート
からalibabacloud_credentials.client importクライアント
alibabacloud_credentials.modelsからのインポートConfig
config = Config (
type='oidc_role_arn '、access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID ') 、access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET ') 、security_token=os.environ.get('ALIBABA_CLOUD_SECURITY_TOKEN ') 、role_arn=os.environ.get('ALIBABA_CLOUD_ROLE_ARN ') 、oidc_provider_arn=os.environ.get('ALIBABA_CLOUD_OIDC_PROVIDER_ARN ') 、oidc_token_file_path=os.environ.get('ALIBABA_CLOUD_OIDC_TOKEN_FILE ') 、# ロールセッションの名前を指定します。
role_session_name='<RoleSessionName>' 、# オプション。 RAMロールの制限付き権限を指定します。 例: {"Statement": [{"Action": ["*"]] 、"Effect": "Allow" 、"Resource": ["*"]}] 、"Version": "1"} 。
policy='<Policy>' 、# セッションの有効期間を指定します。
role_session_expailation=3600
)
cred=クライアント (設定)
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
security_token = cred.get_security_token()
cred_type = cred.get_type()
呼び出し例
方法8: URIを使用する
このメソッドの基本的なロジックは、STSトークンを使用してCredentialsクライアントを初期化することです。 Credentialsツールは、指定したURI (uniform resource identifier) を使用してSTSトークンを取得します。 STSトークンは、Credentialsクライアントを初期化するために使用されます。
alibabacloud_credentials.client import Clientからのalibabacloud_credentials.modelsからのインポートConfig
config = Config (
type='credentials_uri' 、# 資格情報のURIをhttp:// local_or_remote_uri /の形式で指定します。
credentials_uri='<local_or_remote_uri>' 、)
cred=クライアント (設定)
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
security_token = cred.get_security_token()
cred_type = cred.get_type()
呼び出し例
方法9: ベアラトークンを使用する
ベアラトークンを使用して資格情報クライアントを初期化できるのは、Cloud Call Centerのみです。
alibabacloud_credentials.client import Clientからのalibabacloud_credentials.modelsからのインポートConfig
config = Config (
type='bearer' 、# ベアラトークンを入力します。
bearer_token='<BearerToken>' 、)
cred=クライアント (設定)
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
security_token = cred.get_security_token()
cred_type = cred.get_type()
呼び出し例
デフォルトの資格情報プロバイダーチェーン
アプリケーションの開発環境と本番環境でさまざまな種類の資格情報を使用する場合は、通常、コードから環境情報を取得し、コードブランチを作成して、開発環境と本番環境でさまざまな資格情報を取得する必要があります。 Credentialsツールの既定の資格情報プロバイダーチェーンを使用すると、同じコードを使用して、アプリケーションに依存しない構成に基づいて異なる環境の資格情報を取得できます。 初期化方法を指定せずにcred = CredClient()
を使用して資格情報クライアントを初期化すると、資格情報ツールは次の順序で資格情報を取得します。
1. 環境変数から資格情報を取得する
資格情報ツールは、まず、環境変数から資格情報を取得します。 ALIBABA_CLOUD_ACCESS_KEY_ID (AccessKey ID) およびALIBABA_CLOUD_ACCESS_KEY_SECRET (AccessKey secret) システム環境変数が指定されている場合、資格情報ツールは指定されたAccessKeyペアをデフォルトの資格情報として使用します。
2. OIDC IdPのRAMロールを使用して資格情報を取得する
前の手順で資格情報が見つからない場合、資格情報ツールは次の環境変数の値を取得します。
ALIBABA_CLOUD_ROLE_ARN: RAMロールのARN。
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: OIDC IdPのARN。
ALIBABA_CLOUD_OIDC_TOKEN_FILE: OIDCトークンファイルのパス。
上記の3つの環境変数が指定されている場合、資格情報ツールはその環境変数を使用してSTSのAssumeRoleWithOIDC操作を呼び出し、STSトークンをデフォルトの資格情報として取得します。
3. 構成ファイルから資格情報を取得する
前の手順で資格情報が見つからない場合、資格情報ツールは構成ファイルから資格情報を取得します。 構成ファイルのパスは、オペレーティングシステムによって異なります。
Linux: ~/.alibabacloud/credentials.ini
Windows: C:\Users\USER_NAME\.alibabacloud\credentials.ini
環境変数ALIBABA_CLOUD_CREDENTIALS_fileを設定して、設定ファイルパスを指定することもできます。 設定ファイルが存在する場合、アプリケーションは設定ファイルで既定で指定されている資格情報を使用して資格情報クライアントを初期化します。 ALIBABA_CLOUD_PROFILE環境変数を設定して、読み取られるデフォルトの資格情報を変更することもできます。
[デフォルト]
enable = true
type = access_key
access_key_id = foo
access_key_secret=バー
[client1]
type = ecs_ram_role
role_name = EcsRamRoleTest
[client2]
enable = false
type = ram_role_arn
region_id = cn-test
policy = test
access_key_id = foo
access_key_secret=バー
role_arn = role_arn
role_session_name = session_name
[client3]
type = rsa_key_pair
public_key_id = publicKeyId
private_key_file = /your/pk.pem
[client4]
enable = false
type = oidc_role_arn
region_id = cn-test
policy = test
access_key_id = foo
access_key_secret=バー
role_arn = role_arn
oidc_provider_arn = oidc_provider_arn
oidc_token_file_path = /xxx/xxx
role_session_name = session_name
4。 ECSインスタンスのRAMロールを使用して資格情報を取得する
前の手順で資格情報が見つからない場合、資格情報ツールは、ECSインスタンスのRAMロール名を指定するALIBABA_CLOUD_ECS_METADATA環境変数の値を取得します。 RAMロールが存在する場合、アプリケーションはECSのメタデータサーバーを使用して、デフォルトの資格情報としてRAMロールのSTSトークンを取得します。
5. URIに基づいて資格情報を取得する
前の手順で資格情報が見つからない場合、資格情報ツールはALIBABA_CLOUD_CREDENTIALS_URI環境変数の値を取得します。 環境変数が指定されている場合、アプリケーションは、Credentialsツールが一時的なセキュリティ資格情報を取得するURIとして値を設定します。
資格情報の保護
資格情報のリークにより、システムが攻撃にさらされる可能性があります。 これは、クラウドサービスに対する主な脅威の1つです。 平文の資格情報の漏洩を防ぎ、セキュリティリスクを軽減するために、次のソリューションを使用できます。
ECSインスタンスのRAMロールまたはSTSトークンを使用することを推奨します。
デフォルトの資格情報プロバイダーチェーンを使用し、資格情報を環境変数または構成ファイルに記録することを推奨します。
明示的な初期化メソッドを使用して資格情報クライアントを初期化するには、システムプロパティまたは環境変数を使用して資格情報を記録し、
os.getenv
またはos.environ.get
メソッドを使用して資格情報を取得することをお勧めします。
alibabacloud_credentials.modelsからのインポートConfig
osのインポート
config = Config (
type='access_key' 、access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID ') 、access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET ') 、)
cred=クライアント (設定)
access_key_id = cred.get_access_key_id()
access_key_secret = cred.get_access_key_secret()
cred_type = cred.get_type()
資格情報の切り替え
次の方法を使用して、さまざまな資格情報を使用して、アプリケーションでさまざまなAPI操作を呼び出すことができます。
複数の資格情報クライアントを使用する
複数の資格情報クライアントを初期化して、異なる資格情報を異なる要求クライアントに渡します。
alibabacloud_credentials.client import Clientからのalibabacloud_credentials.modelsからのインポートConfig
config1=設定 (
type='access_key' 、access_key_id='<ALIBABA_CLOUD_ACCESS_KEY_ID>' 、access_key_secret='<ALIBABA_CLOUD_ACCESS_KEY_SECRET>' 、)
cred1=クライアント (config1)
config2=設定 (
type='access_key' 、access_key_id='<ALIBABA_CLOUD_ACCESS_KEY_ID>' 、access_key_secret='<ALIBABA_CLOUD_ACCESS_KEY_SECRET>' 、)
cred2=クライアント (config2)
AuthUtilsクラスの使用
構成ファイルに記録されている資格情報を使用して資格情報クライアントを初期化する場合、auth_util.client_type
パラメーターを使用して異なる資格情報を切り替えることができます。
[デフォルト]
enable=true
type=access_key
access_key_id=<ALIBABA_CLOUD_ACCESS_KEY_ID>
access_key_secret=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
[client1]
enable=true
type=sts
access_key_id=<ALIBABA_CLOUD_ACCESS_KEY_ID>
access_key_secret=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
security_token=<security_token>
[client2]
enable=true
type=ecs_ram_role
role_name=<ecs_ram_role_name>
サンプルコード:
alibabacloud_credentials.utilsからauth_utilをインポート
からalibabacloud_credentials.client importクライアント
# AuthUtilsクラスのclientTypeプロパティを指定しない場合は、デフォルトが使用されます。
credentialClient=クライアント ()
# client1資格情報に切り替えます。
auth_util.client_type="client1"
credentialClient1=クライアント ()
# client2資格情報に切り替えます。
auth_util.client_type="client2"
credentialClient2=クライアント ()