Как мне запросить ключ MFA для создания и использования учетных данных для доступа к AWS CLI?

У меня есть несколько сценариев Bash, которые вызывают команды AWS CLI, для которых разрешения были изменены, чтобы требовать MFA, и я хочу иметь возможность запрашивать код, сгенерированный моим устройством MFA, в этих сценариях, чтобы они могли работать с необходимой аутентификацией.

Но, похоже, нет простого встроенного способа сделать это. Единственная документация, которую я могу найти, включает сложный процесс использования aws sts get-session-token, а затем сохраняет каждое значение в конфигурации, которую затем непонятно, как использовать.

Чтобы прояснить, чего я хочу, так это того, чтобы при запуске одного из моих скриптов, который содержит команды AWS CLI, требующие MFA, мне просто предлагается ввести код, чтобы его предоставление позволило завершить операции AWS CLI. Что-то вроде:

#!/usr/bin/env bash

# (1) prompt for generated MFA code
# ???

# (2) use entered code to generate necessary credentials
aws sts get-session-token ... --token-code $ENTERED_VALUE

# (3) perform my AWS CLI commands requiring MFA
# ....

Мне непонятно, как запрашивать это при необходимости (что, вероятно, связано с незнанием bash) или как использовать вывод get-session-token, когда он у меня есть.

Есть ли способ сделать то, что я ищу?


Я попытался вызвать запрос, указав --profile с записью mfa_serial; но это тоже не работает.


person orome    schedule 27.03.2017    source источник


Ответы (4)


Хорошо, потратив больше времени на этот сценарий с коллегой - мы придумали гораздо более простой сценарий. Это делает всю работу с файлом учетных данных за вас, и его намного легче читать. Это также позволяет всем вашим средам новые токены находиться в одном файле creds. Для первоначального вызова MFA требуются ключи вашей учетной записи по умолчанию в файле учетных данных - затем он генерирует ваш токен MFA и помещает их обратно в файл учетных данных.

#!/usr/bin/env bash

function usage {
  echo "Example: ${0} dev 123456 "
  exit 2
}

if [ $# -lt 2 ]
then
  usage
fi

MFA_SERIAL_NUMBER=$(aws iam list-mfa-devices --profile bh${1} --query 'MFADevices[].SerialNumber' --output text)

function set-keys {
  aws configure set aws_access_key_id  ${2} --profile=${1}
  aws configure set aws_secret_access_key  ${3} --profile=${1}
  aws configure set aws_session_token  ${4} --profile=${1}
}


case ${1} in
  dev|qa|prod) set-keys ${1} $(aws sts get-session-token --profile bh${1} --serial-number ${MFA_SERIAL_NUMBER} --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' --output text --token-code ${2});;
  *) usage ;;
esac
person Nick    schedule 09.08.2019
comment
Гениально !!! Я поместил свои учетные данные pre-mfa в [bhdev] в ~/.aws/configure. Если я назову сценарий aws-mfa, я запускаю aws-mfa dev 123456, и он создает профиль dev с моими учетными данными mfa. Кстати, что означает bh? - person Ben Mares; 15.10.2019
comment
Это была компания, в которой я работал - это не имеет особого значения - вы можете использовать префикс, который вам нравится. - person Nick; 16.10.2019

Вдохновленный ответами @strongjz и @Nick, я написал небольшую команду Python, которой вы можете передать вывод по конвейеру. команды aws sts.

Установить:

pip install sts2credentials

Использовать:

aws sts get-session-token \
    --serial-number arn:aws:iam::123456789012:mfa/your-iam-user \
    --token-code 123456 \
    --profile=your-profile-name  \
    | sts2credentials

Это автоматически добавит идентификатор ключа доступа, секретный ключ доступа и токен сеанса в новый профиль "sts" в вашем ~/.aws/credentials файле.

person Yacine Nouri    schedule 01.06.2020

Для bash вы можете прочитать значение, а затем установить эти значения из вывода sts

echo "Type the mfa code that you want to use (4 digits), followed by [ENTER]:"

read ENTERED_VALUE

aws sts get-session-token ... --token-code $ENTERED_VALUE

тогда вам нужно будет проанализировать вывод вызова sts, который имеет ключ доступа, секрет и токен сеанса.

