Skip to main content

Pregunta 11 | Secrets en ETCD

Usar contexto: kubectl config use-context workload-prod

Hay un Secret existente llamado database-access en el Namespace team-green.

Lee el contenido completo del Secret directamente desde ETCD (usando etcdctl) y guárdalo en /opt/course/11/etcd-secret-content. Escribe el valor plano y decodificado de la clave "pass" del Secret en /opt/course/11/database-password.


Respuesta:

Intentemos obtener el valor del Secret directamente desde ETCD, lo cual funcionará ya que no está cifrado.

Primero, hacemos ssh al nodo maestro donde ETCD se está ejecutando en esta configuración y verificamos si etcdctl está instalado y listamos sus opciones:

ssh cluster1-controlplane1

➜ root@cluster1-controlplane1:~# etcdctl
NAME:
etcdctl - A simple command line client for etcd.

WARNING:
Environment variable ETCDCTL_API is not set; defaults to etcdctl v2.
Set environment variable ETCDCTL_API=3 to use v3 API or ETCDCTL_API=2 to use v2 API.

USAGE:
etcdctl [global options] command [command options] [arguments...]
...
--cert-file value identify HTTPS client using this SSL certificate file
--key-file value identify HTTPS client using this SSL key file
--ca-file value verify certificates of HTTPS-enabled servers using this CA bundle
...

Entre otros, vemos argumentos para identificarnos. El apiserver se conecta a ETCD, por lo que podemos ejecutar el siguiente comando para obtener la ruta de los archivos .crt y .key necesarios:

cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd

# La salida es la siguiente:

- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
- --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
- --etcd-servers=https://127.0.0.1:2379 # opcional ya que estamos en el mismo nodo

# Con esta información consultamos ETCD para el valor del secret:

➜ root@cluster1-controlplane1:~# ETCDCTL_API=3 etcdctl \
--cert /etc/kubernetes/pki/apiserver-etcd-client.crt \
--key /etc/kubernetes/pki/apiserver-etcd-client.key \
--cacert /etc/kubernetes/pki/etcd/ca.crt get /registry/secrets/team-green/database-access

ETCD en Kubernetes almacena datos bajo /registry/{type}/{namespace}/{name}. Así es como llegamos a buscar /registry/secrets/team-green/database-access. También hay un ejemplo en una página de la documentación de k8s que podrías guardar como marcador para acceder rápidamente durante el examen.

La tarea requiere que almacenemos la salida en nuestra terminal. Para esto simplemente podemos copiar y pegar el contenido en un nuevo archivo en nuestra terminal:

# /opt/course/11/etcd-secret-content
/registry/secrets/team-green/database-access
k8s


v1Secret

database-access
team-green"*$3e0acd78-709d-4f07-bdac-d5193d0f2aa32bB
0kubectl.kubernetes.io/last-applied-configuration{"apiVersion":"v1","data":{"pass":"Y29uZmlkZW50aWFs"},"kind":"Secret","metadata":{"annotations":{},"name":"database-access","namespace":"team-green"}}
z
kubectl-client-side-applyUpdatevFieldsV1:
{"f:data":{".":{},"f:pass":{}},"f:metadata":{"f:annotations":{".":{},"f:kubectl.kubernetes.io/last-applied-configuration":{}}},"f:type":{}}
pass
confidentialOpaque"

# También se nos requiere almacenar la contraseña de la base de datos en texto plano y "descifrada". Para esto podemos copiar el valor codificado en base64 de la salida de ETCD y ejecutar en nuestra terminal:

echo Y29uZmlkZW50aWFs | base64 -d > /opt/course/11/database-password

cat /opt/course/11/database-password
confidential