AWS CLI 不支持 MultiFactorAuthAge
AWS CLI not honoring MultiFactorAuthAge
我正在尝试设置我的 AWS CLI 以使用 MFA 承担一个角色,并在 15 分钟后使信用过期(显然,允许的最低限度为 duration_seconds)。
我的 IAM 角色策略是:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/myuser"
},
"Action": "sts:AssumeRole",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
},
"NumericLessThan": {
"aws:MultiFactorAuthAge": "900"
}
}
}
]
}
我的 CLI 配置设置如下:
[profile xxx]
role_arn = arn:aws:iam::XXXXXXXXXXXX:role/mfa
mfa_serial = arn:aws:iam::XXXXXXXXXXXX:mfa/foobar
source_profile = mfa
当我 运行 使用上述 xxx
配置文件的命令时,第一次询问 MFA 并对所有后续请求保持有效。但是,15 分钟后,令牌仍然有效,并且不会再次询问 MFA。
$ aws s3 ls --profile xxx
我尝试在我的 CLI 上设置 duration_seconds
参数,如下所示:
[profile xxx]
role_arn = arn:aws:iam::XXXXXXXXXXXX:role/mfa
mfa_serial = arn:aws:iam::XXXXXXXXXXXX:mfa/foobar
source_profile = mfa
duration_seconds = 900
但是现在,我被要求为每个发出的命令提供 MFA 令牌,即使时差是秒级的。
我是不是漏掉了什么?
AWS CLI version: aws-cli/2.0.49 Python/3.7.4 Darwin/19.6.0 exe/x86_64
感谢任何帮助。
提前致谢!
看来问题出在你的条件上。
"Bool": {
"aws:MultiFactorAuthPresent": "true"
},
这将始终需要 MFA
改为尝试类似的方法:
{
"Version": "2012-10-17",
"Statement":[
{
"Sid": "AllowActionsForEC2",
"Effect": "Allow",
"Action": ["ec2:RunInstances",
"ec2:DescribeInstances",
"ec2:StopInstances "],
"Resource": "*"
},
{
"Sid": "AllowActionsForEC2WhenMFAIsPresent",
"Effect":"Allow",
"Action":"ec2:TerminateInstances",
"Resource":"*",
"Condition":{
"NumericLessThan ":{"aws:MultiFactorAuthAge":"300"}
}
}
]
}
具有超过 300 秒的短期凭据的用户必须重新验证才能访问此 API。
因此,对于您的保单,它将如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/myuser"
},
"Action": "sts:AssumeRole",
"Condition": {
"NumericLessThan": {
"aws:MultiFactorAuthAge": "900"
}
}
}
]
}
问题是您需要满足所有条件才能担任该角色。 "aws:MultiFactorAuthPresent": "true"
将始终检查您是否使用 MFA 登录。
所以,我发现了这种行为的原因:
如 this Github Issue 中所述,AWS CLI 将 15 分钟内的任何会话视为已过期,自动刷新凭据(或在 MFA 的情况下要求新的一次性密码)。
因此,将会话持续时间设置为 15 分钟(900 秒)与获得一次性凭证基本相同。
我刚刚测试将session_duration
设置为930
(15分钟+30秒),会话确实有效30秒。
我正在尝试设置我的 AWS CLI 以使用 MFA 承担一个角色,并在 15 分钟后使信用过期(显然,允许的最低限度为 duration_seconds)。
我的 IAM 角色策略是:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/myuser"
},
"Action": "sts:AssumeRole",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
},
"NumericLessThan": {
"aws:MultiFactorAuthAge": "900"
}
}
}
]
}
我的 CLI 配置设置如下:
[profile xxx]
role_arn = arn:aws:iam::XXXXXXXXXXXX:role/mfa
mfa_serial = arn:aws:iam::XXXXXXXXXXXX:mfa/foobar
source_profile = mfa
当我 运行 使用上述 xxx
配置文件的命令时,第一次询问 MFA 并对所有后续请求保持有效。但是,15 分钟后,令牌仍然有效,并且不会再次询问 MFA。
$ aws s3 ls --profile xxx
我尝试在我的 CLI 上设置 duration_seconds
参数,如下所示:
[profile xxx]
role_arn = arn:aws:iam::XXXXXXXXXXXX:role/mfa
mfa_serial = arn:aws:iam::XXXXXXXXXXXX:mfa/foobar
source_profile = mfa
duration_seconds = 900
但是现在,我被要求为每个发出的命令提供 MFA 令牌,即使时差是秒级的。
我是不是漏掉了什么?
AWS CLI version: aws-cli/2.0.49 Python/3.7.4 Darwin/19.6.0 exe/x86_64
感谢任何帮助。
提前致谢!
看来问题出在你的条件上。
"Bool": {
"aws:MultiFactorAuthPresent": "true"
},
这将始终需要 MFA
改为尝试类似的方法:
{
"Version": "2012-10-17",
"Statement":[
{
"Sid": "AllowActionsForEC2",
"Effect": "Allow",
"Action": ["ec2:RunInstances",
"ec2:DescribeInstances",
"ec2:StopInstances "],
"Resource": "*"
},
{
"Sid": "AllowActionsForEC2WhenMFAIsPresent",
"Effect":"Allow",
"Action":"ec2:TerminateInstances",
"Resource":"*",
"Condition":{
"NumericLessThan ":{"aws:MultiFactorAuthAge":"300"}
}
}
]
}
具有超过 300 秒的短期凭据的用户必须重新验证才能访问此 API。
因此,对于您的保单,它将如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/myuser"
},
"Action": "sts:AssumeRole",
"Condition": {
"NumericLessThan": {
"aws:MultiFactorAuthAge": "900"
}
}
}
]
}
问题是您需要满足所有条件才能担任该角色。 "aws:MultiFactorAuthPresent": "true"
将始终检查您是否使用 MFA 登录。
所以,我发现了这种行为的原因:
如 this Github Issue 中所述,AWS CLI 将 15 分钟内的任何会话视为已过期,自动刷新凭据(或在 MFA 的情况下要求新的一次性密码)。
因此,将会话持续时间设置为 15 分钟(900 秒)与获得一次性凭证基本相同。
我刚刚测试将session_duration
设置为930
(15分钟+30秒),会话确实有效30秒。