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

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 = 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 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)

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:

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:

  1. Confirma que generaste los certificados y el conjunto de claves de wrapper, y que los copiaste en todos los servidores de tu implementación.
  2. 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.
  3. 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.

  1. 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.txt
    

    La 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
  2. 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-server establece los métodos de autenticación y el protocolo de contraseña admitidos, y crea el usuario admin inicial con el rol roles/spanner.admin usando 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:

  1. Crea un archivo de contraseña que contenga la contraseña del usuario admin predeterminado con su conjunto de permisos establecido en 600 (solo el propietario puede leerlo):

    printf '%s' 'PASSWORD' > admin_password.txt
    chmod 600 admin_password.txt
    

    La 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
  2. Asegúrate de que deployment.yaml incluya 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_OPAQUE
    

    Puedes especificar uno o más de los siguientes métodos de autenticación:

    • AUTHENTICATION_METHOD_PASSWORD: Autenticación de contraseña
    • AUTHENTICATION_METHOD_CLIENT_CERTIFICATE: Autenticación de certificados de cliente

    Puedes especificar el siguiente protocolo de contraseña:

    • PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE: Protocolo OPAQUE
  3. Ejecuta el comando spanner deployment create desde 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:

  1. Accede a Spanner Omni

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

    Cuando se te solicite, ingresa la contraseña configurada en admin_password.txt.

    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 SQL Shell

    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 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:

  1. 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.

  2. 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.

  3. 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