AWS Secrets Manager とは - AWS Secrets Manager

AWS Secrets Manager とは

以前は、データベースから情報を取得するカスタムアプリケーションを作成したとき、通常、アプリケーション内でデータベースに直接アクセスするための認証情報 (シークレット) を埋め込んでいました。認証情報を更新するときには、単に新しい認証情報を作成する以上のことが必要でした。新しい認証情報を使用するために、アプリケーションを更新する時間を費やさなければなりませんでした。次に、更新されたアプリケーションを配布しました。認証情報を共有している複数のアプリケーションがあり、そのうちの 1 つを更新しなかった場合、アプリケーションは失敗しました。このリスクのために、多くのお客様は定期的に認証情報を更新せずに、実際のところは代わりに別のリスクを選択していました。

Secrets Manager では、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API コールに置き換えて、シークレットをプログラムで取得できます。これは、シークレットがコード内に存在しなくなったため、コードを調べる人によってシークレットが侵害されないようにするのに役立ちます。また、指定したスケジュールに従って自動的にシークレットをローテーションするように Secrets Manager を設定することもできます。これにより、長期のシークレットを短期のシークレットに置き換えることが可能となり、侵害されるリスクを大幅に減少させるのに役立ちます。

Secrets Manager を十分に活用するために理解しておく必要のある用語や概念のリストについては、AWS Secrets Manager の開始方法 を参照してください。

Secrets Manager の基本的なシナリオ

この最も基本的なシナリオを以下に図で示します。この図表は、Secrets Manager のデータベースの認証情報を保存して、これらの認証情報をアプリケーションで使用してデータベースにアクセスできることを示しています。

  1. データベース管理者は、人事データベースに認証情報のセットを作成し、MyCustomApp という名前のアプリケーションで使用します。また、管理者は、アプリケーションが従業員データベースにアクセスするために必要なアクセス許可でこれらの認証情報を設定します。

  2. データベース管理者は、これらの認証情報を MyCustomAppCreds という名前の Secrets Manager にシークレットとして保存します。次に、Secrets Manager は認証情報をシークレット内で暗号化し、保護されたシークレットテキストとして保存します。

  3. MyCustomApp がデータベースにアクセスすると、アプリケーションは Secrets Manager に対して MyCustomAppCreds という名前のシークレットについてのクエリ 実行します。

  4. Secrets Manager はシークレットを取得して、保護されたシークレットテキストを復号し、そのシークレットを保護された (TLS を使用した HTTPS) チャネルを介してクライアントアプリケーションに返します。

  5. クライアントアプリケーションは、認証情報、接続文字列、およびその他の必要な情報をレスポンスから解析し、その情報を使用してデータベースサーバーにアクセスします。

注記

Secrets Manager は、多くのタイプのシークレットをサポートしています。ただし、Secrets Manager は、追加のプログラミングを必要とせずに、サポートされている AWS データベースの認証情報をネイティブにローテーションできます。ただし、他のデータベースまたはサービスのシークレットをローテーションするには、カスタム Lambda 関数を作成して、Secrets Manager がデータベースまたはサービスとどのようにやりとりするかを定義する必要があります。その関数を作成するには、プログラミングスキルが必要です。詳細については、「AWS Secrets Manager シークレットのローテーション」を参照してください。

Secrets Manager の機能

ランタイムに暗号化されたシークレットの値をプログラムで取得する

Secrets Manager は、アプリケーションのソースコードからハードコードされた認証情報を削除して、アプリケーション内には認証情報を保存しないため、セキュリティ体制の改善に役立ちます。認証情報をアプリケーション内またはアプリケーションと共に保存すると、アプリケーションまたはそのコンポーネントを調べることができるすべてのユーザーに、その認証情報が漏洩する可能性があります。また、古い認証情報を廃止する前に、アプリケーションを更新してすべてのクライアントに変更をデプロイする必要があるため、認証情報の更新が困難になります。

Secrets Manager では、保存された認証情報を Secrets Manager ウェブサービスへのランタイム呼び出しに置き換えることができるため、必要に応じて認証情報を動的に取得できます。

ほとんどの場合、クライアントは暗号化されたシークレット値の最新バージョンにアクセスする必要があります。暗号化されたシークレット値をクエリするときは、バージョン情報をまったく指定せずにシークレット名またはその Amazon リソースネーム (ARN) だけを指定することができます。これを行うと、Secrets Manager は最新バージョンのシークレット値を自動的に返します。

ただし、他のバージョンも同時に存在する可能性があります。ほとんどのシステムは、接続の詳細、ユーザー ID、およびパスワードを含む認証情報の完全なセットなど、1 つの単純なパスワードよりも複雑なシークレットをサポートしています。Secrets Manager では、これらの認証情報の複数のセットを同時に保存することができます。Secrets Manager は、各セットを異なるバージョンのシークレットに保存します。シークレットのローテーションプロセス中、Secrets Manager はローテーションが完了するまで、古い認証情報とこれから使用を開始する新しい認証情報を追跡します。

