默认添加到新的安全组的可配置安全组规则

https://bugs.launchpad.net/neutron/+bug/1983053

问题描述

对于每个项目,Neutron 始终会创建一个名为 default 的安全组。当首次使用安全组或通过 API 请求列出安全组时,它始终会被创建。对于每个这样的 default 安全组,Neutron 会自动创建 4 条硬编码规则。这些规则允许

  1. 所有 IPv4 从端口发出的流量,

  2. 所有 IPv6 从端口发出的流量,

  3. 所有 IPv4 进入端口的流量,来自使用相同安全组的其他端口,

  4. 所有 IPv6 进入端口的流量,来自使用相同安全组的其他端口。

对于用户创建的任何其他安全组,Neutron 会自动创建 2 条规则,允许

  1. 所有 IPv4 从端口发出的流量,

  2. 所有 IPv6 从端口发出的流量,

这种方法至少存在一些问题

  • 众所周知,带有 remote_group_id 的安全组规则(上述规则 3 和 4)不能很好地扩展,例如在 neutron-openvswitch-agent 中 [1]

  • 一些操作员希望为每个新项目定义不同的默认创建规则。

当然,Neutron 默认创建的这些规则可以很容易地被安全组所有者删除,但是能够定义添加到每个安全组的不同的规则集可以使云用户和管理员更容易使用。

提议的变更

为了解决上述问题,建议引入新的 API 来创建 security group rules template,用于为每个新安全组创建新的安全组规则。为了与现有的硬编码规则保持向后兼容,默认情况下 Neutron 将配置与今天硬编码的相同的 4 条规则(参见上述详细信息)。云管理员可以删除这些规则并创建新的规则,然后 Neutron 将使用这些规则来处理每个新的安全组。如果 default_security_group_rule 列表为空,则将创建新的安全组,而不会创建任何默认规则。

REST API 影响

