【问题标题】:How to use MFA with AWS CLI?如何将 MFA 与 AWS CLI 结合使用?
【发布时间】:2019-08-17 00:37:39
【问题描述】:

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

【问题讨论】:

    标签: amazon-web-services


    【解决方案1】:

    如果您使用角色,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 请求。

    然后将 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"
     # }
    

    【讨论】:

    • 这种技术让我大吃一惊。这比直接处理临时密钥和令牌要简单得多!我很惊讶这没有被更多地提及。
    • 当我尝试为自己创建角色时,没有任何好的选择。你是如何创建这个角色的?
    • 这项技术很好,但对我来说一个缺点是一小时后我的角色配置文件凭据超时,我必须重新输入 mfa 代码,即使我的主帐户每 12 小时只需要 mfa reauth 或所以。有没有办法在不重新输入 mfa 密钥的情况下刷新令牌(12 小时)?
    • @user2636840 在 AWS 控制台中的角色摘要中,查找 Maximum CLI/API session duration 行。您可以更改持续时间。要使用 CLI aws iam update-role --max-session-duration 更改此值,请阅读此链接:docs.aws.amazon.com/cli/latest/reference/iam/update-role.html
    • 这个工作没有角色的问题:github.com/aws/aws-cli/issues/1985
    【解决方案2】:

    致电aws sts get-session-token --serial-number &lt;serial&gt; --token-code &lt;code&gt; 记录here。这将为您提供临时安全令牌。可以在here 找到有关使用临时安全令牌的文档。

    【讨论】:

    • 好像也需要--serial-number
    • 感谢@GertvandenBerg。使用更新的 CLI 命令更正了帖子(在 4 年前发布时是正确的)。
    • @Phifo 这个问题是关于使用 2FA 令牌的。代码是 2FA 令牌。
    【解决方案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 cli aws_session_token <SESSION_TOKEN_HERE>
    

    aws_session_tokenaws configure 中是not included

    1. 测试命令
    aws s3 ls --profile cli
    

    【讨论】:

    • 上帝保佑你这个答案!感谢您告诉我如何将 aws_sesison_token 添加到个人资料中
    • @pnv 确实,很高兴知道“幕后”发生了什么,但我强烈建议每天使用一个工具。有3-4个流行的。我用github.com/broamski/aws-mfa
    • @pnv 您也可以从文本编辑器更新~/.aws/credentials,而完全不用担心aws configure
    【解决方案4】:

    我已经为 aws-cli 发布了一个 PR,它将允许在凭证中使用 mfa_serial,这将强制您在向 AWS 发出请求之前输入令牌(并且它将在令牌有效时被缓存)

    如果您想参与,请随意投票。

    【讨论】:

      【解决方案5】:

      编写了一个工具来为标准 IAM 用户配置文件添加 MFA 支持,直到 @outcoldman PR 被合并:https://github.com/tongueroo/aws-mfa-secure

      为赶时间的人设置

      1. 安装 gem
      gem install aws-mfa-secure
      
      1. 使用mfa_serial 设置您的~/.aws/credentials

      ~/.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
      

      【讨论】:

        【解决方案6】:

        在 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 包。

        【讨论】:

        • 谢谢伙伴.. 救了我创建它:)
        【解决方案7】:

        我的用例是我有一个根账户,其中创建了所有 IAM 用户并将其分配给 IAM 组,这些 IAM 组又能够在不同账户上担任角色,根据他们所在的组具有不同程度的访问权限。我有一些家规;

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

        这是使用 AWS Shared Organizations 设置的。

        以前,我一直在使用我编写的 python 脚本让我的用户通过 cli 使用 MFA 登录并切换帐户。这是通过操作 ~/.aws/credentials 来完成的。

        我已经迁移到使用这个项目 https://gitlab.com/severity1/aws-auth,它是用 Go 编写的,允许我在没有太多设置的情况下做同样的事情,它适用于 windows、macosx 和 linux。

        这有效地使我的所有用户能够在开发适用于 AWS 的应用程序时进行本地测试,而无需将 AWS 凭证硬编码到他们的代码中。

        【讨论】:

          【解决方案8】:

          aws-mfa 充当 sts 的包装器,效果非常好:https://github.com/broamski/aws-mfa

          【讨论】:

            【解决方案9】:

            我编写了一个小 bash 脚本来解决这个烦人的问题。 你可以在这里找到它:https://gist.github.com/geekgunda/db4c9c8d850c08a48d1d60f119628032

            假设:

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

            【讨论】:

              【解决方案10】:

              在我们为使用 Yubikeys 作为源代码而开发的一些自定义工具 (https://github.com/kreuzwerker/awsu) 的文档中,我们为 AWS API 多因素(在何处添加条件、含义等)记录了一个 few considerations TOTP 代币。这使得使用角色和长期凭证 + 会话令牌变得非常容易。

              【讨论】:

                【解决方案11】:

                我已经分叉了 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
                

                【讨论】:

                  【解决方案12】:

                  在命令行上使用 AWS 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 和 WSL bash 与 Ubuntu 编写的)。

                  您可以在我的 GitHub 存储库 https://github.com/vwal/awscli-mfa 中找到脚本和示例 MFA 策略

                  【讨论】:

                  • 我希望 Windows 也有这样的东西。
                  • @RyanShillington 如果你install Windows Subsystem for Linux (WSL),脚本在其中运行良好。事实上,当你在 WSL 中运行它时,它还为 Windows CMD 和 PowerShell 提供了 MFA 和角色会话激活字符串。
                  【解决方案13】:

                  运行 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/

                  【讨论】:

                    【解决方案14】:

                    使用 jq 授权 MFA 用户并将其附加到您的凭据文件的单线:

                    SERIAL_NUMBER=arn:aws:iam::000000000000:mfa/john TOKEN_CODE=123123 PROFILE_NAME=my_aws_2fa; \
                    aws sts get-session-token --serial-number $SERIAL_NUMBER --token-code $TOKEN_CODE \
                       | jq -r '.Credentials | ("aws_access_key_id = " + .AccessKeyId), ("aws_secret_access_key = " + .SecretAccessKey), ("aws_session_token = " + .SessionToken)' \
                       | (echo "\n[$PROFILE_NAME]" && cat) >> ~/.aws/credentials
                    

                    【讨论】:

                      猜你喜欢
                      • 2019-05-11
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-11-13
                      • 2021-09-25
                      • 1970-01-01
                      • 2021-04-28
                      • 2019-09-22
                      相关资源
                      最近更新 更多