使用 AWS cli 从 AWS 机密管理器解析机密

Posted

技术标签:

【中文标题】使用 AWS cli 从 AWS 机密管理器解析机密【英文标题】:Parsing secrets from AWS secrets manager using AWS cli 【发布时间】:2018-11-27 10:07:42 【问题描述】:

我正在使用 AWS cli 检索存储在 AWS 机密管理器中的机密,如下所示:

aws secretsmanager get-secret-value --secret-id secrets

返回

arn:aws:secretsmanager<ID>:secret:my_secrets <number> my_secrets "API_KEY":"ABCDEFGHI"       <UUID string>
VERSIONSTAGES   AWSCURRENT

有谁知道我是如何获得秘密的(“API_KEY”:“ABCDEFGHI”)? 我需要将这些秘密移动到我的注册任务定义环境变量中。最好的方法是将它们存储在一个文件中并在我们之后删除它或将它们存储在变量中。它在linux机器上运行。

【问题讨论】:

【参考方案1】:

使用 CLI 的 --query 选项仅提取密钥。

aws secretsmanager get-secret-value --secret-id secrets --query SecretString --output text

【讨论】:

这不再工作了吗?每个秘密对我来说都是空的 SecretString选择整个秘密字符串,它不用于匹配密钥 @caleb 只是运行命令导致该错误或 w -query 是否有效?【参考方案2】:

aws secretsmanager get-secret-value --secret-id secrets| jq --raw-output '.SecretString' | jq -r .API_KEY

使用 jq 可以打印。

【讨论】:

jq 不是标准工具 如果你的秘密有破折号,你可以使用:aws secretsmanager get-secret-value --secret-id my-secret --query SecretString --output text | jq '."my-secret"' 更正,删除引号除了使它适用于带有破折号的秘密:aws secretsmanager get-secret-value --secret-id my-secret --query SecretString --output text | jq -r '."my-secret"'【参考方案3】:

helloV 答案的小补充。您可以添加输出参数text 以删除引号。

aws secretsmanager get-secret-value \
   --secret-id secrets \
   --query SecretString \
   --output text

【讨论】:

【参考方案4】:

当你有多个秘密并且你得到json返回时,你可以使用获取密码的确切值

aws secretsmanager get-secret-value --secret-id <secret_bucket_name> | jq --raw-output '.SecretString' | jq -r .key_for_password

【讨论】:

jq 是用于 shell 命令的 json 实用程序。它有助于解析 Json 并从文件中提取属性。 这是这个答案的复制粘贴***.com/a/52921217/4212158 在我的例子中,密码有 '&' 符号并转换为 '\u0026'。有什么解决方法吗?【参考方案5】:

如果您的密钥只有一个密钥/对值,并且您只想打印出该值,并且您不想依赖系统首先安装 jq,您可以这样做:

aws secretsmanager get-secret-value --secret-id secrets --query SecretString --output text | cut -d: -f2 | tr -d \"

【讨论】:

您在最后一个 之前缺少一个 "\",例如 tr -d \"\ @GwenM 在 GNU/Bash 上不需要 啊,你可能是对的,我在 mac 上使用的是 ZSH 一个不需要jq的好答案【参考方案6】:

所以我在提取我需要的东西时遇到了一些麻烦,我存储在 SecretsManager 中的两个变量的值。所以这对我有用。

注意:这是 AWS SecretsManager 文档中的一个示例。

我跑了这个

aws secretsmanager get-secret-value --secret-id MyTestDatabaseSecret --version-stage AWSPREVIOUS

这个查询的响应是:


  "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
  "Name": "MyTestDatabaseSecret",
  "VersionId": "EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE",
  "SecretString": "\n  \"username\":\"david\",\n  \"password\":\"BnQw&XDWgaEeT9XGTT29\"\n\n",
  "VersionStages": [
    "AWSPREVIOUS"
  ],
  "CreatedDate": 1523477145.713

现在我想准确地获取用户名或密码的值

aws secretsmanager get-secret-value --secret-id MyTestDatabaseSecret --version-stage AWSPREVIOUS | jq --raw-output .SecretString | jq -r ."password"

输出

BnQw&XDWgaEeT9XGTT29

【讨论】:

