メニュー
AWS SDK for .NET
開発者ガイド

AWS 認証情報の設定

AWS 認証情報を安全に管理し、意図せずに認証情報が一般に公開される可能性がある手法を避ける必要があります。このトピックでは、安全性を維持するためにアプリケーションの AWS 認証情報を設定する方法について説明します。

  • アカウントのルート認証情報を使用して AWS リソースにアクセスしないでください。これらの認証情報は無制限のアカウントアクセスを提供し、取り消すのが困難です。

  • プロジェクトの App.config または Web.config ファイルを含めて、アプリケーションにリテラルアクセスキーを配置しないでください。これを行うと、パブリックリポジトリにプロジェクトをアップロードするなど、誤って認証情報が公開されるリスクが発生します。

注記

ここでは、AWS アカウントを作成済みであり、認証情報にアクセスできることを前提としています。作成済みでない場合は、「AWS のアカウントと認証情報を作成する」を参照してください。

認証情報を安全に管理するための一般的なガイドラインを次に示します。

  • IAM ユーザーを作成し、AWS ルートユーザーを使用する代わりに IAM ユーザー認証情報を使用します。IAM ユーザーの認証情報は、漏洩した場合に簡単に取り消すことができます。特定のリソースとアクションのセットにユーザーを限定するポリシーを、各 IAM ユーザーに適用できます。

  • アプリケーションの開発中に認証情報を管理するための推奨される手法は、IAM ユーザー認証情報のセットごとのプロファイルを SDK Store に置くことです。プレーンテキストの認証情報ファイルを使用して、認証情報を含むプロファイルを保存することもできます。次に、プロジェクトファイルに認証情報を保存するのではなく、プログラムから特定のプロファイルを参照することができます。意図せずに認証情報を公開してしまうリスクを抑えるために、SDK Store または認証情報ファイルはプロジェクトファイルとは別に保存しておく必要があります。

  • Amazon Elastic Container Service (Amazon ECS) タスクにタスク用の IAM ロールを使用します。

  • Amazon EC2 インスタンスで実行中のアプリケーションに対して IAM ロールを使用します。

  • 組織外部のユーザーが利用できるアプリケーションでは、一時的な認証情報または環境変数を使用します。

以下のトピックでは、AWS SDK for .NET アプリケーションの認証情報を管理する方法について説明します。安全に AWS 認証情報を管理する方法の説明については、「AWS アクセスキーを管理するためのベストプラクティス」を参照してください。

SDK Store の使用

AWS SDK for .NET アプリケーションの開発中は、アプリケーションで使用する認証情報のセットごとのプロファイルを SDK Store に追加します。これにより、AWS セキュリティ認証情報が誤って公開されることを防ぎます。SDK Store は、RegisteredAccounts.json ファイルの C:\Users\<username>\AppData\Local\AWSToolkit フォルダにあります。SDK Store には次の利点があります。

  • SDK Store には任意の数のアカウントから複数のプロファイルを含めることができます。

  • SDK Store の認証情報は暗号化され、SDK Store はユーザーのホームディレクトリに置かれます。これにより、認証情報が誤って公開されるリスクが制限されます。

  • アプリケーションでそのプロファイルを名前で参照すると、関連する認証情報が実行時に参照されます。ソースファイルには、リテラル認証情報は含まれません。

  • default という名前のプロファイルを含めると、AWS SDK for .NET ではそのプロファイルが使用されます。これは、別のインスタンスプロファイル名を指定しない場合、または指定された名前が見つからない場合も同様です。

  • SDK Store は、AWS Tools for Windows PowerShell および AWS Toolkit for Visual Studio にも認証情報を提供します。

注記

SDK Store のプロファイルは、特定ホストの特定ユーザーに固有です。これらは他のホストや他のユーザーにコピーすることはできません。そのため、SDK Store のプロファイルを本稼働アプリケーションで使用することはできません。詳細については、「認証情報とプロファイルの解決」を参照してください。

