如何使用 MFA 令牌对通过 AWS CLI 进行的 AWS 资源访问执行身份验证?

上次更新时间:2020 年 2 月 7 日

如何使用 MFA 令牌对通过 AWS 命令行界面 (AWS CLI) 进行的 AWS 资源访问执行身份验证?

解决方法

最佳实践是使用 multi-factor authentication (MFA) 设备保护账户及其资源。如果您打算在使用 MFA 设备时通过 AWS CLI 与资源交互,则必须创建临时会话。如果您使用的是 MFA 硬件设备,则 ARN 值类似于 GAHT12345678。如果您使用的是虚拟 MFA,则该值类似于 arn:aws:iam::123456789012:mfa/user。有关更多信息,请参阅检查 MFA 状态

重要提示:开始之前,请确保您已安装配置 AWS CLI。

运行 sts get-session-token AWS CLI 命令 (将变量替换为账户、资源和 MFA 设备的信息):  

$ aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token

您会收到类似于以下内容的输出,其中包含临时凭证和到期时间(默认为 12 小时):

{
    "Credentials": {
        "SecretAccessKey": "secret-access-key",
        "SessionToken": "temporary-session-token",
        "Expiration": "expiration-date-time",
        "AccessKeyId": "access-key-id"
    }
}

注意:可以在 sts get-session-token 命令中使用 --duration-seconds 选项指定到期时间 (单位:秒),该值的范围在 900 秒 (15 分钟) 至 129600 秒 (36 小时) 之间。如果您使用的是根用户凭证,则范围为 900 秒(15 分钟)到 3600 秒(1 小时)。

通过环境变量使用临时凭证

您可以使用以下命令将临时凭证的值导出到环境变量,从而使用临时凭证(在 Linux 中):

Linux:

export AWS_ACCESS_KEY_ID=example-access-key-as-in-previous-output
export AWS_SECRET_ACCESS_KEY=example-secret-access-key-as-in-previous-output
export AWS_SESSION_TOKEN=example-session-token-as-in-previous-output

Windows:

set AWS_ACCESS_KEY_ID=example-access-key-as-in-previous-output
set AWS_SECRET_ACCESS_KEY=example-secret-access-key-as-in-previous-output
set AWS_SESSION_TOKEN=example-session-Token-as-in-previous-output

如果您已设置环境变量,请确保在使用这些命令再次进行 get-session-token 调用之前取消对它们的设置。 

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN

通过命名配置文件使用临时凭证

还可以使用命名配置文件指定需要进行 MFA 身份验证的命令。为此,请编辑用户主目录中的 .aws 文件夹下的 credentials 文件,然后添加新的配置文件配置以发出业经 MFA 身份验证的命令。下面是一个配置文件配置示例:

[mfa]
aws_access_key_id = example-access-key-as-in-returned-output
aws_secret_access_key = example-secret-access-key-as-in-returned-output
aws_session_token = example-session-Token-as-in-returned-output

​凭证到期后,再次执行 get-session-token ​命令,然后将返回值导出到环境变量或配置文件配置。

提示:可以考虑在后台运行脚本或 cron 作业,以检查 get-session-token 命令输出中的“expiration”(到期时间),然后提示重新进行身份验证。

如果使用 configure 命令配置 AWS CLI,则存在具有永久 AWS Identity and Access Management (IAM) 用户凭证的默认配置。此 IAM 用户可以使用不需要 MFA 身份验证的命令。

示例配置:

.aws/credentials

[default]
aws_access_key_id = example-access-Key-for-an-IAM-user
aws_secret_access_key = example-secret-access-key-for-IAM-user

注意:不能将 mfa_serial 参数与永久 IAM 凭证一起使用。

如果您使用配置文件对使用 AWS CLI 的命令进行身份验证,请指定 --profile 选项并且在后面跟随配置文件名称,以验证调用使用 MFA 进行身份验证。

例如,此命令使用默认配置文件凭证,而不使用 MFA 进行身份验证。

$ aws s3 ls

重要提示:请确保了解凭证优先顺序,以便您可以验证在进行 API 调用时使用正确的凭证。

$ aws s3 ls --profile mfa

还可以要求用户使用 MFA 进行身份验证,以使用 IAM 策略中的 aws:MultiFactorAuthPresentaws:MultiFactorAuthAge 条件执行特定的 API 操作。。