This patchset adds documentation on document encryption. It also adds appropriate references to other sections of the documentation where linking to document encryption is apropos. Finally, this patchset adds further information and structure around the document rendering process in general, in order to underscore the pieces of documentation that undergird the general concept of document rendering: substitution, layering and replacement. Change-Id: I566cac4a3374556a0e62e0e1962e153029f7ec05
8.0 KiB
Document Substitution
Introduction
Document substitution, simply put, allows one document to overwrite parts of its own data with that of another document. Substitution involves a source document sharing data with a destination document, which replaces its own data with the shared data.
Substitution may be leveraged as a mechanism for:
- inserting secrets into configuration documents
- reducing data duplication by declaring common data within one document and having multiple other documents substitute data from the common location as needed
During document rendering, substitution is applied at each layer
after all merge actions occur. For more information on the interaction
between document layering and substitution, see: rendering.
Requirements
Substitutions between documents are not restricted by
schema, name, nor layer. Source
and destination documents do not need to share the same
schema.
No substitution dependency cycle may exist between a series of substitutions. For example, if A substitutes from B, B from C, and C from A, then Deckhand will raise an exception as it is impossible to determine the source data to use for substitution in the presence of a dependency cycle.
Substitution works like this:
The source document is resolved via the src.schema and
src.name keys and the src.path key is used
relative to the source document's data section to retrieve
the substitution data, which is then injected into the data
section of the destination document using the dest.path
key.
If all the constraints above are correct, then the substitution
source data is injected into the destination document's
data section, at the path specified by
dest.path.
The injection of data into the destination document can be more
fine-tuned using a regular expression; see the substitution-pattern section
below for more information.
Note
Substitution is only applied to the data section of a
document. This is because a document's metadata and
schema sections should be immutable within the scope of a
revision, for obvious reasons.
Rendering Documents with Substitution
Concrete (non-abstract) documents can be used as a source of
substitution into other documents. This substitution is
layer-independent, so given the 3 layer example above, which includes
global, region and site layers, a
document in the region layer could insert data from a
document in the site layer.
Example
Here is a sample set of documents demonstrating substitution:
---
schema: deckhand/Certificate/v1
metadata:
name: example-cert
storagePolicy: cleartext
layeringDefinition:
layer: site
data: |
CERTIFICATE DATA
---
schema: deckhand/CertificateKey/v1
metadata:
name: example-key
storagePolicy: encrypted
layeringDefinition:
layer: site
data: |
KEY DATA
---
schema: deckhand/Passphrase/v1
metadata:
name: example-password
storagePolicy: encrypted
layeringDefinition:
layer: site
data: my-secret-password
---
schema: armada/Chart/v1
metadata:
name: example-chart-01
storagePolicy: cleartext
layeringDefinition:
layer: region
substitutions:
- dest:
path: .chart.values.tls.certificate
src:
schema: deckhand/Certificate/v1
name: example-cert
path: .
- dest:
path: .chart.values.tls.key
src:
schema: deckhand/CertificateKey/v1
name: example-key
path: .
- dest:
path: .chart.values.some_url
pattern: INSERT_[A-Z]+_HERE
src:
schema: deckhand/Passphrase/v1
name: example-password
path: .
data:
chart:
details:
data: here
values:
some_url: http://admin:INSERT_PASSWORD_HERE@service-name:8080/v1
...The rendered document will look like:
---
schema: armada/Chart/v1
metadata:
name: example-chart-01
storagePolicy: cleartext
layeringDefinition:
layer: region
substitutions:
- dest:
path: .chart.values.tls.certificate
src:
schema: deckhand/Certificate/v1
name: example-cert
path: .
- dest:
path: .chart.values.tls.key
src:
schema: deckhand/CertificateKey/v1
name: example-key
path: .
- dest:
path: .chart.values.some_url
pattern: INSERT_[A-Z]+_HERE
src:
schema: deckhand/Passphrase/v1
name: example-password
path: .
data:
chart:
details:
data: here
values:
some_url: http://admin:my-secret-password@service-name:8080/v1
tls:
certificate: |
CERTIFICATE DATA
key: |
KEY DATA
...Substitution with Patterns
Substitution can be controlled in a more fine-tuned fashion using
dest.pattern (optional) which functions as a regular
expression underneath the hood. The dest.pattern has the
following constraints:
dest.pathkey must already exist in thedatasection of the destination document and must have an associated value.- The
dest.patternmust be a valid regular expression string. - The
dest.patternmust be resolvable in the value ofdest.path.
If the above constraints are met, then more precise substitution via a pattern can be carried out.
Example
---
# Source document.
schema: deckhand/Passphrase/v1
metadata:
name: example-password
schema: metadata/Document/v1
layeringDefinition:
layer: site
storagePolicy: cleartext
data: my-secret-password
---
# Destination document.
schema: armada/Chart/v1
metadata:
name: example-chart-01
schema: metadata/Document/v1
layeringDefinition:
layer: region
substitutions:
- dest:
path: .chart.values.some_url
pattern: INSERT_[A-Z]+_HERE
src:
schema: deckhand/Passphrase/v1
name: example-password
path: .
data:
chart:
details:
data: here
values:
some_url: http://admin:INSERT_PASSWORD_HERE@service-name:8080/v1After document rendering, the output for
example-chart-01 (the destination document) will be:
---
schema: armada/Chart/v1
metadata:
name: example-chart-01
schema: metadata/Document/v1
layeringDefinition:
layer: region
substitutions:
- dest:
path: .chart.values.some_url
pattern: INSERT_[A-Z]+_HERE
src:
schema: deckhand/Passphrase/v1
name: example-password
path: .
data:
chart:
details:
data: here
values:
# Notice how the data from the source document is injected into the
# exact location specified by ``dest.pattern``.
some_url: http://admin:my-secret-password@service-name:8080/v1Substitution of Encrypted Data
Deckhand allows data to be encrypted using Barbican <encryption>.
Substitution of encrypted data works the same as substitution of
cleartext data.
Note that during the rendering process, source and destination documents receive the secrets stored in Barbican.