使用 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 中启动的任何实例都应该有一个与之关联的密钥对,但它不必是特定的密钥对。

我已经尝试在下面的代码中使用条件的几种变体(例如明确指定名称、更改测试条件等),还尝试了一个 Nullfalse 的测试,以尝试指定 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 函数,该函数在启动实例时触发,该函数也将检查密钥。