我想列出所有秘密,然后获取所有值并针对它运行 grep > aws secretsmanager get-secret-value --secret-id * 对我不起作用 错误信息是什么?您对所有人都有访问权限吗?您是否在查询中传递了版本号?您可以制作一个秘密ID列表然后尝试运行一个循环,而不是使用 * 通配符。首先,尝试运行 10 个不同的秘密,然后检查以扩大规模。 github.com/ashishkarpe/scripts_aws_cli/blob/main/… 编写了对我有用的脚本,谢谢【参考方案7】:

没有 Jq 的 PowerShell 解决方案

$a = aws secretsmanager get-secret-value --region <region> --secret-id <secret-name>  | ConvertFrom-Json 

$a 将所有 json 转换为对象类型

输出

ARN           : xxxxxx
Name          : postgxxx
VersionId     : fxxxx-xx-x-xx
SecretString  : "key":"value","key2":"value"
VersionStages : xxxxx
CreatedDate   : xxxxx.xx

$b = $a.SecretString | ConvertFrom-Json

输出

key : value
key2 : value

$b.key

**Output** 
value

【讨论】:

【参考方案8】:

这里的很多答案取决于jq。如果您不想安装任何其他依赖项,可以使用python one-liner:

aws secretsmanager get-secret-value \
   --output text \
   --query SecretString \
   --secret-id my-secret-name \
| python -c 'import json, sys; print(json.load(sys.stdin)["my-secret-key"])'

基于helloV's answer。

【讨论】:

【参考方案9】:

将所有可用 AWS 机密列出到 /tmp/name.text 并从中查找特定机密值的脚本

注意需要 AWS CLI 配置才能成功运行此脚本

#!/bin/bash

aws secretsmanager list-secrets | grep  "Name" | awk 'print $2' | tr -d '"' | sed 's/,/ /g' > /tmp/name.text

for line in `cat /tmp/name.text`
do

echo $line >> /tmp/secrets-values.txt

aws secretsmanager get-secret-value --secret-id "$line" | grep "XYZ" >>  /tmp/secrets-values.txt
done

【讨论】:

成功了吗?你测试了。如果是,那就太好了。 :) 是的,我测试了它并且它有效【参考方案10】:

按照“...没有jq”的答案,这是node 用户的答案。 (需要现代 bash 和 nodejs,可以通过使用 echo | 而不是更清洁的 &lt;&lt;&lt; 轻松重写为仅使用 sh)

SECRET_ARN="..."
REGION=us-east-1

SECRET_BLOB=$(aws secretsmanager get-secret-value --region="$REGION" --output=text --query SecretString --secret-id "$SECRET_ARN")

MY_VALUE=$(node -pe 'JSON.parse(require("fs").readFileSync("/dev/stdin").toString()).myKey' <<< "$SECRET_BLOB")

MY_OTHER_VALUE=$(node -pe 'JSON.parse(require("fs").readFileSync("/dev/stdin").toString()).myOtherKey' <<< "$SECRET_BLOB")

如果您需要从密钥中提取多个值,您需要将 json blob 缓存在 env var 中。如果您只需要一个值:

MY_VALUE=$(aws secretsmanager get-secret-value --region="$REGION" --output=text --query SecretString --secret-id "$SECRET_ARN" | node -pe 'JSON.parse(require("fs").readFileSync("/dev/stdin").toString()).myKey' <<< "$SECRET_BLOB")

【讨论】:

【参考方案11】:

使用它来获取密钥的值。请务必填写您的secert ID 和secret 的密钥:

aws secretsmanager get-secret-value --secret-id <yourSecretID> | jq '.SecretString' | tail -c +2 | head -c -2 | tr -d '\' | jq .<YourSecretKey>

【讨论】:

以上是关于使用 AWS cli 从 AWS 机密管理器解析机密的主要内容,如果未能解决你的问题,请参考以下文章

外部机密无法从私有集群访问 AWS STS

如何在自定义解析器 AWS Amplify CLI 中查询 API?

Databricks的秘密[关闭]

GKE Secrets 或 Google 机密管理器

在 AWS 解析器映射模板中,是不是有任何方法可以从对象中删除字段?

从 AWS Secrets Manager 导入 Spring Boot 应用程序中的密钥