Bird
Raised Fist0
Kubernetesdevops~10 mins

Secrets are not encrypted by default in Kubernetes - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Secrets are not encrypted by default
Create Secret YAML
↓
kubectl apply Secret
↓
Secret stored in etcd
↓
Secret stored as base64 (not encrypted)
↓
Anyone with etcd access can decode Secret
↓
Enable Encryption at Rest to protect Secret
This flow shows how Kubernetes stores Secrets by default as base64 in etcd without encryption, exposing them unless encryption at rest is enabled.
Execution Sample
Kubernetes
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
data:
  password: cGFzc3dvcmQ=
This YAML creates a Kubernetes Secret named 'mysecret' with a base64 encoded password.
Process Table
StepActionData Stored in etcdSecurity State
1Create Secret YAML with password 'password'password encoded as cGFzc3dvcmQ=Secret is base64 encoded, not encrypted
2Apply Secret with kubectlSecret saved in etcd as base64 stringSecret still not encrypted
3Access etcd storage directlyRetrieve base64 string cGFzc3dvcmQ=Secret can be decoded easily
4Decode base64 stringDecoded value: 'password'Secret exposed in plain text
5Enable Encryption at Rest in KubernetesSecret stored encrypted in etcdSecret protected from direct etcd access
💡 By default, Secrets are stored base64 encoded but not encrypted, so enabling encryption at rest is needed for protection.
Status Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 5
Secret Datanonepassword base64 encodedstored base64 in etcdretrieved base64 from etcdstored encrypted in etcd
Key Moments - 3 Insights
Why is base64 encoding not the same as encryption?
Base64 encoding only changes the format to text; it does not hide the data. As shown in execution_table step 4, anyone can decode base64 to get the original secret.
What happens if someone accesses etcd directly without encryption enabled?
They can read Secrets easily because they are stored as base64 strings, which can be decoded to reveal the secret, as shown in execution_table step 3 and 4.
How does enabling Encryption at Rest change Secret storage?
Encryption at Rest stores Secrets encrypted in etcd, so even if someone accesses etcd, they cannot read the Secrets without the encryption keys, as shown in execution_table step 5.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the format of the Secret stored in etcd after applying kubectl?
ABase64 encoded string
BPlain text
CEncrypted data
DHashed value
💡 Hint
Check execution_table row 2 under 'Data Stored in etcd'
At which step does the Secret become readable in plain text?
AStep 2
BStep 3
CStep 4
DStep 5
💡 Hint
Look at execution_table where decoding happens
If Encryption at Rest is enabled, what changes in the Secret storage?
ASecrets are stored as base64 strings
BSecrets are stored encrypted in etcd
CSecrets are stored in plain text
DSecrets are deleted after use
💡 Hint
Refer to execution_table step 5 under 'Security State'
Concept Snapshot
Kubernetes Secrets are stored base64 encoded by default, not encrypted.
Base64 encoding only changes format, not security.
Anyone with etcd access can decode Secrets.
Enable Encryption at Rest to protect Secrets in etcd.
Encryption stores Secrets securely, preventing easy access.
Full Transcript
In Kubernetes, when you create a Secret, it is stored in etcd as a base64 encoded string, not encrypted. This means anyone who can access etcd can decode and read the Secret easily. The flow starts with creating a Secret YAML, applying it with kubectl, and storing it in etcd. Without encryption, the Secret is exposed. To protect Secrets, Kubernetes supports Encryption at Rest, which encrypts Secrets in etcd, making them safe from direct access. Base64 encoding is not encryption; it only changes the data format. Enabling Encryption at Rest is essential for securing sensitive data in Kubernetes.

Practice

(1/5)
1. What is the default way Kubernetes stores Secrets?
easy
A. Hashed using SHA-256 before storage
B. As base64 encoded plain text in etcd
C. Stored in an external vault automatically
D. Encrypted with AES-256 by default

Solution

  1. Step 1: Understand Kubernetes default Secret storage

    Kubernetes stores Secrets in etcd as base64 encoded strings, which is not encryption but simple encoding.
  2. Step 2: Confirm encryption is not enabled by default

    Encryption at rest must be explicitly configured; by default, Secrets are not encrypted.
  3. Final Answer:

    As base64 encoded plain text in etcd -> Option B
  4. Quick Check:

    Default Secret storage = base64 plain text [OK]
Hint: Remember: base64 is encoding, not encryption [OK]
Common Mistakes:
  • Confusing base64 encoding with encryption
  • Assuming Secrets are encrypted by default
  • Thinking Kubernetes uses external vault automatically
