AWS Systems Manager Parameter Store が AWS KMS を使用する方法 - 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 は、パラメータ名の階層構造をサポートしているため、特定の用途に合わせてパラメータを修飾できます。

機密データを管理するために、セキュアな文字列パラメータを作成できます。Parameter Store は、AWS KMS keys を使用して、ユーザーが作成または変更した際に、Secure String パラメータのパラメーター値を暗号化します。また、アクセス時に KMS キーを使用してパラメータ値を復号します。Parameter Store がアカウント用に作成する AWS マネージドキー を使用するか、独自のカスタマーマネージドキーを指定できます。

重要

Parameter Store は、対称 KMS キーのみをサポートします。非対称 KMS キーを使用してパラメータを暗号化することはできません。KMS キーが対称か非対称かを判断する方法については、対称および非対称 KMS キーを識別する を参照してください。

Parameter Store は、 標準高度の 2 つのセキュリティで保護された文字列パラメータをサポートします。スタンダードパラメータは 4,096 バイトを上限とし、ユーザーが指定した KMS キーで直接、暗号化および復号されます。アドバンスト Secure String パラメータを暗号化および復号するために、Parameter Store は AWS Encryption SDK でエンベロープ暗号化を使用します。標準のセキュア文字列パラメーターを高度なパラメーターに変換できますが、高度なパラメーターを標準パラメーターに変換することはできません。スタンダードとアドバンスト Secure String パラメータの違いの詳細については、AWS Systems Manager ユーザーガイドの Systems Manager のアドバンストパラメータについてを参照してください。

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

パラメータストアは、暗号化操作を実行しません。代わりに、AWS KMS に依存して、Secure String パラメータ値を暗号化および復号します。スタンダード Secure String パラメータ値を作成または変更すると、Parameter Store は AWS KMS Encrypt オペレーションを呼び出します。このオペレーションでは、KMS キーを使用してデータキーを生成するのではなく、対称 KMS キーを直接、使用してパラメータ値を暗号化します。

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

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

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

標準のセキュリティで Secure String パラメータを作成するには、Systems Manager API で PutParameter 操作を使用します。Tier パラメータを省略するか、デフォルトの値である Standard を指定します。値が TypeSecureString パラメータを含めます。KMS キーを指定するには、KeyId パラメータを使用します。デフォルトは、アカウントの AWS マネージドキー である aws/ssm です。

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

次の例では、AWS CLI で Systems Manager put-parameter コマンドとその --type パラメータを使用して、Secure String パラメータを作成します。コマンドではオプションの --tier パラメータと --key-id パラメータが省略されるため、Parameter Store はスタンダード Secure String パラメータを作成し、 AWS マネージドキー で暗号化します。

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

次の類似した例では、--key-id パラメータを使用してカスタマーマネージドキーを指定します。この例では、KMS キー ID を使用して KMS キーを識別しますが、任意の有効な KMS キー識別子を使用することができます。コマンドでは Tier パラメータ (--tier) を省略するため、Parameter Store では、高度なパラメータではなく、標準のセキュア文字列パラメータが作成されます。

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

Parameter Store からセキュア文字列パラメータを取得すると、その値は暗号化されます。パラメータを取得するには、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=" } }

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

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

次のワークフローは、Parameter Store が KMS キーを使用してスタンダード Secure String パラメータを暗号化および復号する方法を示しています。

標準パラメータの暗号化

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

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

    
              標準のセキュア文字列パラメータ値の暗号化

標準パラメータの復号

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

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

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

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

PutParameter を使用してアドバンスト Secure String パラメータを作成する際、Parameter Store は AWS Encryption SDK および対称 AWS KMS key によるエンベロープ暗号化を使用してパラメータ値を保護します。アドバンストパラメータ値は、それぞれ一意のデータキーで暗号化され、そのデータキーは KMS キーで暗号化されます。アカウントの AWS マネージドキー (aws/ssm) または任意のカスタマーマネージドキーを使用できます。

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

Parameter Store は Secure String パラメータ値ごとに AWS Encryption SDK を呼び出し、AWS KMS が生成する一意のデータキー (GenerateDataKey) を使用してパラメータ値を暗号化します。AWS Encryption SDK は、暗号化されたパラメータ値と一意のデータキーの暗号化されたコピーを含む、暗号化されたメッセージを Parameter Store に返します。Parameter Store は、暗号化されたメッセージ全体をセキュア文字列パラメータ値に格納します。次に、アドバンスト Secure String パラメータ値を取得すると、Parameter Store は AWS Encryption SDK を使用してパラメータ値を復号します。これには、AWS KMS を呼び出して、暗号化されたデータを復号化する必要があります。

高度な Secure String パラメータを作成するには、Systems Manager API で PutParameter 操作を使用します。Tier パラメータの値を Advanced に設定します。値が TypeSecureString パラメータを含めます。KMS キーを指定するには、KeyId パラメータを使用します。デフォルトは、アカウントの AWS マネージドキー である aws/ssm です。

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

次の類似した例では、--key-id パラメータを使用してカスタマーマネージドキーを指定します。例では、KMS キーの Amazon リソースネーム (ARN) を使用していますが、任意の有効な KMS キー識別子を使用することもできます。

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 Encryption SDK から返される暗号化されたメッセージです。パラメータを取得するには、Systems Manager API で GetParameter 操作を使用します。

