27b7b453a9
* Update metadata.generation behaviour for custom resources (#10705) * update docs promoting plugins to beta (#10796) * docs update to promote TaintBasedEvictions to beta (#10765) * First Korean l10n work for dev-1.13 (#10719) * Update outdated l10n(ko) contents (#10689) fixes #10686 * Translate concepts/overview/what-is-kubernetes in Korean (#10690) * Translate concepts/overview/what-is-kubernetes in Korean * Feedback from ClaudiaJKang * Translate concepts/overview/components in Korean (#10882) * Translate concepts/overview/components in Korean #10717 * Translate concepts/overview/components in Korean * Translate concepts/overview/components in Korean * Apply Korean glossary: 서비스 어카운트 * Translate concepts/overview/kubernetes-api in Korean (#10773) * Translate concepts/overview/kubernetes-api in Korean * Applied feedback from ianychoi * kubeadm: update the configuration docs to v1beta1 (#10959) * kubeadm: add small v1beta1 related updates (#10988) * ADD content/zh/docs/reference/setup-tools/kubeadm/kubeadm.md (#11031) * ADD content/zh/docs/reference/setup-tools/kubeadm/kubeadm.md * ADD content/zh/docs/reference/setup-tools/kubeadm/generated/kubeadm_init.md * Update content/zh/docs/reference/setup-tools/kubeadm/kubeadm.md Accepted Co-Authored-By: YouthLab <tsui@highyouth.com> * do not change 'master' or 'worker' nodes to '主从' * Doc updates for volume scheduling GA (#10743) * Doc updates for volume scheduling GA * Make trivial change to kick build * Document nodelease feature (#10699) * advanced audit doc for ModeBlockingStrict (#10203) * Rename EncryptionConfig to EncryptionConfiguration (#11080) EncryptionConfig was renamed to EncryptedConfiguration and added to the `apiserver.config.k8s.io` API group in Kubernetes 1.13. The feature was previously in alpha and was not handling versions properly, which lead to an originally unnoticed `v1` in the docs. * content/zh/docs/reference/setup-tools/kubeadm/kubeadm-init.md * trsanlate create-cluster-kubeadm.md to chinese (#11041) * trsanlate create-cluster-kubeadm.md to chinese * Update create-cluster-kubeadm.md * update the feature stage in v1.13 (#11307) * update new feature gates to document (#11295) * refresh controller role list on rbac description page (#11290) * node labeling restriction docs (#10944) * Update 1.13 docs for CSI GA (#10893) * dynamic audit documentation (#9947) * adds dynamic audit documentation * Copyedit for clarity See also inline question/s * Fix feature state shortcode * Update feature state * changes wording for dynamic audit flag behavior * Minor copyedit * fix dynamic audit yaml * adds api enablement command to dynamic audit docs * change ordering dynamic audit appears in * add references to dynamic audit in webhook backend * reword dynamic audit reference * updates stages field for audit sink object * changes audit sink api definition; rewords policy * kubeadm: remove kube-proxy workaround (#11162) * zh-trans content/en/docs/setup/independent/install-kubeadm.md (#11338) * zh-trans content/en/docs/setup/independent/install-kubeadm.md * Update install-kubeadm.md * Update dry run feature to beta (#11140) * vSphere volume raw block support doc update (#10932) * Add docs for Windows DNS configurations (#10036) * Update docs for fields allowed at root of CRD schema (#9973) * Add docs for Windows DNS configurations * add device monitoring documentation (#9945) * kubeadm: adds upgrade instructions for 1.13 (#11138) * kubeadm: adds upgrade instructions for 1.13 Signed-off-by: Chuck Ha <ha.chuck@gmail.com> * add minor copyedits Addressed a couple of copyedit comments a bit more cleanly. * kubeadm: add improvements to HA docs (#11094) * kubeadm: add information and diagrams for HA topologies * kubeadm: update HA doc with simplified steps * kubeadm: update HA doc with simplified steps * edit ha, add new topology topic, reorder by weight * troubleshoot markdown * fix more markdown, fix links * more markdown * more markdown * more markdown * changes after reviewer comments * add steps about Weave * update note about stacked topology * kubeadm external etcd HA upgrade 1.13 (#11364) * kubeadm external etcd HA upgrade 1.13 Signed-off-by: Ruben Orduz <rubenoz@gmail.com> * Update stacked controlplane steps * kubeadm cert documentation (#11093) * kubeadm certificate API and CSR documentation * copyedits * fix typo * PR for diff docs (#10789) * Empty commit against dev-1.13 for diff documentation * Complete Declarative maangement with diff commands * Second Korean l10n work for dev-1.13. (#11030) * Update outdated l10n(ko) contents (#10915) * Translate main menu for l10n(ko) docs (#10916) * Translate tasks/run-application/horizontal-pod-autoscale-walkthrough (#10980) * Translate content/ko/docs/concepts/overview/working-with-objects/kubernetes-object in Korean #11104 (#11332) * Pick-right-solution page translates into Korean. (#11340) * ko-trans: add jd/..., sap/..., ebay/..., homeoffice/... (#11336) * Translate concept/workloads/pods/pod-overview.md (#11092) Co-authored-by: June Yi <june.yi@samsung.com> Co-authored-by: Jesang Myung <jesang.myung@gmail.com> Co-authored-by: zerobig <38598117+zer0big@users.noreply.github.com> Co-authored-by: Claudia J.Kang <claudiajkang@gmail.com> Co-authored-by: lIuDuI <1693291525@qq.com> Co-authored-by: Woojin Na(Eddie) <cheapluv@gmail.com> * Rename encryption-at-rest related objects (#11059) EncryptionConfig was renamed to EncryptedConfiguration and added to the `apiserver.config.k8s.io` API group in Kubernetes 1.13. The feature was previously in alpha and was not handling versions properly, which lead to an originally unnoticed `v1` in the docs. Also, the `--experimental-encryption-provider-config` flag is now called just `--encryption-provider-config`. * Documenting FlexVolume Resize alpha feature. (#10097) * CR webhook conversion documentation (#10986) * CR Conversion * Addressing comments * Addressing more comments * Addressing even more comments * Addressing even^2 more comments * Remove references to etcd2 in v1.13 since support has been removed (#11414) * Remove etcd2 references as etcd2 is deprecated Link back to the v1.12 version of the etcd3 doc for the etcd2->etcd3 migration instructions. I updated the kube-apiserver reference manually, unsure if that is auto-generated somehow. The federation-apiserver can still potentially support etcd2 so I didn't touch that. * Remove outdated {master,node}.yaml files There are master/node yaml files that reference etcd2.service that are likely highly out of date. I couldn't find any docs that actually reference these templates so I removed them * Address review comments * Final Korean l10n work for dev-1.13 (#11440) * Update outdated l10n(ko) contents (#11425) fixes #11424 * Remove references to etcd2 in content/ko (#11416) * Resolve conflicts against master for /ko contents (#11438) * Fix unopened caution shortcode * kubeadm: update the reference docs for 1.13 (#10960) * docs update to promote TaintBasedEvictions to beta (#10765) * First Korean l10n work for dev-1.13 (#10719) * Update outdated l10n(ko) contents (#10689) fixes #10686 * Translate concepts/overview/what-is-kubernetes in Korean (#10690) * Translate concepts/overview/what-is-kubernetes in Korean * Feedback from ClaudiaJKang * Translate concepts/overview/components in Korean (#10882) * Translate concepts/overview/components in Korean #10717 * Translate concepts/overview/components in Korean * Translate concepts/overview/components in Korean * Apply Korean glossary: 서비스 어카운트 * Translate concepts/overview/kubernetes-api in Korean (#10773) * Translate concepts/overview/kubernetes-api in Korean * Applied feedback from ianychoi * kubeadm: update the configuration docs to v1beta1 (#10959) * kubeadm: add small v1beta1 related updates (#10988) * update new feature gates to document (#11295) * Update dry run feature to beta (#11140) * kubeadm: add improvements to HA docs (#11094) * kubeadm: add information and diagrams for HA topologies * kubeadm: update HA doc with simplified steps * kubeadm: update HA doc with simplified steps * edit ha, add new topology topic, reorder by weight * troubleshoot markdown * fix more markdown, fix links * more markdown * more markdown * more markdown * changes after reviewer comments * add steps about Weave * update note about stacked topology * kubeadm: update reference docs - add section about working with phases under kubeadm-init.md - update GA / beta status of features - kubeadm alpha phase was moved to kubeadm init phase - new commands were added under kubeadm alpha - included new CoreDNS usage examples * Generate components and tools reference * Add generated federation API Reference (#11491) * Add generated federation API Reference * Add front matter to federation reference * Remove whitespace from federation front matter * Remove more whitespace from federation front matter * Remove superfluous kubefed reference * Add frontmatter to generated kubefed reference * Fix kubefed reference page frontmatter * Generate kubectl reference docs 1.13 (#11487) * Generate kubectl reference docs 1.13 * Fix links in kubectl reference * Add 1.13 API reference (#11489) * Update config.toml (#11486) * Update config.toml Preparing for 1.13 release, updating the config.toml and dropping the 1.8 docs reference. * update dot releases and docsbranch typo * adding .Site. to Params.currentUrl (#11503) see https://github.com/kubernetes/website/pull/11502 for context * Add 1.13 Release notes (#11499)
212 lines
8.1 KiB
Markdown
212 lines
8.1 KiB
Markdown
---
|
||
reviewers:
|
||
- smarterclayton
|
||
title: Encrypting Secret Data at Rest
|
||
content_template: templates/task
|
||
---
|
||
|
||
{{% capture overview %}}
|
||
This page shows how to enable and configure encryption of secret data at rest.
|
||
{{% /capture %}}
|
||
|
||
{{% capture prerequisites %}}
|
||
|
||
* {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
|
||
|
||
* Kubernetes version 1.13.0 or later is required
|
||
|
||
* etcd v3 or later is required
|
||
|
||
{{% /capture %}}
|
||
|
||
{{% capture steps %}}
|
||
|
||
## Configuration and determining whether encryption at rest is already enabled
|
||
|
||
The `kube-apiserver` process accepts an argument `--encryption-provider-config`
|
||
that controls how API data is encrypted in etcd. An example configuration
|
||
is provided below.
|
||
|
||
Note:
|
||
The alpha version of the encryption feature prior to 1.13 used the `--experimental-encryption-provider-config` flag.
|
||
|
||
## Understanding the encryption at rest configuration.
|
||
|
||
```yaml
|
||
kind: EncryptionConfiguration
|
||
apiVersion: apiserver.config.k8s.io/v1
|
||
resources:
|
||
- resources:
|
||
- secrets
|
||
providers:
|
||
- identity: {}
|
||
- aesgcm:
|
||
keys:
|
||
- name: key1
|
||
secret: c2VjcmV0IGlzIHNlY3VyZQ==
|
||
- name: key2
|
||
secret: dGhpcyBpcyBwYXNzd29yZA==
|
||
- aescbc:
|
||
keys:
|
||
- name: key1
|
||
secret: c2VjcmV0IGlzIHNlY3VyZQ==
|
||
- name: key2
|
||
secret: dGhpcyBpcyBwYXNzd29yZA==
|
||
- secretbox:
|
||
keys:
|
||
- name: key1
|
||
secret: YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY=
|
||
```
|
||
|
||
Each `resources` array item is a separate config and contains a complete configuration. The
|
||
`resources.resources` field is an array of Kubernetes resource names (`resource` or `resource.group`)
|
||
that should be encrypted. The `providers` array is an ordered list of the possible encryption
|
||
providers. Only one provider type may be specified per entry (`identity` or `aescbc` may be provided,
|
||
but not both in the same item).
|
||
|
||
The first provider in the list is used to encrypt resources going into storage. When reading
|
||
resources from storage each provider that matches the stored data attempts to decrypt the data in
|
||
order. If no provider can read the stored data due to a mismatch in format or secret key, an error
|
||
is returned which prevents clients from accessing that resource.
|
||
|
||
Note:
|
||
The alpha version of the encryption feature prior to 1.13 required to be configured with
|
||
`kind: EncryptionConfig` and `apiVersion: v1`.
|
||
|
||
{{< caution >}}
|
||
**IMPORTANT:** If any resource is not readable via the encryption config (because keys were changed),
|
||
the only recourse is to delete that key from the underlying etcd directly. Calls that attempt to
|
||
read that resource will fail until it is deleted or a valid decryption key is provided.
|
||
{{< /caution >}}
|
||
|
||
### Providers:
|
||
|
||
Name | Encryption | Strength | Speed | Key Length | Other Considerations
|
||
-----|------------|----------|-------|------------|---------------------
|
||
`identity` | None | N/A | N/A | N/A | Resources written as-is without encryption. When set as the first provider, the resource will be decrypted as new values are written.
|
||
`aescbc` | AES-CBC with PKCS#7 padding | Strongest | Fast | 32-byte | The recommended choice for encryption at rest but may be slightly slower than `secretbox`.
|
||
`secretbox` | XSalsa20 and Poly1305 | Strong | Faster | 32-byte | A newer standard and may not be considered acceptable in environments that require high levels of review.
|
||
`aesgcm` | AES-GCM with random nonce | Must be rotated every 200k writes | Fastest | 16, 24, or 32-byte | Is not recommended for use except when an automated key rotation scheme is implemented.
|
||
`kms` | Uses envelope encryption scheme: Data is encrypted by data encryption keys (DEKs) using AES-CBC with PKCS#7 padding, DEKs are encrypted by key encryption keys (KEKs) according to configuration in Key Management Service (KMS) | Strongest | Fast | 32-bytes | The recommended choice for using a third party tool for key management. Simplifies key rotation, with a new DEK generated for each encryption, and KEK rotation controlled by the user. [Configure the KMS provider](/docs/tasks/administer-cluster/kms-provider/)
|
||
|
||
Each provider supports multiple keys - the keys are tried in order for decryption, and if the provider
|
||
is the first provider, the first key is used for encryption.
|
||
|
||
## Encrypting your data
|
||
|
||
Create a new encryption config file:
|
||
|
||
```yaml
|
||
kind: EncryptionConfiguration
|
||
apiVersion: apiserver.config.k8s.io/v1
|
||
resources:
|
||
- resources:
|
||
- secrets
|
||
providers:
|
||
- aescbc:
|
||
keys:
|
||
- name: key1
|
||
secret: <BASE 64 ENCODED SECRET>
|
||
- identity: {}
|
||
```
|
||
|
||
To create a new secret perform the following steps:
|
||
|
||
1. Generate a 32 byte random key and base64 encode it. If you're on Linux or macOS, run the following command:
|
||
|
||
```
|
||
head -c 32 /dev/urandom | base64
|
||
```
|
||
|
||
2. Place that value in the secret field.
|
||
3. Set the `--encryption-provider-config` flag on the `kube-apiserver` to point to the location of the config file.
|
||
4. Restart your API server.
|
||
|
||
{{< caution >}}
|
||
Your config file contains keys that can decrypt content in etcd, so you must properly restrict permissions on your masters so only the user who runs the kube-apiserver can read it.
|
||
{{< /caution >}}
|
||
|
||
|
||
## Verifying that data is encrypted
|
||
|
||
Data is encrypted when written to etcd. After restarting your `kube-apiserver`, any newly created or
|
||
updated secret should be encrypted when stored. To check, you can use the `etcdctl` command line
|
||
program to retrieve the contents of your secret.
|
||
|
||
1. Create a new secret called `secret1` in the `default` namespace:
|
||
|
||
```
|
||
kubectl create secret generic secret1 -n default --from-literal=mykey=mydata
|
||
```
|
||
|
||
2. Using the etcdctl commandline, read that secret out of etcd:
|
||
|
||
```
|
||
ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C
|
||
```
|
||
|
||
where `[...]` must be the additional arguments for connecting to the etcd server.
|
||
3. Verify the stored secret is prefixed with `k8s:enc:aescbc:v1:` which indicates the `aescbc` provider has encrypted the resulting data.
|
||
4. Verify the secret is correctly decrypted when retrieved via the API:
|
||
|
||
```
|
||
kubectl describe secret secret1 -n default
|
||
```
|
||
|
||
should match `mykey: bXlkYXRh`, mydata is encoded, check [decoding a secret](/docs/concepts/configuration/secret#decoding-a-secret) to
|
||
completely decode the secret.
|
||
|
||
|
||
## Ensure all secrets are encrypted
|
||
|
||
Since secrets are encrypted on write, performing an update on a secret will encrypt that content.
|
||
|
||
```
|
||
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
|
||
```
|
||
|
||
The command above reads all secrets and then updates them to apply server side encryption.
|
||
If an error occurs due to a conflicting write, retry the command.
|
||
For larger clusters, you may wish to subdivide the secrets by namespace or script an update.
|
||
|
||
|
||
## Rotating a decryption key
|
||
|
||
Changing the secret without incurring downtime requires a multi step operation, especially in
|
||
the presence of a highly available deployment where multiple `kube-apiserver` processes are running.
|
||
|
||
1. Generate a new key and add it as the second key entry for the current provider on all servers
|
||
2. Restart all `kube-apiserver` processes to ensure each server can decrypt using the new key
|
||
3. Make the new key the first entry in the `keys` array so that it is used for encryption in the config
|
||
4. Restart all `kube-apiserver` processes to ensure each server now encrypts using the new key
|
||
5. Run `kubectl get secrets --all-namespaces -o json | kubectl replace -f -` to encrypt all existing secrets with the new key
|
||
6. Remove the old decryption key from the config after you back up etcd with the new key in use and update all secrets
|
||
|
||
With a single `kube-apiserver`, step 2 may be skipped.
|
||
|
||
|
||
## Decrypting all data
|
||
|
||
To disable encryption at rest place the `identity` provider as the first entry in the config:
|
||
|
||
```yaml
|
||
kind: EncryptionConfiguration
|
||
apiVersion: apiserver.config.k8s.io/v1
|
||
resources:
|
||
- resources:
|
||
- secrets
|
||
providers:
|
||
- identity: {}
|
||
- aescbc:
|
||
keys:
|
||
- name: key1
|
||
secret: <BASE 64 ENCODED SECRET>
|
||
```
|
||
|
||
and restart all `kube-apiserver` processes. Then run the command `kubectl get secrets --all-namespaces -o json | kubectl replace -f -`
|
||
to force all secrets to be decrypted.
|
||
|
||
{{% /capture %}}
|
||
|
||
|