SDK Store のプロファイルはいくつかの方法で管理できます。

  • AWS Toolkit for Visual Studio のグラフィカルユーザーインターフェイス (GUI) を使用してプロファイルを管理します。GUI を使用して SDK Store に認証情報を追加する方法の詳細については、AWS Toolkit for Visual Studioの「認証情報の指定」を参照してください。

  • AWS Tools for Windows PowerShell で Set-AWSCredentials コマンドレットを使用して、コマンドラインからプロファイルを管理できます。詳細については、「AWS セキュリティ認証情報の使用」を参照してください。

  • Amazon.Runtime.CredentialManagement.CredentialProfile クラスを使用してプログラムからプロファイルを作成および管理できます。

次の例では、ベーシックプロファイルと SAML プロファイルを作成し、RegisterProfile メソッドを使用して SDK Store に追加する方法を示します。

プロファイルの作成と、.NET 認証情報ファイルへの保存

Amazon.Runtime.CredentialManagement.CredentialProfileOptions オブジェクトを作成し、その AccessKey および SecretKey プロパティを設定します。Amazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成します。プロファイルと、作成した CredentialProfileOptions オブジェクトの名前を指定します。必要に応じて、プロファイルのリージョンプロパティを設定します。NetSDKCredentialsFile オブジェクトをインスタンス化し、RegisterProfile メソッドを呼び出してプロファイルを登録します。

var options = new CredentialProfileOptions { AccessKey = "access_key", SecretKey = "secret_key" }; var profile = new Amazon.Runtime.CredentialManagement.CredentialProfile("basic_profile", options); profile.Region = RegionEndpoint.USWest1; var netSDKFile = new NetSDKCredentialsFile(); netSDKFile.RegisterProfile(profile);

新しいプロファイルを登録するには、RegisterProfile メソッドを使用します。アプリケーションでは通常、プロファイルごとにこのメソッドを 1 回呼び出します。

SAMLEndpoint および関連プロファイルの作成と、.NET 認証情報ファイルへの保存

Amazon.Runtime.CredentialManagement.SAMLEndpoint オブジェクトを作成します。名前とエンドポイント URI パラメーターを指定します。Amazon.Runtime.CredentialManagement.SAMLEndpointManager オブジェクトを作成します。RegisterEndpoint メソッドを呼び出して、エンドポイントを登録します。Amazon.Runtime.CredentialManagement.CredentialProfileOptions オブジェクトを作成し、その EndpointName および RoleArn プロパティを設定します。Amazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成し、そのプロファイルと、作成した CredentialProfileOptions オブジェクトの名前を指定します。必要に応じて、プロファイルのリージョンプロパティを設定します。NetSDKCredentialsFile オブジェクトをインスタンス化し、RegisterProfile メソッドを呼び出してプロファイルを登録します。

var endpoint = new SAMLEndpoint("endpoint1", new Uri("https://some_saml_endpoint"), SAMLAuthenticationType.Kerberos); var endpointManager = new SAMLEndpointManager(); endpointManager.RegisterEndpoint(endpoint); options = new CredentialProfileOptions { EndpointName = "endpoint1", RoleArn = "arn:aws:iam::999999999999:role/some-role" }; profile = new CredentialProfile("federated_profile", options); netSDKFile = new NetSDKCredentialsFile(); netSDKFile.RegisterProfile(profile);

認証情報ファイルの使用

共有認証情報ファイルにプロファイルを保存することもできます。このファイルは、他の AWS SDK、AWS CLI、および AWS Tools for Windows PowerShell で使用できます。誤って認証情報が公開されるリスクを軽減するために、認証情報ファイルはプロジェクトファイルとは別に保存し、通常はユーザーのホームフォルダに置きます。認証情報ファイル中のプロファイルは平文で格納される点に注意してください。

共有認証情報ファイルのプロファイルは、2 つの方法で管理できます。

  • テキストエディタを使用できます。ファイルは credentials という名前で、デフォルトの場所はユーザーのホームフォルダ内です。たとえば、ユーザー名が awsuser である場合、認証情報ファイルは C:\users\awsuser\.aws\credentials です。

    認証情報ファイルのプロファイルの例は次のようになります。

