跳转到: 导航, 搜索

Network/LBaaS/docs/how-to-create-tls-loadbalancer

如何创建一个启用 TLS 的负载均衡器

以下文章将介绍设置负载均衡器以提供 TLS 终止流量所需的步骤。本文面向项目的当前状态,并将随着项目本身的发展而演变。

将讨论的一些内容是

  • Barbican devstack 设置
  • 证书和密钥生成
  • Barbican 密钥和容器操作
  • 负载均衡器创建
  • 验证设置


Neutron-LBaaS 使用 Barbican 作为其密钥存储库,需要进行一些设置,让我们开始吧。

首先,本文假设读者熟悉 Git、Openstack、Devstack 和其他相关工具和技术,以便开始使用。本文将不会介绍设置 Devstack、Openstack、Git 或任何相关内容。


Barbican Devstack

在 localrc 中的 lbaas 插件正上方添加 'enable_plugin barbican https://review.openstack.org/openstack/barbican',然后运行 stack.sh

./<devstack_dir>/stack.sh

创建证书链和密钥。

  • 以下内容可能比实际需要的更详细,请根据需要自由创建/检索证书/密钥/中间证书。
openssl genrsa -des3 -out ca.key 1024 
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt  
openssl x509  -in  ca.crt -out ca.pem 
openssl genrsa -des3 -out ca-int_encrypted.key 1024 
openssl rsa -in ca-int_encrypted.key -out ca-int.key 
openssl req -new -key ca-int.key -out ca-int.csr -subj "/CN=ca-int@acme.com" 
openssl x509 -req -days 3650 -in ca-int.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out ca-int.crt 
openssl genrsa -des3 -out server_encrypted.key 1024 
openssl rsa -in server_encrypted.key -out server.key 
openssl req -new -key server.key -out server.csr -subj "/CN=server@acme.com" 
openssl x509 -req -days 3650 -in server.csr  -CA ca-int.crt -CAkey ca-int.key -set_serial 01 -out server.crt

如果您还想测试 SNI,请创建至少另一个具有不同 CN 的证书链

openssl genrsa -des3 -out ca2.key 1024 
openssl req -new -x509 -days 3650 -key ca2.key -out ca2.crt  
openssl x509  -in  ca2.crt -out ca2.pem 
openssl genrsa -des3 -out ca-int_encrypted2.key 1024 
openssl rsa -in ca-int_encrypted2.key -out ca-int2.key 
openssl req -new -key ca-int2.key -out ca-int2.csr -subj "/CN=ca-int-test2@stacme.com" 
openssl x509 -req -days 3650 -in ca-int2.csr -CA ca2.crt -CAkey ca2.key -set_serial 01 -out ca-int2.crt 
openssl genrsa -des3 -out server_encrypted2.key 1024 
openssl rsa -in server_encrypted2.key -out server2.key 
openssl req -new -key server2.key -out server2.csr -subj "/CN=test2@stacme.com" 
openssl x509 -req -days 3650 -in server2.csr --CA ca-int2.crt -CAkey ca-int2.key -set_serial 01 -out server2.crt
  • 记下两个链的 CN,稍后用于验证 SNI

Barbican 密钥和容器

barbican secret store --payload-content-type='text/plain' --name='certificate' --payload="$(cat server.crt)"

barbican secret store --payload-content-type='text/plain' --name='private_key' --payload="$(cat server.key)"

barbican secret container create --name='tls_container' --type='certificate' --secret="certificate=$(barbican secret list | awk '/ certificate / {print $2}')" --secret="private_key=$(barbican secret list | awk '/ private_key / {print $2}')"

添加第二个证书链以测试 SNI

barbican secret store --payload-content-type='text/plain' --name='certificate2' --payload="$(cat server2.crt)"

barbican secret store --payload-content-type='text/plain' --name='private_key2' --payload="$(cat server2.key)"

