使用AWS CLI时如何输入MFA代码?我查看了IAM http://docs.aws.amazon.com/cli/latest/reference/iam/index.html的文档页面。
我已在用户名下启用了MFA设备。
aws iam list-mfa-devices --user-name X
返回
{
"MFADevices": [
{
"UserName": "X",
"SerialNumber": "arn:aws:iam::+++:mfa/X",
"EnableDate": "2016-01-13T23:15:43Z"
}
]
}
答案 0 :(得分:32)
如果您正在使用角色,CLI可以为您管理大量此类操作。这里描述:http://docs.aws.amazon.com/cli/latest/userguide/cli-roles.html
在我的凭据文件中,我有:
[my_iam_user]
aws_access_key_id = AKIABLAHBLAHBLAHBLAH
aws_secret_access_key = <blah>
region = us-east-1
[my_admin_role]
role_arn = arn:aws:iam::123456789123:role/my_admin_role
source_profile = my_iam_user
mfa_serial = arn:aws:iam::123456789123:mfa/my_iam_user
region = us-east-1
请注意mfa_serial
条目。您可以在AWS IAM控制台中从您的用户详细信息中获取此值。此条目告诉CLI该角色需要MFA。
当我致电aws s3 ls --profile my_admin_role
时,它会显示Enter MFA code:
,在我粘贴代码后,它会返回列表。
注意:在调用用户个人资料(--profile my_iam_user
)时,我没有找到让CLI请求MFA的方法,只调用角色个人资料会触发MFA请求。 < / p>
然后继续使用MFA令牌,也可以使用用户配置文件:
aws sts get-caller-identity --profile my_iam_user
# {
# "Account": "123456789123",
# "UserId": "AIDABLAHBLAHBLAHBLAH",
# "Arn": "arn:aws:iam::123456789123:user/my_iam_user"
# }
aws sts get-caller-identity --profile my_admin_role
# {
# "Account": "123456789123",
# "UserId": "AROABLAHBLAHBLAHBLAH:AWS-CLI-session-1234567890",
# "Arn": "arn:aws:sts::123456789123:assumed-role/my_admin_role/AWS-CLI-session-1234567890"
# }
答案 1 :(得分:6)
答案 2 :(得分:3)
分步手动解决方案:
aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token
arn-of-the-mfa-device
:从您的用户IAM可见
aws iam list-mfa-devices --user-name ryan
code-from-token
:已配置的MFA设备中的6位数字
aws configure --profile cli
aws configure set --profile mfa aws_session_token <SESSION_TOKEN_HERE>
aws_session_token
在aws configure
中是not included
aws s3 ls --profile cli
答案 3 :(得分:1)
在命令行上使用AWS A MFA可能会非常麻烦和麻烦,尤其是当您有多个配置文件和角色时。
我发布了awscli-mfa.sh
脚本,该脚本使命令行上的MFA /角色会话管理更加容易。伴随脚本enable-disable-vmfa-device.sh
同样可让您轻松在IAM用户帐户上启用或禁用虚拟MFA设备。
awscli-mfa.sh
在~/.aws/credentials
中保留一个已启动的会话(在~/.aws/config
中保留一些信息),或者仅允许您启动一个环境内会话,以免其详细信息不保留。在Linux的Windows子系统中执行时,该脚本还提供PowerShell和Windows命令行的会话激活字符串。但是,脚本本身仅以bash运行(为macOS,Linux和Ubuntu的WSL bash编写)。
您可以在https://github.com/vwal/awscli-mfa的GitHub存储库中找到脚本和MFA策略示例
答案 4 :(得分:1)
编写了一种工具,以添加对标准IAM用户配置文件的MFA支持,直到合并@outcoldman PR:https://github.com/tongueroo/aws-mfa-secure
gem install aws-mfa-secure
~/.aws/credentials
设置mfa_serial
〜/ .aws /凭证:
[mfa]
aws_access_key_id = BKCAXZ6ODJLQ1EXAMPLE
aws_secret_access_key = ABCDl4hXikfOHTvNqFAnb2Ea62bUuu/eUEXAMPLE
mfa_serial = arn:aws:iam::112233445566:mfa/MFAUser
~/.bash_profile
alias aws="aws-mfa-secure session"
重新启动终端。
$ export AWS_PROFILE=mfa
$ aws s3 ls
Please provide your MFA code: 751888
2019-09-21 15:53:34 my-example-test-bucket
$ aws s3 ls
2019-09-21 15:53:34 my-example-test-bucket
$
假设角色配置文件已适用于AWS CLI,下面是一个示例:
〜/ .aws /凭证:
[mfa]
aws_access_key_id = BKCAXZ6ODJLQ1EXAMPLE
aws_secret_access_key = ABCDl4hXikfOHTvNqFAnb2Ea62bUuu/eUEXAMPLE
mfa_serial = arn:aws:iam::112233445566:mfa/MFAUser
[assumed-role]
role_arn = arn:aws:iam::112233445566:role/Admin
source_profile = mfa
role_session_name = MFAUser
mfa_serial = arn:aws:iam::112233445566:mfa/MFAUser
答案 5 :(得分:1)
运行sts get-session-token AWS CLI命令,将变量替换为您的账户,资源和MFA设备中的信息:
$ aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token
https://aws.amazon.com/premiumsupport/knowledge-center/authenticate-mfa-cli/
答案 6 :(得分:0)
我写了一个小的bash脚本来克服这个烦人的问题。 您可以在这里找到它:https://gist.github.com/geekgunda/db4c9c8d850c08a48d1d60f119628032
假设:
答案 7 :(得分:0)
我的用例是我有一个root帐户,在该帐户中创建了所有IAM用户并将其分配给IAM组,这些IAM组又可以根据其所在的组在不同的帐户上担任角色,并具有不同的访问程度。我有一些家庭规则;
这是使用AWS共享组织设置的。
以前,我一直在使用编写的python脚本让用户通过MFA的cli登录并切换帐户。这是通过操纵〜/ .aws / credentials来完成的。
此后,我迁移到使用该项目https://gitlab.com/severity1/aws-auth编写,该项目是用Go语言编写的,无需过多设置即可进行操作,并且可以在Windows,macosx和linux上运行。
这有效地使我的所有用户都能够在开发Apps for AWS时进行本地测试,而无需将AWS凭证硬编码到他们的代码中。
答案 8 :(得分:0)
我们在为使用Yubikeys而开发的一些自定义工具(few considerations)的文档中,一般记录了https://github.com/kreuzwerker/awsu的AWS API多因素(在何处添加条件,含义是什么)。作为TOTP令牌的来源。这使得使用角色和长期凭证+会话令牌非常容易。
答案 9 :(得分:0)
我已经分叉了Chinmay的要点,并对其进行了更新,以从aws中提取设备序列,而不是对其进行硬编码。我还更新了出口,使其返回状态1,而不仅仅是退出。
在这里可用: https://gist.github.com/jpribyl/e44021ae5cbf7fd1b4549598e85b5341
我正在像这样的部署脚本中使用它(我将脚本重命名为awsMfaCli.sh):
. awsMfaCli.sh
script_status=$?
if [[ $script_status -ne 1 ]]; then
echo "Building production"
if npm run build ; then
echo "Build Successful"
else
echo "Error building, exiting.."
return 1
fi
echo "Removing all files on bucket.."
aws s3 rm --recursive s3://mybucket
echo "Uploading site.."
aws s3 sync build/ s3://mybucket
echo "S3 Upload complete.."
echo "Deployment complete."
else
return 1
fi
答案 10 :(得分:0)
aws-mfa
充当sts
的包装,并且效果很好:https://github.com/broamski/aws-mfa
答案 11 :(得分:0)
我在Windows上,我创建了一个批处理文件以传递我的MFA代码,并自动设置我的凭据。首先,您需要在AWS中设置生产凭证:
aws configure --profile prod
用您的密钥和秘密适当回答问题。然后,我像这样运行脚本:
C:\> mfa-getCreds.bat 229168
Your credentials are set up, and will expire on 2019-05-12T04:04:13Z
Now you should be able to run aws commands like this: aws s3 ls
这是我的mfa-getCreds.bat
的内容:
@echo off
set TOKEN=%1
if not defined TOKEN goto showUsage
@call aws sts get-session-token --profile prod --serial-number "arn:aws:iam::109627855994:mfa/ryan.shillington" --token-code %* > c:\temp\mfa-getCreds.json
FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET AWS_ACCESS_KEY=%%g)
FOR /F "tokens=*" %%g IN ('jq -r ".Credentials.SecretAccessKey" c:\temp\mfa-getCreds.json') do (SET "AWS_SECRET_KEY=%%g")
FOR /F "tokens=*" %%g IN ('jq -r ".Credentials.SessionToken" c:\temp\mfa-getCreds.json') do (SET "AWS_SESSION_TOKEN=%%g")
FOR /F "tokens=*" %%g IN ('jq -r ".Credentials.Expiration" c:\temp\mfa-getCreds.json') do (SET "EXPIRATION=%%g")
set AWS_ACCESS_KEY_ID=%AWS_ACCESS_KEY%
set "AWS_SECRET_ACCESS_KEY=%AWS_SECRET_KEY%"
echo.
echo Your credentials are set up, but will expire on %EXPIRATION%
echo.
echo Now you should be able to run aws commands like this: aws s3 ls
goto :EOF
:showUsage
echo Usage: %0 [MFA Token]
goto :EOF
要运行此程序,您需要在路径中使用优质的jq软件包。