[{profile_name}] aws_access_key_id = {accessKey} aws_secret_access_key = {secretKey} For more information, see `Best Practices for Managing AWS Access Keys <http://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html>`_.

注記

default という名前のプロファイルを含めている場合、AWS SDK for .NET では、指定されたプロファイルが見つからない場合にデフォルトでそのプロファイルが使用されます。

プロファイルを含む認証情報ファイルは、任意の場所に保存できます (例: C:\aws_service_credentials\credentials)。次に、プロジェクトの AWSProfilesLocation または App.config ファイルで、Web.config 属性のファイルパスを明示的に指定する必要があります。詳細については、「プロファイルの指定」を参照してください。

プロファイルの作成と、共有認証情報ファイルへの保存

Amazon.Runtime.CredentialManagement.CredentialProfileOptions オブジェクトを作成し、その AccessKey および SecretKey プロパティを設定します。Amazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成します。プロファイルと、作成した CredentialProfileOptions の名前を指定します。必要に応じて、プロファイルのリージョンプロパティを設定します。Amazon.Runtime.CredentialManagement.SharedCredentialsFile オブジェクトをインスタンス化し、RegisterProfile メソッドを呼び出してプロファイルを登録します。

options = new CredentialProfileOptions { AccessKey = "access_key", SecretKey = "secret_key" }; profile = new CredentialProfile("shared_profile", options); profile.Region = RegionEndpoint.USWest1; var sharedFile = new SharedCredentialsFile(); sharedFile.RegisterProfile(profile);

新しいプロファイルを登録するには、RegisterProfile メソッドを使用します。アプリケーションでは通常、プロファイルごとにこのメソッドを 1 回呼び出します。

ソースプロファイルおよび関連するロールの継承プロファイルの作成と、認証情報ファイルへの保存

ソースプロファイルの Amazon.Runtime.CredentialManagement.CredentialProfileOptions オブジェクトを作成し、その AccessKey および SecretKey プロパティを設定します。Amazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成します。プロファイルと、作成した CredentialProfileOptions の名前を指定します。Amazon.Runtime.CredentialManagement.SharedCredentialsFile オブジェクトをインスタンス化し、RegisterProfile メソッドを呼び出してプロファイルを登録します。引き受けたロールプロファイルの別の Amazon.Runtime.CredentialManagement.CredentialProfileOptions オブジェクトを作成し、そのプロファイルの SourceProfile および RoleArn プロパティを設定します。引き受けたロールの Amazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成します。プロファイルと、作成した CredentialProfileOptions の名前を指定します。

// Create the source profile and save it to the shared credentials file var sourceProfileOptions = new CredentialProfileOptions { AccessKey = "access_key", SecretKey = "secret_key" }; var sourceProfile = new CredentialProfile("source_profile", sourceProfileOptions); sharedFile = new SharedCredentialsFile(); sharedFile.RegisterProfile(sourceProfile); // Create the assume role profile and save it to the shared credentials file var assumeRoleProfileOptions = new CredentialProfileOptions { SourceProfile = "source_profile", RoleArn = "arn:aws:iam::999999999999:role/some-role" }; var assumeRoleProfile = new CredentialProfile("assume_role_profile", assumeRoleProfileOptions); sharedFile.RegisterProfile(assumeRoleProfile);

共有認証情報ファイルの既存のプロファイルの更新

Amazon.Runtime.CredentialManagement.SharedCredentialsFile オブジェクトを作成します。プロファイルの RegionAccessKeySecretKey の各プロパティを設定します。TryGetProfile メソッドを呼び出します。プロファイルが存在する場合は、Amazon.Runtime.CredentialManagement.SharedCredentialsFile インスタンスを使用して RegisterProfile メソッドを呼び出し、更新されたプロファイルを登録します。

