Alibaba Cloud SDK for C# V1.0 は、複数の認証情報タイプをサポートしています。デプロイ環境とセキュリティ要件に合ったものを選択してください。
認証情報タイプの選択
認証情報タイプ | 使用場面 |
AccessKey | 開発およびテスト環境。本番環境での使用は避けてください。AccessKey が漏洩すると、アカウント内のすべてのリソースが危険にさらされます。 |
STS トークン | きめ細かな権限を持つ、有効期間の短いアクセス。通常、AssumeRole を介して取得されます。 |
RAM ロール ARN | クロスアカウントアクセス、または STS を介した RAM ユーザーへの権限委譲。 |
インスタンス RAM ロール | Elastic Compute Service (ECS) 上で実行されるアプリケーションで利用します。AccessKey は不要です。SDK はインスタンスメタデータサービスから認証情報を自動的に取得します。 |
OIDC を使用した RAM ロール | Container Service for Kubernetes (ACK) で実行されるアプリケーションで利用します。各 Pod は AccessKey なしで個別の RAM ロールを引き受けます。 |
デフォルトの認証情報プロバイダーチェーン | ローカルでの開発、または認証情報が外部 (環境変数、設定ファイル、インスタンスメタデータ) で管理される環境。 |
AccessKey の使用
Alibaba Cloud アカウントの AccessKey が漏洩すると、そのアカウント内のすべてのリソースが危険にさらされます。セキュリティを向上させるために、RAM ユーザーの AccessKey を使用することを強く推奨します。詳細については、「AccessKey の作成」をご参照ください。
ランタイム環境に環境変数
ALIBABA_CLOUD_ACCESS_KEY_IDおよびALIBABA_CLOUD_ACCESS_KEY_SECRETが設定されていることを確認してください。詳細については、「Linux、macOS、Windows で環境変数を設定する」をご参照ください。
IClientProfileを使用して、AccessKey でクライアントを初期化します。using Aliyun.Acs.Core; using Aliyun.Acs.Core.Profile; namespace AlibabaCloud.SDK.Sample { public class Sample { public static void Main(string[] args) { IClientProfile profile = DefaultProfile.GetProfile( // リージョン ID。 "<REGION_ID>", // 環境変数から RAM ユーザーの AccessKey ID を取得します。 Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"), // 環境変数から RAM ユーザーのアクセスキーシークレットを取得します。 Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); DefaultAcsClient client = new DefaultAcsClient(profile); // API を呼び出すコードは省略されています。 } } }AlibabaCloudCredentialsProviderを使用して、AccessKey でクライアントを初期化します。using Aliyun.Acs.Core; using Aliyun.Acs.Core.Profile; using Aliyun.Acs.Core.Auth; namespace AlibabaCloud.SDK.Sample { public class Sample { public static void Main(string[] args) { AlibabaCloudCredentialsProvider provider = new AccessKeyCredentialProvider( // 環境変数から RAM ユーザーの AccessKey ID を取得します。 Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"), // 環境変数から RAM ユーザーのアクセスキーシークレットを取得します。 Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>"); DefaultAcsClient client = new DefaultAcsClient(profile, provider); // API を呼び出すコードは省略されています。 } } }
STS トークンの使用
Security Token Service (STS) を介して取得した一時的なアクセス認証情報でクライアントを初期化します。
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;
namespace AlibabaCloud.SDK.Sample
{
public class Sample
{
public static void Main(string[] args)
{
AlibabaCloudCredentialsProvider provider = new StsCredentialProvider(
// 環境変数から一時的な AccessKey ID を取得します。
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 環境変数から一時的なアクセスキーシークレットを取得します。
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
// 環境変数からセキュリティトークンを取得します。
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_SECURITY_TOKEN"));
IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
DefaultAcsClient client = new DefaultAcsClient(profile, provider);
// API を呼び出すコードは省略されています。
}
}
}
RAM ロール ARN の使用
Resource Access Management (RAM) ユーザーとして STS の AssumeRole API を呼び出し、STS トークンを取得します。
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;
namespace AlibabaCloud.SDK.Sample
{
public class Sample
{
public static void Main(string[] args)
{
IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
AlibabaCloudCredentialsProvider provider = new AccessKeyCredentialProvider(
// 環境変数から RAM ユーザーの AccessKey ID を取得します。
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 環境変数から RAM ユーザーのアクセスキーシークレットを取得します。
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// RAM ロール ARN を使用します。
STSAssumeRoleSessionCredentialsProvider stsProvider = new STSAssumeRoleSessionCredentialsProvider(
provider,
"<ROLE_ARN>",
profile
);
DefaultAcsClient client = new DefaultAcsClient(profile, stsProvider);
// API を呼び出すコードは省略されています。
}
}
}
インスタンス RAM ロールの使用
SDK は、ECS インスタンスにアタッチされたインスタンス RAM ロールから一時的な認証情報を取得します。アプリケーションは、ハードコードされた AccessKey なしで Alibaba Cloud API にアクセスします。SDK は、ロールに付与された権限を自動的に使用します。
RAM ロールが ECS インスタンスにアタッチされていることを確認してください。
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Core.Auth;
namespace AlibabaCloud.SDK.Sample
{
public class Sample
{
public static void Main(string[] args)
{
IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
// インスタンス RAM ロールを使用します。
InstanceProfileCredentialsProvider provider = new InstanceProfileCredentialsProvider(
"<ROLE_NAME>");
DefaultAcsClient client = new DefaultAcsClient(profile, provider);
// API を呼び出すコードは省略されています。
}
}
}
OIDC を使用した RAM ロールの使用
ACK では、サービスアカウントの RAM ロール (RRSA) を使用すると、各 Pod が個別の RAM ロールを引き受け、一時的な認証情報でクラウドリソースにアクセスできます。これにより、最小権限が適用され、AccessKey が不要になるため、認証情報の漏洩を防ぐことができます。
ACK は、各 Pod のサービスアカウントの OpenID Connect (OIDC) トークンファイルを作成してマウントし、設定詳細を環境変数に挿入します。SDK はこれらの変数を読み取り、STS の AssumeRoleWithOIDC API を呼び出して、OIDC トークンを一時的な STS トークンと交換します。詳細については、「RAM Roles for Service Accounts (RRSA) を使用した Pod 権限の分離」をご参照ください。
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;
namespace AlibabaCloud.SDK.Sample
{
public class Sample
{
public static void Main(string[] args)
{
AlibabaCloudCredentialsProvider provider = new OIDCCredentialsProvider(
// RAM ロールの ARN。
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ROLE_ARN"),
// OIDC プロバイダーの ARN。
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_OIDC_PROVIDER_ARN"),
// OIDC トークンのファイルパス。
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_OIDC_TOKEN_FILE"),
// カスタムのロールセッション名。
"<ROLE_SESSION_NAME>",
// STS サービスのリージョン ID。
"<REGION_ID>");
IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
DefaultAcsClient client = new DefaultAcsClient(profile, provider);
// API を呼び出すコードは省略されています。
}
}
}
デフォルトの認証情報プロバイダーチェーンの使用
DefaultCredentialsProvider は、次の順序で認証情報を検索し、最初に見つかったものを使用します:
優先度 | ソース | 認証情報タイプ |
1 | 環境変数 ( | AccessKey |
2 | 環境変数 ( | OIDC RAM ロール |
3 | 認証情報ファイル ( | サポートされている任意のタイプ |
4 | 環境変数 | インスタンス RAM ロール |
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;
namespace AlibabaCloud.SDK.Sample
{
public class Sample
{
public static void Main(string[] args)
{
IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
var alibabaCloudClientCredential = new DefaultCredentialsProvider();
var client = new DefaultAcsClient(profile,alibabaCloudClientCredential);
// API を呼び出すコードは省略されています。
}
}
}DefaultCredentialsProvider は、ローカルでの開発やテストには便利ですが、本番環境での使用は推奨されません。認証が失敗した場合、問題の認証情報ソースを特定するのが困難になる場合があります。本番環境では、ECS のインスタンス RAM ロールや ACK の OIDC RAM ロールなど、デプロイ環境に合った明示的な認証情報タイプを使用してください。
1. 環境認証情報
SDK は、ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET をチェックします。両方が設定されており、空でない場合、それらを使用して認証情報が作成されます。
2. OIDC RAM ロール
より優先度の高い認証情報が見つからない場合、SDK は次の環境変数を読み取ります:
変数 | 説明 |
| RAM ロールの ARN。 |
| OIDC プロバイダーの ARN。 |
| OIDC トークンのファイルパス。 |
3 つすべてが設定されている場合、SDK は AssumeRoleWithOIDC API を呼び出し、返された STS トークンを使用します。
3. 認証情報ファイル
~/.alibabacloud/credentials.ini (Windows の場合は C:\Users\USER_NAME\.alibabacloud\credentials.ini) にファイルが存在する場合、SDK はそこから認証情報を読み取ります。デフォルトのパスを上書きするには、ALIBABA_CLOUD_CREDENTIALS_FILE 環境変数を使用します。プロファイルを指定するには ALIBABA_CLOUD_PROFILE を使用します。設定されていない場合、SDK は default プロファイルを使用します。
このファイルは、すべての認証情報タイプをサポートしています。
[default] # デフォルトプロファイル
type = access_key # 認証タイプ: access_key
access_key_id = foo # AccessKey ID
access_key_secret = bar # アクセスキーシークレット
[client1] # 'client1' という名前のプロファイル
type = ecs_ram_role # 認証タイプ: ecs_ram_role
role_name = EcsRamRoleTest # ロール名
[client2] # 'client2' という名前のプロファイル
type = ram_role_arn # 認証タイプ: ram_role_arn
access_key_id = foo
access_key_secret = bar
role_arn = role_arn # ロール ARN
role_session_name = role_session_name # カスタムセッション名
[client3] # 'client3' という名前のプロファイル
type = oidc_role_arn # 認証タイプ: oidc_role_arn
access_key_id = foo
access_key_secret = bar
role_arn = role_arn # ロール ARN
oidc_provider_arn = oidc_provider_arn # OIDC プロバイダー ARN
oidc_token_file_path = /path/to/token # OIDC トークンファイルパス
role_session_name = role_session_name # カスタムセッション名4. インスタンス RAM ロール
以前のソースから認証情報が見つからない場合、SDK は ALIBABA_CLOUD_ECS_METADATA 環境変数にインスタンス RAM ロールの名前が設定されているかを確認します。設定されている場合、SDK は ECS のメタデータサーバーから STS トークンを取得します。