AWS 利用 Parameter Store 來儲存 credentials 和 config 等機敏性參數

2017-08-01 AWS

前陣子參加 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-parameterget-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 的話就可以達到隨時更換密碼的效果(新舊並存)。

 

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