默认添加到新的安全组的可配置安全组规则¶
https://bugs.launchpad.net/neutron/+bug/1983053
问题描述¶
对于每个项目,Neutron 始终会创建一个名为 default 的安全组。当首次使用安全组或通过 API 请求列出安全组时,它始终会被创建。对于每个这样的 default 安全组,Neutron 会自动创建 4 条硬编码规则。这些规则允许
所有
IPv4从端口发出的流量,所有
IPv6从端口发出的流量,所有
IPv4进入端口的流量,来自使用相同安全组的其他端口,所有
IPv6进入端口的流量,来自使用相同安全组的其他端口。
对于用户创建的任何其他安全组,Neutron 会自动创建 2 条规则,允许
所有
IPv4从端口发出的流量,所有
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。也可以使用特殊值 |
remote_address_group_id |
字符串 |
否 |
CR |
与此安全组规则关联的远程地址组 UUID。 |
protocol |
字符串 |
否 |
CR |
IP 协议可以用字符串、整数或 null 表示。有效的字符串或整数与 |
port_range_min |
字符串 |
否 |
CR |
安全组规则匹配的范围内的最小端口号。 |
port_range_max |
Integer |
否 |
CR |
安全组规则匹配的范围内的最大端口号。 |
remote_ip_prefix |
字符串 |
否 |
CR |
此安全组规则匹配的远程 IP 前缀。 |
standard_attr_id |
整数 |
是 |
R |
关联的标准属性记录的 ID。 |
used_in_default_sg |
布尔值 |
否 |
CR |
如果设置为 |
used_in_non_default_sg |
布尔值 |
否 |
CR |
如果设置为 |
安全影响¶
新的 API 默认情况下仅对管理员用户可用。
性能影响¶
无
实现¶
负责人¶
- 主要负责人
Slawek Kaplonski <skaplons@redhat.com> (IRC: slaweq)
工作项¶
REST API 更新。
数据库模式更新。
安全组数据库代码更新。
CLI 更新。
文档。
测试和 CI 相关更改。
测试¶
单元测试
API 测试
文档影响¶
用户文档¶
新的 API 必须在 Neutron API 参考文档中记录。