Разбор секретов от менеджера секретов 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>