使用 IAM 角色权限防止用户在没有密钥对的情况下在 CLI 中启动 EC2 实例
Using IAM role permissions to prevent user from launching EC2 instance in CLI without a key pair
我正在为 Terraform 中的 IAM 角色创建策略,该角色需要能够从启动模板启动 EC2 实例,但具有一定的灵活性和一些限制。这些限制之一是 在控制台或 AWS CLI 中启动的任何实例都应该有一个与之关联的密钥对,但它不必是特定的密钥对。
我已经尝试在下面的代码中使用条件的几种变体(例如明确指定名称、更改测试条件等),还尝试了一个 Null
值 false
的测试,以尝试指定 ec2:KeyPairName
只需要存在。 None 这些条件允许我启动一个实例。
{
"Sid": "AllowEC2Launch",
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": [
"arn:aws:iam::xxx:instance-profile/xxx",
"arn:aws:ec2:xxx::image/xxx",
"arn:aws:ec2:xxx:xxx:volume/*",
"arn:aws:ec2:xxx:xxx:subnet/subnet-xxx",
"arn:aws:ec2:xxx:xxx:security-group/sg-xxx",
"arn:aws:ec2:xxx:xxx:network-interface/*",
"arn:aws:ec2:xxx:xxx:launch-template/lt-xxx",
"arn:aws:ec2:xxx:xxx:key-pair/*",
"arn:aws:ec2:xxx:xxx:instance/*",
"arn:aws:ec2:xxx:xxx:elastic-gpu/*"
],
"Condition": {
"ForAnyValue:StringLike": {
"ec2:KeyPairName": [
"*"
]
}
}
},
(我在 Terraform 中定义它,但由于问题是关于如何编写策略,而不是 TF,所以我已经发布了策略。)
确认一下,在没有条件的情况下,我可以使用和不使用指定密钥启动实例。在我尝试过的任何条件下,我都无法启动带有或不带有指定密钥的实例。这一切都是通过 AWS CLI 完成的。
我还考虑过 key_name
可以在 Terraform 启动模板定义中指定,但是我希望条件 not null 而不是仅限于一个特定的关键。
你试过只用 StringLike
作为你的条件吗?
您正在使用 ForAnyValue:StringLike
set operator,这意味着您希望 ec2:KeyPairName
有多个值,我认为这对 EC2 实例来说不可能吗?
我认为不可能。 ec2:KeyPairName
条件仅对 arn:aws:ec2:*:*:key-pair/*
资源有效。如果您在没有密钥的情况下启动实例,则根本不会使用资源 arn:aws:ec2:*:*:key-pair/*
,因此永远不会评估 ec2:KeyPairName
。
解决方法是设置 AWS Config 规则以检查新实例是否具有密钥,或者简单地设置一个 lambda 函数,该函数在启动实例时触发,该函数也将检查密钥。
我正在为 Terraform 中的 IAM 角色创建策略,该角色需要能够从启动模板启动 EC2 实例,但具有一定的灵活性和一些限制。这些限制之一是 在控制台或 AWS CLI 中启动的任何实例都应该有一个与之关联的密钥对,但它不必是特定的密钥对。
我已经尝试在下面的代码中使用条件的几种变体(例如明确指定名称、更改测试条件等),还尝试了一个 Null
值 false
的测试,以尝试指定 ec2:KeyPairName
只需要存在。 None 这些条件允许我启动一个实例。
{
"Sid": "AllowEC2Launch",
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": [
"arn:aws:iam::xxx:instance-profile/xxx",
"arn:aws:ec2:xxx::image/xxx",
"arn:aws:ec2:xxx:xxx:volume/*",
"arn:aws:ec2:xxx:xxx:subnet/subnet-xxx",
"arn:aws:ec2:xxx:xxx:security-group/sg-xxx",
"arn:aws:ec2:xxx:xxx:network-interface/*",
"arn:aws:ec2:xxx:xxx:launch-template/lt-xxx",
"arn:aws:ec2:xxx:xxx:key-pair/*",
"arn:aws:ec2:xxx:xxx:instance/*",
"arn:aws:ec2:xxx:xxx:elastic-gpu/*"
],
"Condition": {
"ForAnyValue:StringLike": {
"ec2:KeyPairName": [
"*"
]
}
}
},
(我在 Terraform 中定义它,但由于问题是关于如何编写策略,而不是 TF,所以我已经发布了策略。)
确认一下,在没有条件的情况下,我可以使用和不使用指定密钥启动实例。在我尝试过的任何条件下,我都无法启动带有或不带有指定密钥的实例。这一切都是通过 AWS CLI 完成的。
我还考虑过 key_name
可以在 Terraform 启动模板定义中指定,但是我希望条件 not null 而不是仅限于一个特定的关键。
你试过只用 StringLike
作为你的条件吗?
您正在使用 ForAnyValue:StringLike
set operator,这意味着您希望 ec2:KeyPairName
有多个值,我认为这对 EC2 实例来说不可能吗?
我认为不可能。 ec2:KeyPairName
条件仅对 arn:aws:ec2:*:*:key-pair/*
资源有效。如果您在没有密钥的情况下启动实例,则根本不会使用资源 arn:aws:ec2:*:*:key-pair/*
,因此永远不会评估 ec2:KeyPairName
。
解决方法是设置 AWS Config 规则以检查新实例是否具有密钥,或者简单地设置一个 lambda 函数,该函数在启动实例时触发,该函数也将检查密钥。