如何使用策略限制可从何处使用 EC2 实例证书

2023 年 4 月 5 日:在服务控制策略示例中添加 了一个修复程序,允许 EC2 实例挂载加密的 EBS 卷。

2023 年 3 月 7 日: 我们添加了阐明使用 VPC 终端节点要求的措辞,并更正了 S3 存储桶策略示例中的一个错字。


今天,亚马逊云科技 推出了两个新的 全局条件上下文密钥 , 使您可以更轻松地编写策略,其中 亚马逊弹性计算云 (Amazon EC2) 实例证书仅在用于颁发证书的实例上时才有效。这些新的条件密钥现已在所有 亚马逊云科技 区域以及 亚马逊云科技 GovCloud 和中国分区上线。

使用这些新的条件密钥,您可以编写 服务控制策略 (SCP) 亚马逊云科技 身份和访问管理 (IAM) 策略,限制可使用您的 EC2 实例证书的虚拟私有云 (VPC) 和私有 IP 地址,无需在策略中硬编码 VPC ID 或 IP 地址。以前,如果您想使用策略来限制 EC2 证书的使用位置,则必须在策略中列出特定的 VPC ID 和 IP 地址。使用这种新方法,您可以减少在 VPC 和网络范围列表发生变化时使用的策略空间并减少更新所花费的时间。

在这篇博客文章中,我们将向您展示如何在 SCP 和资源策略中使用这些新的条件密钥,以帮助确保分配给您的 EC2 实例的 IAM 角色证书只能在颁发证书的实例中使用。

新的全局条件密钥

两个新的条件键如下所示:

  • aws: ec2InstanceSourceVPC — 此单值条件密钥包含部署 EC2 实例的 VPC ID。
  • aws: ec2InstanceSourcePrivateIPv4 — 这个单值条件键包含 EC2 实例的主 IPv4 地址。

这些新条件仅适用于颁发给 EC2 实例的证书。您无需更改配置即可激活新的条件键。

首先,让我们回顾一些现有的 IAM 条件以及如何将它们与新条件结合起来。通过 VPC 终端节点向 亚马逊云科技 服务发出请求时, aws: SourceVPC 条件键的值是部署终端节点的 VPC 的 ID。 aws: vpcSourceIP 条件键的值是端点从中接收请求的 IP 地址。通过 亚马逊云科技 公共服务终端节点发出请求时, aws: SourceVPC 和 aws: vpcSourceIP 密钥为空。这些条件密钥与您的 亚马逊云科技 签名版本 4 签名 请求到达 API 终端节点时所用的网络路径的动态属性有关。有关支持 VPC 终端节点的 亚马逊云科技 服务列表,请参阅 与 亚马逊云科技 Pri vateLink 集成的 亚马逊云科技 服务

这两个新的条件密钥与 EC2 角色证书本身的动态属性有关。通过使用两个新的凭证相对条件密钥以及现有的网络路径相关性 aws : SourceVPC 和 aws : vpcSou rceIP 条件密钥,您可以创建 SCP 来帮助确保 EC2 实例的证书只能在颁发证书的 EC2 实例中使用。通过编写比较两组动态值的策略,您可以配置您的环境,这样,如果使用 EC2 实例凭证签署的请求在发放请求的 EC2 实例以外的任何地方使用,则会被拒绝。

政策示例

在以下 SCP 示例中,如果 aws: SourceVPC 的值不等于 aws: ec2InstanceSourceVPC 的值,或者 aws: vpcSourceIP 的值不等于 aws: ec2InstanceSourceP rivateIPv4 的值 ,则访问将被拒绝。 这意味着对 亚马逊云科技 服务的请求必须通过 VPC 终端节点,并且来自为允许访问而向其颁发实例证书的同一 EC2 实例。

该策略使用 亚马逊云科技: viaawsSer vice 允许某些 亚马逊云科技 服务在使用您的角色身份调用服务时代表您采取行动,例如当亚马逊 Athena 查询 亚马逊简单 存储 服务 (Amazon S3) 时。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:ec2InstanceSourceVPC": "${aws:SourceVpc}"
        },
        "Null": {
          "ec2:SourceInstanceARN": "false"
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
        },
        "ArnNotLike": {
          "aws:PrincipalArn": [
            "arn:aws:iam::*:role/aws:ec2-infrastructure"
          ]
        }
      }
    },
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:ec2InstanceSourcePrivateIPv4": "${aws:VpcSourceIp}"
        },
        "Null": {
          "ec2:SourceInstanceARN": "false"
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
        },
        "ArnNotLike": {
          "aws:PrincipalArn": [
            "arn:aws:iam::*:role/aws:ec2-infrastructure"
          ]
        }
      }
    }
  ]
}

