如何在AWS CLI中使用MFA?

时间:2016-01-14 17:20:48

标签: amazon-web-services

使用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"
    }
]
}

12 个答案:

答案 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)

致电aws sts get-session-token --token-code <value>记录here。这将为您提供临时安全令牌。可以找到有关使用临时安全令牌的文档here

答案 2 :(得分:3)

分步手动解决方案:

  1. 通过MFA请求会话令牌
aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token

arn-of-the-mfa-device:从您的用户IAM可见

  • 选项:使用CLI检索:aws iam list-mfa-devices --user-name ryan
  • 选项:在IAM控制台中查看:IAM->用户->->安全凭据

code-from-token:已配置的MFA设备中的6位数字

  1. 使用返回的凭据创建配置文件
aws configure --profile cli

aws configure set --profile mfa aws_session_token <SESSION_TOKEN_HERE>

aws_session_tokenaws configure中是not included

  1. 测试命令
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

为赶时间的人设置

  1. 安装gem
gem install aws-mfa-secure
  1. 使用~/.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
  1. 将别名添加到您的~/.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

假设:

  1. 您原始的AWS Creds应存储在〜/ .aws / credentials
  2. 您已更正了MFA设备的ARN(搜索FIXME)
  3. 您已将正确的MFA代码作为cli参数
  4. 您已经安装了jq。参考:https://stedolan.github.io/jq/

答案 7 :(得分:0)

我的用例是我有一个root帐户,在该帐户中创建了所有IAM用户并将其分配给IAM组,这些IAM组又可以根据其所在的组在不同的帐户上担任角色,并具有不同的访问程度。我有一些家庭规则;

  1. 除管理自己的IAM用户帐户外,不允许任何人在根帐户上执行任何操作。
  2. 需要重置密码。
  3. 必需的MFA。
  4. 如果不使用MFA登录,则无法切换帐户。

这是使用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上

我在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软件包。