前陣子參加 AWS Summit Taipei 2017 的時候有和 AWS SA 討論在 AWS 上要怎麼管理 Credentials 的議題,然後就有從一位 AWS SA 的口中問出 Parameter Store 這個東西 …
Parameter Store 也是 AWS 建議儲存 Credentials 的解決方案,在 AWS Management Tools Blog 有提到「Use Parameter Store to Securely Access Secrets and Config Data in AWS CodeDeploy」
在官方的這篇 Blog 中是以 CodeDeploy 來做示範,由於我也有好幾個專案有 Credentials 要處理,所以就跑了一次作法發現 Parameter Store 超級簡單 …
首先 Parameter Store 是跑在 SSM (Amazon EC2 Systems Manager),Parameter Store 本身就支援 KMS 加密,跑 SecureString 就幫你用 default KMS key 來加密 (也支援你用 –key-id 指定 CMK)
要用 Parameter Store 就只需要兩個指令:put-parameter、get-parameters
先講 put-parameter,就是簡單的名稱、值、類型的宣告
$ aws ssm put-parameter --name MySecureSQLPassword --value 'P@assw0rd' --type SecureString --region ap-northeast-1
要取出值,你必須有 IAM policy:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:DescribeParameters" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ssm:GetParameters" ], "Resource": [ "arn:aws:ssm:ap-northeast-1:<account-id>:parameter/MySecureSQLPassword" ] }, { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:ap-northeast-1:<accountid>:alias/aws/ssm" } ] }
可以從 policy 看到,除了 parameters 的權限以外,還要有 kms 的 key 權限。
如果你有很多的 parameter 要存取,可以用 * 的方式在 policy 表示:
"arn:aws:ssm:us-east-1:<account-id>:parameter/MySecureSQL*",
再用 get-parameters 把它抓出來。
$ aws ssm get-parameters --names MySecureSQLPassword --with-decryption --query "Parameters[0].Value" --region ap-northeast-1
如果忘記 parameter name 就用 describe-parameters 來撈 parameter
$ aws ssm describe-parameters
parameter type,支援三種類型:
- String
- StringList
- SecureString
AWS 針對 StringList 的用法可以採用 “/Test/Service/MySecureSQLPassword” 的方式方便在 Dev/Staging/Prod 等環境中區分想要的參數。
要撈 StringList 的話會用 get-parameters-by-path 來 get 想要的值
也能用 –allowed-pattern 來限制你的 Value,例如:
–allowed-pattern “\d{1,4}”
該值限制 1 到 4 個字元,你就不能 overwrite 塞 10000 到 parameter,你會得到 error:
An error occurred (ParameterPatternMismatchException) when calling the PutParameter operation: Parameter value, cannot be validated against allowedPattern: \d{1,4}
要刪除在 parameter store 上的參數可以用 delete-parameter 來刪除。
$ aws ssm delete-parameter --name "MySecureSQLPassword"
如果藏在 CI / CD,或是動態取 parameter 的話就可以達到隨時更換密碼的效果(新舊並存)。