AWS SDK for .NET
開発者ガイド

AWS 認証情報の設定

このトピックでは、アプリケーションの AWS 認証情報を設定する方法について説明します。この方法では、「AWS のアカウントと認証情報を作成する」で説明しているように、AWS アカウントが作成済みであり、自分の認証情報へのアクセス権があることを前提としています。認証情報を安全に管理し、意図せずに認証情報が公開される可能性がある手法を避けることが重要です。特に、次のことに注意してください。

  • アカウントのルート認証情報を使用して AWS リソースにアクセスしないでください。これらの認証情報は無制限のアカウントアクセスを提供し、取り消すのが困難です。
  • プロジェクトの App.config または Web.config ファイルを含めて、アプリケーションにリテラルアクセスキーを配置しないでください。このようにすると、パブリックリポジトリにプロジェクトをアップロードするなど、誤って認証情報が公開されるリスクが発生します。

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

  • IAM ユーザーを作成し、アカウントのルート認証情報の代わりに IAM ユーザーの認証情報を使用して、アカウントアクセスを提供します。IAM ユーザーの認証情報は、漏洩した場合に簡単に取り消すことができます。指定したリソースとアクションのセットにユーザーを限定するポリシーを、各 IAM ユーザーに適用できます。
  • アプリケーション開発時に認証情報を管理するための推奨される手法は、IAM ユーザー認証情報のセットごとのプロファイルを SDK ストアに置くことです。プレーンテキストの認証情報ファイルを使用して、認証情報を含むプロファイルを保存することもできます。次に、プロジェクトファイルに認証情報を格納する代わりに、プログラムで、またはアプリケーションの App.config または Web.config ファイルで特定のプロファイルを参照することができます。意図せずに認証情報を公開してしまうリスクを抑えるために、SDK ストアまたは認証情報ファイルはプロジェクトファイルとは別に保存しておく必要があります。
  • Amazon EC2 インスタンスで実行中のアプリケーションに対して IAM ロールを使用します。
  • 組織外部のユーザーが利用できるアプリケーションでは、一時的な認証情報または環境変数を使用します。

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

SDK ストアの使用#

AWS SDK for .NET アプリケーションの開発中は、アプリケーションで使用する認証情報のセットごとのプロファイルを SDK ストアに追加します。これにより、アプリケーション開発中に AWS 認証情報が誤って公開されることを防ぐことができます。SDK ストアには次の利点があります。

  • SDK ストアには任意の数のアカウントから複数のプロファイルを含めることができます。
  • SDK ストアにある認証情報は暗号化されていて、SDK ストアはユーザーのホームディレクトリに置かれています。これにより、認証情報が誤って公開されるリスクが抑えられます。
  • アプリケーションでそのプロファイルを名前で参照すると、関連する認証情報が実行時に参照されます。ソースファイルには、リテラル認証情報は含まれません。
  • default という名前のプロファイルを含めると、AWS SDK for .NET ではそのプロファイルが使用されます。このプロファイルは、他のプロファイル名が指定されていない場合や、指定した名前が見つからない場合にも使用されます。
  • SDK ストアでは、AWS Tools for Windows PowerShell と AWS Toolkit for Visual Studio にも認証情報が提供されます。

注意

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

SDK ストアのプロファイルを管理する方法は複数あります。

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

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

  • よく使用される機能ではありませんが、Amazon.Util.ProfileManager クラスを使用してプログラムからプロファイルを管理できます。次の例では、RegisterProfile メソッドを使用して、新しいプロファイルを SDK ストアに追加しています。

    Amazon.Util.ProfileManager.RegisterProfile({profileName}, {accessKey}, {secretKey})
    

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

認証情報ファイルの使用#

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

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

各プロファイルの形式を次に示します。

[{profile_name}]
aws_access_key_id = {accessKey}
aws_secret_access_key = {secretKey}

プロファイルにはオプションで、セッショントークンを含めることができます。詳細については、「 AWS アクセスキーを管理するためのベストプラクティス」を参照してください。SDK ストアにあるプロファイルではセッショントークンを使用できません。SDK ストアは、「存続期間の長い」認証情報用です。

ヒント

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

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

アプリケーションでの認証情報の使用#

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

  1. ソースコードに記述されているか、アプリケーションの App.config ファイルや Web.config ファイルに保存されている、サービスクライアントのコンストラクタに渡すアクセスキーおよびシークレットキーの値。プロジェクトファイルにリテラル認証情報を格納するのではなく、プロファイルを使用することを強くお勧めします
  2. プロファイルが指定されている場合:
  1. SDK ストアの指定されたプロファイル。
  2. 認証情報ファイルの指定されたプロファイル。

プロファイルが指定されていない場合:

  1. SDK ストアの default というプロファイル。
  2. 認証情報ファイルの default というプロファイル。
  1. AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEY 環境変数に格納されている認証情報。
  2. Amazon EC2 インスタンスで実行しているアプリケーションの場合は、プロファイルに保存されている認証情報。

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

プロファイルの指定#

プロファイルは、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 ストアに存在しているか、またはデフォルトの場所に認証情報ファイルが存在することを前提としています。

プロファイルが別の場所の認証情報ファイルに保存されている場合は、<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>

Amazon.Runtime.StoredProfileAWSCredentials クラスを使用して、プログラムからプロファイルを参照することもできます。次の例では、プロファイル別の認証情報を使用する AmazonS3Client オブジェクトを作成する方法を示します。SDK では、プロファイルに含まれている認証情報が自動的にロードされます。次のようにして、App.Config で指定している「グローバル」プロファイルとは異なるクライアント別のプロファイルを使用できます。

var credentials = new StoredProfileAWSCredentials(profileName);
var s3Client = new AmazonS3Client(credentials, RegionEndpoint.USWest2);

ヒント

デフォルトのプロファイルを使用する場合は、AWSCredentials オブジェクトを省略します。そうすると、AWS SDK for .NET によってデフォルトの認証情報が自動的に使用され、クライアントオブジェクトが作成されます。

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

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 コマンドレットを使用してロールプロファイルをセットアップする必要があります。Tools for Windows PowerShell のドキュメントでの説明に従って、PowerShell コマンドレットを使用してロールプロファイルをセットアップします。

ロールプロファイルをセットアップした後に、他の認証情報のプロファイルと同様に、AWSProfileName の appsetting キーを持つアプリケーションの 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 と通信する場合、サービスの ProxyCredentialsClientConfig クラスで プロパティを使用して、プロキシの認証情報を指定できます。たとえば、Amazon S3 の場合は次のようなコードを使用できます。ここで、{my-username} と {my-password} は、NetworkCredential オブジェクトで指定されているプロキシのユーザー名とパスワードです。

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

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