2. Which of the following is the correct way to enable encryption of Secrets in Kubernetes?
easy
A. Configure EncryptionConfiguration file in API server flags
B. Set encryption: true in the Secret manifest
C. Add --encryption-provider flag to kubelet
D. Use kubectl encrypt secret command

Solution

  1. Step 1: Identify where encryption is configured

    Encryption at rest is enabled by configuring the API server with an EncryptionConfiguration file and passing it via flags.
  2. Step 2: Verify other options are invalid

    Kubelet does not handle encryption, Secret manifests do not have encryption fields, and kubectl has no encrypt command.
  3. Final Answer:

    Configure EncryptionConfiguration file in API server flags -> Option A
  4. Quick Check:

    Encryption enabled via API server config [OK]
Hint: Encryption config is on API server, not kubelet or kubectl [OK]
Common Mistakes:
  • Trying to encrypt Secrets via kubectl commands
  • Assuming kubelet manages encryption
  • Adding encryption fields in Secret YAML
3. Given this snippet from an EncryptionConfiguration file:
{
  "kind": "EncryptionConfiguration",
  "apiVersion": "apiserver.config.k8s.io/v1",
  "resources": [
    {
      "resources": ["secrets"],
      "providers": [
        {"aescbc": {"keys": [{"name": "key1", "secret": "c2VjcmV0MTIzNDU2Nzg5MDEyMzQ1Njc4OTA="}]}},
        {"identity": {}}
      ]
    }
  ]
}
What does this configuration do?
medium
A. Encrypts Secrets using AES-CBC with key1, falling back to no encryption
B. Encrypts all resources except Secrets
C. Disables encryption for Secrets
D. Encrypts Secrets using identity provider only

Solution

  1. Step 1: Analyze the providers list for Secrets

    The providers list has an AES-CBC encryption provider with a key named key1, followed by identity (no encryption) as fallback.
  2. Step 2: Understand the effect on Secrets

    This means Secrets are encrypted with AES-CBC using key1; if decryption fails, identity provider returns plain data.
  3. Final Answer:

    Encrypts Secrets using AES-CBC with key1, falling back to no encryption -> Option A
  4. Quick Check:

    Encryption config with AES-CBC + identity fallback [OK]
Hint: First provider encrypts, second is fallback identity [OK]
Common Mistakes:
  • Thinking identity means encryption is disabled
  • Assuming all resources are encrypted, not just Secrets
  • Confusing provider order effect
4. You configured encryption for Secrets but still see base64 encoded plain text in etcd. What is the most likely cause?
medium
A. Secrets manifest missing encryption annotation
B. Encryption key is too short
C. kubectl version is outdated
D. API server was not restarted after adding EncryptionConfiguration

Solution

  1. Step 1: Check if API server reload is needed

    EncryptionConfiguration changes require API server restart to take effect.
  2. Step 2: Verify other options are irrelevant

    Secrets do not need annotations for encryption, kubectl version does not affect encryption, and key length would cause errors, not silent failure.
  3. Final Answer:

    API server was not restarted after adding EncryptionConfiguration -> Option D
  4. Quick Check:

    API server restart required for encryption config [OK]
Hint: Restart API server after config changes [OK]
Common Mistakes:
  • Forgetting to restart API server
  • Adding encryption annotations to Secrets
  • Blaming kubectl version for encryption issues
5. You want to ensure all Secrets in your cluster are encrypted at rest. Which steps should you follow? Select the correct sequence.
hard
A. Enable encryption in kube-proxy config, restart kube-proxy, check logs
B. Add encryption field to Secret manifests, restart kubelet, verify kubectl output
C. Create EncryptionConfiguration file, update API server flags, restart API server, verify etcd data
D. Run kubectl encrypt secrets, update RBAC, restart API server

Solution

  1. Step 1: Prepare EncryptionConfiguration file

    Create a file defining encryption providers for Secrets, typically AES-CBC or AES-GCM.
  2. Step 2: Update API server flags and restart

    Pass the EncryptionConfiguration file path to the API server via flags and restart it to apply changes.
  3. Step 3: Verify Secrets are encrypted in etcd

    Check etcd data to confirm Secrets are stored encrypted, not just base64 encoded.
  4. Final Answer:

    Create EncryptionConfiguration file, update API server flags, restart API server, verify etcd data -> Option C
  5. Quick Check:

    Encryption setup = config file + API server restart + verify [OK]
Hint: Encryption needs config file + API server restart + verify [OK]
Common Mistakes:
  • Trying to encrypt Secrets via manifest changes
  • Restarting wrong components like kubelet or kube-proxy
  • Using non-existent kubectl encrypt command
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard