[新機能]AWS CloudFormationでAWS Systems ManagerパラメータストアのSecureStringがサポートされました
こんにちは。サービスグループの武田です。
AWSにはAWS Systems Managerパラメータストア(以下、SSMパラメータストア)という、設定データ管理と機密管理のための安全な階層型ストレージを提供するサービスがあります。SSMパラメータストアは、パラメータ値をString/StringList(平文)またはSecureString(暗号化されたデータ)として保存できます。
これまでAWS CloudFormationでは、SSMパラメータストアのString/StringListデータは参照できましたが、SecureStringデータは参照できませんでした。今回のアップデートで、CloudFormationでSSMパラメータストアのSecureStringがサポートされたので実際に使ってみました。ちなみにこの機能はDynamic references
というらしいです。
AWS CloudFormation Supports AWS Systems Manager Secure String Parameters in CloudFormation Templates
CloudFormationでDynamic referencesの使い方
- スタックテンプレートに含められる
Dynamic references
は60個まで cn-north-1
とcn-northwest-1
リージョンは未サポート- テンプレート内の書式は
{{resolve:service-name:reference-key}}
- 現在サポートされている
service-name
はssm
とssm-secure
の2つ - SSMパラメータストアのString/StringListの参照は
{{resolve:ssm:parameter-name:version}}
- SSMパラメータストアのSecureStringの参照は
{{resolve:ssm-secure:parameter-name:version}}
parameter-name
は大文字と小文字を区別する(case-sensitive)version
は必須- 最新のバージョン を参照という指定は不可
現在ssm-secure
をサポートしているのは次のリソースのみです。
Resource | Property Type | Properties |
---|---|---|
AWS::DirectoryService::MicrosoftAD | Password | |
AWS::DirectoryService::SimpleAD | Password | |
AWS::ElastiCache::ReplicationGroup | AuthToken | |
AWS::IAM::User | LoginProfile | Password |
AWS::KinesisFirehose::DeliveryStream | RedshiftDestinationConfiguration | Password |
AWS::OpsWorks::App | AppSource | Password |
AWS::OpsWorks::Stack | CustomCookbooksSource | Password |
AWS::OpsWorks::Stack | RdsDbInstances | DbPassword |
AWS::RDS::DBCluster | MasterUserPassword | |
AWS::RDS::DBInstance | MasterUserPassword | |
AWS::Redshift::Cluster | MasterUserPassword |
やってみた
それでは実際にCloudFormationテンプレートを用意してSSMパラメータストアのデータを参照してみます。まずはSSMパラメータストアにパラメータ値をセットします。
$ aws ssm put-parameter --name plaintext-password --value jugemujugemugokounosurikire --type String $ aws ssm put-parameter --name secure-password --value 'P@ssW%rd#123' --type SecureString $ aws ssm get-parameter --name plaintext-password { "Parameter": { "Name": "plaintext-password", "Type": "String", "Value": "jugemujugemugokounosurikire", "Version": 1 } } $ aws ssm get-parameter --name secure-password { "Parameter": { "Name": "secure-password", "Type": "SecureString", "Value": "AQICAHhoU3dH8gG618tMtQTGML7F40J6GS3uxzeVcB1fm+PZ1wGXv+cRZAPFPYdWBmTiDW83AAAAajBoBgkqhkiG9w0BBwagWzBZAgEAMFQGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMK8sT/8JMqPeg6aPEAgEQgCd0cG5p0sxp7CZyUkP6vj3WXxGSFwsZ66q5mE8D//P3/30ZPAfe004=", "Version": 1 } }
次にCloudFormationテンプレートを用意します。今回はssm-pstest.template.yml
というファイル名で用意しました。
--- AWSTemplateFormatVersion: '2010-09-09' Description: SSM Parameter Store test template. Parameters: ParamPlaintextPassword: Type : AWS::SSM::Parameter::Value<String> Default: '' Resources: IAMUser: Type: AWS::IAM::User Properties: UserName: test-user LoginProfile: Password: '{{resolve:ssm-secure:secure-password:1}}' Outputs: ParamPlaintextPassword: Value: !Ref ParamPlaintextPassword DynamicRefPlaintextPassword: Value: '{{resolve:ssm:plaintext-password:1}}'
テンプレートの要点を簡単に解説します。
- 6行目
- 以前からサポートされていたSSMパラメータストアの参照形式です(String/StringListのみ)
- スタック作成時のパラメータ(引数)でキー名を指定すると、SSMパラメータストアのパラメータ値が取得できます
- 今回のアップデートには関係ありません
- 17行目
AWS::SSM::Parameter::Value
のパラメータを参照していますRef
組込み関数などで参照すると値が取得できます- 14行目
secure-password
というキー名のSecureStringを参照しています- 前述した、サポートされているリソースでのみ使用できます
- 今回のアップデートの目玉機能です
- 19行目
plaintext-password
というキー名のStringを参照しています- これによって
AWS::SSM::Parameter::Value
以外の参照方法ができるようになりました
それでは用意したテンプレートを使用してスタックを作成してみます。
$ aws cloudformation create-stack \ --stack-name ssm-pstest \ --template-body file://ssm-pstest.template.yml \ --capabilities CAPABILITY_NAMED_IAM \ --parameters \ ParameterKey=ParamPlaintextPassword,ParameterValue=plaintext-password
出力を確認してみます。従来の参照方法と、今回のDynamic references
どちらでも取得できています。
$ aws cloudformation describe-stacks | jq '.Stacks[] |select(.StackName == "ssm-pstest") | .Outputs[]' { "OutputKey": "DynamicRefPlaintextPassword", "OutputValue": "jugemujugemugokounosurikire" } { "OutputKey": "ParamPlaintextPassword", "OutputValue": "jugemujugemugokounosurikire" }
続いて、マネジメントコンソールから作成したIAMユーザーでログインしてみます。もちろんパスワードはsecure-password
でセットした値です。
無事にログインできました!
確認できたらさくっとスタックは削除しておきましょう。
パラメータ(引数)としてキー名を受け取ってみる
先ほどのテンプレートでは、パスワードのキー名をテンプレート内にハードコーディングしていました。これをスタック作成時のパラメータ(引数)で受け取って動作するか確認してみました。
--- AWSTemplateFormatVersion: '2010-09-09' Description: SSM Parameter Store test template. Parameters: PassKey: Type: AWS::SSM::Parameter::Name Resources: IAMUser: Type: AWS::IAM::User Properties: UserName: test-user LoginProfile: Password: !Sub '{{resolve:ssm-secure:${PassKey}:1}}'
ポイントは5-6行目でキー名を取得している点。そして13行目でキー名を参照してDynamic references
を構築している点です。
画面キャプチャは省きますが、次のコマンドでスタックを作成でき、マネジメントコンソールからのログインもできました。これは熱いですね!
$ aws cloudformation create-stack \ --stack-name ssm-pstest \ --template-body file://ssm-pstest.template.yml \ --capabilities CAPABILITY_NAMED_IAM \ --parameters \ ParameterKey=PassKey,ParameterValue=secure-password
もしかして従来の方法でもSecureString参照できる?
できません。 次のようなテンプレートを用意してスタック作成をしてみましたが、エラーで失敗しました。
--- AWSTemplateFormatVersion: '2010-09-09' Description: SSM Parameter Store test template. Parameters: ParamSecurePassword: Type : AWS::SSM::Parameter::Value<String> Default: '' Resources: IAMUser: Type: AWS::IAM::User Properties: UserName: test-user Outputs: ParamSecurePassword: Value: !Ref ParamSecurePassword
$ aws cloudformation create-stack \ --stack-name ssm-pstest \ --template-body file://ssm-pstest.template.yml \ --capabilities CAPABILITY_NAMED_IAM \ --parameters \ ParameterKey=ParamSecurePassword,ParameterValue=secure-password An error occurred (ValidationError) when calling the CreateStack operation: Parameters [secure-password] referenced by template have types not supported by CloudFormation.
SecureStringも出力できるんじゃない?
できません。 次のようなテンプレートを用意してスタック作成をしてみましたが、エラーで失敗しました。前述したサポートされているリソース以外ではエラーとなるようです。
--- AWSTemplateFormatVersion: '2010-09-09' Description: SSM Parameter Store test template. Resources: IAMUser: Type: AWS::IAM::User Properties: UserName: test-user Outputs: DynamicRefSecurePassword: Value: '{{resolve:ssm-secure:secure-password:1}}'
$ aws cloudformation create-stack \ --stack-name ssm-pstest \ --template-body file://ssm-pstest.template.yml \ --capabilities CAPABILITY_NAMED_IAM An error occurred (ValidationError) when calling the CreateStack operation: SSM Secure reference is not supported in: [Outputs/DynamicRefSecurePassword/Value]
まとめ
これまでCloudFormationで参照したいデータをSSMパラメータストアに保存する場合、暗号化して保存できませんでした。今回のアップデートによって、よりセキュアにデータが保存できるようになりました。地味ですがうれしいアップデートですね!