Usar autoridades certificadoras personalizadas del clúster

Las autoridades certificadoras (AC) del clúster emiten y firman certificados para habilitar la autenticación y la encriptación seguras entre los componentes del clúster. De forma predeterminada, en Google Distributed Cloud, la API de clúster crea las AC del clúster cuando creas un clúster nuevo. En este documento, se describe cómo puedes usar tus propias autoridades certificadoras con Google Distributed Cloud. Usar AC de clúster personalizadas te brinda más control sobre la emisión y la administración de los certificados de tu clúster. También puedes controlar la confianza, los parámetros del algoritmo de encriptación, la profundidad de los certificados subordinados y su propósito.

Para usar AC personalizadas, debes proporcionar AC raíz, que constan de un archivo de certificado de AC y su archivo de clave privada correspondiente. Proporciona un certificado de la AC y un par de archivos de claves para cada una de las siguientes AC de clúster obligatorias:

  • CA de etcd: el certificado para el certificado de la AC de etcd protege la comunicación desde el servidor de la API de Kubernetes a las réplicas de etcd, así como la comunicación entre las réplicas de etcd.

  • CA del clúster: El certificado de la CA del clúster protege la comunicación entre el servidor de la API de Kubernetes y todos los clientes internos de la API de Kubernetes. Entre los clientes, se incluyen kubelet, el administrador del controlador y el programador.

  • CA del proxy frontal: El certificado para la CA del proxy frontal protege la comunicación con las APIs agregadas.

Puedes proporcionar un par de claves de certificado único para cada AC o puedes volver a usar un par de claves de certificado para más de una de las AC.

Aplicas los pares de claves de certificado durante la creación del clúster (solo el método bmctl) y la rotación de AC. La función de la AC de clúster personalizado funciona con todos los tipos de clústeres: administrador, usuario, híbrido e independiente.

Requisitos previos

Eres responsable de preparar tus propias AC raíz de acuerdo con las siguientes reglas:

  • Las AC personalizadas son AC raíz, cada una de ellas compuesta por un archivo de certificado autofirmado y un archivo de claves privadas.

  • Para tu certificado, te recomendamos que uses el formato de reglas de codificación distinguidas (DER) (consulta la recomendación X.690 para las reglas de codificación ASN.1). El archivo de certificado debe contener datos codificados en base64 precedidos de ‑‑‑‑‑BEGIN CERTIFICATE‑‑‑‑‑ y seguidos de ‑‑‑‑END CERTIFICATE‑‑‑‑‑.

  • Para la clave privada, te recomendamos usar el formato Public-Key Cryptography Standards (PKCS) #1. Tu archivo de claves debe contener datos codificados en Base64 precedidos de ‑‑‑‑BEGIN RSA PRIVATE KEY‑‑‑‑ y seguidos de ‑‑‑‑END RSA PRIVATE KEY‑‑‑‑.

  • Para minimizar la posible interrupción del clúster, las AC personalizadas no deben vencer antes de cinco años. Recomendamos un período de vencimiento más largo, como de 10 a 30 años.

  • Asegúrate de que el certificado y los archivos de claves estén en la estación de trabajo de administrador en la que ejecutas los comandos de bmctl.

  • El usuario que ejecuta los comandos bmctl debe tener acceso al directorio en el que almacenas los archivos. Te recomendamos colocar los archivos en un directorio existente que se utilice para los certificados y las claves. Por ejemplo, puedes almacenar los archivos en ~/baremetal/bmctl-workspace/.sa-keys junto con las claves de tu cuenta de servicio.

  • El usuario que ejecuta los comandos bmctl debe tener acceso de lectura a los archivos.

Usa una AC personalizada durante la creación del clúster

Cuando creas un clúster con bmctl, primero debes actualizar el archivo de configuración del clúster para describir sus características y parámetros de configuración. Si quieres usar la función de AC de clúster personalizado durante la creación del clúster, tienes dos opciones para especificar las AC personalizadas en el archivo de configuración del clúster:

  • Especifica las rutas de acceso para los archivos de certificado de la AC y los archivos de claves privadas.
  • Especifica las rutas de acceso solo para los archivos de claves privadas

Cuando solo especificas las claves privadas, bmctl busca los archivos de certificados de la AC correspondientes en el mismo directorio. Los archivos de certificado deben tener el mismo nombre que los archivos de claves privadas correspondientes y la extensión de archivo .crt. Por ejemplo, si la ruta de la clave privada es /custom-ca/cluster_ca.key, entonces bmctl espera que la ruta del certificado sea /custom-ca/cluster_ca.crt.

En cualquier caso, las rutas de acceso se especifican en la sección de credenciales del archivo de configuración, como se muestra en los siguientes ejemplos.

Ejemplo 1: Especifica el certificado y las rutas de las claves

En el siguiente extracto de un archivo de configuración de clúster, se muestra cómo especificar las rutas de acceso al certificado y a los archivos de claves para cada AC del clúster. En este ejemplo, el certificado de la AC y los archivos de claves están en el mismo directorio que los archivos de claves JSON de la cuenta de servicio.

gcrKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-gcr.json
...
cloudOperationsServiceAccountKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-cloud-ops.json
clusterCACertPath: bmctl-workspace/.sa-keys/cluster_ca_cert.pem
clusterCAPrivateKeyPath: bmctl-workspace/.sa-keys/cluster_ca_key.pem
etcdCACertPath: bmctl-workspace/.sa-keys/etcd_ca_cert.pem
etcdCAPrivateKeyPath: bmctl-workspace/.sa-keys/etcd_ca_key.pem
frontProxyCACertPath: bmctl-workspace/.sa-keys/front_proxy_ca_cert.pem
frontProxyCAPrivateKeyPath: bmctl-workspace/.sa-keys/front_proxy_ca_key.pem
---
apiVersion: v1
kind: Namespace
metadata:
  name: cluster-admin-test
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
...

Ejemplo 2: Especifica solo las rutas de acceso de la clave privada

En el siguiente extracto de un archivo de configuración de clúster, se muestra cómo especificar las rutas de acceso solo a los archivos de claves. En este ejemplo, los archivos de claves privadas de la AC están en el mismo directorio que los archivos de claves JSON de la cuenta de servicio. Los archivos de certificado de la AC correspondientes también deben estar en el directorio /.sa-keys. Los archivos de certificados tienen el mismo nombre de archivo que los archivos de claves, pero con una extensión .crt. Por lo tanto, el archivo de certificado de la AC de etcd tiene el nombre etcd_ca.crt.

gcrKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-gcr.json
...
cloudOperationsServiceAccountKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-cloud-ops.json
clusterCAPrivateKeyPath: bmctl-workspace/.sa-keys/cluster_ca_key.pem
etcdCAPrivateKeyPath: bmctl-workspace/.sa-keys/etcd_ca_key.pem
frontProxyCAPrivateKeyPath: bmctl-workspace/.sa-keys/front_proxy_ca_key.pem
---
apiVersion: v1
kind: Namespace
metadata:
  name: cluster-admin-test
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
...

Ejemplo 3: Reutiliza un solo par de certificados de la AC y archivos de claves

En el siguiente extracto de un archivo de configuración de clúster, se muestra cómo especificar las rutas de acceso solo a los archivos de claves. En este ejemplo, se usa un solo par de claves de certificado para todas las AC del clúster. El certificado de la AC y los archivos de claves privadas se encuentran en el directorio /custom-ca. Siguiendo la convención de nombres, el nombre del archivo del certificado de la AC es custom_ca.crt.

gcrKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-gcr.json
...
cloudOperationsServiceAccountKeyPath: bmctl-workspace/.sa-keys/myproject-anthos-baremetal-cloud-ops.json
clusterCAPrivateKeyPath: /custom-ca/custom_ca.key
etcdCAPrivateKeyPath: /custom-ca/custom_ca.key
frontProxyCAPrivateKeyPath: /custom-ca/custom_ca.key
---
apiVersion: v1
kind: Namespace
metadata:
  name: cluster-admin-test
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
...

Cómo usar una AC personalizada durante la rotación de AC

Cuando rotas las AC, puedes especificar las rutas de acceso para el certificado de la AC del clúster personalizado y los archivos de claves privadas. Las opciones que tienes son similares a las opciones para especificar CA de clúster personalizadas durante su creación. Cuando ejecutas el comando bmctl update credentials certificate-authorities rotate, tienes las siguientes opciones:

  • Especifica las rutas de acceso para los archivos de certificados de la AC personalizados y los archivos de claves privadas.
  • Especifica solo las rutas de acceso para los archivos de claves privadas de la AC personalizadas. El archivo de certificado de la AC correspondiente debe estar en el mismo directorio, tener el mismo nombre que el archivo de claves y tener una extensión de archivo .crt.
  • Especifica el mismo certificado y las mismas rutas de claves para más de una AC del clúster a fin de volver a usar un par de claves de certificado de la AC.
  • Omite los argumentos para las rutas de acceso de AC personalizadas. Si no especificas rutas de AC personalizadas cuando rotas las AC, Google Distributed Cloud crea y usa la AC estándar del clúster.

Ejemplo 1: Especifica el certificado de la AC y las rutas de la clave privada

bmctl update credentials certificate-authorities rotate \
    --cluster CLUSTER_NAME \
    --kubeconfig ADMIN_KUBECONFIG \
    --cluster-ca-cert-path=CLUSTER_CA_CERT_PATH \
    --cluster-ca-private-key-path=CLUSTER_CA_KEY_PATH \
    --etcd-ca-cert-path=ETCD_CA_CERT_PATH \
    --etcd-ca-private-key-path=ETCD_CA_KEY_PATH \
    --front-proxy-ca-cert-path=FRONT_PROXY_CA_CERT_PATH \
    --front-proxy-ca-private-key-path=FRONT_PROXY_CA_KEY_PATH

