【问题标题】:How to normalize a private key stored on AWS secrets manager如何规范存储在 AWS Secrets Manager 上的私钥
【发布时间】:2020-02-14 14:06:16
【问题描述】:

编辑:截至 2020 年 2 月,AWS 似乎已修复此错误。不再需要 BASE64 和其他方式。


我将我的秘密存储为字符串,但当然,当 aws 存储秘密时,它会删除空格和换行符。最重要的是,它将值包装在 json 中。

当我运行 aws secretsmanager get-secret-value --secret-id my-private-key > private.pem 时,它会返回类似的内容。

{
    "Name": "ai-data-devops-ansible-deploy-key",
    "VersionId": "fedafe24-d3eb-4964-9a8f-7f4ecb375a35",
    "SecretString": "-----BEGIN RSA PRIVATE KEY-----\nasdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=\n-----END RSA PRIVATE KEY-----\n",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1568147513.11,
    "ARN": "arn:aws:secretsmanager:us-east-1:13726472r4:secret:my-private-key-XQuwafs"
}

所以我需要:

  • Strip 从 json 中获取值
  • 重新格式化字符串,使其更像
-----BEGIN RSA PRIVATE KEY-----
asdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=
-----END RSA PRIVATE KEY-----

【问题讨论】:

  • 我想知道 AWS Systems Manager Parameter Store 是否更适合这种类型的“秘密”?
  • @JohnRotenstein 为什么 AWS System Manager Parameter Store 更适合这个秘密? AWS Secrets Manager 似乎适合此私钥
  • @Josh 好吧,由于您在使用 Secrets Manager 时遇到了困难,我认为 Parameter Store 可能会更好地对待您。
  • 我正在尝试:将秘密管理器存储为纯文本,并直接检索字符串而不将它们作为 jason 加载,它适用于我。
  • @EmmaYang。我刚刚重试,它使用了 tghe base64。 AWS 已经修复了很多错误。

标签: amazon-web-services aws-cli aws-secrets-manager


【解决方案1】:

另一种选择是对 PEM 进行 base64 编码以进行存储:

对密钥进行编码:

$ cat private_key 
-----BEGIN RSA PRIVATE KEY-----
asdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=
-----END RSA PRIVATE KEY-----
$ base64 private_key > encoded_private_key

$ cat encoded_private_key
LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQphc2RrbW5hc2Vma2xqenNka2ZmanNsZGtnZmpsemttc2RmbGtOT1RBUkVBTEtFWWFzZGRram5zZmRsenhkZnZsa21kZ2dvPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=

取回钥匙:

$ base64 -D encoded_private_key
-----BEGIN RSA PRIVATE KEY-----
asdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=
-----END RSA PRIVATE KEY-----

编辑: 假设秘密是 base64 编码的,这将起作用:

编码和推送:

aws secretsmanager create-secret --name my-private-key --secret-string `base64 private.pem`

提取和解码:

aws secretsmanager get-secret-value --secret-id my-private-key --query 'SecretString' --output text |base64 -D > private.pem

即使您不想对它进行 base64 编码,也可以使用 --query --output 文本来简化解析。

【讨论】:

  • 这是否消除了必须从 json 中获取值的问题,我可以看到这将消除 sed 修复的格式问题?
  • 您可以告诉 aws cli 使用 jsonpath 表达式为您处理。完整的命令是 $ aws secretsmanager get-secret-value --secret-id (secret id) --query 'SecretString' --output text |base64 -D
  • 顺便说一下,推送秘密的命令是:aws secretsmanager create-secret --name my-private-key --secret-string `base64 private.pem`
  • 在我的电脑(Ubuntu 18.04)上,我不得不将上述命令更改为:aws secretsmanager create-secret --name my-private-key --secret-string "$(base64 private.pem)"aws secretsmanager get-secret-value --secret-id my-private-key --query 'SecretString' --output text | base64 -d > private.pem
  • 我认为 aws cli 有 --file:// 和 --fileb:// 参数来添加(二进制)文件的内容
【解决方案2】:

您需要通过几个步骤来管道 (|) 输出

  1. 要仅从 json 中返回键的值,请使用 jq ".SecretString"
  2. 要格式化公钥,请使用cut -b 2- |tr -d '"' |sed -En "s/\\\n/\n/pg"

这将返回你想要的。

另请注意,您需要将 private.pem 设为只读。 (chmod 400 private.pem)

总而言之,完整的命令如下所示:

aws secretsmanager get-secret-value --secret-id my-private-key | jq ".SecretString" |cut -b 2- |tr -d '"' |sed -En "s/\\\n/\n/pg" > private.pem

【讨论】:

  • 你能用你用来把秘密放在secretsmanager中的cli调用更新问题吗?
  • 我想我在创建控制台时使用了控制台,抱歉
  • 哦,不用担心。我认为您的完整命令没有 jq 部分。但是,如果用户不必一开始就重新格式化所有内容,那就太好了:)
【解决方案3】:

我想出了一个解决方案,它利用在秘密管理器中存储秘密作为纯文本。

  1. 将机密以纯文本形式存储在机密管理器中。他们控制台将有 JSON 括号,但我删除了这些。
  2. 使用 cli 以纯文本形式获取秘密输出。现在文本中的 \n 和 \s 将被转换为它们应该是的换行符和空格

    aws secretsmanager get-secret-value --secret-id privatekey --query 
    'SecretString' --output text > private.pem
    

pem 文件现在将被正确格式化

    -----BEGIN RSA PRIVATE KEY-----
    MIIG3DCCBM
    -----END RSA PRIVATE KEY-----

【讨论】:

    【解决方案4】:

    最近面临类似的“问题”。

    简要说明

    • 我们生成了通常的public | private {file-name}.pem 键,格式为:
    ---BEGIN RSA ... KEY---
    ...
    ---END RSA ... KEY---
    
    • 我们存储了那些public | private {file-name}.pem 在 AWS SSM(参数存储)服务中使用 SecureString 值类型的键。
    • 之后我们不得不使用 boto3 获取这些密钥。

    分辨率

    --> 这段代码会返回给你base64 ENcoded representation of your key

    from boto3 import client
     
    parameter_name = '/ssm/parameter/name/to/fetch'
    key = client('ssm').get_parameter(Name=parameter_name).get('Parameter', {}).get('Value', '')
    

    --> 这段代码会返回给你base64 DEcoded representation of your key

    from boto3 import client
     
    parameter_name = '/ssm/parameter/name/to/fetch'
    key = client('ssm').get_parameter(Name=parameter_name, WithDecryption=True).get('Parameter', {}).get('Value', '')
    

    所以,请确保在client('ssm').get_parameter() 中使用附加参数作为WithDecryption=True,这将自动解决字符串的解码问题。

    参考:

    https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ssm.html#SSM.Client.get_parameter

    【讨论】:

      猜你喜欢
      • 2020-08-14
      • 2020-11-23
      • 2020-09-29
      • 2019-02-15
      • 1970-01-01
      • 2020-08-11
      • 2021-03-10
      • 2020-07-23
      • 2020-01-09
      相关资源
      最近更新 更多