sharedFile = new SharedCredentialsFile(); CredentialProfile basicProfile; if (sharedFile.TryGetProfile("basicProfile", out basicProfile)) { basicProfile.Region = RegionEndpoint.USEast1; basicProfile.Options.AccessKey = "different_access_key"; basicProfile.Options.SecretKey = "different_secret_key"; sharedFile.RegisterProfile(basicProfile); }

アプリケーションでの認証情報とプロファイルへのアクセス

Amazon.Runtime.CredentialManagement.CredentialProfileStoreChain クラスを使用して、.NET 認証情報ファイルまたは共有認証情報ファイルで認証情報およびプロファイルを簡単に見つけることができます。これは、.NET SDK が認証情報とプロファイルを検索する方法です。CredentialProfileStoreChain クラスは自動的に両方の認証情報ファイルを確認します。

TryGetAWSCredentials または TryGetProfile メソッドを使用して、認証情報またはプロファイルを取得できます。ProfilesLocation プロパティにより、次のように CredentialsProfileChain の動作が決まります。

  1. ProfilesLocation が null 以外または空でない場合は、ProfilesLocation プロパティのディスクパスで共有認証情報ファイルを検索します。

  2. ProfilesLocation が null または空で、プラットフォームが .NET 認証情報ファイルをサポートしている場合は、.NET 認証情報ファイルを検索します。プロファイルが見つからない場合は、デフォルトの場所で共有認証情報ファイルを検索します。

  3. ProfilesLocation が null または空で、プラットフォームが .NET 認証情報ファイルをサポートしていない場合は、デフォルトの場所で共有認証情報ファイルを検索します。

デフォルトの場所での SDK 認証情報ファイルまたは共有認証情報ファイルからの認証情報の取得

CredentialProfileStoreChain オブジェクトおよび Amazon.Runtime.AWSCredentials オブジェクトを作成します。TryGetAWSCredentials メソッドを呼び出します。プロファイル名および認証情報を返す AWSCredentials オブジェクトを指定します。

