Bash 如何提示输入MFA密钥以生成和使用AWS CLI访问的凭据?

Bash 如何提示输入MFA密钥以生成和使用AWS CLI访问的凭据?,bash,amazon-web-services,aws-cli,multi-factor-authentication,Bash,Amazon Web Services,Aws Cli,Multi Factor Authentication,我有几个Bash脚本可以调用AWS CLI命令,这些命令的权限已更改为需要MFA,我希望能够在这些脚本中提示由我的MFA设备生成的代码,以便它们可以在必要的身份验证下运行 但似乎没有简单的内置方式来实现这一点。我能找到的唯一文档涉及到一个复杂的使用过程,然后将每个值保存在一个配置中,现在还不清楚如何使用 要明确的是,当我运行一个包含需要MFA的AWS CLI命令的脚本时,系统只会提示我输入代码,这样就可以完成AWS CLI操作。比如: #!/usr/bin/env bash # (1) pro

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

但似乎没有简单的内置方式来实现这一点。我能找到的唯一文档涉及到一个复杂的使用过程,然后将每个值保存在一个配置中,现在还不清楚如何使用

要明确的是,当我运行一个包含需要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
,如何使用它的输出

有没有办法做到我想要的



我通过指定带有
mfa_序列
条目的
--profile
进行了修改;但是这也不行。

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

AWS STS API参考

AWS CLI STS命令


我写了一些非常类似于您在Go中尝试的内容,但这是针对sts assumerole not get session token的

我编写了一个简单的脚本,为名为mfa的概要文件设置AWS凭据文件。然后,您编写的所有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
#/bin/bash
#更改您的用户名-在Linux/BSD上为/home/username
dir='/Users/'
地区=美国东部-1
功能使用{
echo“必须输入mfa令牌,然后输入dev/qa/prod”
echo“即mfa-set-aws-profile.sh 123456 qa”
出口2
}
如果[[$1==”“]]
然后
echo“必须给我一个令牌-你认为这会如何工作-DOH:-)”
使用
出口2
fi
#将sts命令的输出写入json文件进行解析
#只需根据需要在下面添加帐户
案件二元
dev)aws sts获取会话令牌--配置文件dev--序列号arn:aws:iam:::mfa/--令牌代码$1>$dir/mfa json;;
qa)aws sts获取会话令牌--配置文件qa--序列号arn:aws:iam:::mfa/--令牌代码$1>$dir/mfa json;;
-h) 用法;;
*)用法;;
以撒
#删除引号和逗号,使文件更易于分析-
#注意:gsed是针对OSX的——在Linux/BSD等平台上,sed应该可以。
/usr/local/bin/gsed-i's/\“//g;s/\,//g'$dir/mfa json
#将mfa信息解析为VAR,以便在aws凭证文件中使用
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的//[:space:]+SessionToken\://g'`
#将收集的所有信息输出到aws凭据文件中。
目录$dir/.aws/凭证
[默认值]
aws\u访问\u密钥\u id=
aws\u密码\u访问\u密钥=
[开发人员]
aws\u访问\u密钥\u id=
aws\u密码\u访问\u密钥=
[质询]
aws\u访问\u密钥\u id=
aws\u密码\u访问\u密钥=
[外交部]
输出=json
地区=$地区
aws\访问\密钥\ id=$acckey
aws_secret_access_key=$seckey
aws_会话_令牌=$sesstok
EOF

在与同事花更多时间编写此脚本后,确定-我们已经想出了一个更简单的脚本。这为您完成了所有凭据文件的工作,并且更易于阅读。它还允许您的所有环境新令牌位于同一个凭据文件中。获取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 answers的启发,我编写了一个可以通过管道将
aws sts
命令的输出传输到其中的脚本

要安装:

pip安装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、秘密访问密钥和会话令牌。

Brilliant!!!我将我的mfa前凭据放在
[bhdev]下
~/.aws/configure
中。如果我将脚本命名为
aws mfa
,那么我运行
aws mfa dev 123456
并使用我的mfa凭据创建
dev
配置文件。顺便说一句,
bh
代表什么?它是我工作的公司-它没有特殊意义-你可以用任何你喜欢的前缀。