Crea una implementación con encriptación TLS en VMs

En este documento, se describe cómo agregar encriptación TLS a una implementación de Spanner Omni en máquinas virtuales (VMs). Una implementación con funciones de seguridad de red usa la seguridad de la capa de transporte (TLS) 1.3 para encriptar y autenticar la comunicación dentro de la implementación y con sus clientes. Spanner Omni proporciona TLS mutua (mTLS) para mejorar la seguridad, en la que ambas partes establecen la autenticidad antes de intercambiar datos. La mTLS es opcional entre el cliente y el servidor, pero los servidores de Spanner Omni se comunican entre sí a través de mTLS.

La versión de vista previa de Spanner Omni no admite la encriptación TLS. Para obtener las funciones que te permiten crear implementaciones con encriptación TLS, comunícate con Google para solicitar acceso anticipado a la versión completa de Spanner Omni.

Antes de comenzar

Antes de comenzar, asegúrate de que tu entorno cumpla con los siguientes requisitos:

  • Asegúrate de tener acceso SSH a cada máquina de la implementación. Este acceso te permite descargar y ejecutar el objeto binario de Spanner Omni.

  • Tu red debe permitir la comunicación TCP en los puertos 15000 a 15025.

  • Cada máquina debe tener suficiente almacenamiento para alojar los datos que maneja la implementación.

  • Revisa la página Requisitos del sistema para asegurarte de que tu configuración cumpla con los requisitos.

  • Si ejecutas los objetos binarios en la plataforma de virtualización vSphere, inhabilita la virtualización de TSC. Para ello, agrega el parámetro de configuración monitor_control.virtual_rdtsc = FALSE al archivo de configuración .vmx de la máquina virtual.

Paso 1: Crea una implementación sin encriptación TLS

Sigue los pasos que se indican en Crea una implementación de VM de Spanner Omni sin encriptación. Verifica que tu implementación de VM sin encriptación ni funciones de seguridad funcione correctamente. En esta página, se supone que creaste una implementación regional con tres zonas.

Paso 2: Genera los certificados

Debes crear tres conjuntos de certificados:

Tipo de certificado Descripción
Certificados de API Los certificados de API ayudan a proteger el servidor de la API de Spanner.
Certificados de servidor Los certificados de servidor ayudan a proteger la comunicación entre servidores.
Certificados de cliente Los usuarios finales o las aplicaciones usan certificados de cliente para establecer su identidad y confianza con los servidores de Spanner Omni.

Una autoridad certificadora (CA) emite estos certificados. Spanner Omni proporciona herramientas para crear una CA y los tres tipos de certificados. Realiza los siguientes pasos en una de tus máquinas.

Puedes crear estos certificados en tu estación de trabajo con la CLI de Spanner Omni y, luego, transferir los archivos de certificado a cada servidor de Spanner Omni. Para obtener más información, consulta la Guía de inicio rápido con la CLI de Spanner Omni.

Para generar certificados, debes completar los siguientes pasos:

Crea una autoridad certificadora (CA)

Esta autoridad es la CA raíz de todos los certificados de cliente y servidor que generes en los siguientes pasos.

spanner certificates create-ca --ca-certificate-directory=certs

El directorio certs contiene el certificado de la AC. Crea una copia de este certificado para usarlo como CA para los certificados de API.

cp certs/ca.crt certs/ca-api.crt

El directorio $HOME/.spanner/private-keys contiene la clave privada de la CA. Haz una copia de seguridad de este directorio y protégelo. Un usuario con acceso a la clave privada puede firmar certificados arbitrarios que los clientes que confían en la CA autofirmada confían. Aunque puedes usar la misma CA para todos los certificados, es obligatorio que los certificados de API y los certificados de cliente usen la misma CA. De manera opcional, puedes crear una CA adicional (o usar una CA de confianza externa) para los certificados de API. Asegúrate de usar la CA correcta en los siguientes pasos mientras creas certificados. En este documento, se usa la misma CA para todos los tipos de certificados.

Genera certificados de servidor

Generas dos tipos de certificados de servidor:

Esta configuración proporciona una administración más flexible de estos certificados, como una rotación de certificados.

Crea el certificado de servidor de Spanner

Los servidores de Spanner Omni usan certificados de servidor para encriptar la comunicación entre sí (comunicación entre servidores).

Para crear el certificado de servidor, ejecuta lo siguiente. Reemplaza SERVER_LIST por una lista separada por comas de nombres o sufijos de servidores de Spanner.

SERVER_NAMES=SERVER_LIST
spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Este comando crea dos archivos, server.crt y server.key, en el directorio certs.

Crea el certificado de API

Los certificados de API encriptan la comunicación de los sistemas que interactúan con la implementación. El uso de certificados separados para la API y la comunicación entre servidores te permite administrar y rotar cada tipo de forma independiente.

Para crear el certificado de API, ejecuta lo siguiente. Reemplaza LB_DNS por el DNS del balanceador de cargas.

SERVER_NAMES=LB_DNS
spanner certificates create-server --filename-prefix=api --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Este comando crea dos archivos más, api.crt y api.key, en el directorio certs. Si es necesario, puedes usar una CA de confianza externa para los certificados de API.

Distribuye los certificados a todos los servidores

Copia el directorio certs a todos los demás servidores de la implementación para iniciarlos con funciones de seguridad de red.

scp -r certs REMOTE_HOST:SPANNER_DIR/certs

Paso 3: Genera certificados de cliente

Puedes usar certificados de cliente para autenticar usuarios y aplicaciones en Spanner. Los certificados de cliente habilitan mTLS entre el cliente y el servidor.