さまざまなタイプのシークレットを保存する

Secrets Manager では、シークレットの暗号化されたシークレットデータ部分にテキストを保存できます。通常、このテキストはデータベースまたはサービスへの接続の詳細です。詳細には、サーバー名、IP アドレス、ポート番号、サービスにサインインするために使用されるユーザー名とパスワードが含まれます。シークレットについては、「最大値と最小値」を参照してください。保護されたテキストに以下の情報は含まれません。

  • シークレットの名前と説明

  • ローテーションまたは有効期限の設定

  • シークレットに関連付けられた KMS キーの ARN

  • アタッチされた AWS タグ

シークレットデータを暗号化する

Secrets Manager は、AWS Key Management Service (AWS KMS).を使用してシークレットの保護されたテキストを暗号化します。多くの AWS のサービスでは、キーの保存および暗号化に AWS KMS を使用します。AWS KMS により、シークレットは保管時に安全に暗号化されます。Secrets Manager は、すべてのシークレットを KMS キーに関連付けます。KMS キーとして、アカウント (aws/secretsmanager) のSecrets Manager の AWS マネージドキー、または AWS KMS で作成したカスタマーマネージド型キーのいずれかを使用できます。

Secrets Manager が保護されたシークレットデータの新しいバージョンを暗号化するたびに、Secrets Manager は、KMS キーから新しいデータキーを生成するように AWS KMS にリクエストします。Secrets Manager は、このデータキーをエンベロープ暗号化に使用します。Secrets Manager は、暗号化されたデータキーを、保護されたシークレットデータを使用して保存します。シークレットを復号する必要があるたびに、Secrets Manager はデータキーを復号するように AWS KMS にリクエストします。Secrets Manager はそれを保護されたシークレットデータを復号するために使用します。Secrets Manager では、データキーは暗号化されていない形式で保存されることはなく、データキーは常に使用後すぐに破棄されます。

さらに、Secrets Manager は、デフォルトでオープンスタンダードの Transport Layer Security (TLS)Perfect Forward Secrecy を使用するホストからのリクエストのみを受け入れます。Secrets Manager により、シークレットの所得に使用する AWS とコンピュータ間の転送中にシークレットが暗号化されます。

シークレットを自動的にローテーションする

ユーザーが操作しなくても、指定したスケジュールに従ってシークレットを自動的にローテーションするよう Secrets Manager を設定できます。

AWS Lambda 関数を使用して、ローテーションを定義し、実装します。この関数は、Secrets Manager が次のタスクを実行する方法を定義します。

  • これにより、シークレットの新しいバージョンが作成されます。

  • シークレットを Secrets Manager に保存します。

  • 新しいバージョンを使用するように保護されたサービスを構成します。

  • 新しいバージョンを確認します。

  • 新しいバージョンを本番準備完了としてマークします。

ステージングラベルは、シークレットの異なるバージョンを追跡するのに役立ちます。各バージョンには複数のステージングラベルをアタッチできますが、各ステージングラベルは 1 つのバージョンにのみアタッチできます。例えば、Secrets Manager によって、現在アクティブで使用中のシークレットのバージョンに AWSCURRENT というラベルが付けられます。現在のバージョンのシークレットを常にクエリするようアプリケーションを設定する必要があります。ローテーションプロセスで新しいバージョンのシークレットが作成されると、テストおよび検証が完了するまで、Secrets Manager によって、新しいバージョンに AWSPENDING というステージングラベルが自動的に付けられます。その後、Secrets Manager は AWSCURRENT というステージングラベルをこの新しいバージョンに追加します。アプリケーションは、次回の AWSCURRENT バージョンのクエリで、すぐに新しいシークレットの使用を開始します。

ローテーションが完全に設定されすぐに使用できる状態のデータベースをサポート

ローテーションを有効にすると、Secrets Manager は、AWS によって記述およびテストされた Lambda ローテーション関数テンプレートと完全に設定されたローテーションプロセスが含まれる以下の Amazon Relational Database Service (Amazon RDS) データベースをサポートします。

  • Amazon RDS 上の Amazon Aurora

  • Amazon RDS 上の MySQL

  • Amazon RDS 上の PostgreSQL

  • Amazon RDS 上の Oracle

  • Amazon RDS 上の MariaDB

  • Amazon RDS 上の Microsoft SQL Server

ローテーションが完全に設定されすぐに使用できる状態のその他のサービスをサポート

AWS によって記述およびテストされた Lambda ローテーション関数テンプレートと完全に設定されたローテーションプロセスをフルサポートする以下のサービスでも、ローテーションを有効にすることもできます。

  • Amazon DocumentDB

  • Amazon Redshift

ほとんどすべての他の種類のデータベースやサービスのシークレットを保存することもできます。ただし、自動的にシークレットをローテーションするには、カスタム Lambda ローテーション関数を作成して設定する必要があります。データベースまたはサービスのカスタム Lambda 関数の記述の詳細については、 を参照してください。

