AWS Key Management Service
開発者ガイド

AWS Systems Manager Parameter Store で AWS KMS を使用する方法

AWS Systems Manager Parameter Store を使用すると、プレーンテキストのパラメータ名と暗号化されたパラメータ値を持つ secure string パラメータを作成できます。Parameter Store は AWS KMS を使用して、secure string パラメータのパラメータ値を暗号化および復号します。

Parameter Store を使用すると、値を持つパラメータとしてデータを作成、保存、管理することができます。Parameter Store にパラメータを作成し、それを設計したポリシーとアクセス許可の対象となる複数のアプリケーションやサービスで使用することができます。パラメータの値を変更する必要がある場合は、エラーが発生しやすい変更を多数のソースで管理するのではなく、1 つのインスタンスを変更します。Parameter Store はパラメータ名の階層構造をサポートしているため、特定の用途に応じてパラメータを選別できます。

secure string パラメータを作成して、機密データを管理することができます。Parameter Store は、AWS KMS カスタマーマスターキー (CMK) を使用して、secure string パラメータを作成または変更する際にそのパラメータ値を暗号化します。また、アクセス時に CMK を使用してパラメータ値を復号化します。Parameter Store がアカウント用に作成する AWS 管理の CMK を使用するか、独自のカスタマー管理 CMK を指定することができます。

Parameter Store は、標準アドバンストの 2 つの階層の secure string パラメータをサポートしています。標準パラメータは、4096 バイトを上限とし、ユーザーが指定した CMK を使って直接暗号化および復号化されます。アドバンストの secure string パラメータを暗号化および復号化するには、Parameter Store は AWS 暗号化 SDK を使用したエンベロープ暗号化を行います。標準の secure string パラメータをアドバンストパラメータに変換することはできますが、アドバンストパラメータを標準パラメータに変換することはできません。標準とアドバンストの secure string パラメータの違いの詳細については、AWS Systems Manager ユーザーガイド の「Systems Manager アドバンストパラメータについて」 を参照してください 。

標準 Secure String パラメータの保護

Parameter Store は暗号化オペレーションを実行しません。代わりに、AWS KMS を使用して、secure string パラメータ値を暗号化および復号します。標準の secure string パラメータ値を作成または変更すると、Parameter Store は AWS KMSEncrypt API オペレーションを呼び出します。このオペレーションでは、CMK を使用してデータキーを生成する代わりに、AWS KMS CMK を直接使用してパラメータ値を暗号化します。

Parameter Store がパラメータ値を暗号化するために使用する CMK を選択できます。CMK を指定しない場合、Parameter Store は Systems Manager がアカウントに自動的に作成する AWS 管理の CMK を使用します。この CMK には aws/ssm エイリアスがあります。

アカウントのデフォルトの aws/ssm CMK を表示するには、AWS KMS API で DescribeKey オペレーションを使用します。次の例では、aws/ssm エイリアス名を持つ AWS Command Line Interface (AWS CLI) の describe-key コマンドを使用します。

aws kms describe-key --key-id alias/aws/ssm

標準の secure string パラメータを作成するには、Systems Manager API で PutParameter オペレーションを使用します。Tier パラメータを省略するか、デフォルトの値である Standard を指定します。値が SecureStringType パラメータを含めます。AWS KMS CMK を指定するには、KeyId パラメータを使用します。デフォルトは、アカウントの AWS 管理 CMK である aws/ssm です。

Parameter Store は CMK とプレーンテキストパラメータ値を使用して AWS KMS Encrypt API を呼び出します。AWS KMS は暗号化したパラメータ値を返します。この値を Parameter Store はパラメータ名とともに保存します。

次の例では、AWS CLI で Systems Manager put-parameter コマンドとその --type パラメータを使用して、secure string パラメータを作成します。このコマンドはオプションの --tier および --key-id パラメータを省略するため、Parameter Store は標準の secure string パラメータを作成し、それを AWS 管理 CMK を使って暗号化します。

aws ssm put-parameter --name MyParameter --value "secret_value" --type SecureString

次の例では、--key-id パラメータを使用して類似したカスタマー管理の CMK を指定します。この例では、CMK ID を使用して CMK を識別していますが、任意の有効な CMK ID を使用することもできます。このコマンドは Tier パラメータ (--tier) を省略するため、Parameter Store は、アドバンストではなく標準の secure string パラメータを作成します。

aws ssm put-parameter --name param1 --value "secret" --type SecureString --key-id 1234abcd-12ab-34cd-56ef-1234567890ab

Parameter Store から secure string パラメータを取得すると、その値が暗号化されます。パラメータを取得するには、Systems Manager API で GetParameter オペレーションを使用します。

