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.
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 del 15000 al 15030.
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 archivos binarios en la plataforma de virtualización de 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 la implementación de tu 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 clientes | 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. Sigue estos 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 (AC)
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 una 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.
Crea una copia de seguridad de este directorio y protégelo. Un usuario con acceso a la clave privada puede firmar certificados arbitrarios en los que confían los clientes que confían en la CA autofirmada.
Si bien 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 externa de confianza) para los certificados de la API.
Asegúrate de usar la AC correcta en los siguientes pasos cuando crees 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 del 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 del servidor de Spanner
Los servidores de Spanner Omni usan certificados de servidor para encriptar la comunicación entre sí (comunicación entre servidores).
Ejecuta el siguiente comando para crear el certificado del servidor. Reemplaza SERVER_LIST por una lista separada por comas de los nombres o sufijos de los 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 independientes para la API y la comunicación entre servidores te permite administrar y rotar cada tipo de forma independiente.
Ejecuta el siguiente comando para crear el certificado de la API. 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 en todos los demás servidores de la implementación para iniciarlos con las 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 la 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, los roles 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 los 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: Inicia los servidores
Después de generar los certificados y copiarlos en todos los servidores de tu implementación, inicia cada servidor. Crea un directorio base en cada servidor para almacenar datos, metadatos y registros. Si un servidor necesita reiniciarse, especifica el mismo directorio para garantizar la continuidad.
Implementación de un solo servidor
Para iniciar una implementación de un solo servidor con encriptación, crea un archivo de contraseña para el usuario admin inicial y, luego, inicia el servidor con tus métodos de autenticación y certificados compatibles.
Crea el archivo de contraseña con los permisos establecidos en 600 para que solo su propietario pueda leerlo:
printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txtLa contraseña debe cumplir con los siguientes requisitos:
- Debe tener entre 8 y 32 caracteres.
- Al menos un carácter en mayúscula
- Al menos un carácter en minúscula
- Al menos un número
- Al menos un carácter especial
Inicia el servidor único con TLS y autenticación configurados:
nohup spanner start-single-server \ --base-dir=BASE_DIR \ --certificate-directory=${HOME}/.spanner/certs \ --auth-methods=password,client-certificate \ --password-protocol=opaque \ --initial-admin-password-file=admin_password.txt &En el inicio inicial,
spanner start-single-serverestablece los métodos de autenticación y el protocolo de contraseña admitidos, y crea el rol inicial de administradoruser with theroles/spanner.admin` con el archivo de contraseña especificado.
Para obtener información sobre cómo interactuar con tu implementación, consulta el paso 7: Interactúa con la implementación.
Implementación de escalamiento horizontal
Para las implementaciones de expansión horizontal, inicia el servidor en cada máquina. Los valores de server-address y zone deben coincidir con los valores de la configuración de implementación. La red debe resolver server-address. Los servidores usan server-address para la comunicación interna. Ejecuta el siguiente comando 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 &
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 &
Ahora que los servidores se ejecutan en cada máquina, ya puedes crear la implementación.
Paso 5: Crea una implementación con encriptación TLS
Para crear la implementación, sigue estos pasos:
Crea un archivo de contraseña que contenga la contraseña del usuario
adminpredeterminado con sus permisos establecidos en 600 (solo el propietario puede leerlo):printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txtLa contraseña debe cumplir con los siguientes requisitos:
- Debe tener entre 8 y 32 caracteres.
- Al menos un carácter en mayúscula
- Al menos un carácter en minúscula
- Al menos un número
- Al menos un carácter especial
Asegúrate de que
deployment.yamlincluya los métodos de autenticación y el protocolo de contraseña que seleccionaste:deployment_settings: security_settings: authentication_methods: - AUTHENTICATION_METHOD_PASSWORD - AUTHENTICATION_METHOD_CLIENT_CERTIFICATE password_authentication_protocol: PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUEPuedes especificar uno o más de los siguientes métodos de autenticación:
AUTHENTICATION_METHOD_PASSWORD: Autenticación con contraseñaAUTHENTICATION_METHOD_CLIENT_CERTIFICATE: Autenticación con certificado de cliente
Puedes especificar el siguiente protocolo de contraseñas:
PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE: Protocolo OPAQUE
Ejecuta el comando
spanner deployment createdesde uno de los servidores raíz para crear la implementación. Especifica el directorio base con la marca--base-dir(con el mismo BASE_DIR especificado cuando se inició el servidor raíz) y proporciona el archivo de contraseña del administrador con la marca--admin-password-file:spanner deployment create \ --config-file=deployment.yaml \ --base-dir=BASE_DIR \ --admin-password-file=admin_password.txt
La consola de cada máquina muestra mensajes que indican que la implementación ahora incluye la 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 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, incluye también la siguiente marca con cada comando:
--client-certificate-directory=clientcerts
Para acceder a tu implementación y usarla, sigue estos pasos:
Accede a Spanner Omni
spanner auth login admin \ --ca-certificate-file=certs/ca-api.crt \ --deployment-endpoint=ENDPOINTCuando se te solicite, ingresa la contraseña configurada en
admin_password.txt.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 SQL Shell
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: (Opcional) Ajusta la escala de la implementación
Puedes agregar servidores que no sean raíz a una zona para escalar su capacidad. Para ello, genera el certificado del servidor para los servidores que no son 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
Próximos pasos
- Usa bibliotecas cliente y controladores JDBC para conectar tu aplicación con la implementación.
- Administra usuarios y roles.