创建 AWS IAM 策略,将正在运行的实例限制为特定安全组
Posted
技术标签:
【中文标题】创建 AWS IAM 策略,将正在运行的实例限制为特定安全组【英文标题】:Creating an AWS IAM policy that restricts running instances to certain security groups 【发布时间】:2018-05-21 22:45:54 【问题描述】:我正在尝试编写一个 IAM 策略,该策略仅在安全组是两种类型之一时才允许 AWS 用户启动实例。因为没有安全组条件键,所以我选择使用条件语句,这样 EC2 实例就无法启动/运行除非安全组属于 2 个类别中的任何一个。我在下面的策略中引用这些批准的安全组的方式是通过它们的标签。
我遇到的问题是,当我有一个确实等于第一个条件的安全组时,可以启动一个实例。但是,当我使用等于“UCSFInbound”(第二个条件)的安全组时,实例不会启动(即使它应该启动)。
我确实有一个单独的策略,它授予对 EC2 资源的更广泛的访问权限,但是,据我了解,AWS 在“允许”操作之前首先注册“拒绝”操作。如果这就是我遇到问题的原因,那么这两种情况(安全组)都不应该起作用。
IAM 政策:
"Version": "2012-10-17",
"Statement": [
"Sid": "VisualEditor0",
"Effect": "Deny",
"Action": [
"ec2:StartInstances",
"ec2:RunInstances"
],
"Resource": [
"arn:aws:ec2:*:*:subnet/*",
"arn:aws:ec2:*:*:key-pair/*",
"arn:aws:ec2:*:*:instance/*",
"arn:aws:ec2:*::snapshot/*",
"arn:aws:ec2:*:*:launch-template/*",
"arn:aws:ec2:*:*:volume/*",
"arn:aws:ec2:*:*:security-group/*",
"arn:aws:ec2:*:*:placement-group/*",
"arn:aws:ec2:*:*:network-interface/*",
"arn:aws:ec2:*::image/*"
],
"Condition":
"StringNotLike":
"ec2:ResourceTag/aws:cloudformation:stack-id": "NetworkResourcesStack"
,
"StringNotEquals":
"ec2:ResourceTag/Name": "UCSFInbound"
]
【问题讨论】:
此页面对于 EC2 资源级权限始终有用:Supported Resource-Level Permissions for Amazon EC2 API Actions - Amazon Elastic Compute Cloud 请注意,正如所写的那样,您的条件是“与”,因此两者都必须为真才能使拒绝生效。如果您希望每个都单独导致拒绝,请重写您的策略以包含两个针对相同操作和资源的拒绝语句,每个语句都有一个条件。 如果您无法通过 IAM 策略以主动的方式实现您想要的,那么您可以考虑使用 CloudTrail 日志和 Lambda 的被动方法(您可以在响应创建的资源时验证它们的状态,如果他们不合规,您会停止或终止他们或提醒某人)。 【参考方案1】:一般来说,您应该避免使用Deny
政策,除非它推翻了其他政策。
例如,您可以像这样控制对 Amazon S3 的访问:
Allow
所有员工都可以访问所有 S3 存储桶
Deny
如果您不是 HR 员工,则可以访问 HR 存储桶
这使用通用策略来允许大多数访问,但随后使用拒绝来覆盖特殊情况。
因此,您应该将arn:aws:ec2:region:account:security-group/security-group-id
放入允许他们使用EC2 的初始Allow
策略中。
【讨论】:
以上是关于创建 AWS IAM 策略,将正在运行的实例限制为特定安全组的主要内容,如果未能解决你的问题,请参考以下文章
如何限制 AWS IAM 组访问 AWS Secret Manager?