我有几个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
;但这也不起作用。
答案 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