{
  Credentials: {
    AccessKeyId: "ASIAJPC6D7SKHGHY47IA",
    Expiration: 2016-06-05 22:12:07 +0000 UTC,
    SecretAccessKey: "qID1YUDHaMPet5xw/vpw1Wk8SKPilFihdiMSdSIj",
    SessionToken: "FQoDYXdzEB4aDLwmzouEQ3eckfqJxyLOARbBGasdCaAXkZ7ABOcOCNx2/7sS8N7A6Dpcax/t2G8KNTcUkRLdxI0gTvPoKQeZrH8wUrL4UxFFP6kCWEasdVIBAoUfuhdeUa1a7H216Mrfbbv3rMGsVKUoJT2Ar3r0pYgsYxizOWzH5VaA4rmd5gaQvfSFmasdots3WYrZZRjN5nofXJBOdcRd6J94k8m5hY6ClfGzUJEqKcMZTrYkCyUu3xza2S73CuykGM2sePVNH9mGZCWpTBcjO8MrawXjXj19UHvdJ6dzdl1FRuKdKKeS18kF"
  }
}

затем установите их

aws configure set aws_access_key_id default_access_key --profile NAME_PROFILE
aws configure set aws_secret_access_key default_secret_key --profile NAME_PROFILE
aws configure set default.region us-west-2 --profile

aws some_commmand --profile NAME_PROFILE

http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_08_02.html

Справочник по API AWS STS http://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html

Команда AWS CLI STS http://docs.aws.amazon.com/cli/latest/reference/sts/get-session-token.html

Я написал что-то очень похожее на то, что вы пытаетесь сделать в Go, здесь, но это для sts acceptrole не получить токен сеанса.

person strongjz    schedule 05.06.2017

Я написал простой скрипт для установки файла учетных данных AWS для профиля с именем mfa. Затем во все сценарии bash, которые вы пишете, просто нужно добавить "--profile mfa", чтобы они просто работали. Это также позволяет создавать несколько учетных записей AWS - как у многих из нас есть в наши дни. Я уверен, что это можно улучшить, но это было быстро и грязно, и делало то, что вы хотите, и все, что мне нужно.

Вам нужно будет изменить факты в скрипте, чтобы они соответствовали данным вашей учетной записи - я четко пометил их шевронами ‹>. NB Очевидно, что после того, как вы заполнили скрипт всеми своими данными, его нельзя будет копировать - если вы не хотите непредвиденных последствий. При этом используется рекурсия в файле учетных данных, поскольку стандартные ключи доступа вызываются каждый раз для создания токенов безопасности mfa.

#!/bin/bash
# Change for your username - would be /home/username on Linux/BSD
dir='/Users/<your-user-name>'
region=us-east-1
function usage {
    echo "Must enter mfa token and then either dev/qa/prod"
    echo "i.e. mfa-set-aws-profile.sh 123456 qa"
    exit 2
}
if [[ $1 == "" ]]
then
    echo "Must give me a token - how do you expect this to work - DOH :-)"
    usage
    exit 2
fi
# Write the output from sts command to a json file for parsing
# Just add accounts below as required

case $2 in
    dev) aws sts get-session-token --profile dev --serial-number arn:aws:iam::<123456789>:mfa/<john.doe> --token-code $1 > $dir/mfa-json;;
    qa) aws sts get-session-token --profile qa --serial-number arn:aws:iam::<123456789>:mfa/<john.doe> --token-code $1 > $dir/mfa-json;;
    -h) usage ;;
    *) usage ;;
esac

# Remove quotes and comma's to make the file easier to parse -
# N.B. gsed is for OSX - on Linux/BSD etc sed should be just fine.
/usr/local/bin/gsed -i 's/\"//g;s/\,//g' $dir/mfa-json

# Parse the mfa info into vars for use in aws credentials file
seckey=`cat $dir/mfa-json | grep SecretAccessKey | gsed -E 's/[[:space:]]+SecretAccessKey\: //g'`
acckey=`cat $dir/mfa-json | grep AccessKeyId | gsed 's/[[:space:]]+AccessKeyId\: //g'`
sesstok=`cat $dir/mfa-json | grep SessionToken | gsed 's/[[:space:]]+SessionToken\: //g'`

# output all the gathered info into your aws credentials file.
cat << EOF > $dir/.aws/credentials
[default]
aws_access_key_id = <your normal keys here if required>
aws_secret_access_key = <your normal keys here if required>
[dev]
aws_access_key_id = <your normal keys here >
aws_secret_access_key = <your normal keys here >
[qa]
aws_access_key_id = <your normal keys here >
aws_secret_access_key = <your normal keys here >
[mfa]
output = json
region = $region
aws_access_key_id = $acckey
aws_secret_access_key = $seckey
aws_session_token = $sesstok
EOF
person Nick    schedule 17.05.2019