Neutron/LBaaS/SSL
目录
描述
在负载均衡器上终止 TLS 连接并加密回后端节点的流量,是现代负载均衡器所期望的功能,并集成到许多应用程序中。此功能能够更好地管理证书并改进基于应用程序的负载均衡(例如,基于 cookie 的持久性、L7 策略等)。
为了赋予 LBaaS TLS 终止能力,将添加一个新的扩展,称为 TLS。
概述
- 租户将使用 Barbican 管理其 TLS 证书。证书将存储在 Barbican 安全容器中
- 租户将使用 Neutron 管理其 TLS 策略。策略将存储在 neutron 模式中
- 除了现有的 HTTP、HTTPS 和 TCP 之外,将为 VIP 监听器创建添加新的协议 TLS
- 对于租户来说,使用 TLS 作为协议创建 VIP 监听器意味着希望卸载传入的加密流量和/或加密到后端服务器的传出流量。
- 在使用 TLS 协议创建 VIP 监听器时
- 不必提供 TLS 策略 - 将实现默认行为,可以在 neutron 配置文件中进行部分配置
- 前端 TLS 卸载已启用,后端重新加密已禁用 - 作为代码中的默认行为硬编码
- 前端/后端支持的协议和密码套件列在 neutron 配置文件中。这可以通过 neutron 配置文件进行编辑
- 如果没有关联的策略并且默认行为生效 - 租户必须为前端卸载提供默认 TLS 证书
- 如果关联了策略并且该策略禁用了前端卸载但启用了后端重新加密 - 租户不得为前端卸载提供默认 TLS 证书
- SNI 证书不是必须指定的
- SNI 证书列表的指定方式和处理建议发布在“SNI 证书列表的指定和处理建议”部分,应进行讨论
- 不必提供 TLS 策略 - 将实现默认行为,可以在 neutron 配置文件中进行部分配置
- 前端证书的证书链在本阶段将不受支持
- 前端客户端身份验证和后端服务器身份验证在本阶段将不受支持
在上述条件下,以下是基本的租户用例的描述 - 创建具有 TLS 卸载的 VIP 监听器
- 创建 TLS 作为监听器协议的 VIP 监听器
- 通过提供 Barbican 的 TLS 证书容器 ID 来指定前端卸载的默认 TLS 证书
结果,VIP 监听器已创建,使用默认租户的 TLS 证书卸载前端加密流量,不加密到后端的流量。
Neutron LBaaS 与 Barbican API 的需求
- 需要 API 来获取整个 TLS 证书容器,包括私钥,通过容器 ID
- 需要 API 来获取 TLS 证书 x.509 证书
用户体验
TLS 证书管理
TLS 证书将存储在 Barbican 证书容器中,其中包含 TLS 证书本身及其私钥。我们还应检查使用 Barbican 执行证书签名请求的必要性。
租户将能够使用 Barbican 创建(添加)、删除(删除)和更新 TLS 证书
创建 TLS 证书(使用 Barbican)
- 名称:文本字段
- 描述:文本字段
- 证书:PEM 文件名
- 私钥:PEM 文件名(可选)
- 密码短语:文本字段(可选)
删除 TLS 证书(使用 Barbican)
在确认后进行。正在被 VIP 监听器/s 使用的证书无法删除
更新 TLS 证书(使用 Brbican)
- 只能修改名称和描述
Note: If changed certificate is associated with VIP listener(s), each back-end service provider (driver) should make any required changes
TLS 策略管理
- TLS 策略将存储在 neutron 模式中
- 租户将能够“添加”(创建)、“删除”(删除)和更新 TLS 策略。
- 默认 TLS 策略行为描述
- 前端卸载已启用(硬编码)
- 默认前端支持的协议 - SSL v3.0、TLS v1.0、TLS v1.2(可通过 neutron 配置文件配置)
- 默认前端支持的密码套件 - OpenSSL LOW 密码套件组(可通过 neutron 配置文件配置)
- 后端重新加密已禁用(硬编码)
- 默认后端支持的协议 - SSL v3.0、TLS v1.0、TLS v1.2(可通过 neutron 配置文件配置)
- 默认后端支持的密码套件 - OpenSSL LOW 密码套件组(可通过 neutron 配置文件配置)
- 建议使用 OpenSSL 密码套件组(all、low、medium、high)作为定义密码套件的选项
https://www.openssl.org/docs/apps/ciphers.html
- (待定) 我们也可能允许租户选择编译自己的密码套件组
创建 TLS 策略
Note: 1.Policy with both, front-end offloading and back-end re-encryption, disabled - is invalid 2.When creating TLS policy ,default values for all parameters are derived from the default TLS policy behavior (described above).
- 名称:文本字段
- 描述:文本字段
- 启用前端卸载:复选框(需要指定默认 TLS 证书)
- 启用后端加密:复选框
- 前端支持的协议:从选项列表中进行多项选择(SSL v3.0、TLS v1.0、TLS v1.2),至少应选择一个
- 前端支持的密码套件:单选按钮,4 个选项
- ALL:(OpenSSL ALL 密码组)
- LOW(OpenSSL LOW 密码组)
- MEDIUM(OpenSSL MEDIUM 密码组)
- HIGH(OpenSSL HIGH 密码组)
- 后端支持的协议:从选项列表中进行多项选择(SSL v3.0、TLS v1.0、TLS v1.2),至少应选择一个
- 后端支持的密码套件:单选按钮,4 个选项(与前端类似)
删除 TLS 策略
像往常一样,在确认后进行。正在被 VIP 监听器/s 使用的策略无法删除
更新 TLS 策略
- 只能修改前端和后端协议以及密码套件组
- 不支持更改前端卸载和后端重新加密功能
Note: If changed policy is associated with VIP listener(s), each back-end service provider should perform any required changes
VIP 监听器创建
VIP 监听器当前有 3 种协议可供选择(HTTP、HTTPS、TCP)。建议使用新的协议 - TLS,它将用于解决使用证书和策略进行前端或/和后端加密的情况。
TLS 的 VIP 监听器创建场景
默认情况下,不需要 TLS 策略关联,概述部分中描述的默认策略行为将生效。租户可以关联 TLS 策略以获得不同的行为,但不必这样做。如果策略启用了前端卸载,则租户必须为前端卸载提供默认 TLS 证书。租户还可以提供 SNI 的 TLS 证书列表,但不必这样做。
SNI 证书指定及其 LBaaS 提供商处理的建议
1. 排序的证书列表。
租户将创建 TLS 证书列表并能够控制其顺序。
对于传入流量卸载,选择 TLS 证书的步骤如下(直到找到第一个匹配项):
- 从第一个到最后一个(从上到下)扫描列表,并检查域名是否与证书的主机名完全匹配
- 从第一个到最后一个(从上到下)扫描列表,并检查域名是否与证书的主机名正则表达式匹配
- 从第一个到最后一个(从上到下)扫描列表,并检查域名是否与证书的任何一个替代主机名匹配
- 未找到匹配项? - 使用默认证书
2. 证书列表
租户将创建 TLS 证书列表。
- 通过扫描列表直到找到第一个匹配项来完成传入流量卸载的 TLS 证书选择
- 未找到匹配项? - 使用默认证书
3. (证书,主机名/模式列表):示例:( (amazon_cert_id, [*amazon.com, *amazon1.com]), (acme_cert_id, [acme.com]) )
租户将创建 TLS 证书条目以及与该特定证书相关联的主机名/模式列表。
对于传入流量卸载,选择 TLS 证书的步骤如下(直到找到第一个匹配项):
- 从第一个到最后一个(从上到下)扫描列表,并检查域名是否与任何一个主机名/模式匹配
- 未找到匹配项? - 使用默认证书
Note: this can not be supported by Radware LBaaS provider
VIP 监听器(使用 TLS 协议)更新
- TLS 策略和证书设置仅适用于具有 TLS 作为协议的 VIP 监听器
- 建议废弃现有 VIP 监听器的 TLS 策略更改,因为
不同的策略可能会为前端卸载和/或后端重新加密指定不同的行为。这将需要对提供商的后端系统进行彻底的重新配置,这似乎对于这种用例来说是不合理的。租户可能应该使用不同的 TLS 前端卸载和后端重新加密设置创建新的 VIP 监听器。
API 变更
- 将向 LBaaS 插件 API 添加 TLS 策略 CRUD
- 由于 TLS 卸载功能是 LBaaS 的核心功能,因此 VIP 监听器 TLS 设置 API 将合并到现有的 LBaaS 插件 API 中
资源变更
- VIP 监听器资源将使用新的
- TLS 策略(可选)
- 默认 TLS 证书(可选)
- 与 SNI 证书列表的关联链接 - SNI 证书将保存在新的关联表中
- TLS 策略(新实体)
- front-end-offloading:bool
- front-end-protocols:逗号分隔值的列表,来自允许值的列表(SSLv3、TLSv1、TLSv1.2),默认=None
- front-end-cipher_suites:逗号分隔值的列表
- 格式 - <密钥交换算法>_<批量加密算法>_<消息认证码>_<伪随机函数>
- back-end-encryption:bool
- back-end-protocols:<与前端相同的格式>
- back-end-cipher_suites:<与前端相同的格式>
数据模型变更
- VIP 监听器实体将使用新的可选 TLS 策略和 TLS 默认证书字段进行修改。
- tls_policy_id(字符串 36)
- default_tls-certificate_id(字符串 36)- Barbican 的证书容器 ID
- tls_policy(新表)
- tls_policy_id(字符串 36)
- tls_policy_name(字符串 64)
- tls_policy_description(字符串 256)
- front_end_offloading(bool)
- front_end_protocols(字符串 32)
- front_end_cipher_suites(字符串 512)
- back_end_encryption_enabled(bool)
- back_end_protocols(字符串 32)
- back_end_cipher_suites(字符串 512)
- vip_listener_sni_certificate_assoc - N:M(新的关联表)
- vip_listener_id(字符串 36)
- tls_certificate_id(字符串 36)
DB 迁移
DB 迁移需要
- VIP 监听器新列 - 现有行将填充为 null
- TLS 策略的新表
- SNI 证书关联到 VIP 监听器的新表
CLI 示例
- VIP 监听器创建使用 TLS 协议(默认行为)
lb-vip-listener-create --subnet-id <subnet-id> --protocol TLS --protocol-port 443 --tls_default_certificate <barbican certificate container id> --name <name> [--address <address>] ...<usual CLI options>
- VIP 监听器创建使用 TLS 协议和 SNI 证书列表(使用 TLS 策略,前端卸载已启用,后端重新加密已启用)
lb-vip-listener-create --subnet-id <subnet-id> --protocol TLS --protocol-port 443 --tls_policy policy_with_front_end_offloading_enabled_id --tls_default_certificate <barbican certificate container id> --tls_sni_certificates certificate_1, certificate_2, certificate_3 --name <name> [--address <address>] ...<usual CLI options>
- VIP 监听器创建使用 TLS 协议(使用 TLS 策略,前端卸载已禁用,后端重新加密已启用)
lb-vip-listener-create --subnet-id <subnet-id> --protocol TLS --protocol-port 443 --tls_policy policy_with_front_end_offloading_disabled_id --name <name> [--address <address>] ...<usual CLI options>
- TLS 策略创建(前端卸载和后端重新加密均已启用)
lb-tls-policy-create --front-end-termination type=dict enabled=true protocols=SSLv3,TLSv1,TLSv1.2 cipher-suites=DES-CBC-SHA,EXP-DES-CBC-SHA, ... --back-end-termination type=dict enabled=true protocols=SSLv3,TLSv1,TLSv1.2 cipher-suites=DES-CBC-SHA,EXP-DES-CBC-SHA, ... MY_POLICY
- 使用不同的协议更新 MY_POLICY 策略(无 SSLv3)
lb-tls-policy-update --policy_id MY_POLICY_ID --front-end-termination type-dict protocols=TLSv1,TLSv1.2 --back-end-termination type=dict protocols=TLSv1,TLSv1.1
- 删除 MY_POLICY
lb-tls-policy-delete --policy_id MY_POLICY_ID
- 列出策略
lb-tls-policy-list
- 显示策略
lb-tls-policy-show --policy_id
TLS 证书管理将通过 Barbican CLI 提供
<待扩展>
实施计划
- 创建名为“tls”的新扩展,其中包含新的 TLS 实体
- 将新的 TLS 策略 CRUD API 实现到 LBaaS 插件
- 实现 DB 模式的更改
- 为新的 TLS 扩展资源实现单元测试
- 为新的 TLS DB mixin 实现单元测试
- 与 Barbican 证书存储 API 集成
- 修改 LBaaS HA-Proxy 驱动程序以支持 TLS 扩展
- 将 HA-Proxy 更新到版本 1.5 {待定}
支持矩阵
| 提供商 | 协议 | 密码套件 | 证书链 | FE 客户端身份验证。 | BE 身份验证。 | SNI |
|---|---|---|---|---|---|---|
| HAProxy 1.5 | SSLv3, TLSv1 | 与 OpenSSL 相同 | Yes | 否 | 否 | Yes |
| Amazon EC2 | SSLv2, SSLv3, TLSv1, TLSv1.1, TLSv1.2 | 与 OpenSSL 相同 | 否 | Yes | 否 | 否 |
| OpenStack | SSLv2, SSLv3, TLSv1, TLSv1.1, TLSv1.2 | 与 OpenSSL 相同 | 阶段 2 | 阶段 2 | 阶段 2 | Yes |