次の例では、AWS CLI で Systems Manager get-parameter コマンドを使用して、値を復号することなく Parameter Store から MyParameter パラメータを取得します。

$ aws ssm get-parameter --name MyParameter { "Parameter": { "Type": "SecureString", "Name": "MyParameter", "Value": "AQECAHgnOkMROh5LaLXkA4j0+vYi6tmM17Lg/9E464VRo68cvwAAAG8wbQYJKoZIhvcNAQcGoGAwXgIBADBZBgkqhkiG9w0BBwEwHgYJYZZIAWUDBAEuMBEEDImYOw44gna0Jm00hAIBEIAsjgr7mum1EnnXzE3xM8bGle0oKYcfVCHtBkfjIeZGTgL6Hg0fSDnpMHdcSXY=" } }

返す前にパラメータ値を復号するには、GetParameterWithDecryption パラメータを true に設定します。WithDecryption を使用すると、Parameter Store はユーザーに代わって AWS KMS Decrypt API オペレーションを呼び出して、パラメータ値を復号します。その結果、GetParameter リクエストは、次の例に示すように、プレーンテキストパラメータ値を持つパラメータを返します。

$ aws ssm get-parameter --name MyParameter --with-decryption { "Parameter": { "Type": "SecureString", "Name": "MyParameter", "Value": "secret_value" } }

次のワークフローでは、Parameter Store が AWS KMS CMK を使って標準の secure string パラメータを暗号化および復号します。

標準パラメータの暗号化

  1. PutParameter を使って secure string パラメータを作成する場合、Parameter Store は、AWS KMS に Encrypt リクエストを送信します。このリクエストには、プレーンテキストのパラメータ値、ユーザーが選択した CMK、Parameter Store 暗号化コンテキストが含まれます。AWS KMS への送信時に、secure string パラメータのプレーンテキスト値は、Transport Layer Security (TLS) によって保護されます。

  2. AWS KMS は、指定の CMK と暗号化コンテキストを使ってパラメータ値を暗号化します。暗号化テキストを Parameter Store に返し、そこでパラメータ名と暗号化された値が保存されます。

    
              標準 secure string パラメータ値の暗号化

標準パラメータの復号化

  1. GetParameter リクエストに WithDecryption パラメータを含めると、Parameter Store は、暗号化された secure string パラメータ値と Parameter Store 暗号化コンテキストを含む Decrypt リクエストを AWS KMS に送信します。

  2. AWS KMS は、同じ CMK と指定の暗号化コンテキストを使って、暗号化された値を復号化します。これは、プレーンテキストの (復号化された) パラメータ値を Parameter Store に返します。送信中、プレーンテキストのデータは TLS によって保護されます。

  3. Parameter Store は、プレーンテキストパラメータ値を GetParameter レスポンスで返します。

アドバンストの Secure String パラメータを保護する

PutParameter を使用してアドバンストの secure string パラメータを作成する場合、Parameter Store は、AWS 暗号化 SDK と AWS KMS カスタマーマスターキー (CMK) を使ったエンベロープ暗号化を行ってパラメータ値を保護します。アドバンストパラメータ値は、それぞれ一意のデータキーで暗号化され、そのデータキーは AWS KMS CMK で暗号化されます。アカウント用の AWS 管理 CMK (aws/ssm) か、任意のカスタマー管理 CMK を使用できます。

AWS 暗号化 SDK は、オープンソースのクライアント側ライブラリで、業界標準とベストプラクティスに沿ったデータの暗号化および復号化に役立ちます。これは、複数のプラットフォームと、コマンドラインインターフェイスを含む複数のプログラミング言語でサポートされています。ソースコードを表示し、GitHub での開発に貢献することができます。

各 secure string パラメータ値に対して、Parameter Store は AWS 暗号化 SDK を呼び出し、AWS KMS が生成する一意のデータキー (GenerateDataKey) を使ってパラメータ値を暗号化します。AWS 暗号化 SDK は、暗号化されたメッセージを Parameter Store に返します。このメッセージには、暗号化されたパラメータ値と、一意のデータキーの暗号化されたコピーが含まれます。Parameter Store は、暗号化されたメッセージ全体を secure string パラメータ値に保存します。その後、アドバンスト secure string パラメータ値を取得すると、Parameter Store は AWS 暗号化 SDK を使ってパラメータ値を復号化します。これには、AWS KMS を呼び出して、暗号化されたデータを復号化する必要があります。