Reemplaza lo siguiente:

  • CLUSTER_NAME: Es el nombre del clúster en el que deseas rotar las AC.
  • ADMIN_KUBECONFIG es la ruta al archivo kubeconfig del clúster de administrador. Para los clústeres autoadministrados, este archivo es el archivo kubeconfig del clúster.
  • CLUSTER_CA_CERT_PATH: Es la ruta de acceso del archivo de certificado de la AC del clúster.
  • CLUSTER_CA_KEY_PATH: Es la ruta de acceso del archivo de claves privadas de la AC del clúster.
  • ETCD_CA_CERT_PATH: Es la ruta de acceso del archivo del certificado de la AC de etcd.
  • ETCD_CA_KEY_PATH: Es la ruta de acceso del archivo de claves privadas de la AC de etcd.
  • FRONT_PROXY_CA_CERT_PATH: Es la ruta de acceso del archivo de certificado del proxy frontal.
  • FRONT_PROXY_CA_KEY_PATH: Es la ruta de acceso del archivo de claves privadas del proxy frontal.

Ejemplo 2: Especifica solo las rutas de acceso de la clave privada

bmctl update credentials certificate-authorities rotate \
    --cluster CLUSTER_NAME \
    --kubeconfig ADMIN_KUBECONFIG \
    --cluster-ca-private-key-path=CLUSTER_CA_KEY_PATH \
    --etcd-ca-private-key-path=ETCD_CA_KEY_PATH \
    --front-proxy-ca-private-key-path=FRONT_PROXY_CA_KEY_PATH

Reemplaza lo siguiente:

  • CLUSTER_NAME: Es el nombre del clúster en el que deseas rotar las AC.
  • ADMIN_KUBECONFIG es la ruta al archivo kubeconfig del clúster de administrador. Para los clústeres autoadministrados, este archivo es el archivo kubeconfig del clúster.
  • CLUSTER_CA_KEY_PATH: Es la ruta de acceso del archivo de claves privadas de la AC del clúster.
  • ETCD_CA_KEY_PATH: Es la ruta de acceso del archivo de claves privadas de la AC de etcd.
  • FRONT_PROXY_CA_KEY_PATH: Es la ruta de acceso del archivo de claves privadas del proxy frontal.

AC intermedias

Los clústeres de la versión 1.29 admiten el uso de AC intermedias como una capacidad de Versión preliminar. Esta función no se encuentra en la misma etapa de lanzamiento para todas las versiones de productos compatibles:

  • 1.29: Vista previa
  • 1.28: No disponible
  • 1.16: No disponible

Al igual que el requisito de AC raíz para AC personalizadas, si quieres usar AC intermedias, debes preparar tres conjuntos de AC. Cada AC consta de un archivo de certificado de AC y su archivo de clave privada correspondiente. Proporciona un certificado de la AC y un par de archivos de claves para cada una de las siguientes AC de clúster obligatorias:

  • CA de etcd
  • CA del clúster
  • CA de Front-proxy

Al igual que con las AC raíz, puedes proporcionar un par de clave de certificado único para cada AC o puedes reutilizar un par de clave de certificado para más de una AC especificando las mismas rutas de acceso de archivo en la configuración de AC.

Cuando usas AC intermedias, el archivo de certificado de AC debe contener toda la cadena de certificados, incluidos los certificados desde las AC intermedias hasta la AC raíz. Los certificados se enumeran en el orden inverso a la firma, con el último certificado de la AC intermedio en la parte superior y el certificado de la AC raíz en la parte inferior.

En el siguiente ejemplo (comienza con la AC raíz en la parte inferior), el orden indica lo siguiente:

  • La AC raíz firmó el certificado de la AC intermedia-A
  • La AC intermedia-A firmó el certificado de la AC intermedia-B
  • La cadena continúa hasta el certificado final de la AC intermedia-Y, que fue firmado por la AC intermedia-X.
-----BEGIN CERTIFICATE-----
<Intermediate-Y CA CERT CONTENT>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<Intermediate-X CA CERT CONTENT>
-----END CERTIFICATE-----
...
-----BEGIN CERTIFICATE-----
<Intermediate-B CA CERT CONTENT>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<Intermediate-A CA CERT CONTENT>
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
<ROOT CA CERT CONTENT>
-----END CERTIFICATE----- 

Para continuar con este ejemplo, la clave privada asociada con el certificado de la AC intermedia-Y se debe pasar junto con las cadenas de certificados de la AC del mismo modo que en una AC personalizada.

-----BEGIN RSA PRIVATE KEY-----
<Intermediate-Y PRIVATE KEY CONTENT>
-----END RSA PRIVATE KEY-----

Para verificar si el clúster usa la AC intermedia, inspecciona el recuento de certificados en el secreto de la AC del clúster:

kubectl get secret CLUSTER_NAME-ca \
    --kubeconfig ADMIN_KUBECONFIG
    -n cluster-CLUSTER_NAME \
    -o jsonpath='{.data.tls\.crt}' | base64 --decode | grep "BEGIN CERTIFICATE" | wc -l