Internal OpenStack endpoints encryption spec
An initial specification of the internal TLS implementation for kolla, describing https://etherpad.openstack.org/p/kolla-internal-tls and https://blueprints.launchpad.net/kolla-ansible/+spec/add-ssl-internal-network Change-Id: I5a42226b724affad2dc12390e345336f375c7a57
This commit is contained in:
parent
048e8f80c6
commit
ab88284943
140
specs/internal-tls-endpoints.rst
Normal file
140
specs/internal-tls-endpoints.rst
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
..
|
||||||
|
This template should be in ReSTructured text. The filename in the git
|
||||||
|
repository should match the launchpad URL, for example a URL of
|
||||||
|
https://blueprints.launchpad.net/kolla/+spec/awesome-thing should be named
|
||||||
|
awesome-thing.rst . Please do not delete any of the sections in this
|
||||||
|
template. If you have nothing to say for a whole section, just write: None
|
||||||
|
For help with syntax, see http://www.sphinx-doc.org/en/stable/rest.html
|
||||||
|
To test out your formatting, see http://www.tele3.cz/jbar/rest/rest.html
|
||||||
|
|
||||||
|
==================================
|
||||||
|
Enable TLS for OpenStack endpoints
|
||||||
|
==================================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/kolla-ansible/+spec/add-ssl-internal-network
|
||||||
|
|
||||||
|
This proposal describes implementation of the internal TLS encryption for
|
||||||
|
OpenStack services deployed with kolla-ansible, i.e. adding support to make
|
||||||
|
OpenStack internal and admin endpoints encrypted, as well as encrypting traffic
|
||||||
|
between HAProxy and OpenStack services. Other services that are are out of scope of this
|
||||||
|
document. Also, more workflows (using company CA, using certificates already
|
||||||
|
provisioned on the hosts) are out of the scope, and shall be discussed separately.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
Kolla-ansible can only enable TLS encryption on the external OpenStack
|
||||||
|
endpoints, and both internal and admin endpoints are unencrypted, leaving
|
||||||
|
inter-service communication unsecured. However, some deployments may require an
|
||||||
|
end-to-end encryption for all the traffic, which is currently not possible.
|
||||||
|
|
||||||
|
|
||||||
|
Use cases
|
||||||
|
---------
|
||||||
|
1. There is an external requirement for the deployment to support end-to-end
|
||||||
|
encryption of passwords, or all traffic.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
This spec proposes extending the encryption to internal TLS traffic between
|
||||||
|
services by allowing operator to provide a separate set of HAProxy
|
||||||
|
certificates, that can be used to enable HTTPS encryption on the internal and
|
||||||
|
admin endpoints, as well as encrypting backend traffic from HAProxy to
|
||||||
|
OpenStack services. Optionally, a support for self-signed certificates can be
|
||||||
|
extended, so that deployment can be done without certificates signed by a
|
||||||
|
trusted CA, while still validating the backend connections.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Implementing this spec will allow operators to deploy OpenStack with end-to-end
|
||||||
|
encryption of the control plane, preventing exposure of passwords and tokens.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Enabling TLS for all inter-service communication will have a small but
|
||||||
|
measurable impact, due to the requirements for the TLS handshake for each API
|
||||||
|
call. It's not clear whether OpenStack services can be configured to keep their
|
||||||
|
HTTP sessions alive, lowering the impact of that change.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
An alternate approach has been suggested [1]_, where HAProxy terminates all TLS
|
||||||
|
traffic, and then either speaks to the localhost backend over unencrypted
|
||||||
|
connection, or proxies the request to another HAProxy if the local backend is
|
||||||
|
down. However, the concern has been raised that this approach would not be
|
||||||
|
enough to satisfy requirements of some operators. Additionally, the
|
||||||
|
implementation proposed by this document seems more in line with how backend
|
||||||
|
TLS is implemented by other deployment methods like openstack-ansible [2]_.
|
||||||
|
|
||||||
|
.. [1] https://review.opendev.org/#/c/548407/
|
||||||
|
.. [2] https://docs.openstack.org/openstack-ansible-haproxy_server/pike/configure-haproxy.html, search for `haproxy_backend_ssl`
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
[TBD]
|
||||||
|
|
||||||
|
Milestones
|
||||||
|
----------
|
||||||
|
|
||||||
|
[TBD]
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
1. Implement frontend encryption for internal and admin endpoints:
|
||||||
|
- Allow for distinct internal and external certificates
|
||||||
|
- Add support for merging public and internal/admin networks by reusing
|
||||||
|
same endpoints.
|
||||||
|
- Support existing deployments by setting correct defaults that behave as
|
||||||
|
in stein.
|
||||||
|
2. Implement per-service backend TLS encryption
|
||||||
|
- Introduce per-service ansible variables to control backend TLS encryption
|
||||||
|
- Pass the variable to the HAProxy template via the haproxy data structure
|
||||||
|
in service's defaults/main.yaml
|
||||||
|
- based on the variable generate backend configuration with/without
|
||||||
|
encryption.
|
||||||
|
3. Add support for using self-signed/untrusted certificates both for frontend
|
||||||
|
and backend connections.
|
||||||
|
- Change all authorization configs to add `insecure` parameter, which optionally
|
||||||
|
disables certificate verification.
|
||||||
|
- Ensure that all tasks that interact with OpenStack APIs support disabling
|
||||||
|
certificate verification.
|
||||||
|
- Fix heat-api bootstrap process, which currently requires valid certficate,
|
||||||
|
probably by moving domain/user creation out of the container, and into the
|
||||||
|
ansible itself.
|
||||||
|
- Allow for providing a CA used to verify connections to the service backends.
|
||||||
|
- Change the process of generating self-signed certificates to use a single
|
||||||
|
CA for both external and internal connections, and use that CA for
|
||||||
|
validating backends.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
A new test scenario will be implemented that does the deployment with internal
|
||||||
|
and external TLS enabled, running the same set of tests as now, but over
|
||||||
|
encrypted connection.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
Documentation has to be expanded, describing TLS requirements for the internal
|
||||||
|
certificate, as well as all ansible variables used to configure TLS settings
|
||||||
|
for the deployment.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
None
|
Loading…
Reference in New Issue
Block a user