2

我有几个 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一旦我拥有它的输出。

有没有办法做我正在寻找的东西?


试图通过指定--profile一个mfa_serial条目来触发提示;但这也不起作用。

4

4 回答 4

3

好吧,在和同事一起花更多时间在这个脚本上之后——我们想出了一个更简单的脚本。这为您完成了所有凭证文件的工作,并且更易于阅读。它还允许您的所有环境中的新令牌位于同一个 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
于 2019-08-09T13:09:31.970 回答
1

受@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”配置文件下添加访问密钥 ID、秘密访问密钥和会话令牌~/.aws/credentials

于 2020-06-01T02:44:58.930 回答
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
于 2019-05-17T14:46:49.807 回答
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 中尝试的非常相似的东西,但这是针对 sts 假设角色而不是 get-session-token。

于 2017-06-05T23:45:42.043 回答