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 = FALSEal archivo de configuración.vmxde 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)
- Genera certificados de servidor
- Genera certificados de cliente
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:
Certificado de servidor de Spanner: Encripta la comunicación entre los servidores de Spanner Omni.
Certificado de API: Encripta la comunicación de los sistemas que interactúan con la implementación.
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:
Accede a Spanner Omni
spanner auth login admin \ --ca-certificate-file=certs/ca-api.crt \ --deployment-endpoint=ENDPOINTLa contraseña predeterminada es
admin.Successfully logged in as "admin"Crea una base de datos
spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crtCreating database...done.Abre el shell de SQL
spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crtConnected. spanner>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)Verifica los datos
Enumera las bases de datos:
spanner databases list --ca-certificate-file=certs/ca-api.crtNAME STATE VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME KMS_KEY_NAME ENABLE_DROP_PROTECTION mydb READY 1h 2025-02-07T12:25:30Z falseObtén los datos de la tabla:
spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crtConnected. 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
- Usa bibliotecas cliente y controladores JDBC para conectar tu aplicación con la implementación.
- Administra usuarios y funciones.