亚马逊AWS官方博客

使用新安全组规则 ID 轻松管理安全组规则

在 Amazon Web Services,我们不懈地创新,让您能够专注于业务,而不是其底层 IT 基础设施。有时,我们会推出新服务主要功能。有时,我们专注于让您职业生涯更轻松的细节

今天,我很高兴可以宣布其中一个有所作为的小细节:VPC 安全组规则 ID。

安全组会充当云资源的虚拟防火墙,例如 Amazon Elastic Compute Cloud (Amazon EC2) 实例或 Amazon Relational Database Service (RDS) 数据库。它控制进出网络流量。安全组由安全组规则,协议、源或目标 IP 地址和端口号的组合以及可选说明组成。

当您使用 Amazon Web Services 命令行界面 (CLI) 或 API 修改安全组规则时,必须指定所有这些元素才能识别规则。由此会产生很长的 CLI 命令,键入或读取这些命令非常繁琐,且容易出错。例如:

aws ec2 revoke-security-group-egress \
         --group-id sg-0xxx6          \
         --ip-permissions IpProtocol=tcp, FromPort=22, ToPort=22, IpRanges='[{CidrIp=192.168.0.0/0}, {84.156.0.0/0}]'

新增功能?
安全组规则 ID 是安全组规则的唯一标识符。向安全组添加规则时,将自动创建这些标识符并将其添加到安全组规则中。安全组 ID 在 Amazon Web Services 区域中是唯一的。以下是 Amazon VPC 控制台编辑入站规则页面:

安全组规则 ID

如前所述,当您创建规则时,将自动添加标识符。例如,当我使用 CLI 时:

aws ec2 authorize-security-group-egress                                  \
        --group-id sg-0xxx6                                              \
        --ip-permissions IpProtocol=tcp,FromPort=22,ToPort=22,           \
                         IpRanges=[{CidrIp=1.2.3.4/32}]
        --tag-specifications                                             \
                         ResourceType='security-group-rule',             \
                         "Tags": [{                                      \
                           "Key": "usage", "Value": "bastion"            \
                         }]

更新的 AuthorizeSecurityGroupEgress API 操作现在会返回有关安全组规则的详细信息,包括安全组规则 ID:

"SecurityGroupRules": [
    {
        "SecurityGroupRuleId": "sgr-abcdefghi01234561",
        "GroupId": "sg-0xxx6",
        "GroupOwnerId": "6800000000003",
        "IsEgress": false,
        "IpProtocol": "tcp",
        "FromPort": 22,
        "ToPort": 22,
        "CidrIpv4": "1.2.3.4/32",
        "Tags": [
            {
                "Key": "usage",
                "Value": "bastion"
            }
        ]
    }
]

我们还添加了两个 API 操作:DescribeSecurityGroupRulesModifySecurityGroupRulesVPC API。您可以分别使用它们列出或修改安全组规则。

有什么益处?
安全组规则 ID 的第一个益处是简化 CLI 命令。例如,之前经常使用的 RevokeSecurityGroupEgress 命令现在可以表示为:

aws ec2 revoke-security-group-egress \
         --group-id sg-0xxx6         \
         --security-group-rule-ids "sgr-abcdefghi01234561"

更短更简单,不是吗?

第二个益处是现在可以标记安全组规则,就像许多其他 Amazon Web Services 资源一样。您可以使用标签快速列出或识别跨多个安全组的一组安全组规则。

在上一个示例中,创建安全组规则时,我使用了创建标签技巧来添加带有 --tag-specifications 的标签。我还可以在稍后阶段使用标签 ID 在现有安全组规则上添加标签:

aws ec2 create-tags                         \
        --resources sgr-abcdefghi01234561   \
        --tags "Key=usage,Value=bastion"

假设我的公司授权访问一组 EC2 实例,但仅当网络连接是从本地部署堡垒主机启动时才可以进行。安全组规则为 IpProtocol=tcp, FromPort=22, ToPort=22, IpRanges='[{1.2.3.4/32}]',其中 1.2.3.4 是本地部署堡垒主机的 IP 地址。可以在许多安全组中复制此规则。

如果本地部署堡垒主机 IP 地址发生变化怎么办? 我需要在所有受影响的规则中更改 IpRanges 参数。通过使用 usage: bastion 标记安全组规则,我现在可以使用 DescribeSecurityGroupRules API 操作列出我的 Amazon Web Services 账户安全组中使用的安全组规则,然后根据 usage: bastion 标签筛选结果。通过这样做,我能够快速识别想要更新的安全组规则。

aws ec2 describe-security-group-rules \
        --max-results 100 
        --filters "Name=tag-key,Values=usage" --filters "Name=tag-value,Values=bastion" 

这样我有了以下输出:

{
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-abcdefghi01234561",
            "GroupId": "sg-0xxx6",
            "GroupOwnerId": "40000000003",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 22,
            "ToPort": 22,
            "CidrIpv4": "1.2.3.4/32",
            "Tags": [
                {
                    "Key": "usage",
                    "Value": "bastion"
                }
            ]
        }
    ],
    "NextToken": "ey...J9"
}

像往常一样,您可以通过再次发出同一个 API 调用来管理结果分页,使用 --next-token 传递 NextToken 的值。

可用性
所有商业 Amazon Web Services 区域中的 VPC 安全组规则均可免费使用安全组规则 ID。

它可能看起来像一个小型递增变化,但这实际上为未来管理安全组和安全组规则的其他功能奠定了基础。请随时关注!