AWS Systems ManagerParameter Store SecureString パラメータの AWS KMS 暗号化 - AWS Systems Manager

AWS Systems ManagerParameter Store SecureString パラメータの AWS KMS 暗号化

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

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

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

重要

Parameter Store は、対称 KMS キーのみをサポートします。非対称 KMS キーを使用してパラメータを暗号化することはできません。KMS キーが対称か非対称かを判断する方法については、「AWS Key Management Service デベロッパーガイド」の「さまざまなキータイプの特定」を参照してください。

Parameter Store では、2 つの階層 (標準アドバンスト) の SecureString パラメータをサポートしています。スタンダードパラメータは 4,096 バイトを上限とし、ユーザーが指定した KMS キーで直接、暗号化および復号されます。アドバンストの SecureString パラメータを暗号化および復号化するには、Parameter Store は AWS Encryption SDK を使用したエンベロープ暗号化を行います。標準の SecureString パラメータをアドバンストパラメータに変換することはできますが、アドバンストパラメータを標準パラメータに変換することはできません。標準とアドバンストの SecureString パラメータの違いの詳細については、「パラメータ層の管理」を参照してください。

標準 SecureString パラメータの保護

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

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

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

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

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

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

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

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

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

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

Parameter Store から SecureString パラメータを取得すると、その値が暗号化されます。パラメータを取得するには、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"
    }
}

返す前にパラメータ値を復号するには、GetParameterWithDecryption パラメータを 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 キーを使用して標準 SecureString パラメータを暗号化および復号する方法を示しています。

スタンダードパラメータの暗号化

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

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

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

標準パラメータの復号

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

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

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

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

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

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

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

アドバンスト SecureString パラメータを作成するには、Systems Manager API で PutParameter オペレーションを使用します。Tier パラメータの値を Advanced に設定します。値が SecureStringType パラメータを含めます。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-east-2:987654321098:key/1234abcd-12ab-34cd-56ef-1234567890ab

Parameter Store から SecureString パラメータを取得すると、その値は、AWS Encryption 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"
    }
}

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

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

アドバンスト SecureString パラメータを標準パラメータに変換することはできますが、標準 SecureString をアドバンストに変換することはできません。標準 SecureString パラメータをアドバンスト SecureString に変換するには、Overwrite パラメータを使った PutParameter オペレーションを実行します。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 キーを使用してアドバンスト SecureString パラメータを暗号化および復号する方法を示しています。

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

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

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

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

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

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

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

  1. アドバンスト SecureString パラメータを取得するための GetParameter リクエストに、WithDecryption パラメータを含めることができます。これを行うと、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 は、プレーンテキストのデータキーを使ってパラメータ値を復号し、プレーンテキストのパラメータ値を Parameter Store に返します。

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

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

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

AWS Identity and Access Management (IAM) ポリシーを使用して、ユーザーが Systems Manager の PutParameter および GetParameter オペレーションを呼び出すアクセス許可を許可または拒否できます。

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

次の例は、標準 SecureString パラメータ用に設計された IAM ポリシーを示しています。これにより、ユーザーは FinancialParameters パス内のすべてのパラメータに対して Systems Manager PutParameter オペレーションを呼び出すことができます。このポリシーにより、ユーザーはサンプルカスタマーマネージドキーで AWS KMS Encrypt オペレーションを呼び出すこともできます。

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

次の例は、アドバンスト SecureString パラメータ用に設計された IAM ポリシーを示しています。これにより、ユーザーは ReservedParameters パス内のすべてのパラメータに対して Systems Manager PutParameter オペレーションを呼び出すことができます。このポリシーにより、ユーザーはサンプルカスタマーマネージドキーで AWS KMS GenerateDataKey オペレーションを呼び出すこともできます。

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

最後の例も、標準またはアドバンスト SecureString パラメータに使用できる IAM ポリシーを示します。これにより、ユーザーは ITParameters パス内のすべてのパラメータに対して Systems Manager の GetParameter オペレーション (および関連する操作) を呼び出すことができます。このポリシーにより、ユーザーはサンプルカスタマーマネージドキーで AWS KMS Decrypt オペレーションを呼び出すこともできます。

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

Parameter Store の暗号化コンテキスト

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

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

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

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

  • キー: PARAMETER_ARN

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

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

"PARAMETER_ARN":"arn:aws:ssm:region-id:account-id:parameter/parameter-name"

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

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

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

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

正しい暗号化コンテキストと、Systems Manager の GetParameter オペレーションによって返される暗号化されたパラメータ値を使用して AWS KMS Decrypt オペレーションを呼び出すことで、暗号化された SecureString パラメータ値を復号することができます。ただし、Parameter Store パラメータ値の復号化には、GetParameter オペレーションと 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-east-2:111122223333:parameter/MyParameter" }, { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-2:987654321098:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition": { "StringEquals": { "kms:EncryptionContext:PARAMETER_ARN":"arn:aws:ssm:us-east-2:111122223333:parameter/MyParameter" } } } ] }

Parameter Store における KMS キーの問題のトラブルシューティング

SecureString パラメータに対してオペレーションを実行するには、Parameter Store は、ユーザーが意図したオペレーションに対して指定した AWS KMS KMS キーを使用できる必要があります。KMS キーに関連する Parameter Store の失敗のほとんどは、次の問題が原因で発生します。

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

    このエラーを解決するには、異なる認証情報を使用してアプリケーションを実行するか、オペレーションを妨げている IAM またはキーポリシーを修正します。AWS KMS IAM ポリシーとキーポリシーの詳細については、「AWS Key Management Service デベロッパーガイド」の「KMS キーのアクセスとアクセス許可」を参照してください。

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

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

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

    KMS キーのキー状態を検索するには、DescribeKey オペレーションを使用します。