Merge "spec: encryption at rest"
This commit is contained in:
commit
2d93253242
338
specs/rocky/approved/encryption-at-rest.rst
Normal file
338
specs/rocky/approved/encryption-at-rest.rst
Normal file
@ -0,0 +1,338 @@
|
|||||||
|
..
|
||||||
|
Copyright 2018, Canonical Ltd.
|
||||||
|
|
||||||
|
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. 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://sphinx-doc.org/rest.html To test out your formatting, see
|
||||||
|
http://www.tele3.cz/jbar/rest/rest.html
|
||||||
|
|
||||||
|
======================
|
||||||
|
Encrypted Data at Rest
|
||||||
|
======================
|
||||||
|
|
||||||
|
Problem Description
|
||||||
|
===================
|
||||||
|
|
||||||
|
OpenStack Clouds provide a number of different types of storage to Cloud users,
|
||||||
|
including instance ephemeral disks (typically attached to hypervisors), Cinder
|
||||||
|
block devices (typically backed by some sort of storage solution such as Ceph)
|
||||||
|
and Swift object storage.
|
||||||
|
|
||||||
|
By default the data residing on such virtual devices is unencrypted; regulation
|
||||||
|
such as PCI-DSS and GPDR+ require that data at rest is stored encrypted,
|
||||||
|
so that if devices are removed from the data center, the data on them cannot
|
||||||
|
be recovered without access to the appropriate encryption keys.
|
||||||
|
|
||||||
|
Proposed Change
|
||||||
|
===============
|
||||||
|
|
||||||
|
Underlying storage devices will be protected using dm-crypt/LUKS with encryption
|
||||||
|
keys stored directly in Hashicorp Vault. No local copy of the key is made during
|
||||||
|
the encryption process or the decryption process on boot.
|
||||||
|
|
||||||
|
A new tool 'vaultlocker' will be used to LUKS format block devices, directly
|
||||||
|
storing encryption keys in Vault. Keys are referenced using the UUID of the
|
||||||
|
underlying block device (which is generated as the disk is prepared for use).
|
||||||
|
|
||||||
|
On (re)boot, a vaultlocker-decrypt systemd unit will execute for each encrypted
|
||||||
|
block device, retrieving the encryption key from Vault and opening the LUKS
|
||||||
|
formatted block device ready for use.
|
||||||
|
|
||||||
|
vaultlocker will access vault over https using an approle issued as part of the
|
||||||
|
deployment process; the approle will be passed from vault to the consuming
|
||||||
|
service via a charm relation and will be scoped for access from units
|
||||||
|
participating in the relation to vault.
|
||||||
|
|
||||||
|
The approle will be specific to each unit participating in the relation, with
|
||||||
|
a policy that only permits read/write/delete/update/list to:
|
||||||
|
|
||||||
|
<kv-backend>/<hostname>/*
|
||||||
|
|
||||||
|
from the provided network address of the unit. Approles for other units will
|
||||||
|
be visible in the relation data, but will not be usable as the CIDR ACL will
|
||||||
|
not permit access.
|
||||||
|
|
||||||
|
In addition to the unit specific approle, and limitation of access to the /32
|
||||||
|
of the unit, a secret_id will also be used to authenticate use of the approle.
|
||||||
|
|
||||||
|
The secret_id will not be passed over the relation from the vault charm to the
|
||||||
|
consuming application. Instead the vault charm will generate a secret_id and
|
||||||
|
wrap it using Vault's response wrapping feature. The resulting one-shot token
|
||||||
|
will be passed over the relation to the consuming application unit, which can
|
||||||
|
then use the token to pull the secret_id directly from Vault. This ensures
|
||||||
|
that the secret_id is only known to Vault and the consuming application unit.
|
||||||
|
|
||||||
|
The one-shot token has a ttl of 1h (allowing for complex deployment with large
|
||||||
|
numbers of hook executions to complete on converged hypervisor/storage
|
||||||
|
machines).
|
||||||
|
|
||||||
|
The initial scope of support will include:
|
||||||
|
|
||||||
|
- ceph-osd: OSD device encryption.
|
||||||
|
- swift-storage: Block device encryption.
|
||||||
|
- nova-compute: Ephemeral storage block device encryption; note that this
|
||||||
|
requires that hypervisors are configured with a specific set of storage
|
||||||
|
devices for use by Nova for ephemeral block devices for instances.
|
||||||
|
|
||||||
|
block device preparation
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
The encrypted block device will be labelled with a UUID generated by the
|
||||||
|
charmhelper. This UUID will be used during encryption and during decryption
|
||||||
|
during server reboots.
|
||||||
|
|
||||||
|
The device will be encrypted with key storage in Vault using:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
vaultlocker encrypt --uuid $UUID $BLOCK_DEVICE
|
||||||
|
|
||||||
|
The resulting dm-crypt block device will be opened ready for use.
|
||||||
|
|
||||||
|
swift-storage and nova-compute
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Block devices will be prepared inline with "block device preparation"; existing
|
||||||
|
fstab management by the charm will be updated to use `/dev/mapper/crypt-<UUID>`
|
||||||
|
entries with a x-systemd.requires option - for example:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
/dev/mapper/crypt-$UUID /mnt auto defaults,x-systemd.requires=vaultlocker-decrypt@$UUID.service,comment=vaultlocker 0 2
|
||||||
|
|
||||||
|
This ensures that the vaultlocker-decrypt task has completed prior to the mount
|
||||||
|
of the mapper device being attempted.
|
||||||
|
|
||||||
|
ceph-osd/ceph-volume
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Integration into the ceph-osd charm requires the charm to switch to using the
|
||||||
|
new ceph-volume tool to manage the creation and activation of OSD's. This
|
||||||
|
requires that the block device be prepared with LVM volumes before passing to
|
||||||
|
ceph-volume; to mirror existing ceph-disk functionality:
|
||||||
|
|
||||||
|
filestore
|
||||||
|
~~~~~~~~~
|
||||||
|
|
||||||
|
Use block device for journal and data; journal lv (osd-journal-<OSD-FSID>)
|
||||||
|
created on vg ceph-<OSD-FSID> using configured journal size, data lv
|
||||||
|
(osd-data-<OSD-FSID) created on vg ceph-<OSD-FSID> using remaining capacity.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
pv /dev/sdb
|
||||||
|
vg /dev/ceph-<OSD-FSID>
|
||||||
|
lv /dev/ceph-<OSD-FSID/osd-journal-<OSD-FSID>
|
||||||
|
lv /dev/ceph-<OSD-FSID/osd-data-<OSD-FSID>
|
||||||
|
|
||||||
|
Use separate device for journal; journal lv (osd-journal-<OSD-FSID>) created
|
||||||
|
on vg ceph-journal-<UUID> of a journal device using configured journal size;
|
||||||
|
data lv (osd-data-<OSD-FSID) created on ceph-<OSD-FSID> of data device
|
||||||
|
using 100% of capacity.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
pv /dev/sdb
|
||||||
|
vg /dev/ceph-<OSD-FSID>
|
||||||
|
lv /dev/ceph-<OSD-FSID/osd-data-<OSD-FSID>
|
||||||
|
pv /dev/sdg
|
||||||
|
vg /dev/ceph-journal-<UUID>
|
||||||
|
lv /dev/ceph-journal-<UUID>/osd-journal-<OSD-FSID>
|
||||||
|
|
||||||
|
bluestore
|
||||||
|
~~~~~~~~~
|
||||||
|
|
||||||
|
Bluestore is simpler in that there is no journal so a single logical volume
|
||||||
|
will be created on ceph-<OSD-FSID> of the provided disk:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
pv /dev/sdb
|
||||||
|
vg /dev/ceph-<OSD-FSID>
|
||||||
|
lv /dev/ceph-<OSD-FSID/osd-block-<OSD-FSID>
|
||||||
|
|
||||||
|
The Bluestore DB and WAL volumes may be optionally stored on separate
|
||||||
|
devices again using a logical volume of the configured/default size on vg
|
||||||
|
ceph-{db,wal}-<UUID>.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
pv /dev/sdb
|
||||||
|
vg /dev/ceph-<OSD-FSID>
|
||||||
|
lv /dev/ceph-<OSD-FSID/osd-block-<OSD-FSID>
|
||||||
|
pv /dev/sdg
|
||||||
|
vg /dev/ceph-db-<UUID>
|
||||||
|
lv /dev/ceph-db-<UUID>/osd-db-<OSD-FSID>
|
||||||
|
pv /dev/sdh
|
||||||
|
vg /dev/ceph-wal-<UUID>
|
||||||
|
lv /dev/ceph-wal-<UUID>/osd-wal-<OSD-FSID>
|
||||||
|
|
||||||
|
Note that ceph-volume is only provided with Ceph Luminous or later releases;
|
||||||
|
as a result encryption under Ceph Jewel is explicitly excluded from the scope
|
||||||
|
of this specification.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
ceph
|
||||||
|
~~~~
|
||||||
|
|
||||||
|
Use of native suppport in Ceph for OSD encryption; discounted as it makes use
|
||||||
|
of the ceph-mon cluster for key storage - keys are not sharded and deployments
|
||||||
|
typically place ceph-mon units alongside ceph-osd units so its possible that
|
||||||
|
the encryption keys might directly reside on the same server as encrypted
|
||||||
|
Ceph OSD block devices.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
The ceph-osd charm already supports native Ceph block device
|
||||||
|
encryption using ceph-disk/ceph-volume via the osd-encrypt option.
|
||||||
|
|
||||||
|
Support for use of vault could be added to ceph-volume; however due to the
|
||||||
|
requirement to support existing Ceph releases (>= Luminous) this option
|
||||||
|
is discounted in the short term but may be considered in the long term if
|
||||||
|
support lands into Ceph upstream.
|
||||||
|
|
||||||
|
cinder
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
Cinder has native support for block device encryption using LUKS; keys are
|
||||||
|
stored using Barbican which relies on HSM's implementing PKCS#11 of KMIP to
|
||||||
|
be considered secure. This would provide the required level of encryption
|
||||||
|
support for Cinder block devices however does require use of a hardware
|
||||||
|
based security module (Barbican does not have Vault support).
|
||||||
|
|
||||||
|
nova
|
||||||
|
~~~~
|
||||||
|
|
||||||
|
Nova has native support for encryption of ephemeral disks if using an LVM
|
||||||
|
backend for storage; again keys are stored in barbican, requiring use of a
|
||||||
|
HSM or implementation of support for a suitable Software Security Module in
|
||||||
|
Barbican. Use of this option is also limited to LVM storage only.
|
||||||
|
|
||||||
|
swift
|
||||||
|
~~~~~
|
||||||
|
|
||||||
|
Swift has no native encryption support so no alternatives considered for this
|
||||||
|
part of the problem domain.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
|
||||||
|
james-page
|
||||||
|
|
||||||
|
Gerrit Topic
|
||||||
|
------------
|
||||||
|
|
||||||
|
Use Gerrit topic "vaultlocker" for all patches related to this spec.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
git-review -t vaultlocker
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
vaultlocker
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
- base codebase (support for encrypt/decrypt)
|
||||||
|
- unit tests
|
||||||
|
- functional tests
|
||||||
|
|
||||||
|
QA
|
||||||
|
~~
|
||||||
|
|
||||||
|
- mojo specification to validate encryption-at-rest support
|
||||||
|
|
||||||
|
Docs
|
||||||
|
~~~~
|
||||||
|
|
||||||
|
- example bundle + documentation for encryption-at-rest
|
||||||
|
- appendix for deployment guide on usage and security considerations
|
||||||
|
|
||||||
|
charmhelpers
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
- block device encryption helper
|
||||||
|
|
||||||
|
ceph-osd
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
- add support for use of ceph-volume >= Luminous
|
||||||
|
- enable support for block device encryption using vaultlocker
|
||||||
|
- add relation to vault
|
||||||
|
|
||||||
|
swift-storage
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
- enable support for block device encryption using vaultlocker
|
||||||
|
- add relation to vault
|
||||||
|
|
||||||
|
nova-compute
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
- enable support for block device encryption using vaultlocker
|
||||||
|
- add relation to vault
|
||||||
|
|
||||||
|
Repositories
|
||||||
|
------------
|
||||||
|
|
||||||
|
A new repository will be required for vaultlocker.
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Documentation will be provided as part of the ceph-osd, swift-storage
|
||||||
|
and nova-compute charms.
|
||||||
|
|
||||||
|
An additional appendix will be added to the charm deployment guide to
|
||||||
|
cover encryption at rest.
|
||||||
|
|
||||||
|
Security
|
||||||
|
--------
|
||||||
|
|
||||||
|
As this solution covers the security of encryption keys used to secure
|
||||||
|
block devices from unauthorized removal there are multiple security
|
||||||
|
concerns to address.
|
||||||
|
|
||||||
|
Communication with Vault will be done over a TLS encrypted connection
|
||||||
|
using an AppRole (without a secret_id) for authentication which will be
|
||||||
|
delivered to the consuming charm over a charm relation; connectivity with
|
||||||
|
Juju also TLS encrypted so the potential for interception of the AppRole
|
||||||
|
is limited.
|
||||||
|
|
||||||
|
The secret_id for the unit to use with the AppRole is passed out-of-band
|
||||||
|
of Juju - a one-shot token is passed over the vault-kv relation, which
|
||||||
|
can only be used by the consuming unit to retrieve the generated
|
||||||
|
secret_id for the AppRole. The token has a 1hr TTL and is CIDR limited
|
||||||
|
in the same way as the AppRole.
|
||||||
|
|
||||||
|
Encryption keys will be stored under a Vault path specific to the AppRole.
|
||||||
|
The Vault AppRole will limit access to the secrets backend based on the
|
||||||
|
CIDR of the accessing servers.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
-------
|
||||||
|
|
||||||
|
Functionality will be validated by unit and functional tests within
|
||||||
|
each component.
|
||||||
|
|
||||||
|
Overall solution function will be validated using a Mojo spec.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
- Production grade vault charm.
|
||||||
|
- AppRole interface to vault charm.
|
Loading…
x
Reference in New Issue
Block a user