Secrets Manager を使用して機密データを保護する
Amazon ECS を使用すると、AWS Secrets Manager シークレットに機密データを保存してコンテナの定義でそれを参照することによって、コンテナに機密データを挿入できます。Secrets Manager シークレットに保存された機密データは、環境変数として、またはログ設定の一部としてコンテナに公開できます。
シークレットを環境変数として挿入する場合、シークレットの内容全体、シークレット内の特定の JSON キー、挿入するシークレットの特定のバージョンを指定できます。これは、コンテナに公開される機密データの制御に役立ちます。シークレットのバージョニングの詳細については、AWS Secrets Managerユーザーガイドの「AWS Secrets Manager の主な用語と概念」を参照してください。
Secrets Manager を使用した機密データの指定に関する考慮事項
Secrets Manager を使用してコンテナのために機密データを指定する場合は、以下の点を考慮してください。
-
AWS Fargate 上の Amazon ECS タスクでは、以下の点を考慮してください。
-
シークレットの内容全体を環境変数として挿入したり、ログ設定にシークレットを挿入したりするには、プラットフォームバージョン
1.3.0
以降を使用する必要があります。詳細については、「AWS Fargate プラットフォームのバージョン」を参照してください。 -
特定の JSON キーまたはシークレットのバージョンを環境変数またはログ設定に挿入するには、プラットフォームバージョン
1.4.0
以降 (Linux) または1.0.0
(Windows) を使用する必要があります。詳細については、AWS Fargate プラットフォームのバージョン を参照してください。
-
-
EC2 上の Amazon ECS タスクでは、以下の点を考慮してください。
-
シークレットの特定の JSON キーやバージョンを使用してシークレットを挿入するには、コンテナインスタンスにバージョン
1.37.0
以降のコンテナエージェントが必要です。ただし、最新のコンテナエージェントのバージョンを使用することをお勧めします。エージェントのバージョンの確認方法と最新バージョンへの更新方法については、「Amazon ECS コンテナエージェントをアップデートする」を参照してください。シークレットの内容全体を環境変数として挿入したり、ログ設定にシークレットを挿入したりするには、コンテナインスタンスにバージョン
1.22.0
以降のコンテナエージェントが必要です。
-
-
CreateSecret API の
SecretString
パラメータで作成されたシークレットであるテキストデータを格納するシークレット のみがサポートされます。CreateSecret API の SecretBinary パラメータで作成されたシークレットである、バイナリデータを格納するシークレットはサポートされていません。 -
Secrets Manager シークレットを参照するタスク定義を使用してコンテナの機密データを取得する場合で、インターフェイス VPC エンドポイントを使用している場合には、Secrets Manager 用としてインターフェイス VPC エンドポイントを作成する必要があります 。詳細については、AWS Secrets Manager ユーザーガイドの「VPC エンドポイント で Secrets Manager を作成する」を参照してください。
-
重要なデータは、コンテナが最初に開始されたときにコンテナに挿入されます。このシークレットを後で更新またはローテーションすると、コンテナには更新された値が自動的に送信されなくなります。この場合は、新しいタスクを起動する必要があります。または、タスクがサービスの一部である場合は、サービスを更新し、[Force new deployment] (新しいデプロイの強制) オプションを使用して、新しいタスクの起動をサービスに強制できます。
-
タスクで使用する VPC で DNS 解像度が有効になっている必要があります。
-
awslogs
ログドライバーを使用するように設定された Windows タスクの場合は、コンテナインスタンスでECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE
環境変数も設定する必要があります。これは、次の構文をによりユーザーデータで設定できます。<powershell> [Environment]::SetEnvironmentVariable("ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE", $TRUE, "Machine") Initialize-ECSAgent -Cluster <cluster name> -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]' </powershell>
Amazon ECS シークレットで必須の IAM アクセス許可
この機能を使用するには、Amazon ECS タスク実行ロールを持っていて、タスク定義でそのロールを参照する必要があります。これにより、コンテナエージェントは必要な Secrets Manager リソースをプルすることを許可されます。詳細については、「Amazon ECS タスク実行IAM ロール」を参照してください。
作成した Secrets Manager シークレットへのアクセスを許可するには、以下のアクセス許可をインラインポリシーとしてタスクの実行ロールに手動で追加します。詳細については、「IAM ポリシーの追加と削除」を参照してください。
-
secretsmanager:GetSecretValue
– Secrets Manager シークレットを参照する場合に必須です。 -
kms:Decrypt
– シークレットでカスタムの KMS キーを使用し、デフォルトのキーを使用しない場合にのみ必須です。このカスタムキーの ARN が、リソースとして追加されている必要があります。
次の例のインラインポリシーでは必須の アクセス許可を追加しています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "kms:Decrypt" ], "Resource": [ "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:<secret_name>", "arn:aws:kms:<region>:<aws_account_id>:key/<key_id>" ] } ] }
アプリケーションに Secrets Manager シークレットをプログラムで取得させる
タスク定義で Secrets Manager シークレットを参照する
コンテナの定義内では、以下を指定できます。
-
コンテナに設定する環境変数の名前が含まれている
secrets
オブジェクト -
Secrets Manager シークレットの Amazon リソースネーム (ARN)。
-
コンテナに渡す機密データが含まれている追加のパラメータ
次の例は、Secrets Manager シークレットに指定する必要がある完全な構文を示しています。
arn:aws:secretsmanager:
region
:aws_account_id
:secret:secret-name
:json-key
:version-stage
:version-id
次のセクションでは、追加のパラメータについて説明します。これらのパラメータはオプションですが、これらを使用しないでデフォルト値を使用する場合は、パラメータにコロン :
を含める必要があります。以下の例でより詳細なコンテキストを示します。
json-key
-
キーと値のペアのキーの名前を指定します。値は設定する環境変数の値です。JSON 形式の値のみがサポートされます。JSON キーを指定しないと、シークレットの内容全体が使用されます。
version-stage
-
使用するシークレットのバージョンのステージングラベルを指定します。バージョンのステージングラベルを指定した場合、バージョン ID は指定できません。バージョンのステージを指定しないと、デフォルトの動作として、
AWSCURRENT
ステージングラベルのシークレットが取得されます。ステージングラベルは、シークレットが更新またはローテーションされた際に、シークレットのさまざまなバージョンを追跡するために使用します。シークレットの各バージョンには、1 つ以上のステージングラベルと 1 つの ID があります。詳細については、AWS Secrets Managerユーザーガイドの「AWS Secrets Managerの主な用語と概念」を参照してください。
version-id
-
使用するシークレットのバージョンの固有 ID を指定します。バージョン ID を指定した場合、バージョンのステージングラベルは指定できません。バージョン ID を指定しないと、デフォルトの動作として、
AWSCURRENT
ステージングラベルのシークレットが取得されます。バージョン ID は、シークレットが更新またはローテーションされた際に、シークレットのさまざまなバージョンを追跡するために使用します。シークレットの各バージョンには ID があります。詳細については、AWS Secrets Managerユーザーガイドの「AWS Secrets Managerの主な用語と概念」を参照してください。
Secrets Manager シークレットを作成し、それを環境変数としてコンテナに取り込むための詳細なチュートリアルについては、「チュートリアル: Secrets Manager のシークレットを使用して機密データを指定する」を参照してください。
コンテナの定義の例
以下の例では、コンテナの定義で Secrets Manager シークレットを参照する方法を示します。
例 シークレット全体を参照する
次のタスク定義のスニペットで、Secrets Manager シークレットのテキスト全体を参照する際の形式を示しています。
{ "containerDefinitions": [{ "secrets": [{ "name": "
environment_variable_name
", "valueFrom": "arn:aws:secretsmanager:region
:aws_account_id
:secret:secret_name-AbCdEf
" }] }] }
例 シークレット内の特定のキーを参照する
次に示すのは、シークレットの内容と、それに関連付けられているバージョンのステージングラベルおよびバージョン ID を表示する、get-secret-value コマンドの出力例です。
{ "ARN": "arn:aws:secretsmanager:region
:aws_account_id
:secret:appauthexample-AbCdEf
", "Name": "appauthexample
", "VersionId": "871d9eca-18aa-46a9-8785-981ddEXAMPLE
", "SecretString": "{\"username1
\":\"password1
\",\"username2
\":\"password2
\",\"username3
\":\"password3
\"}", "VersionStages": [ "AWSCURRENT
" ], "CreatedDate": 1581968848.921 }
前のコンテナの定義の出力で特定のキーを参照するには、ARN の最後にキー名を指定します。
{ "containerDefinitions": [{ "secrets": [{ "name": "
environment_variable_name
", "valueFrom": "arn:aws:secretsmanager:region
:aws_account_id
:secret:appauthexample-AbCdEf
:username1
::" }] }] }
例 特定のシークレットバージョンを参照する
次に示すのは、シークレットの暗号化されていない内容と、シークレットのすべてのバージョンのメタデータを表示する describe-secret コマンドの出力例です。
{ "ARN": "arn:aws:secretsmanager:region
:aws_account_id
:secret:appauthexample-AbCdEf
", "Name": "appauthexample
", "Description": "Example of a secret containing application authorization data.", "RotationEnabled": false, "LastChangedDate": 1581968848.926, "LastAccessedDate": 1581897600.0, "Tags": [], "VersionIdsToStages": { "871d9eca-18aa-46a9-8785-981ddEXAMPLE
": [ "AWSCURRENT
" ], "9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE
": [ "AWSPREVIOUS
" ] } }
前のコンテナの定義の出力で特定のバージョンのステージングラベルを参照するには、ARN の最後にキー名を指定します。
{ "containerDefinitions": [{ "secrets": [{ "name": "
environment_variable_name
", "valueFrom": "arn:aws:secretsmanager:region
:aws_account_id
:secret:appauthexample-AbCdEf
::AWSPREVIOUS
:" }] }] }
前のコンテナの定義の出力で特定のバージョン ID を参照するには、ARN の最後にキー名を指定します。
{ "containerDefinitions": [{ "secrets": [{ "name": "
environment_variable_name
", "valueFrom": "arn:aws:secretsmanager:region
:aws_account_id
:secret:appauthexample-AbCdEf
:::9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE
" }] }] }
例 シークレットの特定のキーおよびバージョンのステージングラベルを参照する
シークレット内の特定のキーと特定のバージョンのステージングラベルの両方を参照する方法は次のとおりです。
{ "containerDefinitions": [{ "secrets": [{ "name": "
environment_variable_name
", "valueFrom": "arn:aws:secretsmanager:region
:aws_account_id
:secret:appauthexample-AbCdEf
:username1
:AWSPREVIOUS
:" }] }] }
特定のキーとバージョン ID を指定するには、次の構文を使用します。
{ "containerDefinitions": [{ "secrets": [{ "name": "
environment_variable_name
", "valueFrom": "arn:aws:secretsmanager:region
:aws_account_id
:secret:appauthexample-AbCdEf
:username1
::9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE
" }] }] }
ログ設定への機密データの挿入
コンテナの定義内で logConfiguration
を指定する際には、コンテナに設定するログドライバーオプションの名前と、コンテナに渡す機密データが含まれている Secrets Manager シークレットの完全な Amazon リソースネーム (ARN) を使用して secretOptions
を指定できます。
以下のタスク定義のスニペットに、Secrets Manager シークレットを参照する際の形式を示します。
{ "containerDefinitions": [{ "logConfiguration": [{ "logDriver": "
splunk
", "options": { "splunk-url": "https://cloud.splunk.com:8080
" }, "secretOptions": [{ "name": "splunk-token
", "valueFrom": "arn:aws:secretsmanager:region
:aws_account_id
:secret:secret_name-AbCdEf
" }] }] }] }
AWS Secrets Manager シークレットの作成
Secrets Manager コンソールを使用して、機密データ用のシークレットを作成できます。詳細については、AWS Secrets Manager ユーザーガイドの 「ベーシックシークレットの作成 を参照してください。
基本的なシークレットを作成するには
機密データのシークレットを作成するには、Secrets Manager を使用します。
-
https://console.aws.amazon.com/secretsmanager/
から Secrets Manager コンソール を開きます。 -
[Store a new secret] (新しいシークレットの保存) を選択します。
-
[Select secret type] (シークレットタイプの選択) で、[Other type of secrets] (他の種類のシークレット) を選択します。
-
カスタムシークレットの詳細を [Key] (キー) と [Value] (値) のペアの形式で指定します。たとえば、
UserName
のキーを指定し、その値として適切なユーザー名を指定できます。Password
の名前とパスワードのテキストを値として持つ 2 番目のキーを追加します。データベース名、サーバーアドレス、TCP ポートなどのエントリを追加することもできます。必要な情報を格納するのに必要な数だけペアを追加できます。または、[Plaintext] (プレーンテキスト) タブを選択して、任意の方法でシークレット値を入力することもできます。
-
シークレットの保護されたテキストを暗号化するために使用する AWS KMS 暗号化キーを選択します。選択しない場合、Secrets Manager は、アカウントのデフォルトキーが存在するかどうかを調べ、存在する場合はそれを使用します。デフォルトのキーが存在しない場合は、Secrets Manager が自動的に作成します。また、[Add new key(新しいキーの追加)] を選択して、このシークレット専用のカスタム KMS キーを作成します。独自の KMS キーを作成するには、アカウントに KMS キーを作成するアクセス権限が必要です。
-
[Next] を選択します。
-
[Secret name] (シークレット名) に、オプションのパスと名前 (例:
production/MyAwesomeAppSecret
またはdevelopment/TestSecret
) を入力し、[Next] (次) を選択します。オプションで説明を追加することもできます。後でこのシークレットを思い出すのに役立ちます。シークレット名に使用できるのは、ASCII 文字、数字、または以下の記号のみです:
/_+=.@-
。 -
(オプション) この時点で、シークレットのローテーションを設定することができます。この手順では、[Disable automatic rotation] (自動ローテーションを無効化) は無効のままにし、[次] を選択します。
新規または既存のシークレットでローテーションを設定する方法については、「AWS Secrets Manager シークレットの更新」を参照してください。
-
設定を確認した上で、[Store secret] (シークレットの保存) を選択し、入力した全内容を Secrets Manager の新しいシークレットとして保存します。
機密データを参照するクラシックコンソールでのタスク定義の作成
Amazon ECS コンソールを使用して、Secrets Manager シークレットを参照するタスク定義を作成します。
シークレットを指定するタスク定義を作成するには
Amazon ECS コンソール (https://console.aws.amazon.com/ecs/
) を開きます。 -
ナビゲーションペインで [Task Definitions (タスク定義)]、[Create new Task Definition (新しいタスク定義の作成)] の順に選択します。
-
[Select launch type compatibility] (起動タイプの互換性の選択) ページで、タスクの起動タイプを選択してから [Next step] (次のステップ) を選択します。
注記 このステップは、Amazon ECS での AWS Fargate の使用がサポートされているリージョンにのみ適用します。詳細については、「AWS Fargate での Amazon ECS」を参照してください。
-
[Task Definition Name (タスク定義名)] に、タスク定義の名前を入力します。最大 255 文字の英字 (大文字と小文字)、数字、ハイフン、アンダースコアを使用できます。
-
[Task execution role] (タスク実行ロール) で、既存のタスク実行ロールを選択するか、@Create new role] (新しいロールの作成) を選択して作成します。このロールを使用して、タスクのプライベートイメージをプルする Amazon ECS を認証することができます。詳細については、「プライベートレジストリの認証で必須の IAM アクセス許可」を参照してください。
重要 [Task execution role] (実行ロール) フィールドが表示されない場合は、[Configure via JSON] (JSON による設定) を選択し、
executionRoleArn
フィールドを手動で追加して、タスク実行ロールを指定します。次のコードは構文を示しています。"executionRoleArn": "arn:aws:iam::
aws_account_id
:role/ecsTaskExecutionRole" -
タスク定義で作成するコンテナごとに、以下のステップを実行します。
-
[Container Definitions] (コンテナの定義) で [Add container] (コンテナの追加) を選択します。
-
[Container name] (コンテナ名) に、コンテナの名前を入力します。最大 255 文字の英字 (大文字と小文字)、数字、ハイフン、アンダースコアを使用できます。
-
[Image (イメージ)] に、イメージ名、またはプライベートイメージのパスを入力します。最大 255 文字の英字 (大文字と小文字)、数字、ハイフン、アンダースコアを使用できます。
-
[Advanced container configuration (詳細コンテナ設定)] を展開します。
-
環境変数として挿入する機密データの場合は、[Environment] (環境) の [Environment variables] (環境変数) で、以下のフィールドに入力します。
-
[Key] (キー) に、コンテナ内で設定する環境変数の名前を入力します。これは、コンテナの定義の
secrets
セクションのname
フィールドに相当します。 -
[Value] (値) で、ValueFrom を選択します。[Add value (値の追加)] に、環境変数としてコンテナに渡すデータが含まれている Secrets Manager シークレットの ARN を入力します。
-
-
コンテナのログ設定で参照される機密データの場合は、[Storage and Logging] (ストレージとログ記録) の [Log configuration] (ログ設定) で、以下のフィールドに入力します。
-
Auto-configure CloudWatch Logs(CloudWatch Logsの自動設定) オプションをオフにします。
-
[Log options] (ログオプション) の [Key] (キー) に、設定するログ設定オプションの名前を入力します。
-
[Value] (値) で、ValueFrom を選択します。[Add value (値の追加)] に、ログオプションとしてログ設定に渡すデータが含まれている Secrets Manager シークレットの ARN 全体を入力します。
-
-
コンテナの定義で使用するために、残りの必須のフィールドとオプションのフィールドに入力します。その他のコンテナの定義パラメータは、[Advanced container configuration] (詳細コンテナ設定) メニューより設定できます。詳細については、「タスク定義パラメータ」を参照してください。
-
[Add] (追加) を選択します。
-
-
コンテナが追加されたら、[作成] を選択します。