Merge "TLS Data Security Overview"
This commit is contained in:
commit
bae214f23c
16
specs/version0.5/tls-data-security-1.diag
Normal file
16
specs/version0.5/tls-data-security-1.diag
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
seqdiag {
|
||||||
|
span_height = 10;
|
||||||
|
=== If Certificate is pre-stored in Barbican ===
|
||||||
|
User => Octavia [label="Create LB with TLS (passing tls_certificate_id)", note="HTTPS", return="202/400/401"] {
|
||||||
|
Octavia => Barbican [label="Fetch Certificate Container", note="HTTPS", return="Certificate Data"];
|
||||||
|
}
|
||||||
|
=== If Certificate is passed directly to Octavia ===
|
||||||
|
User => Octavia [label="Create LB with TLS (passing tls_certificate, tls_private_key, etc)", note="HTTPS", return="
|
||||||
|
202/400/401"] {
|
||||||
|
Octavia => Barbican [label="Store Secrets / Certificate Container", note="HTTPS", return="tls_certificate_id"];
|
||||||
|
}
|
||||||
|
Octavia -> Octavia [label="Store tls_certificate_id"];
|
||||||
|
=== After certificate handling, in both cases ===
|
||||||
|
Octavia -> Octavia [label="Fetch Amphora from Spare Pool"];
|
||||||
|
Octavia => "Amphora API" [label="Configure Amphora", note="HTTPS", return="Update LB Status"];
|
||||||
|
}
|
29
specs/version0.5/tls-data-security-2.diag
Normal file
29
specs/version0.5/tls-data-security-2.diag
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
seqdiag {
|
||||||
|
span_height = 10;
|
||||||
|
activation = none;
|
||||||
|
=== In Octavia ===
|
||||||
|
Barbican;
|
||||||
|
Octavia => Nova [label="Create new Amphora", note="include Octavia Controller certificate and IP as Metadata"];
|
||||||
|
loop {
|
||||||
|
Octavia => Nova [label="Poll for ACTIVE Amphora", return="Amphora Management IP"];
|
||||||
|
}
|
||||||
|
Octavia -> Octavia [label="Store Amphora IP"];
|
||||||
|
=== Meanwhile, in the Amphora ===
|
||||||
|
Amphora -> Amphora [label="Generate private key and CSR"];
|
||||||
|
Amphora => Octavia [label="Request Certificate Signing", return = "Signed Certificate"] {
|
||||||
|
Octavia -> Octavia [label="Verify Amphora by source IP"];
|
||||||
|
Octavia => Barbican [label="Process CSR using private CA", return="Signed Certificate"];
|
||||||
|
}
|
||||||
|
Amphora -> Amphora [label="Start Services (API, Heartbeat)"];
|
||||||
|
"Amphora Heartbeat" -> Octavia [label="Announce", note="UDP? HTTPS?"] {
|
||||||
|
Octavia -> Octavia [label="Verify Amphora by source IP (UDP) or certificate (HTTPS)"];
|
||||||
|
=== If Verification fails ===
|
||||||
|
Octavia -> Octavia [label="Log and Ignore"];
|
||||||
|
=== If Verification succeeds ===
|
||||||
|
Octavia => "Amphora API" [label="Run Self-test"];
|
||||||
|
=== If Self-test fails ===
|
||||||
|
Octavia -> Octavia [label="Delete Amphora, retry process"];
|
||||||
|
=== If Self-test succeeds ===
|
||||||
|
Octavia -> Octavia [label="Add Amphora to standby pool"];
|
||||||
|
}
|
||||||
|
}
|
164
specs/version0.5/tls-data-security.rst
Normal file
164
specs/version0.5/tls-data-security.rst
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
==============================
|
||||||
|
TLS Data Security and Barbican
|
||||||
|
==============================
|
||||||
|
Launchpad blueprint:
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/octavia/+spec/tls-data-security
|
||||||
|
|
||||||
|
Octavia will have some need of secure storage for TLS related data. This BP is
|
||||||
|
intended to identify all of the data that needs secure storage, or any other
|
||||||
|
interaction that will require the use of Barbican or another secure solution.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
1. Octavia will support TLS Termination (including SNI), which will require us
|
||||||
|
to store and retrieve certificates and private keys from a secure repository.
|
||||||
|
|
||||||
|
2. Octavia will communicate with its Amphorae using TLS, so each Amphora
|
||||||
|
will need a certificate for the controller to validate.
|
||||||
|
|
||||||
|
3. Octavia will need TLS data for exposing its own API via HTTPS.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
The initial supported implementation for TLS related functions will be
|
||||||
|
Barbican, but the interface will be generic such that other implementations
|
||||||
|
could be created later.
|
||||||
|
|
||||||
|
.. seqdiag:: tls-data-security-1.diag
|
||||||
|
|
||||||
|
1. Create a CertificateManager interface for storing and retrieving certificate
|
||||||
|
and private key pairs (and intermediate certs / private key passphrase).
|
||||||
|
Users will pass their TLS data to Octavia in the form of a certificate_id,
|
||||||
|
which is a reference to their data in some secure service. Octavia will store
|
||||||
|
that certificate_id for each Listener/SNI and will retrieve the data when
|
||||||
|
necessary. (Barbican specific: users will need to add Octavia's user account as
|
||||||
|
an authorized user on the Container and all Secrets [1] so we catch fetch the
|
||||||
|
data on their behalf.)
|
||||||
|
|
||||||
|
We will need to validate the certificate data (including key and intermediates)
|
||||||
|
when we initially receive it, and will assume that it remains unchanged for
|
||||||
|
the lifespan of the LB (in Barbican the data is immutable so this is a safe
|
||||||
|
assumption, I do not know how well this will work for other services). In the
|
||||||
|
case of invalid TLS data, we will reject the request with a 400 (if it is an
|
||||||
|
initial create) or else put the LB into ERROR status (if it is on a failover
|
||||||
|
event or during some other non-interactive scenario).
|
||||||
|
|
||||||
|
.. seqdiag:: tls-data-security-2.diag
|
||||||
|
|
||||||
|
2. Create a CertificateGenerator interface to generate certificates from CSRs.
|
||||||
|
When an Amphora spins up, it will generate its own private key and CSR, then
|
||||||
|
contact the controller and request a signed certificate. The controller will
|
||||||
|
cause one to be generated [2] and return it to the Amphora (syncronous), which
|
||||||
|
will configure the Amphora API to listen using that certificate. All future
|
||||||
|
communications with the Amphora will do client certificate validation based on
|
||||||
|
our (private) certificate authority.
|
||||||
|
|
||||||
|
If we are unable to generate a certificate for the Amphora, we will respond
|
||||||
|
with a 503 and the Amphora will be expected to wait some configurable retry
|
||||||
|
period before trying again.
|
||||||
|
|
||||||
|
(The CertificateManager and CertificateGenerator interfaces are separate
|
||||||
|
because while Barbican can perform both functions, future implementations
|
||||||
|
may need to use two distinct services to achieve both.)
|
||||||
|
|
||||||
|
3. The key/cert for the main Octavia API/controller should be maintained
|
||||||
|
manually by the server operators using whatever configuration management
|
||||||
|
they choose. We should not need to use a specific external repo for this.
|
||||||
|
The trusted CA Cert will also need to be retrieved from barbican and manually
|
||||||
|
loaded in the config.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
We could skip the interface and just use Barbican directly, but that would be
|
||||||
|
diverging from what seems to be the accepted Openstack model for Secret Store
|
||||||
|
integration.
|
||||||
|
|
||||||
|
We could also store everything locally or in the DB, but that isn't a real
|
||||||
|
option for production systems because it is incredibly insecure (though there
|
||||||
|
will be a "dummy driver" that operates this way for development purposes).
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
Nothing new, the models for this should already be in place. Some of the
|
||||||
|
columns/classes might need to be renamed more generically (currently there is
|
||||||
|
a tls_container_id column, which would become tls_certificate_id to be more
|
||||||
|
generic).
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
There will need to be an API resource in the controller for the Amphora to
|
||||||
|
use when requesting a certificate. All further API based communication with
|
||||||
|
the Amphora will take place over HTTPS and validate the certificate of
|
||||||
|
both the server and the client.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
Using Barbican is considered secure.
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
None
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
None
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
Adding an external touchpoint (a certificate signing service) to the Amphora
|
||||||
|
spin-up workflow will increase the average time for readying an Amphora. This
|
||||||
|
shouldn't be a huge problem if the standby-pool size is sufficient for the
|
||||||
|
particular deployment.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
None
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
None
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
Adam Harwell (adam-harwell)
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
1. Create CertificateManager interface.
|
||||||
|
|
||||||
|
2. Create CertificateGenerator interface.
|
||||||
|
|
||||||
|
3. Create BarbicanCertificateManager implementation.
|
||||||
|
|
||||||
|
4. Create BarbicanCertificateGenerator implementation.
|
||||||
|
|
||||||
|
5. Create unit tests!
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
This script will depend on the OpenStack Barbican project, including some
|
||||||
|
features that are still only at the blueprint stage.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
There will be testing. Yes.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
Documentation changes will be primarily internal.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
.. line-block::
|
||||||
|
[1] https://review.openstack.org/#/c/127353/
|
||||||
|
[2] https://review.openstack.org/#/c/129048/
|
Loading…
Reference in New Issue
Block a user