将引入一个新的 API 资源,称为 default_security_group_rule。API 的详细信息如下

  • GET /v2.0/default-security-group-rules

    列出用于为每个新的安全组创建规则的默认安全组规则

    响应

    {
      "default_security_group_rules": [
      {
          "direction": "egress",
          "ethertype": "IPv6",
          "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
          "port_range_max": null,
          "port_range_min": null,
          "protocol": null,
          "remote_group_id": null,
          "remote_address_group_id": null,
          "remote_ip_prefix": null,
          "used_in_default_security_group": True,
          "used_in_non_default_security_group": True,
          "description": ""
      },
      {
          "direction": "egress",
          "ethertype": "IPv4",
          "id": "93aa42e5-80db-4581-9391-3a608bd0e448",
          "port_range_max": null,
          "port_range_min": null,
          "protocol": null,
          "remote_group_id": null,
          "remote_address_group_id": null,
          "remote_ip_prefix": null,
          "used_in_default_security_group": True,
          "used_in_non_default_security_group": True,
          "description": ""
      },
      {
          "direction": "ingress",
          "ethertype": "IPv6",
          "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
          "port_range_max": null,
          "port_range_min": null,
          "protocol": null,
          "remote_group_id": "PARENT",
          "remote_address_group_id": null,
          "remote_ip_prefix": null,
          "used_in_default_security_group": True,
          "used_in_non_default_security_group": False,
          "description": ""
      },
      {
          "direction": "ingress",
          "ethertype": "IPv4",
          "id": "93aa42e5-80db-4581-9391-3a608bd0e448",
          "port_range_max": null,
          "port_range_min": null,
          "protocol": null,
          "remote_group_id": "PARENT",
          "remote_address_group_id": null,
          "remote_ip_prefix": null,
          "used_in_default_security_group": True,
          "used_in_non_default_security_group": False,
          "description": ""
      },
      {
          "direction": "ingress",
          "ethertype": "IPv6",
          "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
          "port_range_max": 22,
          "port_range_min": 22,
          "protocol": null,
          "remote_group_id": null,
          "remote_address_group_id": null,
          "remote_ip_prefix": null,
          "used_in_default_security_group": False,
          "used_in_non_default_security_group": True,
          "description": "Allow SSH connections over IPv6"
      },
      {
          "direction": "ingress",
          "ethertype": "IPv4",
          "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
          "port_range_max": 22,
          "port_range_min": 22,
          "protocol": null,
          "remote_group_id": null,
          "remote_address_group_id": null,
          "remote_ip_prefix": null,
          "used_in_default_security_group": False,
          "used_in_non_default_security_group": True,
          "description": "Allow SSH connections over IPv4"
      }]
    }
    
  • POST /v2.0/default-security-group-rules

    创建用于为每个新的安全组创建规则的默认安全组规则

    请求

    {
      "default_security_group_rule": {
        "direction": "ingress",
        "port_range_min": "80",
        "ethertype": "IPv4",
        "port_range_max": "80",
        "protocol": "tcp",
      }
    }
    

    响应

    {
      "default_security_group_rule": {
        "direction": "ingress",
        "ethertype": "IPv4",
        "id": "2bc0accf-312e-429a-956e-e4407625eb62",
        "port_range_max": 80,
        "port_range_min": 80,
        "protocol": "tcp",
        "remote_group_id": null,
        "remote_address_group_id": null,
        "remote_ip_prefix": null,
        "used_in_default_security_group": False,
        "used_in_non_default_security_group": True,
        "description": ""
      }
    }
    
  • GET /v2.0/default-security-group-rules/{rule_id}

    显示用于为每个新的安全组创建规则的默认安全组规则

    响应

    {
      "security_group_rule": {
        "direction": "egress",
        "ethertype": "IPv6",
        "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
        "port_range_max": null,
        "port_range_min": null,
        "protocol": null,
        "remote_group_id": null,
        "remote_address_group_id": null,
        "remote_ip_prefix": null,
        "used_in_default_security_group": False,
        "used_in_non_default_security_group": True,
        "description": ""
      }
    }
    
  • DELETE /v2.0/default-security-group-rules/{rule_id}

    删除用于为每个新的安全组创建规则的默认安全组规则

数据库影响

默认安全组规则数据库表

属性

类型

必需

CRUD

描述

id

uuid-str

R

默认安全组规则的 ID。

direction

字符串

CR

安全组规则应用的方向。

ethertype

字符串

CR

必须是 IPv4 或 IPv6。

remote_group_id

字符串

CR

与此安全组规则关联的远程组 UUID。也可以使用特殊值 PARENT,这意味着始终使用将在其中创建该规则的安全组的 ID。

remote_address_group_id

字符串

CR

与此安全组规则关联的远程地址组 UUID。

protocol

字符串

CR

IP 协议可以用字符串、整数或 null 表示。有效的字符串或整数与 security group rule 相同。

port_range_min

字符串

CR

安全组规则匹配的范围内的最小端口号。

port_range_max

Integer

CR

安全组规则匹配的范围内的最大端口号。

remote_ip_prefix

字符串

CR

此安全组规则匹配的远程 IP 前缀。

standard_attr_id

整数

R

关联的标准属性记录的 ID。

used_in_default_sg

布尔值

CR

如果设置为 True,则该规则将用于为自动为每个项目创建的 default 安全组的模板。默认值为 False

used_in_non_default_sg

布尔值

CR

如果设置为 True,则该规则将用于为每个 non default 安全组的模板。默认值为 False

安全影响

新的 API 默认情况下仅对管理员用户可用。

性能影响

实现

负责人

主要负责人

Slawek Kaplonski <skaplons@redhat.com> (IRC: slaweq)

工作项

  • REST API 更新。

  • 数据库模式更新。

  • 安全组数据库代码更新。

  • CLI 更新。

  • 文档。

  • 测试和 CI 相关更改。

测试

  • 单元测试

  • API 测试

文档影响

用户文档

新的 API 必须在 Neutron API 参考文档中记录。

参考资料