En este documento, se describe cómo agregar la encriptación TLS a una implementación de Spanner Omni en máquinas virtuales (VMs). Una implementación con funciones de seguridad de redes 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 controla 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 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 funciones de encriptación y seguridad funcione correctamente. En esta página, se da por sentado 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 (AC) 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 para usar la CLI de Spanner Omni.
Para generar certificados, debes completar los siguientes pasos:
- Crea una autoridad certificadora (AC)
- 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 la API.
cp certs/ca.crt certs/ca-api.crt
El directorio $HOME/.spanner/private-keys contiene la clave privada de la AC.
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.
Aunque puedes usar la misma CA para todos los certificados, es obligatorio que los certificados de la 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 la API.
Asegúrate de usar la AC correcta en los siguientes pasos mientras creas
certificados. En este documento, se usa la misma AC 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 de 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 nombres de servidores o sufijos 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 la 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.
Para crear el certificado de la API, ejecuta el siguiente comando. 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 la 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 redes.
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 AC 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 de 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: Genera el conjunto de claves de wrapper
Spanner Omni usa un conjunto de claves de wrapper de clave de encriptación de claves (KEK)
para encriptar claves internas, como las claves de firma y encriptación de tokens.
Los servidores de Spanner Omni leen este conjunto de claves de
BASE_DIR/kms/wrapper_key.
Para generar un nuevo archivo de conjunto de claves de wrapper con spanner keys create-keyset, ejecuta
el siguiente comando:
spanner keys create-keyset --output-file=kms/wrapper_key
De forma predeterminada, spanner keys create-keyset genera una clave AES256_GCM. Para
generar un tipo de clave diferente, usa la marca --key-template con uno de los
siguientes valores de tipo de clave: AES256_GCM, AES128_GCM, AES256_GCM_RAW,
CHACHA20_POLY1305 o XCHACHA20_POLY1305.
Distribuye el conjunto de claves de wrapper a todos los servidores
Copia el directorio kms en el directorio base de todos los servidores de la
implementación antes de iniciarlos:
scp -r kms REMOTE_HOST:BASE_DIR/kms
Paso 5: Inicia los servidores
Para iniciar los servidores en tu implementación, sigue estos pasos:
- Confirma que generaste los certificados y el conjunto de claves de wrapper, y que los copiaste en todos los servidores de tu implementación.
- Crea un directorio base en cada servidor para almacenar datos, metadatos y registros. Si un servidor necesita reiniciarse, especifica el mismo directorio base para la continuidad.
- Inicia cada servidor con las instrucciones para tu tipo de implementación en las siguientes secciones.
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 los certificados y métodos de autenticación
admitidos.
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 la autenticación configurada:
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,
spanner start-single-serverestablece los métodos de autenticación y el protocolo de contraseña admitidos, y crea el usuarioadmininicial con el rolroles/spanner.adminusando el archivo de contraseña especificado.
Para obtener información sobre cómo interactuar con tu implementación, consulta Paso 8: Interactúa con la implementación.
Implementación con escalamiento horizontal
Para las implementaciones de escalamiento 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 la 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 &
Con los servidores que se ejecutan en cada máquina, ya puedes crear la implementación.
Paso 6: 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 su conjunto de permisos establecido 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 de contraseñaAUTHENTICATION_METHOD_CLIENT_CERTIFICATE: Autenticación de certificados de cliente
Puedes especificar el siguiente protocolo de contraseña:
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 que se especificó cuando se inició el servidor raíz) y proporciona el archivo de contraseña de 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 7: Configura un balanceador de cargas (opcional)
Para administrar y distribuir el tráfico de los 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 8: 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, luego, interactuar con ella, 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 9: Escala la implementación (opcional)
Puedes agregar servidores que no sean raíz a una zona para escalar su capacidad. Para agregar un servidor que no sea raíz, sigue estos pasos:
Genera un certificado de servidor para el servidor que no es raíz y cópiale los certificados. Para obtener más información, consulta Paso 2: Genera los certificados.
Copia el conjunto de claves de wrapper en el servidor que no es raíz. Para obtener más información, consulta Paso 4: Genera el conjunto de claves de wrapper.
Inicia el servidor que no es raíz:
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.