因为我们在这些策略中将 aws: Source VPC 和 aws: vpcSourceIP 封装 在 “$ {}” 中,所以使用请求中的值将它们视为 变量 。 但是,在 IAM 策略语言中,比较左侧的运算符被隐含地视为变量,而右侧的运算符必须明确声明为变量。 ec2: SourceInstanceArn 条件键 上 的 “空” 运算符旨在确保此策略仅适用于 EC2 实例角色,而不适用于用于其他目的的角色,例如在 亚马逊云科技 Lambda 函数中使用的角色。 Arnn OtLik e 运算符用于允许您的 EC2 实例在安装加密卷时与 KMS 通信。

本示例中的两个拒绝语句构成逻辑 “或” 语句,因此来自不同 VPC 或不同 IP 地址的请求的计算结果均为拒绝。但从功能上讲,它们以 “和” 的方式行事。要获得允许,请求必须同时满足基于 VPC 和基于 IP 的条件,因为任一条件失败都会拒绝调用。由于 VPC ID 是全球唯一值,因此在没有私有 IP 条件的情况下使用基于 VPC 的条件是合理的。但是,您应避免仅评估私有 IP 条件而不评估 VPC 状况。在不同的环境中,私有 IP 可以相同,因此 aws: ec2InstanceSourcePrivateIPv4 只能与基于 VPC 的条件结合使用 才是安全的。

注意 :SCP 不授予 IAM 权限;他们只会将其删除。因此,您必须允许您的 EC2 实例使用与其角色关联的 IAM 策略使用 亚马逊云科技 服务。有关更多信息,请参阅 确定账户中的请求是被允许还是被拒绝

注意:如果请求不是通过 VPC 终端节点发出的,则 此策略将拒绝所有使用 EC2 实例证书的请求。

如果您想从语句中排除特定 EC2 实例角色,则可以通过标签或角色名称应用异常逻辑。

以下示例适用于用作 EC2 实例角色的角色,但带有 vpc-ip 异常标签的角色除外, 其中使用 aws: princ ipalTag 条件键值等于真。 同一个条件块中的三个条件运算符( StringNoteQuals Null boolifEx ists )使用逻辑 AND 运算进行求值,如果其中任何一个测试都没有求值,则拒绝语句不适用。因此,主体标签为 vpc-ip 异常 等于 t rue 的 EC2 实例角色 不受此 SCP 的约束

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:ec2InstanceSourceVPC": "${aws:SourceVpc}",
          "aws:PrincipalTag/exception-to-vpc-ip": "true"
        },
        "Null": {
          "ec2:SourceInstanceARN": "false"
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
        },
        "ArnNotLike": {
          "aws:PrincipalArn": [
            "arn:aws:iam::*:role/aws:ec2-infrastructure"
          ]
        }
      }
    },
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:ec2InstanceSourcePrivateIPv4": "${aws:VpcSourceIp}",
          "aws:principaltag/exception-to-vpc-ip": "true"
        },
        "Null": {
          "ec2:SourceInstanceARN": "false"
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
        },
        "ArnNotLike": {
          "aws:PrincipalArn": [
            "arn:aws:iam::*:role/aws:ec2-infrastructure"
          ]
        }
      }
    }
  ]
}

您可以将异常逻辑应用于 IAM 角色的其他属性。例如,您可以使用 aws: principalARN 条件密钥根据某些角色的 亚马逊云科技 账户对其进行豁免。您还可以指定您希望在您的 亚马逊云科技 Organizations 组织 中应用此 SCP 的位置。您可以将 SCP 直接应用于账户、组织单位或组织根源。有关在组织中应用 SCP 时继承的更多信息,请参阅 了解策略继承