シークレットへのアクセスの制御

特定のシークレットへのアクセスを許可または拒否するユーザー、グループ、およびロールに AWS Identity and Access Management (IAM) アクセス許可ポリシーをアタッチすると、それらのシークレットの管理を制限できます。例えば、メンバーがシークレットを完全に管理および設定する能力を必要とするグループに、1 つのポリシーをアタッチすることができます。アプリケーションによって使用されるロールにアタッチされる別のポリシーは、アプリケーションが実行する必要がある 1 つのシークレットに対する読み取りアクセス権限のみを許可する場合があります。

また、リソースベースのポリシーをシークレットに直接アタッチして、シークレット、およびバージョンの読み取りや変更を許可するユーザーを指定するアクセス許可を付与することもできます。(ユーザー、グループ、またはロールに自動的に適用される) アイデンティティベースのポリシーとは異なり、シークレットに関連付けられたリソースベースのポリシーは、Principal 要素を使用して、ポリシーの適用対象を識別します。Principal 要素には、同じアカウントからのユーザーやロールを、他のアカウントからのシークレットまたはプリンシパルとして含めることができます。

Secrets Manager にアクセスする

Secrets Manager は、次の方法で利用できます。

AWS Management Console

ブラウザベースの Secrets Manager コンソールを使用してシークレットを管理し、コンソールではシークレットに関連するほぼすべてのタスクを実行できます。

現時点では、コンソールで以下のタスクを実行することはできません。

  • ストアバイナリデータをシークレットに保存します。コンソールは現在、シークレットの SecretString フィールドにのみデータを保存し、SecretBinary フィールドは使用しません。バイナリデータを保存するには、AWS CLI または AWS SDK のいずれかを現在使用する必要があります。

AWS コマンドラインツール

AWS コマンドラインツールを使用して、システムのコマンドラインでコマンドを発行することで、Secrets Manager およびその他の AWS タスクを実行できます。これは、コンソールを使用するよりも高速でより便利になります。コマンドラインツールは、AWS タスクを実行するスクリプトを構築する場合にも便利です。

AWS には AWS Command Line Interface (AWS CLI) と AWS Tools for Windows PowerShell という 2 セットのコマンドラインツールが用意されています。AWS CLI のインストールおよび使用の方法については、「AWS Command Line Interface ユーザーガイド」を参照してください。Tools for Windows PowerShell のインストールおよび使用の方法については、AWS Tools for Windows PowerShellユーザーガイドを参照してください。

AWS SDK

AWS SDK は、さまざまなプログラミング言語とプラットフォーム (JavaPythonRuby.NETiOS および Androidその他など) のライブラリとサンプルコードで構成されています。SDK には、暗号署名によるリクエスト、エラーの管理、リクエストの自動再試行などのタスクが含まれます。AWS SDK のダウンロードおよびインストール方法の詳細については、「Amazon Web Services 用ツール」を参照してください。

Secrets Manager HTTPS クエリ API

Secrets Manager の HTTPS クエリ API を使用すると、Secrets Manager および AWS にプログラムでアクセスできます。HTTPS クエリ API を使用すると、サービスに HTTPS リクエストを直接発行できます。HTTPS API を使用する場合は、認証情報を使用してリクエストにデジタル署名するコードを含める必要があります。詳細については、HTTP クエリリクエストを作成して API を呼び出すおよび AWS Secrets Manager API リファレンスを参照してください。

注記

HTTPS クエリ API を使用する代わりに、望ましいプログラミング言語に固有の SDK を使用することをお勧めします。SDK は、手動で実行する多くの便利なタスクを実行します。SDK は自動的にリクエストに署名し、該当言語で構文的に適切な構造になるようレスポンスを変換します。HTTPS Query API は、SDK が使用できない場合にのみ使用します。

Secrets Manager の料金

Secrets Manager では、使用した分のみ料金が発生し、最低料金や設定料金はありません。削除対象としてマークしたシークレットに対しては料金は発生しません。現在の価格の詳細なリストについては、「AWS Secrets Manager 料金表」を参照してください。

Secrets Manager が作成した AWS マネージドキー (aws/secretsmanager) を使用すると、無料でシークレットを暗号化できます。独自の KMS キーを作成してシークレットを暗号化すると、現在の AWS KMS レートが適用された AWS 料金が発生します。詳細については、「AWS Key Management Service 料金表」を参照してください。

アカウントで AWS CloudTrail を有効にすると、Secrets Manager が送信する API コールのログを取得できます。Secrets Manager はすべてのイベントを管理イベントとして記録します。AWS CloudTrail はすべての管理イベントの最初のコピーを無料で保存します。ただし、通知を有効にすると、Amazon S3 のログストレージと Amazon SNS の料金が発生する場合があります。また、追加の証跡を設定している場合、管理イベントの追加コピーについては、料金が発生する可能性があります。詳細については、「AWS CloudTrail 料金表」を参照してください。