アドバンスト secure string パラメータを作成するには、Systems Manager API で PutParameter オペレーションを使用します。Tier パラメータの値を Advanced に設定します。値が SecureStringType パラメータを含めます。AWS KMS CMK を指定するには、KeyId パラメータを使用します。デフォルトは、アカウントの AWS 管理 CMK である aws/ssm です。

aws ssm put-parameter --name MyParameter --value "secret_value" --type SecureString --tier Advanced

次の例では、--key-id パラメータを使用して類似したカスタマー管理の CMK を指定します。この例では、CMK の Amazon リソースネーム (ARN) を使用していますが、有効な CMK ID を使用することもできます。

aws ssm put-parameter --name MyParameter --value "secret_value" --type SecureString --tier Advanced --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

Parameter Store から secure string パラメータを取得すると、その値は、AWS 暗号化 SDK が返した暗号化されたメッセージとなります。パラメータを取得するには、Systems Manager API で GetParameter オペレーションを使用します。

次の例では、Systems Manager GetParameter オペレーションを使用して Parameter Store から値を復号化せずに MyParameter パラメータを取得します。

$ aws ssm get-parameter --name MyParameter { "Parameter": { "Type": "SecureString", "Name": "MyParameter", "Value": "AQECAHgnOkMROh5LaLXkA4j0+vYi6tmM17Lg/9E464VRo68cvwAAAG8wbQYJKoZIhvcNAQcGoGAwXgIBADBZBgkqhkiG9w0BBwEwHgYJYZZIAWUDBAEuMBEEDImYOw44gna0Jm00hAIBEIAsjgr7mum1EnnXzE3xM8bGle0oKYcfVCHtBkfjIeZGTgL6Hg0fSDnpMHdcSXY=" } }

返す前にパラメータ値を復号化するには、GetParameterWithDecryption パラメータを true に設定します。WithDecryption を使用すると、Parameter Store はユーザーに代わって AWS KMS Decrypt API オペレーションを呼び出して、パラメータ値を復号します。その結果、GetParameter リクエストは、次の例に示すように、プレーンテキストパラメータ値を持つパラメータを返します。

$ aws ssm get-parameter --name MyParameter --with-decryption { "Parameter": { "Type": "SecureString", "Name": "MyParameter", "Value": "secret_value" } }

アドバンスト secure string パラメータを標準パラメータに変換することはできますが、標準 secure string をアドバンストに変換することはできません。標準 secure string パラメータをアドバンスト secure string に変換するには、Overwrite パラメータを使った PutParameter オペレーションを実行します。TypeSecureStringTier 値は Advanced である必要があります。カスタマー管理 CMK を特定する KeyId パラメータの使用は任意です。このパラメータを省略すると、Parameter Store は、アカウント用の AWS 管理 CMK を使用します。標準パラメータの暗号化に使用した CMK とは異なる場合でも、プリンシパルが使用を許可されている任意の CMK を指定することができます。

Overwrite パラメータを使用すると、Parameter Store は AWS 暗号化 SDK を使用してパラメータ値を暗号化します。続いて、新たに暗号化されたメッセージを Parameter Store に保存します。

$ aws ssm put-parameter --name myStdParameter --value "secret_value" --type SecureString --tier Advanced --key-id 1234abcd-12ab-34cd-56ef-1234567890ab --overwrite

次のワークフローでは、Parameter Store が AWS KMS CMK を使ってアドバンストの secure string パラメータを暗号化および復号化します。

アドバンストパラメータの暗号化

  1. PutParameter を使用してアドバンスト secure string パラメータを作成すると、Parameter Store は AWS 暗号化 SDK と AWS KMS を使用してパラメータ値を暗号化します。Parameter Store はパラメータ値、ユーザーが指定した AWS KMS CMK、および Parameter Store 暗号化コンテキストを使用して AWS 暗号化 SDK を呼び出します。

  2. AWS 暗号化 SDK は、ユーザーが指定した CMK の識別子と Parameter Store 暗号化コンテキストを含む GenerateDataKey リクエストを AWS KMS に送信します。AWS KMS は、一意のデータキーのコピーを 2 つ (プレーンテキスト形式と CMK で暗号化したもの) 返します。(暗号化コンテキストは、データキーを暗号化するときに使用します)。

  3. AWS 暗号化 SDK はプレーンテキストのデータキーを使ってパラメータ値を暗号化し、暗号化されたメッセージを戻します。このメッセージは、暗号化されたパラメータ値、暗号化されたデータキー、そして Parameter Store 暗号化コンテキストなどのその他のデータを含みます。

  4. Parameter Store は、暗号化されたメッセージをパラメータ値として保存します。

    
              アドバンスト secure string パラメータ値の暗号化

アドバンストパラメータの復号化

  1. アドバンスト secure string パラメータを取得するための GetParameter リクエストに、WithDecryption パラメータを含めることができます。これを行うと、Parameter Store は暗号化されたメッセージをパラメータ値から AWS 暗号化 SDK の復号化メソッドに渡します。

  2. AWS 暗号化 SDK は KMS Decrypt オペレーションを呼び出します。これは、暗号化されたメッセージから暗号化されたデータキーと Parameter Store 暗号化コンテキストを渡します。

  3. AWS KMS は、CMK と Parameter Store 暗号化コンテキストを使って、暗号化されたデータキーを復号化します。続いて、プレーンテキストの (復号化された) データキーを AWS 暗号化 SDK に返します。

  4. AWS 暗号化 SDK は、プレーンテキストのデータキーを使ってパラメータ値を復号化し、プレーンテキストのパラメータ値を Parameter Store に返します。

  5. Parameter Store は暗号化コンテキストを検証し、プレーンテキストパラメータ値を GetParameter レスポンスで返します。

パラメータ値の暗号化および復号化のアクセス許可を設定する

ユーザーが標準 secure string パラメータの値を暗号化するには、kms:Encrypt アクセス許可が必要です。ユーザーがアドバンスト secure string パラメーターの値を暗号化するには、kms:GenerateDataKey アクセス許可が必要です。ユーザーがいずれかのタイプの secure string パラメーターの値を復号化するには、kms:Decrypt アクセス許可が必要です。

IAM ポリシーを使用し、ユーザーに対して Systems Manager PutParameter および GetParameter オペレーションを呼び出すためのアクセス許可を許可または拒否できます。

カスタマー管理の CMK を使用して secure string パラメータ値を暗号化している場合は、IAM ポリシーとキーポリシーを使用して暗号化および復号化のアクセス許可を管理できます。ただし、デフォルトの aws/ssm CMK に対してアクセス許可ポリシーを確立することはできません。カスタマー管理の CMK へのアクセスを制御する方法の詳細については、「AWS KMS に対する認証とアクセスコントロール」を参照してください。

次の例は、標準 secure string パラメータ用に設計された IAM ポリシーです。このポリシーによって、ユーザーは、FinancialParameters パスのすべてのパラメータに対して Systems Manager PutParameter オペレーションの呼び出しを許可されます。また、ユーザーは、例にあるカスタマー管理 CMK で AWS KMS Encrypt オペレーションを呼び出すこともできます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:PutParameter" ], "Resource": "arn:aws:ssm:us-west-2:111122223333:parameter/FinancialParameters/*" }, { "Effect": "Allow", "Action": [ "kms:Encrypt" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }

次の例は、アドバンスト secure string パラメータ用に設計された IAM ポリシーです。このポリシーによって、ユーザーは、ReservedParameters パスのすべてのパラメータに対して Systems Manager PutParameter オペレーションの呼び出しを許可されます。また、ユーザーは、例にあるカスタマー管理 CMK で AWS KMS GenerateDataKey オペレーションを呼び出すこともできます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:PutParameter" ], "Resource": "arn:aws:ssm:us-west-2:111122223333:parameter/ReservedParameters/*" }, { "Effect": "Allow", "Action": [ "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }

最後の例も、標準またはアドバンスト secure string パラメータに使用できる IAM ポリシーを示します。このポリシーによって、ユーザーは、ITParameters パスのすべてのパラメーターに対して Systems Manager GetParameter オペレーション (および関連するオペレーション) の呼び出しを許可されます。また、ユーザーは、例にあるカスタマー管理 CMK で AWS KMS Decrypt オペレーションを呼び出すこともできます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameter*" ], "Resource": "arn:aws:ssm:us-west-2:111122223333:parameter/ITParameters/*" }, { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }

Parameter Store 暗号化コンテキスト

暗号化コンテキスト は、一連のキーと値のペアを含む任意非シークレットデータです。データを暗号化するリクエストに暗号化コンテキストを組み込むと、AWS KMS は暗号化コンテキストを暗号化されたデータに暗号化してバインドします。データを復号化するには、同じ暗号化コンテキストに渡す必要があります。

また、暗号化コンテキストを使用して、監査レコードおよびログ内の暗号化オペレーションを識別することもできます。暗号化コンテキストは、AWS CloudTrail ログのようなログにプレーンテキストで表示されます。

AWS 暗号化 SDK も暗号化コンテキストを取りますが、その処理方法は異なります。Parameter Store が暗号化メソッドの暗号化コンテキストを指定します。AWS 暗号化 SDK は、暗号的に暗号化コンテキストを暗号化されたデータにバインドします。また、暗号化されたメッセージを返す際、ヘッダーに暗号化コンテキストをプレーンテキストとして含めます。ただし、AWS KMS とは異なり、AWS 暗号化 SDK の復号化メソッドは、入力として暗号化コンテキストを取りません。その代わり、AWS 暗号化 SDK は、データを復号化する際に暗号化されたメッセージから暗号化コンテキストを取得します。Parameter Store は、暗号化コンテキストに指定の値が含まれていることを検証してから、プレーンテキストパラメータ値を返します。

Parameter Store は、暗号化オペレーションで次の暗号化コンテキストを使用します。

  • キー: PARAMETER_ARN

  • 値: 暗号化されるパラメータの Amazon リソースネーム (ARN)。

暗号化コンテキストの形式は以下のとおりです。

"PARAMETER_ARN":"arn:aws:ssm:<REGION_NAME>:<ACCOUNT_ID>:parameter/<parameter-name>"

たとえば Parameter Store は、サンプルの AWS アカウントとリージョンで、MyParameter パラメータを暗号化および復号する呼び出しにこの暗号化コンテキストを含めます。

"PARAMETER_ARN":"arn:aws:ssm:us-west-2:111122223333:parameter/MyParameter"

パラメータが Parameter Store 階層パスにある場合、パスと名前は暗号化コンテキストに組み込まれます。たとえば、サンプルの AWS アカウントとリージョンのパス /ReadableParametersMyParameter パラメータを暗号化および復号化するときに、この暗号化コンテキストが使用されます。

"PARAMETER_ARN":"arn:aws:ssm:us-west-2:111122223333:parameter/ReadableParameters/MyParameter"

正しい暗号化コンテキストと、Systems Manager GetParameter オペレーションが返す暗号化されたパラメータ値を使用して AWS KMS Decrypt オペレーションを呼び出し、暗号化された secure string パラメータ値を復号化することができます。ただし、Parameter Store パラメータ値の復号化には、GetParameter オペレーションと WithDecryption パラメータを使用することをお勧めします。

暗号化コンテキストを IAM ポリシーに含めることもできます。たとえば、ユーザーが特定の 1 つのパラメータ値またはパラメータ値のセットのみを復号化できるようにすることができます。

次の例の IAM ポリシーステートメントでは、ユーザーは MyParameter パラメータの値を取得し、指定された CMK を使用してその値を復号できます。ただし、アクセス許可は、暗号化コンテキストが指定された文字列と一致する場合にのみ適用されます。これらのアクセス許可は他のパラメータや CMK には適用されず、暗号化コンテキストが文字列と一致しない場合、GetParameter の呼び出しは失敗します。

このようなポリシーステートメントを使用するときは、事前にサンプルの ARN を有効な値で置き換えてください。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameter*" ], "Resource": "arn:aws:ssm:us-west-2:111122223333:parameter/MyParameter", }, { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition": { "StringEquals": { "kms:EncryptionContext:PARAMETER_ARN":"arn:aws:ssm:us-west-2:111122223333:parameter/MyParameter" } } } ] }

Parameter Store での CMK の問題のトラブルシューティング

secure string パラメータに対してオペレーションを実行するには、Parameter Store は、指定したオペレーションに指定した AWS KMS CMK を使用できる必要があります。CMK に関する Parameter Store の失敗の大部分は、次の問題によって引き起こされます。

  • アプリケーションが使用している認証情報には、CMK で指定されたアクションを実行するアクセス許可がありません。

    このエラーを解決するには、異なる認証情報を使用してアプリケーションを実行するか、オペレーションを妨げている IAM またはキーポリシーを修正します。AWS KMS IAM とキーポリシーのヘルプについては、「AWS KMS に対する認証とアクセスコントロール」を参照してください。

  • CMK が見つかりません。

    これは、通常 CMK に誤った識別子を使用した場合に発生します。CMK の正しい識別子を見つけて、再度コマンドを実行してください。

  • CMK が有効になっていません。これが発生すると、Parameter Store は AWS KMS からの詳細なエラーメッセージとともに InvalidKeyId 例外を返します。CMK のステータスが Disabled の場合、有効にしますPending Import の場合は、インポート手順を完了してください。キーステータスが Pending Deletion の場合は、キーの削除をキャンセルするか、別の CMK を使用します。

    AWS KMS コンソールの CMK のキーステータスを確認するには、[カスタマー管理型のキー] または [AWS 管理型のキー] ページで、ステータス列をクリックします。AWS KMS APIを使用して CMK のステータスを確認するには、DescribeKey オペレーションを使用します。