您也可以在 IAM 操作 中对您的 SCP 语句应用异常逻辑。以下示例语句将 EC2 实例的凭证仅限于发放证书的实例,使用 Not Action 元素调用 IAM 除外。 如果 亚马逊云科技 服务没有 VPC 终端节点,或者您不想使用 VPC 终端节点访问特定服务,则应使用此异常逻辑。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "NotAction": "iam:*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:ec2InstanceSourceVPC": "${aws:SourceVpc}"
        },
        "Null": {
          "ec2:SourceInstanceARN": "false"
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
        },
        "ArnNotLike": {
          "aws:PrincipalArn": [
            "arn:aws:iam::*:role/aws:ec2-infrastructure"
          ]
        }
      }
    },
    {
      "Effect": "Deny",
      "NotAction": "iam:*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:ec2InstanceSourcePrivateIPv4": "${aws:VpcSourceIp}"
        },
        "Null": {
          "ec2:SourceInstanceARN": "false"
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
        },
        "ArnNotLike": {
          "aws:PrincipalArn": [
            "arn:aws:iam::*:role/aws:ec2-infrastructure"
          ]
        }
      }
    }
  ]
}

由于这些新条件密钥是全局条件密钥,因此您可以在所有相关的 亚马逊云科技 策略类型中使用这些密钥,例如以下 S3 存储桶策略。将其用作存储桶策略时,请务必将其 替换为 S3 存储桶的 ARN。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "s3:*",
      "Principal": {
        "AWS": "*"
      },
      "Resource": [
        "arn:aws:s3:::<DOC-EXAMPLE-BUCKET>/*",
        "arn:aws:s3::: <DOC-EXAMPLE-BUCKET>"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:ec2InstanceSourceVPC": "${aws:SourceVpc}"
        },
        "Null": {
          "aws:ec2InstanceSourceVPC": "false"
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
        }
      }
    },
    {
      "Effect": "Deny",
      "Action": "*",
      "Principal": {
        "AWS": "*"
      },
      "Resource": [
        "arn:aws:s3::: <DOC-EXAMPLE-BUCKET> /*",
        "arn:aws:s3::: <DOC-EXAMPLE-BUCKET>"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:ec2InstanceSourcePrivateIPv4": "${aws:VpcSourceIp}"
        },
        "Null": {
          "aws:ec2InstanceSourceVPC": "false"
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
        }
      }
    }
  ]
}

此策略将您的 S3 存储桶的访问权限限制为 EC2 实例角色,这些角色只能在向其出售的实例中使用。与前面的策略示例一样,此示例中有两条拒绝语句构成逻辑 “或” 语句,但构成了功能性 “和” 语句,因为请求必须来自发出请求的实例的同一 VPC 和相同 IP 地址,否则其评估结果为拒绝。

结论

在这篇博客文章中,你了解了 新推出 的 aws: ec2InstanceSourceVPC 和 aws: ec2Instanc eSourcePrivateIPv4 条件密钥。 您还学习了如何将其与 SCP 和资源策略一起使用,以将您的 EC2 实例角色的使用限制为通过 VPC 终端节点发出请求时产生的实例。由于这些新条件密钥是全局条件密钥,因此您可以在所有相关的 亚马逊云科技 策略类型中使用它们。这些新的条件密钥现已在所有地区以及 亚马逊云科技 GovCloud 和中国分区上线。

如果您有任何问题、意见或疑虑,请联系 亚马逊云科技 Support 或在 AW S 身份和访问管理 Compute re : Post 上开始一个新话题。

如果您对这篇文章有反馈,请在下面的 评论 部分提交评论。

Liam Wadman

利亚姆·瓦德曼

(Liam Wadman Liam)是身份解决方案团队的解决方案架构师。当他不在 亚马逊云科技 上构建令人兴奋的解决方案或帮助客户时,他经常会骑着山地自行车在不列颠哥伦比亚省的山地自行车上出现。利亚姆指出,没有 IAM 你就无法拼出 LIAM。

Joshua Levinson

约书亚·莱文森

·约书亚是 亚马逊云科技 EC2 团队的高级产品经理。他热衷于帮助客户在 EC2 和整个 亚马逊云科技 上使用高度可扩展的功能,并乐于为复杂问题构建简化的解决方案。工作之余,他喜欢做饭、和孩子一起读书和奥运会举重。