AWS KMS で EC2 Systems Managerパラメータストアを暗号化
こんにちは、菊池です。
EC2 Systems Managerの機能の1つであるパラメータストアを利用することで、外部で管理する環境設定をEC2から利用することが可能です。パラメータストアを使った環境設定の管理については以下の記事にて詳細に紹介されています。
このパラメータストアに保存する変数を、AWS Key Management Service (KMS) と連携して暗号化し、セキュアに利用する方法を紹介します。
パラメータの暗号化
パラメータストアでは、SecureStringタイプで値を格納することで、KMSを利用したパラメータの暗号化が可能です。パラメータ取得時には、暗号化されたパラメータをKMSのデータキーで復号化することが必要になりす。
暗号化して保存することで、KMSのキーを利用可能なIAMユーザ/IAMロールでのみパラメータを利用することが可能になります。
KMSとの連携手順
実施手順です。
- カスタマーマスターキー(CMK)の作成
- アクセス権の設定
- パラメータの保存
- パラメータの利用
1. カスタマーマスターキー(CMK)の作成
まずはKMSを利用するためのCMKを作成します。マネジメントコンソールからの場合、KMSはIAMのメニュー内にあります。画面左の[暗号化キー]を選択します。
IAMはリージョン共通のグローバルサービスですが、KMSはリージョン単位のサービスです。そのため、作成したリージョンでのみ利用可能です。リージョン選択が通常と異なる場所(上記画面の②)にありますのでご注意ください。
2. アクセス権の設定
キーを作成したら、キーへのアクセス権を設定します。パラメータストアを利用したいIAMユーザ/IAMロールに対して、以下の2つの権限を設定します。
- Systems Managerの参照権限
- CMKの利用権限
このうち、CMKの利用権限は、以下のいずれかの方法で権限を設定可能です。
- CMKのキーユーザーに追加
- IAMポリシーで権限を付与
キーユーザーに追加する場合、対象のCMKを選択し、IAMユーザ/IAMロールを追加します。
IAMポリシーで許可する場合には、対象のIAMユーザ/IAMロールに以下のようなポリシーを付与します。
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "kms:Decrypt" ], "Resource":[ "arn:aws:kms:ap-northeast-1:xxxxxxxxxxxx:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ] } ] }
キーユーザーまたはIAMポリシーのいづれかの許可があれば、KMSでの復号化が可能になります。
3. パラメータの保存
Systems Managerのパラメータストアに環境設定を保存します。
マネジメントコンソールから暗号化したパラメータを作成する場合、[安全な文字列](SecureString)が選択可能ですが、その場合にはデフォルトのKMSキーしか選択できないようです。
CMKを使った暗号化を行うため、AWS CLIでパラメータを保存します。--key-id
には1.で作成したキーのIDを指定します。
$ aws ssm put-parameter \ --region ap-northeast-1 \ --name prd-db-pass \ --value PASSWORD \ --type SecureString \ --key-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
4. パラメータの利用
格納したパラメータを取得してみます。AWS CLIで暗号化されたパラメータを復号して取得するには、ssm get-parameters
で--with-decryption
オプションをつけて実行します。
$ aws ssm get-parameters --region ap-northeast-1 \ --name prd-db-pass \ --with-decryption { "InvalidParameters": [], "Parameters": [ { "Type": "SecureString", "Name": "prd-db-pass", "Value": "PASSWORD" } ] }
CMKの利用権限があれば、このように復号して取得が可能です。
CMKの利用権限がない状態で実行すると、
$ aws ssm get-parameters --region ap-northeast-1 \ --name prd-db-pass \ --with-decryption An error occurred (AccessDeniedException) when calling the GetParameters operation: The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access. (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
となってキーのアクセス権がないためエラーとなります。
--no-with-decryption
オプションで復号化せずに取得すると、
$ aws ssm get-parameters --region ap-northeast-1 \ --name prd-db-pass \ --no-with-decryption { "InvalidParameters": [], "Parameters": [ { "Type": "SecureString", "Name": "prd-db-pass", "Value": "AQICAHjvwQB7AiQjJReCOMEmXnIqPCq0k+6gC1CXAzLrpuyQfAGmH7/g1T0l1n+W68lh6teqAAAAbTBrBgkqhkiG9w0BBwagXjBcAgEAMFcGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM9NRXrAU1dZONUeiXAgEQgCq7AGn3r3QXnLLUHu5xQ5PPIdh8Yj4XObEc0Lecs7ZqpeuSV/4MX5vcr2E=" } ] }
このように暗号化された状態のパラメータが取得されます。また、暗号化した状態であればキーの利用権限がなくても取得が可能です。
最後に
KMSとパラメータストアの連携について紹介しました。地味なサービスかもしれませんが、省力化・高セキュア化のためにうまく活用していきたいですね
参考リンク