Object Storage Service (OSS) SDKを使用するには リクエストを開始するには、アクセス資格情報を設定する必要があります。 Alibaba Cloudサービスは、アクセス資格情報を使用してID情報とアクセス許可を検証します。 認証と承認の要件に基づいて、さまざまなタイプのアクセス資格情報を選択できます。
前提条件
OSS SDK for。NETがインストールされています。 詳細については、「インストール」をご参照ください。
初期化方法の選択
資格情報プロバイダーの選択
OSSは、資格情報プロバイダーを初期化する複数の方法をサポートしています。 実際のシナリオの認証と承認の要件に基づいて、適切な方法を選択できます。
初期化メソッド | シナリオ | AccessKeyペアまたはセキュリティトークンが必要 | 基本的なロジック | 資格情報の有効期間 | 資格情報のローテーションまたは更新方法 |
アプリケーションは、外部からの攻撃に対して脆弱ではなく、頻繁な資格情報のローテーションなしに長期間クラウドサービスにアクセスする必要がある、安全で安定した環境でデプロイおよび実行されます。 | 必須 | AccessKey ペア | 長期 | 手動ローテーション | |
アプリケーションは信頼できない環境でデプロイされ、実行されます。この場合、資格情報の有効期間とアクセス可能なリソースを管理します。 | 必須 | セキュリティトークン | 一時的 | 手動更新 | |
アプリケーションは、クロスアカウントアクセスなどのクラウドサービスへのアクセスを許可されている必要があります。 | 必須 | セキュリティトークン | 一時的 | 自動更新 | |
アプリケーションは、Elastic Compute Service (ECS) インスタンス、elasticコンテナインスタンス、およびcontainer Service for Kubernetes (ACK) ワーカーノードでデプロイされ、実行されます。 | 選択可能 | セキュリティトークン | 一時的 | 自動更新 | |
信頼できないアプリケーションは、ACKワーカーノードにデプロイされ、実行されます。 | 選択可能 | セキュリティトークン | 一時的 | 自動更新 | |
アプリケーションには、外部システムからのアクセス資格情報が必要です。 | 選択可能 | セキュリティトークン | 一時的 | 自動更新 | |
上記の方法のいずれも要件を満たしていない場合は、カスタム方法を指定してアクセス資格情報を取得できます。 | 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 ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
Windows
set ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
環境変数を使用して資格情報を渡します。
using Aliyun.OSS; using Aliyun.OSS.Common; using Aliyun.OSS.Common.Authentication; // Obtain access credentials from environment variables. Before you run the sample code, make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variables are configured. var accessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); var credentialsProvider = new DefaultCredentialsProvider(new DefaultCredentials(accessKeyId, accessKeySecret, "")); // 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. const string endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. const string region = "cn-hangzhou"; var conf = new ClientConfiguration(); var client = new OssClient(endpoint, credentialsProvider, conf); client.SetRegion(region);
方法2: セキュリティトークンの使用
アプリケーションがOSSに一時的にアクセスする必要がある場合は、security token Service (STS) から取得したAccessKeyペアとセキュリティトークンで構成される一時的なアクセス資格情報を使用して、資格情報プロバイダーを初期化できます。 この方法では、セキュリティトークンを手動で管理する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 OSSに複数回アクセスする場合は、セキュリティトークンを手動で更新する必要があります。 セキュリティトークンの取得方法の詳細については、「AssumeRole」をご参照ください。
環境変数
一時的なアクセス資格情報を使用して環境変数を指定します。
Mac OS X/Linux/Unix
export ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> export ALIBABA_CLOUD_SECURITY_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>
一時的なアクセス資格情報を渡す環境変数を指定します。
using Aliyun.OSS; using Aliyun.OSS.Common; using Aliyun.OSS.Common.Authentication; // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, and OSS_SESSION_TOKEN environment variables are configured. var accessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); var token = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_SECURITY_TOKEN"); var credentialsProvider = new DefaultCredentialsProvider(new DefaultCredentials(accessKeyId, accessKeySecret, token)); // 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. const string endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. const string region = "cn-hangzhou"; var conf = new ClientConfiguration(); var client = new OssClient(endpoint, credentialsProvider, conf); client.SetRegion(region);
方法3: RAMRoleARNを使用する
アプリケーションがOSSへのアクセスを許可されている必要がある場合、たとえば、別のAlibaba CloudアカウントのOSSリソースにアクセスする場合、RAMRoleARNを使用して資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 RAMロールのAlibaba Cloud Resource Name (ARN) を指定すると、CredentialsツールはSTSからセキュリティトークンを取得し、セッションの有効期限が切れる前にセキュリティトークンを自動的に更新します。 policy
パラメーターに値を割り当てて、RAMロールの権限を制限できます。 この方法では、AccessKeyペアを手動で提供する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 AccessKeyペアを取得する方法の詳細については、「CreateAccessKey」をご参照ください。 RAMロールARNを取得する方法の詳細については、「CreateRole」をご参照ください。
Alibaba Cloud資格情報ライブラリをインストールします。 詳細については、「アクセス資格情報の管理」をご参照ください。
アクセス資格情報を設定します。
using Aliyun.OSS; using Aliyun.OSS.Common; using Aliyun.OSS.Common.Authentication; class CredentialsProviderWrapper : ICredentialsProvider { private Aliyun.Credentials.Client client; public CredentialsProviderWrapper(Aliyun.Credentials.Client client) { this.client = client; } public ICredentials GetCredentials() { var accessKeyId = client.GetAccessKeyId(); var accessKeySecret = client.GetAccessKeySecret(); var token = client.GetSecurityToken(); return new DefaultCredentials(accessKeyId, accessKeySecret, token); } public void SetCredentials(ICredentials creds) { } }; var config = new Aliyun.Credentials.Models.Config() { Type = "ram_role_arn", AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"), AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"), // By default, the values of the parameters are directly entered for the following operations. You can also add environment variables and use Environment.GetEnvironmentVariable("<variable name>") to obtain the corresponding parameters. // Specify the ARN of the RAM role that you want your application to assume. Example: acs:ram::123456789012****:role/adminrole. RoleArn = "<RoleArn>", // By default, the canonical name of the RoleArn environment variable is ALIBABA_CLOUD_ROLE_ARN. // Specify the name of the role session. RoleSessionName = "<RoleSessionName>", // By default, the canonical name of the RoleSessionName environment variable is ALIBABA_CLOUD_ROLE_SESSION_NAME. }; var credentialsClient = new Aliyun.Credentials.Client(config); var credentialsProvider = new CredentialsProviderWrapper(credentialsClient); // 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. const string endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. const string region = "cn-hangzhou"; var conf = new ClientConfiguration(); var client = new OssClient(endpoint, credentialsProvider, conf); client.SetRegion(region);
方法4: ECSRAMRoleの使用
アプリケーションがECSインスタンス、エラスティックコンテナインスタンス、またはACKワーカーノードで実行されている場合、ECSRAMRoleを使用して資格情報プロバイダーを初期化することを推奨します。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 ECSRAMRoleを使用すると、ECSインスタンス、エラスティックコンテナインスタンス、またはACKワーカーノードにRAMロールをアタッチして、インスタンスのセキュリティトークンを自動的に更新できます。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 ECSRAMRoleロールの取得方法の詳細については、「CreateRole」をご参照ください。
Alibaba Cloud資格情報ライブラリをインストールします。 詳細については、「アクセス資格情報の管理」をご参照ください。
アクセス資格情報としてECSRAMRoleを設定します。
using Aliyun.OSS;
using Aliyun.OSS.Common;
using Aliyun.OSS.Common.Authentication;
class CredentialsProviderWrapper : ICredentialsProvider
{
private Aliyun.Credentials.Client client;
public CredentialsProviderWrapper(Aliyun.Credentials.Client client)
{
this.client = client;
}
public ICredentials GetCredentials()
{
var accessKeyId = client.GetAccessKeyId();
var accessKeySecret = client.GetAccessKeySecret();
var token = client.GetSecurityToken();
return new DefaultCredentials(accessKeyId, accessKeySecret, token);
}
public void SetCredentials(ICredentials creds)
{
}
};
var config = new Aliyun.Credentials.Models.Config()
{
Type = "ecs_ram_role",
// Optional. Specify the name of the RAM role of the ECS instance. If you do not specify this parameter, its value is automatically obtained. To reduce the number of requests, we recommend that you specify this parameter.
RoleName = "<RoleName>"
};
var credentialsClient = new Aliyun.Credentials.Client(config);
var credentialsProvider = new CredentialsProviderWrapper(credentialsClient);
// 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.
const string endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
const string region = "cn-hangzhou";
var conf = new ClientConfiguration();
var client = new OssClient(endpoint, credentialsProvider, conf);
client.SetRegion(region);
方法5: OIDCRoleARNを使用する
ACKワーカーノードでRAMロールを設定すると、ノードのポッド内のアプリケーションは、ECSインスタンスにデプロイされたアプリケーションと同じ方法でメタデータサーバーを使用して、アタッチされたロールのセキュリティトークンを取得できます。 ただし、信頼されていないアプリケーション (顧客によって送信され、コードを使用できないアプリケーションなど) がワーカーノードにデプロイされている場合、アプリケーションがメタデータサーバーを使用してワーカーノードにアタッチされているRAMロールのセキュリティトークンを取得することはできません。 クラウドリソースのセキュリティを確保し、信頼できないアプリケーションが必要なセキュリティトークンを安全に取得できるようにし、アプリケーションレベルの権限を最小限に抑えるために、サービスアカウントのRAMロール (RRSA) 機能を使用できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 ACKは、さまざまなアプリケーションポッドの対応するOpenID Connect (OIDC) トークンファイルを作成およびマウントし、関連する構成情報を環境変数に渡します。 資格情報ツールは、環境変数の構成情報を取得し、STSのAssumeRoleWithOIDC操作を呼び出して、アタッチされたロールのセキュリティトークンを取得します。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 詳細については、「RRSAを使用して異なるポッドに異なるクラウドサービスへのアクセスを許可する」をご参照ください。
次の環境変数がポッドに注入されます。
ALIBABA_CLOUD_ROLE_ARN: RAMロールのARN。
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: OIDC IdpのARN。
ALIBABA_CLOUD_OIDC_TOKEN_FILE: OIDCトークンファイルのパス。
OIDCRoleARNをアクセス資格情報に設定します。
using Aliyun.OSS;
using Aliyun.OSS.Common;
using Aliyun.OSS.Common.Authentication;
class CredentialsProviderWrapper : ICredentialsProvider
{
private Aliyun.Credentials.Client client;
public CredentialsProviderWrapper(Aliyun.Credentials.Client client)
{
this.client = client;
}
public ICredentials GetCredentials()
{
var accessKeyId = client.GetAccessKeyId();
var accessKeySecret = client.GetAccessKeySecret();
var token = client.GetSecurityToken();
return new DefaultCredentials(accessKeyId, accessKeySecret, token);
}
public void SetCredentials(ICredentials creds)
{}
};
var config = new Aliyun.Credentials.Models.Config()
{
Type = "oidc_role_arn",
// Specify the ARN of the RAM role by specifying the ALIBABA_CLOUD_ROLE_ARN environment variable.
RoleArn = "<RoleArn>",
// Specify the ARN of the OIDC IdP by specifying the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable.
OIDCProviderArn = "<OidcProviderArn>",
// Specify the path of the OIDC token file by specifying the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable.
OIDCTokenFilePath = "<OidcTokenFilePath>",
// Specify the role session name by specifying the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
RoleSessionName = "<RoleSessionName>",
// Optional. Specify limited permissions for the RAM role. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
Policy = "<Policy>",
RoleSessionExpiration = 3600
};
var credentialsClient = new Aliyun.Credentials.Client(config);
var credentialsProvider = new CredentialsProviderWrapper(credentialsClient);
// 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.
const string endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
const string region = "cn-hangzhou";
var conf = new ClientConfiguration();
var client = new OssClient(endpoint, credentialsProvider, conf);
client.SetRegion(region);
方法6: CredentialsURIの使用
アプリケーションが外部システムからAlibaba Cloudの資格情報を取得して、柔軟な資格情報管理とキーレスアクセスを実装する必要がある場合は、CredentialsURIを使用して資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 Credentialsツールは、クライアントでOSSClientインスタンスを初期化するために指定したURIを使用してセキュリティトークンを取得します。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 CredentialsURI応答を提供するバックエンドサービスは、アプリケーションが常に有効な資格情報を取得できるように、セキュリティトークンを自動的に更新する必要があることに注意してください。
using Aliyun.OSS;
using Aliyun.OSS.Common;
using Aliyun.OSS.Common.Authentication;
class CredentialsProviderWrapper : ICredentialsProvider
{
private Aliyun.Credentials.Client client;
public CredentialsProviderWrapper(Aliyun.Credentials.Client client)
{
this.client = client;
}
public ICredentials GetCredentials()
{
var accessKeyId = client.GetAccessKeyId();
var accessKeySecret = client.GetAccessKeySecret();
var token = client.GetSecurityToken();
return new DefaultCredentials(accessKeyId, accessKeySecret, token);
}
public void SetCredentials(ICredentials creds)
{}
};
var config = new Aliyun.Credentials.Models.Config()
{
// Specify the credential type.
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.
CredentialsURI = "<CredentialsURI>"
};
var credentialsClient = new Aliyun.Credentials.Client(config);
var credentialsProvider = new CredentialsProviderWrapper(credentialsClient);
// 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.
const string endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
const string region = "cn-hangzhou";
var conf = new ClientConfiguration();
var client = new OssClient(endpoint, credentialsProvider, conf);
client.SetRegion(region);
方法7: カスタムアクセス資格情報の使用
上記のメソッドのいずれも要件を満たしていない場合は、CredentialsProvider操作を呼び出して、アクセス資格情報を取得するカスタムメソッドを指定できます。
using Aliyun.OSS;
using Aliyun.OSS.Common;
using Aliyun.OSS.Common.Authentication;
class CustomCredentialsProvider : ICredentialsProvider
{
public CustomCredentialsProvider()
{
}
public ICredentials GetCredentials()
{
//TODO
// Specify a custom method to obtain access credentials.
string accessKeyId;
string accessKeySecret;
//string token;
// Return long-term access credentials, which consists of an AccessKey ID and an AccessKey secret.
return new DefaultCredentials(accessKeyId, accessKeySecret, "");
// 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 expiration time.
// return new DefaultCredentials(accessKeyId, accessKeySecrect, token);
}
public void SetCredentials(ICredentials creds)
{
}
};
var credentialsProvider = new CustomCredentialsProvider();
// 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.
const string endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
const string region = "cn-hangzhou";
var conf = new ClientConfiguration();
var client = new OssClient(endpoint, credentialsProvider, conf);
client.SetRegion(region);
次に何をすべきか
資格情報プロバイダーを初期化した後、資格情報プロバイダーを使用してOSSClientインスタンスを作成します。 詳細については、「初期化」をご参照ください。