Merge "Review TLS page"
This commit is contained in:
@@ -5,179 +5,266 @@ Managing TLS certificates
|
|||||||
Overview
|
Overview
|
||||||
--------
|
--------
|
||||||
|
|
||||||
The preferred way to provide your charmed OpenStack deployment with
|
The encryption of API endpoints in an OpenStack cloud requires a method for the
|
||||||
certificates for enabling transport layer security (TLS) is to add a
|
creation and distribution of TLS certificates, as well as the management of a
|
||||||
certificate authority to your model. The charms consume the certificates
|
certificate authority (CA). Charmed OpenStack supports two ways of doing this:
|
||||||
through the `tls-certificates relation`_ and we do our validation using the
|
|
||||||
`Vault charm`_.
|
|
||||||
|
|
||||||
Enabling Vault certificate management
|
#. on a per-model basis (using the vault application)
|
||||||
-------------------------------------
|
#. on a per-application basis (using charm configuration options)
|
||||||
|
|
||||||
OpenStack charms providing an API service have a new 'certificates' relation.
|
.. note::
|
||||||
Adding this relation will trigger the OpenStack charm to request
|
|
||||||
certificates and keys from vault. Once vault has provided these the charm
|
|
||||||
will install them and switch to listening on https, the catalogue will also be
|
|
||||||
updated.
|
|
||||||
|
|
||||||
.. code-block:: none
|
The recommended way to manage TLS in Charmed OpenStack is with Vault. It is
|
||||||
|
a centrally managed encryption solution, it is designed for the task, and it
|
||||||
|
integrates well with charms.
|
||||||
|
|
||||||
juju add-relation keystone:certificates vault:certificates
|
Certificate management with Vault
|
||||||
juju add-relation glance:certificates vault:certificates
|
---------------------------------
|
||||||
juju add-relation cinder:certificates vault:certificates
|
|
||||||
juju add-relation nova-cloud-controller:certificates vault:certificates
|
|
||||||
juju add-relation neutron-api:certificates vault:certificates
|
|
||||||
...
|
|
||||||
|
|
||||||
Adding a Certificate Authority (CA) certificate to Vault
|
First ensure that Vault is deployed to the model containing the cloud and the
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
required post-deployment steps have been completed. See the `vault`_ charm
|
||||||
|
README for instructions.
|
||||||
|
|
||||||
|
The next step is to add a CA certificate to the model.
|
||||||
|
|
||||||
|
Add a CA certificate
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
For Vault to be able to issue certificates on your behalf you must equip it
|
For Vault to be able to issue certificates on your behalf you must equip it
|
||||||
with a CA certificate.
|
with a CA certificate. This is done in **one** of two ways:
|
||||||
|
|
||||||
You can either add your own intermediate CA certificate to Vault or have Vault
|
#. a Vault-generated self-signed root CA certificate
|
||||||
generate a self-signed root CA certificate for you.
|
#. a third-party intermediate CA certificate
|
||||||
|
|
||||||
Generate self-signed root CA certifitcate
|
The Vault method is by far the simpler of the two.
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
To have Vault generate a self-signed root CA certificate for you:
|
Self-signed root CA certificate
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
To have Vault generate a self-signed root CA certificate:
|
||||||
|
|
||||||
.. code-block:: none
|
.. code-block:: none
|
||||||
|
|
||||||
juju run-action --wait vault/leader generate-root-ca
|
juju run-action --wait vault/leader generate-root-ca
|
||||||
|
|
||||||
Add your own intermediate CA certificate
|
You're done.
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
Currently, the only supported workflow is for Vault to generate a Certificate
|
Third-party intermediate CA certificate
|
||||||
Signing Request (CSR) for an intermediate CA. This CSR then needs to be signed
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
by an external CA. The resulting signed intermediate CA certificate is then
|
|
||||||
uploaded to Vault along with any certificates to support the certificate chain.
|
|
||||||
|
|
||||||
Retrieve CSR from Vault
|
The supported workflow for a third-party certificate involves three steps:
|
||||||
.......................
|
|
||||||
|
|
||||||
Run the *get-csr* action against the lead unit of the vault application:
|
#. retrieve a Certificate Signing Request (CSR) for an intermediate CA from
|
||||||
|
Vault
|
||||||
|
#. transfer the CSR to an external CA to have a signed certificate created
|
||||||
|
#. upload certificate information to Vault
|
||||||
|
|
||||||
|
Retrieve a CSR from Vault
|
||||||
|
.........................
|
||||||
|
|
||||||
|
To retrieve a Vault-generated CSR run the ``get-csr`` action on the leader
|
||||||
|
unit:
|
||||||
|
|
||||||
.. code-block:: none
|
.. code-block:: none
|
||||||
|
|
||||||
juju run-action vault/0 get-csr
|
juju run-action --wait vault/leader get-csr
|
||||||
Action queued with id: 0495b6ce-09d8-4e57-8d21-efa13794034a
|
|
||||||
juju show-action-output 0495b6ce-09d8-4e57-8d21-efa13794034a
|
.. note::
|
||||||
|
|
||||||
|
The CSR may be rejected by the signing CA due to incorrect values for
|
||||||
|
certain properties (e.g. common-name). It would be prudent therefore to
|
||||||
|
inquire before generating the CSR. Use command :command:`juju actions
|
||||||
|
--schema vault` for help on setting properties with action ``get-csr``.
|
||||||
|
|
||||||
|
This will produce output similar to:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
unit-vault-0:
|
||||||
|
UnitId: vault/0
|
||||||
|
id: "8"
|
||||||
results:
|
results:
|
||||||
|
Stdout: |
|
||||||
|
lxc
|
||||||
|
lxc
|
||||||
|
active
|
||||||
|
lxc
|
||||||
output: |-
|
output: |-
|
||||||
-----BEGIN CERTIFICATE REQUEST-----
|
-----BEGIN CERTIFICATE REQUEST-----
|
||||||
MIICijCCAXICAQAwRTFDMEEGA1UEAxM6VmF1bHQgSW50ZXJtZWRpYXRlIENlcnRp
|
MIICijCCAXICAQAwRTFDMEEGA1UEAxM6VmF1bHQgSW50ZXJtZWRpYXRlIENlcnRp
|
||||||
ZmljYXRlIEF1dGhvcml0eSAoY2hhcm0tcGtpLWxvY2FsKTCCASIwDQYJKoZIhvcN
|
ZmljYXRlIEF1dGhvcml0eSAoY2hhcm0tcGtpLWxvY2FsKTCCASIwDQYJKoZIhvcN
|
||||||
AQEBBQADggEPADCCAQoCggEBAKEkTFyX2SgzDDUMvJNnoptdAb9AAiDZzc3U/aaX
|
AQEBBQADggEPADCCAQoCggEBAJvof3Gut71YY9Ke3TlAYT+AoVUu8w0q2DKGh7dL
|
||||||
g55TmAQ5jIfYbXb/39O+81iWD8esWGzTkg9YyzfPUBwcF3FrsyyEPFjiFRhTEATl
|
5mUggcvThZuckbuj8IJZZ3pl5D114REcRRH9DIRxp4tH0TSmnb0PJLdjnuLyMQqy
|
||||||
6W2U5tA981hKiEScF2BvMm4PJZM/1ND12yoIsg45n1AGUfY8GShqtKKNXvAR3TEj
|
/IEipmSQWiILBF8c/QjYqEkvUoprADeJ+9L9KGc/axwuIoLWHqaXLnkSFzypgyz+
|
||||||
mYWQ35QhVFnsvh9hc5TUORRwlKy74FnCBDfuWuIGph/Ge4GRctAv0MUUsfqCv9DZ
|
9Qvxir4wSPvyygZVUDJvUoEekk/sMBidzpEaKuMF7U+aZAdlZvEPr39FilEwcUgQ
|
||||||
+xMHeE8IdyqMakTJ2iUXktbl0khSwbb5KUT9NOzC1mDPZPBICqSmhXQ1In9FR5ic
|
EY2m3bDDe5maNcD6+la95ENuo0kuHF6wkjXuLGkzDV5xYBMtSO8sqymwRA1CPLyr
|
||||||
VTsVOdHShaN4T4qjrvWI4+S5CJynDnSvDeUWPYu1lOM24H0CAwEAAaAAMA0GCSqG
|
WIA+ciDQ11Hy+1Q+YTurOoWzmr48QPlamCZEIz8BZeuf8vsCAwEAAaAAMA0GCSqG
|
||||||
SIb3DQEBCwUAA4IBAQCHZoVqKJ0TCaYimHT2VGqklomGuQymxqkKIrBHQD4oe/Ts
|
SIb3DQEBCwUAA4IBAQAoPhk5k5nXpFSYfbsOvm8Rc0hHUTfEHgB4xcQfzMrMTDMX
|
||||||
6nXXZaUWVPQF96o+Au4oz2R/l/UF4a89Z2xyCN95tys/QJv0Hw93MeN7cIGUZ8p+
|
fVmiJjGQhiM1q+eKNLLTDxuOGBBbyniQsveV6JZwpOlkOZ1YVdkw0EoaQndz6dEA
|
||||||
nOpb7IX5ZqWEKu1g+2cTQ0mxa1hGb+rbO0LtArbhWVQjrkqKdY26O78Ct76eutfO
|
JNjjelV2z1FxppKT3504uX/YkASTDnpb63aknE4W3C5aZSvyx/qw/WdUauCNnYoV
|
||||||
1uKYXMbbUlXH8Qb/MyfRt30nPqyLKz4bIqH0fm670s/MiK8zoJ8DwI3NpkzB0cfG
|
NdFrzy0p2qm8kXwPsbjIwZTq/AqQ4t7UrNoXoONcxjAdq5UpuoBxgbRJJ7zr1RJp
|
||||||
qzYxRu078uWcenueDBa8HqvBQNT6meZ68y+eesXrIM4EY3dk4YSb5A5QSeqUAWjK
|
NUhVk/1qi9EQSGeigkuzGGPeRdBXvw4NXAXwnQfCiIBHgLEfkE3PVHNbXfVYqtjC
|
||||||
Fp36v30jKNJ29rs8vduytRu6bz7bI+qZ1hCJbzQQ
|
3D2eeYPraKcSJIEts4DCJnbhj5FEzi1km9QgSZgA
|
||||||
-----END CERTIFICATE REQUEST-----
|
-----END CERTIFICATE REQUEST-----
|
||||||
status: completed
|
status: completed
|
||||||
timing:
|
timing:
|
||||||
completed: 2018-06-07 10:21:17 +0000 UTC
|
completed: 2021-02-16 22:40:12 +0000 UTC
|
||||||
enqueued: 2018-06-07 10:21:13 +0000 UTC
|
enqueued: 2021-02-16 22:40:08 +0000 UTC
|
||||||
started: 2018-06-07 10:21:13 +0000 UTC
|
started: 2021-02-16 22:40:09 +0000 UTC
|
||||||
|
|
||||||
Retrieve the CSR from the action output and place it in a file, removing any
|
Place the CSR data (minus any leading whitespace) in a file, say
|
||||||
leading whitespace.
|
``~/csr_file``. In this example, the file's contents would be:
|
||||||
|
|
||||||
Sign CSR
|
.. code-block:: console
|
||||||
........
|
|
||||||
|
|
||||||
The exact command from signing the CSR will depend on the setup of the
|
-----BEGIN CERTIFICATE REQUEST-----
|
||||||
external CA. Below is an example:
|
MIICijCCAXICAQAwRTFDMEEGA1UEAxM6VmF1bHQgSW50ZXJtZWRpYXRlIENlcnRp
|
||||||
|
ZmljYXRlIEF1dGhvcml0eSAoY2hhcm0tcGtpLWxvY2FsKTCCASIwDQYJKoZIhvcN
|
||||||
|
AQEBBQADggEPADCCAQoCggEBAJvof3Gut71YY9Ke3TlAYT+AoVUu8w0q2DKGh7dL
|
||||||
|
5mUggcvThZuckbuj8IJZZ3pl5D114REcRRH9DIRxp4tH0TSmnb0PJLdjnuLyMQqy
|
||||||
|
/IEipmSQWiILBF8c/QjYqEkvUoprADeJ+9L9KGc/axwuIoLWHqaXLnkSFzypgyz+
|
||||||
|
9Qvxir4wSPvyygZVUDJvUoEekk/sMBidzpEaKuMF7U+aZAdlZvEPr39FilEwcUgQ
|
||||||
|
EY2m3bDDe5maNcD6+la95ENuo0kuHF6wkjXuLGkzDV5xYBMtSO8sqymwRA1CPLyr
|
||||||
|
WIA+ciDQ11Hy+1Q+YTurOoWzmr48QPlamCZEIz8BZeuf8vsCAwEAAaAAMA0GCSqG
|
||||||
|
SIb3DQEBCwUAA4IBAQAoPhk5k5nXpFSYfbsOvm8Rc0hHUTfEHgB4xcQfzMrMTDMX
|
||||||
|
fVmiJjGQhiM1q+eKNLLTDxuOGBBbyniQsveV6JZwpOlkOZ1YVdkw0EoaQndz6dEA
|
||||||
|
JNjjelV2z1FxppKT3504uX/YkASTDnpb63aknE4W3C5aZSvyx/qw/WdUauCNnYoV
|
||||||
|
NdFrzy0p2qm8kXwPsbjIwZTq/AqQ4t7UrNoXoONcxjAdq5UpuoBxgbRJJ7zr1RJp
|
||||||
|
NUhVk/1qi9EQSGeigkuzGGPeRdBXvw4NXAXwnQfCiIBHgLEfkE3PVHNbXfVYqtjC
|
||||||
|
3D2eeYPraKcSJIEts4DCJnbhj5FEzi1km9QgSZgA
|
||||||
|
-----END CERTIFICATE REQUEST-----
|
||||||
|
|
||||||
|
Have the CSR signed
|
||||||
|
...................
|
||||||
|
|
||||||
|
The procedure for obtaining a signed certificate from an external CA is
|
||||||
|
particular to the given CA, but it always entails sending the CSR to the CA
|
||||||
|
(typically from its website) and waiting for a reply.
|
||||||
|
|
||||||
|
For informational purposes, an example CLI command is provided below. The exact
|
||||||
|
command syntax is dependent upon the CA. Note the inclusion of the input file
|
||||||
|
``~/csr_file``:
|
||||||
|
|
||||||
.. code-block:: none
|
.. code-block:: none
|
||||||
|
|
||||||
openssl ca -config openssl.cnf -extensions v3_intermediate_ca -days 3650 \
|
openssl ca -config openssl.cnf -extensions v3_intermediate_ca -days 3650 \
|
||||||
-notext -md sha256 -in csr_file -out /tmp/vault-charm-int.pem -batch \
|
-notext -md sha256 -in ~/csr_file -out ~/vault-charm-int.pem -batch \
|
||||||
-passin pass:secretpassword
|
-passin pass:secretpassword
|
||||||
|
|
||||||
*If the signing is rejected due to mismatched O or OU or C etc then rerun the
|
The certificate is normally provided in PEM format, like the output file
|
||||||
get-csr actions and specify the mismatched items.*
|
``~/vault-charm-int.pem`` in the above command. A root CA certificate should
|
||||||
|
also be provided and placed in, say, file ``~/root-ca.pem``.
|
||||||
|
|
||||||
Upload signed CSR and root CA cert to Vault
|
Upload the signed certificate and the root CA certificate to Vault
|
||||||
...........................................
|
..................................................................
|
||||||
|
|
||||||
(Where /tmp/root-ca.pem is the root ca cert)
|
To upload certificate information to Vault run the ``upload-signed-csr``
|
||||||
|
action on the leader unit:
|
||||||
|
|
||||||
.. code-block:: none
|
.. code-block:: none
|
||||||
|
|
||||||
juju run-action vault/0 upload-signed-csr \
|
juju run-action --wait vault/leader upload-signed-csr \
|
||||||
pem="$(cat /tmp/vault-charm-int.pem | base64)" \
|
pem="$(cat ~/vault-charm-int.pem | base64)" \
|
||||||
root-ca="$(cat /tmp/root-ca.pem | base64)" \
|
root-ca="$(cat ~/root-ca.pem | base64)" \
|
||||||
allowed-domains='openstack.local'
|
allowed-domains='openstack.local'
|
||||||
|
|
||||||
.. note::
|
The file that the ``pem`` parameter refers to must contain a PEM bundle
|
||||||
|
consisting of:
|
||||||
|
|
||||||
The certificates provided via the 'pem' parameter must be a PEM bundle
|
#. the signed certificate
|
||||||
containing the signed certificate, any intermediate CA certs external to
|
#. any other intermediate CA certificates
|
||||||
Vault and the root CA cert. Without this information Vault cannot verify
|
#. the root CA certificate
|
||||||
the trust chain and will reject the provided certificate - see `RFC5280`_
|
|
||||||
for more details about certificate paths and trust.
|
|
||||||
|
|
||||||
If external intermediate CAs are in use the root-ca PEM must also be a PEM
|
The file that the ``root-ca`` parameter refers to must contain a PEM bundle
|
||||||
bundle including certs for all intermediate CAs and the root CA.
|
consisting of:
|
||||||
|
|
||||||
For more details about the format of certificate PEM bundles see `RFC7468`_.
|
#. any other intermediate CA certificates
|
||||||
|
#. the root CA certificate
|
||||||
|
|
||||||
Vault issues certificates
|
.. important::
|
||||||
|
|
||||||
|
Omitting the (other) intermediate certificate information will result in the
|
||||||
|
new certificate being rejected (due to an incomplete trust chain).
|
||||||
|
|
||||||
|
See the following resources:
|
||||||
|
|
||||||
|
* `RFC5280`_: for details concerning certificate paths and trust
|
||||||
|
* `RFC7468`_: for details on the format of certificate PEM bundles
|
||||||
|
|
||||||
|
Issuing of certificates
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Now that Vault is in possession of a CA certificate it will be able to issue
|
||||||
|
certificates to clients (API services). Client requests are made via the
|
||||||
|
``vault:certificates`` relation. For example:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
juju add-relation keystone:certificates vault:certificates
|
||||||
|
juju add-relation nova-cloud-controller:certificates vault:certificates
|
||||||
|
juju add-relation cinder:certificates vault:certificates
|
||||||
|
juju add-relation neutron-api:certificates vault:certificates
|
||||||
|
juju add-relation glance:certificates vault:certificates
|
||||||
|
|
||||||
|
A request will result in the transfer of certificates and keys from Vault. The
|
||||||
|
corresponding API endpoint will also be updated in Keystone's service catalogue
|
||||||
|
list to reflect that it is now using HTTPS. The service is now TLS-enabled.
|
||||||
|
|
||||||
|
.. important::
|
||||||
|
|
||||||
|
Once Keystone is TLS-enabled every application that talks to Keystone (i.e.
|
||||||
|
there exists a relation between the two) **must** be in possession of the
|
||||||
|
CA certificate. This is achieved as a side-effect when enabling TLS for that
|
||||||
|
application.
|
||||||
|
|
||||||
|
Verification
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
To verify the CA certificate begin by sourcing the cloud init file and
|
||||||
|
inspecting the certificate's location and the Keystone API endpoint. The latter
|
||||||
|
should be using HTTPS:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
source novarc
|
||||||
|
env | grep -e OS_AUTH_URL -e OS_CACERT
|
||||||
|
|
||||||
|
Sample output is:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
OS_CACERT=/home/ubuntu/snap/openstackclients/common/root-ca.crt
|
||||||
|
OS_AUTH_URL=https://10.0.0.215:5000/v3
|
||||||
|
|
||||||
|
API services can now be queried by referring explicitly to the certificate. The
|
||||||
|
below tests correspond to the clients mentioned in the previous section:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
# Keystone
|
||||||
|
openstack --os-cacert $OS_CACERT catalog list
|
||||||
|
# Nova
|
||||||
|
openstack --os-cacert $OS_CACERT server list
|
||||||
|
# Cinder
|
||||||
|
openstack --os-cacert $OS_CACERT volume list
|
||||||
|
# Neutron
|
||||||
|
openstack --os-cacert $OS_CACERT network list
|
||||||
|
# Glance
|
||||||
|
openstack --os-cacert $OS_CACERT image list
|
||||||
|
|
||||||
|
Reissuing of certificates
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Vault will now issue certificates to all clients that have requested them. This
|
To issue new certificates to all TLS-enabled clients run the
|
||||||
process will trigger the api charms to request endpoint updates from keystone
|
``reissue-certificates`` action on the leader unit:
|
||||||
to reflect that they are now using https. This can be a lengthy process, so
|
|
||||||
monitor keystone units and wait for them to become idle.
|
|
||||||
|
|
||||||
.. code-block:: none
|
.. code-block:: none
|
||||||
|
|
||||||
watch -d juju status keystone
|
juju run-action --wait vault/leader reissue-certificates
|
||||||
|
|
||||||
Test
|
One reason for doing so is in the advent of expired certificates.
|
||||||
~~~~
|
|
||||||
|
|
||||||
Where /tmp/root-ca.pem is the root CA cert:
|
|
||||||
|
|
||||||
.. code-block:: none
|
|
||||||
|
|
||||||
source novarc # make sure you have https in OS_AUTH_URL
|
|
||||||
|
|
||||||
echo "Testing: keystone"
|
|
||||||
openstack --os-cacert /tmp/root-ca.pem catalog list
|
|
||||||
echo "Testing: nova-cloud-controller"
|
|
||||||
openstack --os-cacert /tmp/root-ca.pem server list
|
|
||||||
echo "Testing: cinder"
|
|
||||||
openstack --os-cacert /tmp/root-ca.pem volume list
|
|
||||||
echo "Testing: neutron"
|
|
||||||
openstack --os-cacert /tmp/root-ca.pem network list
|
|
||||||
echo "Testing: image"
|
|
||||||
openstack --os-cacert /tmp/root-ca.pem image list
|
|
||||||
deactivate
|
|
||||||
|
|
||||||
Reissuing certificates
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The vault charm has an *reissue-certificates* action. Running the action
|
|
||||||
will cause vault to issue new certificates for all charm clients. The action
|
|
||||||
must be run on the lead unit.
|
|
||||||
|
|
||||||
.. code-block:: none
|
|
||||||
|
|
||||||
juju run-action vault/0 reissue-certificates
|
|
||||||
|
|
||||||
.. LINKS
|
.. LINKS
|
||||||
.. _RFC5280: https://tools.ietf.org/html/rfc5280#section-3.2
|
.. _RFC5280: https://tools.ietf.org/html/rfc5280#section-3.2
|
||||||
.. _RFC7468: https://tools.ietf.org/html/rfc7468#section-5
|
.. _RFC7468: https://tools.ietf.org/html/rfc7468#section-5
|
||||||
.. _tls-certificates relation: https://github.com/juju-solutions/interface-tls-certificates#readme
|
.. _vault: https://opendev.org/openstack/charm-vault/src/branch/master/src/README.md
|
||||||
.. _Vault charm: https://jaas.ai/vault/
|
|
||||||
|
|||||||
Reference in New Issue
Block a user