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

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

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

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

#!/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 запись; но это тоже не работает.

1 ответ

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

Вдохновленный ответами @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 файл.

Я написал простой скрипт для установки файла учетных данных 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

Для 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, а не get-session-token.

Он имеет много шагов, генерирует токен сеанса и экспортирует его. Многие пользователи пытались абстрагироваться от шагов для создания токена сеанса. Я надеюсь, что следующие инструменты будут кому-то полезны:

Другие вопросы по тегам