var chain = new CredentialProfileStoreChain(); AWSCredentials awsCredentials; if (chain.TryGetAWSCredentials("basic_profile", out awsCredentials)) { // use awsCredentials }

デフォルトの場所での SDK 認証情報ファイルまたは共有認証情報ファイルからのプロファイルの取得

CredentialProfileStoreChain オブジェクトおよび Amazon.Runtime.CredentialManagement.CredentialProfile オブジェクトを作成します。TryGetProfile メソッドを呼び出し、プロファイル名および認証情報を返す CredentialProfile オブジェクトを指定します。

var chain = new CredentialProfileStoreChain(); CredentialProfile basicProfile; if (chain.TryGetProfile("basic_profile", out basicProfile)) { // Use basicProfile }

ファイルの場所での共有認証情報ファイル形式のファイルからの AWSCredentials の取得

CredentialProfileStoreChain オブジェクト作成し、認証情報ファイルのパスを指定します。AWSCredentials オブジェクトを作成します。TryGetAWSCredentials メソッドを呼び出します。プロファイル名および認証情報を返す AWSCredentials オブジェクトを指定します。

var chain = new CredentialProfileStoreChain("c:\\Users\\sdkuser\\customCredentialsFile.ini"); AWSCredentials awsCredentials; if (chain.TryGetAWSCredentials("basic_profile", out awsCredentials)) { // Use awsCredentials }

SharedCredentialsFile クラスを使用して AmazonS3Client を作成する方法

Amazon.Runtime.CredentialManagement.SharedCredentialsFile クラスを使用して、特定のプロファイルの認証情報を使用する AmazonS3Client オブジェクトを作成できます。AWS SDK for .NET では、プロファイルに含まれている認証情報が自動的にロードされます。これは、App.Config で指定している profile とは異なる特有のプロファイルを、指定したクライアントに対して使用する場合に行うことができます。

CredentialProfile basicProfile; AWSCredentials awsCredentials; var sharedFile = new SharedCredentialsFile(); if (sharedFile.TryGetProfile("basic_profile", out basicProfile) && AWSCredentialsFactory.TryGetAWSCredentials(basicProfile, sharedFile, out awsCredentials)) { using (var client = new AmazonS3Client(awsCredentials, basicProfile.Region)) { var response = client.ListBuckets(); } }

デフォルトのプロファイルを使用し、AWS SDK for .NET によってデフォルトの認証情報を自動的に使用し、クライアントオブジェクトを作成するには、次のコードを使用します。

using (var client = new AmazonS3Client(RegionEndpoint.US-West2)) { var response = client.ListBuckets(); }

認証情報とプロファイルの解決

AWS SDK for .NET では、次の順序で認証情報が検索され、現在のアプリケーションで使用可能な最初のセットが使用されます。

  1. クライアント設定、または AWS サービスクライアントに明示的に設定される内容。

  2. 使用可能な場合に、AWSAccessKey および AWSSecretKey AppConfig の値から作成される BasicAWSCredentials

  3. AWSConfigs.AWSProfileName の値で指定された名前を持つ認証情報プロファイル (明示的に設定、または AppConfig で設定)。

  4. default 認証情報プロファイル。

  5. すべて空でない場合に、AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY、および AWS_SESSION_TOKEN 環境変数から作成される SessionAWSCredentials

  6. 両方とも空でない場合に、AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEY 環境変数から作成される BasicAWSCredentials

  7. Amazon EC2 Container Service (Amazon ECS) タスクの IAM ロール

  8. EC2 インスタンスメタデータ。

SDK Store のプロファイルは、特定ホストの特定ユーザーに固有です。これらは他のホストや他のユーザーにコピーすることはできません。そのため、開発用マシンの SDK Store にあるプロファイルは、他のホストや他の開発者のマシンで再利用することはできません。アプリケーションを Amazon EC2 インスタンスで実行している場合は、「AWS SDK for .NET による EC2 インスタンスでの IAM ロールの使用」での説明に従って IAM ロールを使用します。それ以外の場合は、ウェブアプリケーションがサーバー上でアクセス可能な認証情報ファイルに認証情報を保存します。

プロファイルの解決

2 つの異なる認証情報ファイルタイプがあるため、それを使用するように AWS SDK for .NET および AWS Tools for Windows PowerShell を設定する方法を理解することが重要です。AWSConfigs.AWSProfilesLocation (明示的に設定または AppConfig で設定) は、AWS SDK for .NET が認証情報プロファイルを見つける方法を制御します。-ProfileLocation コマンドラインの引数は、AWS Tools for Windows PowerShell がプロファイルを見つける方法を制御します。両方のケースでの設定の効果を次に示します。

プロファイルの場所の値 プロファイルの解決動作

null (未設定) または空

最初に、.NET 認証情報ファイル内で指定された名前のプロファイルを検索します。プロファイルが見つからない場合は、%HOME%\.aws\credentials を検索します。プロファイルが見つからない場合は、%HOME%\.aws\config を検索します。

共有認証情報ファイル形式のファイルへのパス

指定されたファイルのみを対象に、指定された名前のプロファイルを検索します。

プロファイルの指定

プロファイルは、AWS SDK for .NET アプリケーションで認証情報を使用するための推奨の方法です。プロファイルの保存場所を指定する必要はありません。名前でプロファイルを参照するだけです。AWS SDK for .NET では、前のセクションで説明したように、該当する認証情報が取得されます。

プロファイルを指定するための推奨の方法は、アプリケーションの App.config ファイルまたは Web.config ファイルの appSettings セクションで AWSProfileName の値を定義することです。関連する認証情報は、構築プロセス中にアプリケーションに組み込まれます。

次の例では、development という名前のプロファイルを指定します。

<configuration> <appSettings> <add key="AWSProfileName" value="development"/> </appSettings> </configuration>

この例では、SDK Store にプロファイルが存在している、またはデフォルトの場所に認証情報が存在すると仮定します。

プロファイルが別の場所の認証情報ファイルに保存されている場合は、<appSettings> 要素で AWSProfilesLocation 属性値を追加してその場所を指定します。次の例では、認証情報ファイルとして C:\aws_service_credentials\credentials を指定しています。

<configuration> <appSettings> <add key="AWSProfileName" value="development"/> <add key="AWSProfilesLocation" value="C:\aws_service_credentials\credentials"/> </appSettings> </configuration>

プロファイルを指定するための廃止された代替方法を次に示しています。これは、すべての方法を説明するために示していますが、推奨されません。

<configuration> <configSections> <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/> </configSections> <aws profileName="development" profilesLocation="C:\aws_service_credentials\credentials"/> </configuration> <configuration> <configSections> <section name="aws" type="Amazon.AWSSection,AWSSDK.Core"/> </configSections> <aws profileName="development" profilesLocation="C:\aws_service_credentials\credentials"/> </configuration>

フェデレーションユーザーアカウントの認証情報の使用

AWS SDK for .NET (AWSSDK.Core バージョン 3.1.6.0 以降) を使用するアプリケーションでは、Active Directory フェデレーションサービス (AD FS) を通じてフェデレーティッドユーザーアカウントを使用し、Security Assertion Markup Language (SAML) を使用することによって AWS ウェブサービスにアクセスできます。

フェデレーティッドアクセスサポートでは、ユーザーは Active Directory を使用して認証できます。一時的な認証情報は、自動的にユーザーに許可されます。これらの一時的な認証情報は 1 時間有効であり、アプリケーションで AWS ウェブサービスを呼び出す際に使用されます。一時的な認証情報の管理は SDK によって処理します。ドメイン結合されたユーザーアカウントでは、アプリケーションが呼び出しを行ったときに資格情報の有効期限が切れている場合に、そのユーザーは自動的に再認証され、新しい認証情報が付与されます (ドメイン結合されていないアカウントでは、ユーザーは再認証の前に認証情報の入力を求められます)。

このサポートを .NET アプリケーションで使用するには、まず PowerShell コマンドレットを使用してロールプロファイルをセットアップする必要があります。方法については、AWS Tools for Windows PowerShell のドキュメントを参照してください。

ロールプロファイルをセットアップした後に、他の認証情報のプロファイルと同様に、AWSProfileName キーを持つアプリケーションの App.config/Web.config ファイルでそのプロファイルを参照します。

実行時にロードされる SDK Security Token Service アセンブリ (AWSSDK.SecurityToken.dll) は、AWS 認証情報を取得するための SAML サポートを提供します。このアセンブリが実行時にアプリケーションで使用できることを確認してください。

ロールまたは一時認証情報の指定

Amazon EC2 インスタンスで実行されるアプリケーションの場合、認証情報を管理する最も安全な方法は、「AWS SDK for .NET による EC2 インスタンスでの IAM ロールの使用」での説明に従って、IAM ロールを使用することです。

組織外部のユーザーに対してソフトウェア実行可能ファイルが利用可能になるアプリケーションシナリオでは、一時的なセキュリティ認証情報を使用するようにソフトウェアを設計することをお勧めします。これらの認証情報は、AWS リソースへの制限されたアクセスの提供に加えて、指定された期間後に失効するという利点があります。一時的なセキュリティ認証情報の使用方法の詳細については、以下を参照してください。

2 番目の記事のタイトルはモバイルアプリケーションに関するものですが、記事には、組織外でデプロイされる AWS アプリケーションにとって有用な情報が含まれています。

プロキシ認証情報の使用

ソフトウェアがプロキシを介して AWS と通信する場合、サービスの AmazonS3Config クラスで ProxyCredentials プロパティを使用して、プロキシの認証情報を指定できます。たとえば、Amazon S3 の場合は次のようなコードを使用できます。ここで、{my-username} と {my-password} は、NetworkCredential オブジェクトで指定されているプロキシのユーザー名とパスワードです。

AmazonS3Config config = new AmazonS3Config(); config.ProxyCredentials = new NetworkCredential("my-username", "my-password");

SDK の前のバージョンでは ProxyUsername および ProxyPassword が使用されていましたが、これらのプロパティは廃止されました。