Los certificados de cliente deben estar firmados por la misma CA que el certificado de API y deben contener un nombre de usuario para la autorización. En este ejemplo, se usa el usuario admin, que es el usuario predeterminado para cada base de datos. Para obtener más información sobre los usuarios, las funciones y las opciones de autenticación, consulta Autenticación y autorización en Spanner Omni.

USERNAME=admin
spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

Este comando crea archivos client.crt y client.key en el directorio clientcerts. Envía estos archivos a cualquier máquina que se conecte a los servidores de la implementación.

Si planeas usar los certificados de cliente con la biblioteca cliente de Java, debes generar la clave del certificado en formato PKCS#8. Usa el siguiente comando:

USERNAME=admin
spanner certificates create-client $USERNAME \
    --output-directory clientcerts \
    --ca-certificate-directory certs \
    --generate-pkcs8-key

Paso 4: Reinicia los servidores

Después de generar los certificados y copiarlos en todos los servidores de tu implementación, reinicia cada servidor.

Implementación de un solo servidor

Para las implementaciones de un solo servidor, ejecuta el siguiente comando:

nohup spanner start-single-server \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

Se inicia el servidor. Consulta el Paso 7: Interactúa con la implementación para interactuar con la implementación.

Implementación de escalabilidad horizontal

Para las implementaciones de escalabilidad horizontal, inicia el servidor en cada máquina. Los valores de server_address y zone deben coincidir con los de la configuración de implementación. La red debe resolver server_address. Los servidores usan esto para la comunicación interna. Ejecuta lo siguiente para iniciar el servidor raíz:

nohup spanner start \
    --root \
    --server-address=HOST_NAME \
    --zone=ZONE_NAME \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

En el siguiente comando, se muestra un ejemplo con valores específicos:

nohup spanner start \
    --root \
    --server-address=rootserver1 \
    --zone=us-central-1a \
    --base-dir=./spanbasedir \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

Para habilitar mTLS para los clientes, usa la marca --enable-client-certificate-authentication=true cuando inicies el servidor.

nohup spanner start \
    --root \
    --server-address=HOST_NAME \
    --zone=ZONE_NAME \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false \
    --enable-client-certificate-authentication=true &

Ahora que los servidores se ejecutan en cada máquina, puedes crear la implementación.

Paso 5: Crea una implementación con encriptación TLS

Ejecuta el comando spanner deployment create desde uno de los servidores raíz:

spanner deployment create --config-file=deployment.yaml

La consola de cada máquina muestra mensajes que indican que la implementación ahora incluye encriptación TLS. Todos los servidores se comunican entre sí a través de un canal encriptado.

Paso 6: Configura un balanceador de cargas (opcional)

Para administrar y distribuir el tráfico de clientes entre los servidores de tu implementación, configura un balanceador de cargas. Asegúrate de que la configuración del balanceador de cargas para la verificación de estado use HTTPS en lugar de HTTP. Usa los siguientes detalles de configuración:

Parámetro Valor
Protocolo TCP
IP de backend Las direcciones IP de tus servidores.
Puerto 15000 (este es el puerto predeterminado. Si usaste un puerto diferente puerto en la marca --server-address usa ese puerto).
URL de verificación de estado https://IP_ADDRESS:15012/healthz
Estrategia de balanceo roundrobin (distribuye las solicitudes de forma secuencial entre los servidores)

Paso 7: Interactúa con la implementación

Puedes interactuar con tu implementación de Spanner Omni desde cualquier VM con la CLI de Spanner Omni.

Debes incluir la siguiente marca con cada comando para establecer una conexión encriptada:

  • --ca-certificate-file=certs/ca-api.crt

Si habilitaste mTLS para los clientes, también incluye la siguiente marca con cada comando:

  • --client-certificate-directory=clientcerts

Para acceder y interactuar con tu implementación, sigue estos pasos:

  1. Accede a Spanner Omni

    spanner auth login admin \
        --ca-certificate-file=certs/ca-api.crt \
        --deployment-endpoint=ENDPOINT
    

    La contraseña predeterminada es admin.

    Successfully logged in as "admin"
    
  2. Crea una base de datos

    spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crt
    
    Creating database...done.
    
  3. Abre el shell de SQL

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner>
    
  4. Crea una tabla y agrega datos

    spanner> create table names (nameId INT64 NOT NULL, name String(100)) Primary Key (nameId);
    Query OK, 0 rows affected (4.62 sec)
    
    spanner> insert names (nameId, name) values (1, "Jack");
    Query OK, 1 rows affected (0.18 sec)
    
  5. Verifica los datos

    Enumera las bases de datos:

    spanner databases list --ca-certificate-file=certs/ca-api.crt
    
    NAME  STATE  VERSION_RETENTION_PERIOD  EARLIEST_VERSION_TIME  KMS_KEY_NAME  ENABLE_DROP_PROTECTION
    mydb  READY  1h                        2025-02-07T12:25:30Z                 false
    

    Obtén los datos de la tabla:

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner> show tables;
    +----------------+
    | Tables_in_mydb |
    +----------------+
    | names          |
    +----------------+
    1 rows in set (0.14 sec)
    
    spanner> select * from names;
    +--------+--------+
    | nameId | name   |
    +--------+--------+
    | 1      | Jack   |
    +--------+--------+
    1 rows in set (18.69 msecs)
    

Paso 8: Escala la implementación (opcional)

Puedes agregar servidores que no sean raíz a una zona para escalar la capacidad de la zona. Para ello, genera el certificado de servidor para los servidores que no sean raíz como se explica en el Paso 2: Genera los certificados y, luego, inicia el servidor con el siguiente comando:

spanner start \
    --server-address=NON_ROOT_MACHINE \
    --join-servers=ROOT_SERVER1,ROOT_SERVER2,ROOT_SERVER3 \
    --zone=us-central1-a \
    --base-dir=./spandir \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false

Próximos pasos