Objeto secreto

En esta página, se describe el objeto secreto de Kubernetes y su uso en Google Kubernetes Engine.

¿Qué es un objeto secreto?

Objeto secreto

Los objetos secretos son objetos seguros que almacenan datos sensibles, como contraseñas, tokens de OAuth y llaves SSH en tus clústeres. Cuando almacenas datos sensibles en objetos secretos es más seguro que en el texto simple ConfigMaps o en especificaciones de pod. El uso de objetos secretos te permite controlar la manera en que se usan los datos sensibles, y reduce el riesgo de exposición de datos a usuarios no autorizados.

También puedes encriptar objetos secretos en la capa de la aplicación con una clave que administras en Cloud KMS. Para obtener más información, consulta Encriptación de objetos secretos de la capa de la aplicación.

Crea un objeto secreto

Creas un objeto secreto con kubectl create secret:

    kubectl create secret type name data
    

En el ejemplo anterior, se ilustra lo siguiente:

  • type puede ser uno de los siguientes:

    • generic: Crea un objeto secreto a partir de un archivo local, directorio o valor literal.
    • docker-registry: Crea un objeto secreto dockercfg para usar con un registro de Docker. Se usa para autenticar con los registros de Docker.
    • tls: Crea un objeto secreto TLS a partir de un par de claves público/privado determinado. Esta par de clave público/privado debe existir con anticipación. El certificado de clave pública debe estar codificado con PEM y coincidir con la clave privada en cuestión.

    En la mayoría de los objetos secretos, se usa el tipo generic.

  • name es el nombre del objeto secreto que creas.

  • data puede ser una de las siguientes opciones:

    • una ruta de acceso a un directorio que contiene uno o más archivos de configuración, que se indica mediante las marcas --from-file o --from-env-file
    • pares clave-valor, cada uno especificado con marcas --from-literal

Para obtener más información sobre kubectl create, consulta la documentación de referencia.

O, como alternativa, para crear un objeto secreto, puedes definir un objeto secreto en un archivo de manifiesto en YAML y, también, implementar un objeto con el siguiente comando:

    kubectl create -f file-name.yaml
    

Para obtener un ejemplo, consulta Distribuye credenciales de forma segura con objetos secretos.

Desde archivos

Si deseas crear un objeto secreto a partir de uno o más archivos, usa --from-file o --from-env-file. El archivo debe ser de texto simple, pero no importa su extensión.

--from-file

Cuando creas el objeto secreto con --from-file, su valor es el contenido completo del archivo. Si el valor del objeto secreto contiene varios pares clave-valor, debes usar --from-env-file en su lugar.

Puedes pasar uno o varios archivos:

    kubectl create secret type name --from-file /path/to/file --from-file /path/to/file2
    

También puedes pasar un directorio que contenga varios archivos:

    kubectl create secret type name --from-file /path/to/directory
    

Por ejemplo, el siguiente comando crea un objeto secreto llamado credentials a partir de dos archivos, username.txt y password.txt, y establece las claves en username.txt y password.txt, respectivamente:

    kubectl create secret generic credentials --from-file ./username.txt --from-file ./password.txt
    

Los valores del objeto secreto están codificados en Base64 en Kubernetes.

Cuando se ejecuta kubectl get secret credentials -o yaml, se muestra el resultado siguiente:

    apiVersion: v1
    data:
      password.txt: MTIzNAo=
      username.txt: YWRtaW4K
    kind: Secret
    metadata:
      creationTimestamp: ...
      name: credentials
      namespace: default
      resourceVersion: "2011810"
      selfLink: /api/v1/namespaces/default/secrets/credentials
      uid: ...
    type: Opaque
    

De manera predeterminada, la clave es el nombre del archivo. Puedes anular la clave si usas la sintaxis extendida para --from-file:

    kubectl create secret type name --from-file=key=/path/to/directory
    

En el siguiente ejemplo, se crea un objeto secreto con nombre de credenciales de dos archivos, username.txt y password.txt, y establece las claves en username y password, en lugar de usar los nombres de archivo:

    kubectl create secret generic credentials --from-file=username=./username.txt --from-file=password=./password.txt
    

--from-env-file

Para cargar varios pares clave-valor en un objeto secreto, debes almacenar los pares clave-valor en uno o más archivos de texto simple y cargarlos con --from-env-file, en lugar de --from-file. Puedes cargar varios archivos si especificas la marca varias veces. Se aplican las mismas limitaciones que para --from-file.

Por ejemplo, el siguiente comando crea un objeto secreto llamado credentials a partir de un solo archivo, credentials.txt, que contiene varios pares clave-valor:

    # Each of these key-value pairs is loaded into the Secret
    username=jane
    password=d7xnNss7EGCFZusG
    

Los valores del objeto secreto están codificados en Base64 en Kubernetes.

    kubectl create secret generic credentials --from-env-file ./credentials.txt
    

Cuando se ejecuta kubectl get secret credentials -o yaml, se muestra el resultado siguiente:

apiVersion: v1
    data:
      password: ZDd4bk5zczdFR0NGWnVzRw==
      username: amFuZQ==
    kind: Secret
    metadata:
      creationTimestamp: 2019-06-04T15:39:27Z
      name: credentials
      namespace: default
      resourceVersion: "14507319"
      selfLink: /api/v1/namespaces/default/secrets/credentials
      uid: efce376b-86de-11e9-9742-42010a80022f
    type: Opaque
    

Limitaciones

kubectl ignora los archivos no regulares, como enlaces simbólicos, dispositivos y canalizaciones. Los subdirectorios también se ignoran; kubectl create secret no se clasifica en subdirectorios.

Desde valores literales

Si quieres crear un objeto secreto a partir de valores literales, debes usar --from-literal.

Por ejemplo, con el siguiente comando, se crea un objeto secreto genérico llamado literal-token con dos pares clave-valor:

    kubectl create secret generic literal-token --from-literal user=admin --from-literal password=1234
    

Especifica --from-literal para cada par clave-valor. Los valores se codifican de forma automática en Base64.

Si ejecutas kubectl get secret literal-token -o yaml, se muestra el siguiente resultado:

    apiVersion: v1
    data:
      password: MTIzNA==
      user: YWRtaW4=
    kind: Secret
    metadata:
      creationTimestamp: ...
      name: literal-token
      namespace: default
      resourceVersion: "2012831"
      selfLink: /api/v1/namespaces/default/secrets/literal-token
      uid: ...
    type: Opaque
    

En el resultado anterior, observa que password y user están codificados en Base64. La codificación en Base64 permite que las apps y los servicios que no pueden manejar algunos caracteres resuman la información. Esta codificación no proporciona seguridad.

Usa un objeto secreto

Si deseas usar un objeto secreto con tus cargas de trabajo, puedes especificar variables de entorno que hagan referencia a los valores del objeto, o activar un volumen que contenga este objeto.

Para obtener información sobre el uso de los objetos secretos, consulta la sección sobre cómo usar objetos secretos.

Próximos pasos