barbican secret container create --name='tls_container2' --type='certificate' --secret="certificate=$(barbican secret list | awk '/ certificate2 / {print $2}')" --secret="private_key=$(barbican secret list | awk '/ private_key2 / {print $2}')"

更新 neutron 配置

在 /etc/neutron/neutron_lbaas.conf 中添加或更新 'service_auth' 组

auth_uri = https://:35357/v2.0
admin_tenant_name = admin
admin_user = admin
admin_password = password
auth_version = 2
  • 所需的值可能与您的特定 devstack 安装不同,请确保使用这些值。
  • 需要重新启动 neutron-server 和 neutron-lbaasv2-agent 以获取更改
    • 注意:在撰写本文时,devstack 插件无法正确加载此配置,因此您必须在重新启动服务时添加命令行参数以加载它。

更新 octavia 配置。

在 'certificates' 组中更改 cert_manager

cert_manager=barbican_cert_manager
  • 所需的值可能与您的特定 devstack 安装不同,请确保使用这些值。
  • 需要重新启动 Octavia 控制器工作器 ('o-cw') 以获取更改

创建 nova 实例

创建成员以进行简单测试(基本的 devstack cirros 实例)

nova keypair-add default --pub-key ~/.ssh/id_rsa.pub 
nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
nova secgroup-add-rule default tcp 80 80 0.0.0.0/0
nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
nova boot --image $(nova image-list | grep -o cirros.*-disk) --flavor 2 --nic net-id=$(neutron net-list | awk '/ private / {print $2}') member1 --security-groups default --key-name default

添加另一个成员以进行负载均衡测试(基本的 devstack cirros 实例)

nova boot --image $(nova image-list | grep -o cirros.*-disk) --flavor 2 --nic net-id=$(neutron net-list | awk '/ private / {print $2}') member2 --security-groups default --key-name default

创建启用 TLS 的负载均衡器

neutron lbaas-loadbalancer-create $(neutron subnet-list | awk '/ private-subnet / {print $2}') --name lb1

创建不使用 SNI 的 TLS 监听器

neutron lbaas-listener-create --loadbalancer lb1 --protocol-port 443 --protocol TERMINATED_HTTPS --name listener1 --default-tls-container=$(barbican secret container list | awk '/ tls_container / {print $2}')

创建使用 TLS 和 SNI 的监听器

neutron lbaas-listener-create --loadbalancer lb1 --protocol-port 443 --protocol TERMINATED_HTTPS --name listener1 --default-tls-container=$(barbican secret container list | awk '/ tls_container / {print $2}') --sni-container $(barbican secret container list | awk '/ tls_container2 / {print $2}')

创建池

neutron lbaas-pool-create --name pool1 --protocol HTTP --listener listener1 --lb-algorithm ROUND_ROBIN

创建成员

neutron lbaas-member-create pool1 --address $(nova show member1 | awk '/private network/ {a = substr($5, 0, length($5)-1); if (a ~ "\\.") print a; else print $6}')  --protocol-port 80 --subnet $(neutron subnet-list | awk '/ private-subnet / {print $2}') 

neutron lbaas-member-create pool1 --address $(nova show member2 | awk '/private network/ {a = substr($5, 0, length($5)-1); if (a ~ "\\.") print a; else print $6}')  --protocol-port 80 --subnet $(neutron subnet-list | awk '/ private-subnet / {print $2}') 

测试

  • 对于一个简单的示例,我们的成员可以运行一个简单的 Web 服务器 
while true; do echo -e 'HTTP/1.0 200 OK\r\n\r\nIt Works member<N>!' | sudo nc -l -p 80 ; done 


验证响应

curl -k https://$(neutron lbaas-loadbalancer-list | awk '/ lb1 / {print $6}')

应该得到

It Works member<N>!

验证 SNI

openssl s_client -servername test2@stacme.com -connect $(neutron lbaas-loadbalancer-list | awk '/ lb1 / {print $6}'):443

证书信息应打印到屏幕上,验证 CN 是否与传递给 '-servername' 的 CN 匹配