I am fresh to Kubernetes.
My understanding of secret
is that it encodes information by base64
. And from the resources I have seen, it is claimed that secret
could protect sensitive information. I do not get this.
Besides encoding information with base64
, I do not see any real difference between secret
and configMap
. And we could decode base64
-encoded information so easily. That means there is no protection at all...
Is my understanding wrong?
The thing which protects a Secret
is the fact that it is a distinct resource type in kubernetes, and thus can be subject to a different RBAC policy than a ConfigMap
.
If you are currently able to read Secret
s in your cluster, that's because your ClusterRoleBinding
(or RoleBinding
) has a rule that specifically grants access to those resources. It can be due to you accessing the cluster through its "unauthenticated" port from one of the master Nodes, or due to the [Cluster
]RoleBinding
attaching your Subject
to cluster-admin
, which is probably pretty common in hello-world situations, but I would guess less common in production cluster setups.
That's the pedantic answer, however, really guarding the secrets contained in a Secret
is trickier, given that they are usually exposed to the Pod
s through environment injection or a volume mount. That means anyone who has exec
access to the Pod
can very easily exfiltrate the secret values, so if the secrets are super important, and must be kept even from the team, you'll need to revoke exec
access to your Pod
s, too. A middle ground may be to grant the team access to Secret
s in their own Namespace
, but forbid it from other Namespace
s. It's security, so there's almost no end to the permutations and special cases.