次の例では、Systems Manager GetParameter 操作を使用して、値を復号化せずにパラメータストアからパラメータを取得します。 MyParameter

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

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

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

高度なセキュア文字列パラメーターを標準パラメーターに変換することはできませんが、標準のセキュア文字列から高度なパラメーターに変換することはできます。標準のセキュア文字列パラメーターを高度なセキュア文字列に変換するには、 PutParameter パラメーターで Overwrite オペレーションを使用します。TypeSecureStringTier 値は Advanced である必要があります。カスタマーマネージドキーを識別する KeyId パラメータはオプションです。省略すると、Parameter Store はアカウントの AWS マネージドキー を使用します。スタンダードパラメータの暗号化に異なる KMS キーを使用した場合でも、プリンシパルが使用を許可されている任意の KMS キーを指定することができます。

Overwrite パラメータを使用する際、Parameter Store は AWS Encryption 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 が KMS キーを使用して、アドバンスト Secure String パラメータを暗号化および復号する方法を示しています。

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

  1. PutParameter を使用してアドバンスト Secure String パラメータを作成すると、Parameter Store は AWS Encryption SDK と AWS KMS を使用してパラメータ値を暗号化します。Parameter Store は、パラメータ値、指定した KMS キー、Parameter Store の暗号化コンテキストを使用して AWS Encryption SDK を呼び出します。

  2. AWS Encryption SDK は、指定した KMS キーの識別子と Parameter Store の暗号化コンテキストを使用して、AWS KMS に GenerateDataKey リクエストを送信します。AWS KMS は一意のデータキーの 2 つのコピーを返します。1 つはプレーンテキストで、もう 1 つは KMS キーで暗号化されています。(暗号化コンテキストは、データキーを暗号化するときに使用します)。

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

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

    
              高度なセキュリティで保護された文字列パラメータ値の暗号化

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

  1. WithDecryption リクエストに GetParameter パラメータを含めると、高度なセキュア文字列パラメータを取得できます。これを行うと、Parameter Store は暗号化されたメッセージをパラメータ値から AWS Encryption SDK の復号メソッドに渡します。

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

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

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

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

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

標準のセキュア文字列パラメータ値を暗号化するには、ユーザーに kms:Encrypt 権限が必要です。高度なセキュリティで保護された文字列パラメータ値を暗号化するには、ユーザーに kms:GenerateDataKey 権限が必要です。どちらのタイプのセキュア文字列パラメータ値を復号化するには、ユーザーに kms:Decrypt 権限が必要です。

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

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

次の例は、標準のセキュア文字列パラメータ用に設計された IAM ポリシーを示しています。これにより、ユーザーは PutParameter パス内のすべてのパラメータに対して Systems Manager FinancialParameters 操作を呼び出すことができます。このポリシーにより、ユーザーはサンプルカスタマーマネージドキーで 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" } ] }

次の例は、高度なセキュア文字列パラメータ用に設計された IAM ポリシーを示しています。これにより、ユーザーは PutParameter パス内のすべてのパラメータに対して Systems Manager ReservedParameters 操作を呼び出すことができます。このポリシーにより、ユーザーはサンプルカスタマーマネージドキーで 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" } ] }

最後の例では、標準または高度なセキュア文字列パラメータに使用できる IAM ポリシーも示しています。これにより、ユーザーは GetParameter パス内のすべてのパラメータに対して Systems Manager の ITParameters 操作 (および関連する操作) を呼び出すことができます。このポリシーにより、ユーザーはサンプルカスタマーマネージドキーで 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" } ] }

パラメータストアの暗号化コンテキスト

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

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

AWS Encryption SDK でも暗号化コンテキストを使用しますが、処理方法は異なります。Parameter Store は、暗号化メソッドに暗号化コンテキストを提供します。AWS Encryption SDK は、暗号的に暗号化コンテキストを暗号化されたデータにバインドします。また、暗号化されたメッセージを返す際、ヘッダーに暗号化コンテキストをプレーンテキストとして含めます。ただし、AWS KMS とは異なり、AWS Encryption SDK の復号化メソッドは、入力として暗号化コンテキストを取りません。代わりに、データを復号するときに、AWS Encryption SDK は暗号化されたメッセージから暗号化コンテキストを取得します。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 アカウント およびリージョンの /ReadableParameters パスで MyParameter パラメータを暗号化および復号するときに、この暗号化コンテキストが使用されます。

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

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

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

次の IAM ポリシーステートメントの例では、ユーザーが MyParameter パラメータの get 値と、指定した KMS キーを使用してその値を復号できるようにします。ただし、アクセス許可は、暗号化コンテキストが指定された文字列と一致する場合にのみ適用されます。これらのアクセス許可は他のパラメータや KMS キーには適用されません。また、暗号化コンテキストが文字列と一致しない場合、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 で KMS キーの問題をトラブルシューティングする

Secure String パラメータに対して任意のオペレーションを実行するには、Parameter Store が目的のオペレーションに対して、指定した AWS KMS KMS キーを使用できる必要があります。KMS キーに関連する Parameter Store の障害のほとんどは、次の問題に起因します。

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

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

  • KMS キーが見つからない。

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

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

    AWS KMS コンソールで KMS キーのキーステータスを確認するには、カスタマーマネージドキーまたは AWS マネージドキー ページのステータス列を参照してください。AWS KMS APIを使用して KMS キーのステータスを確認するには、DescribeKey オペレーションを使用します。