Разбор секретов от менеджера секретов AWS с помощью AWS cli

Я получаю секреты, которые храню в диспетчере секретов AWS с помощью 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.

Спасибо

13 ответов

Решение

Использовать --query вариант CLI, чтобы извлечь только секрет.

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

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

используя JQ вы можете распечатать.

Небольшое дополнение к привет-ответу. Вы можете добавить выходной параметр text удалить цитаты.

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

Если ваш секрет будет иметь только одно значение ключа / пары, и вы хотите, чтобы это значение было распечатано, и вы не хотите полагаться на то, что ваша система предварительно установила jq, вы можете сделать:

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

Когда у вас есть несколько секретов и вы получаете возврат json, вы можете получить точное значение пароля, используя

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

Поэтому я столкнулся с небольшими трудностями при извлечении того, что мне было нужно, значения двух моих переменных, которые я сохранил в 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

Все ответы работают, но требуют сторонней интеграции (в основномjq). следующая команда bash получает соответствующее значение без какого-либо другого стороннего решения -

      SECRET_ARN=arn:aws:secretsmanager:eu-west-1:123456:secret:/test
SECRET_KEY=DB_PASSWORD
aws secretsmanager get-secret-value \ 
  --secret-id $SECRET_ARN \ 
  --query SecretString \
  --output text | grep -o '"$SECRET_KEY":"[^"]*' |  grep -o '[^"]*$'

Многие ответы здесь зависят от jq. Если вы не хотите устанавливать какие-либо другие зависимости, вы можете использовать python один лайнер:

      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 .

Решение PowerShell без Jq

      $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

В духе "... без jq"ответы, вот один для nodeпользователей. (требует современных bash и nodejs, может быть легко переписан, чтобы просто использовать sh, используя echo | вместо уборщика <<<)

      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")

Я вижу много примеров JQ, но у Powershell довольно крутая интеграция с AWS. Вот как я это делаю в Powershell:

Ваше значение JSON

{"API_KEY":"ABCDEFGHI"}

      $aws_secret = Get-SECSecretValue -SecretId my_secrets
$mysecret = $aws_secret.SecretString | ConvertFrom-Json
$myapikey = $mysecret.API_KEY
$newsecret = ConvertTo-SecureString -String $myapikey -AsPlainText -Force

Значение из диспетчера секретов — это JSON, который Powershell может преобразовать в тип массива, на который вы можете ссылаться. Я конвертирую его обратно в безопасную строку, предполагая, что это секрет, и вы хотите передать его. Приведенный выше код должен работать для вас. Дайте мне знать, если у вас возникнут проблемы с кодом, который я предоставил.

Скрипт для вывода списка всех доступных секретов AWS в /tmp/name.text и нахождения в нем определенных секретных значений

Обратите внимание, что для успешного запуска этого скрипта требуется настройка интерфейса командной строки AWS.

      #!/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

Используйте это, чтобы получить только значение секретного ключа. Обязательно укажите свой secert ID и ключ секрета:

aws secretsmanager get-secret-value --secret-id <yourSecretID> | jq '.SecretString' | tail -c +2 | head -c -2 | tr -d '\' | jq .<YourSecretKey>
Другие вопросы по тегам