如何提示MFA密钥生成和使用AWS CLI访问凭据?

时间:2017-03-27 16:41:57

标签: bash amazon-web-services aws-cli multi-factor

我有几个Bash脚本调用AWS CLI命令,其权限已更改为需要MFA,我希望能够在这些脚本中提示我的MFA设备生成的代码,以便它们可以运行必要的身份验证。

但似乎没有简单的内置方法来做到这一点。我能找到的唯一文档涉及使用aws sts get-session-token然后在配置中保存每个值的复杂过程,然后不清楚如何使用。

要清楚我想要的是当我运行一个包含需要MFA的AWS CLI命令的脚本时,我只是提示输入代码,因此提供它可以让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的输出。

有没有办法做我正在寻找的事情?

tried to trigger a prompt指定--profile条目mfa_serial;但这也不起作用。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

受@strongjz和@Nick答案的启发,我写了一个small Python command,您可以在其中输入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

这将在您的~/.aws/credentials文件中的新“ sts”配置文件下自动添加访问密钥ID,秘密访问密钥和会话令牌。

答案 2 :(得分:0)

对于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

AWS STS API参考 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中尝试的内容,here,但这是针对sts假设而不是get-session-token。

答案 3 :(得分:0)

我写了一个简单的脚本来为名为mfa的配置文件设置AWS凭证文件。然后,您编写的所有bash脚本只需要添加“ --profile mfa”,它们便可以正常工作。这也允许使用多个AWS帐户-如今我们当中许多人都拥有这些帐户。我相信这可以改善-但是它又快又脏,可以满足您的需求和我需要的一切。

您将不得不修改脚本中的事实以适合您的帐户详细信息-我已用V形标记<>清楚地标记了它们。 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