@@ -173,9 +173,12 @@ the only recourse is to delete that key from the underlying etcd directly. Calls
173
173
read that resource will fail until it is deleted or a valid decryption key is provided.
174
174
{{< /caution >}}
175
175
176
- # ## Providers
176
+ # ## Available providers {#providers}
177
177
178
- The following table describes each available provider :
178
+ Before you configure encryption-at-rest for data in your cluster's Kubernetes API, you
179
+ need to select which provider(s) you will use.
180
+
181
+ The following table describes each available provider.
179
182
180
183
<!-- localization note : if it makes sense to adapt this table to work for your localization,
181
184
please do that. Each sentence in the English original should have a direct equivalent in the adapted
@@ -281,29 +284,32 @@ The following table describes each available provider:
281
284
</tbody>
282
285
</table>
283
286
284
- Each provider supports multiple keys - the keys are tried in order for decryption, and if the provider
285
- is the first provider, the first key is used for encryption.
287
+ The `identity` provider is the default if you do not specify otherwise. **The `identity` provider does not
288
+ encrypt stored data and provides _no_ additional confidentiality protection.**
286
289
290
+ # ## Key storage
287
291
288
- {{< caution >}}
289
- Storing the raw encryption key in the EncryptionConfig only moderately improves your security
290
- posture, compared to no encryption. Please use `kms` provider for additional security.
291
- {{< /caution >}}
292
-
293
- By default, the `identity` provider is used to protect secret data in etcd, which provides no
294
- encryption. `EncryptionConfiguration` was introduced to encrypt secret data locally, with a locally
295
- managed key.
292
+ # ### Local key storage
296
293
297
294
Encrypting secret data with a locally managed key protects against an etcd compromise, but it fails to
298
295
protect against a host compromise. Since the encryption keys are stored on the host in the
299
296
EncryptionConfiguration YAML file, a skilled attacker can access that file and extract the encryption
300
297
keys.
301
298
302
- Envelope encryption creates dependence on a separate key, not stored in Kubernetes. In this case,
303
- an attacker would need to compromise etcd, the `kubeapi-server`, and the third-party KMS provider to
304
- retrieve the plaintext values, providing a higher level of security than locally stored encryption keys.
299
+ # ### Managed (KMS) key storage {#kms-key-storage}
300
+
301
+ The KMS provider uses _envelope encryption_ : Kubernetes encrypts resources using a data key, and then
302
+ encrypts that data key using the managed encryption service. Kubernetes generates a unique data key for
303
+ each resource. The API server stores an encrypted version of the data key in etcd alongside the ciphertext;
304
+ when reading the resource, the API server calls the managed encryption service and provides both the
305
+ ciphertext and the (encrypted) data key.
306
+ Within the managed encryption service, the provider use a _key encryption key_ to decipher the data key,
307
+ deciphers the data key, and finally recovers the plain text. Communication between the control plane
308
+ and the KMS requires in-transit protection, such as TLS.
305
309
306
- # # Encrypting your data
310
+ Using envelope encryption creates dependence on the key encryption key, which is not stored in Kubernetes.
311
+ In the KMS case, an attacker who intends to get unauthorised access to the plaintext
312
+ values would need to compromise etcd **and** the third-party KMS provider.
307
313
308
314
# # Write an encryption configuration file
309
315
0 commit comments