Habilitar la encriptación de interno de Cassandra

La encriptación entre nodos (o de nodo a nodo) protege los datos que se transmiten entre nodos en un clúster con TLS. En esta página, se explica cómo habilitar la encriptación de entrenudos de Cassandra con TLS en Edge para la nube privada. Para realizar estos pasos, debes estar familiarizado con los detalles de tu anillo de Cassandra.

Habilita la encriptación entre nodos de Cassandra

Sigue estos pasos para habilitar la encriptación entre nodos de Cassandra:

  1. Genera certificados de servidor siguiendo los pasos que se indican en el Apéndice para crear una clave y un certificado autofirmados.

    Si usas Edge para la nube privada en un sistema operativo habilitado con FIPS, usa un FIPS Keystore (BCFKS) de BouncyCastle. Consulta el Apéndice que aparece a continuación para obtener sugerencias sobre cómo trabajar con el almacén de claves de tipo BCFKS.

    En los siguientes pasos, se da por sentado que creaste keystore.node0 y truststore.node0, así como las contraseñas del almacén de claves y del almacén de confianza, como se explica en el Apéndice. El almacén de claves y el almacén de confianza deben crearse como pasos preliminares en cada nodo antes de continuar con los siguientes pasos.

  2. Agrega las siguientes propiedades al archivo /opt/apigee/customer/application/cassandra.properties. Si el archivo no existe, créalo.
    conf_cassandra_server_encryption_internode_encryption=all
    conf_cassandra_server_encryption_keystore=/opt/apigee/data/apigee-cassandra/keystore.node0
    conf_cassandra_server_encryption_keystore_password=keypass
    conf_cassandra_server_encryption_truststore=/opt/apigee/data/apigee-cassandra/truststore.node0
    conf_cassandra_server_encryption_truststore_password=trustpass
        
    # Optionally set the following to enable 2-way TLS or mutual TLS
    conf_cassandra_server_encryption_require_client_auth=true
      
    # Set the following in FIPS enabled operating systems
    # With FIPS, older TLS protocols are disabled, so set to TLSv1.2
    conf_cassandra_server_encryption_protocol=TLSv1.2
    # With FIPS, use BCFKS keystores
    conf_cassandra_server_encryption_store_type=BCFKS
      
  3. Asegúrate de que el archivo cassandra.properties sea propiedad del usuario de Apigee:
    chown apigee:apigee \
    /opt/apigee/customer/application/cassandra.properties
    

Ejecuta los siguientes pasos en cada nodo de Cassandra, uno a la vez, para que los cambios se apliquen sin causar ningún tiempo de inactividad para los usuarios:

  1. Detén el servicio de Cassandra:
    /opt/apigee/apigee-service/bin/apigee-service \
    apigee-cassandra stop
    
  2. Reinicia el servicio de Cassandra:
    /opt/apigee/apigee-service/bin/apigee-service \
    apigee-cassandra start
    
  3. Para determinar si se inició el servicio de encriptación TLS, busca el siguiente mensaje en los registros del sistema:
    Internode messaging enabled TLS protocols
    Internode messaging enabled cipher suites
    

Realiza la rotación del certificado

Para rotar los certificados, sigue estos pasos:

  1. Agrega el certificado de cada par de claves generado único (consulta el Apéndice) al almacén de confianza de un nodo de Cassandra existente, de modo que los certificados antiguos y los nuevos existan en el mismo almacén de confianza:
    keytool -import -v -trustcacerts -alias NEW_ALIAS \
    -file CERT -keystore EXISTING_TRUSTSTORE
    

    donde NEW_ALIAS es una cadena única para identificar la entrada, CERT es el nombre del archivo de certificado que se agregará y EXISTING_TRUSTSTORE es el nombre del almacén de confianza existente en el nodo de Cassandra.

  2. Usar una utilidad de copia, como scp, para distribuir el almacén de confianza a todos los nodos de Cassandra en el clúster, y reemplazar el almacén de confianza existente que usa cada nodo
  3. Realiza un reinicio continuo del clúster para cargar el nuevo almacén de confianza y establecer la confianza para las claves nuevas antes de que se implementen:
    /opt/apigee/apigee-service/bin/apigee-service \
    apigee-cassandra restart
    
  4. En cada nodo de Cassandra del clúster, actualiza las propiedades que se muestran a continuación a los nuevos valores del almacén de claves en el archivo cassandra.properties:
    conf_cassandra_server_encryption_keystore=NEW_KEYSTORE_PATH
    conf_cassandra_server_encryption_keystore_password=NEW_KEYSTORE_PASSWORD
      

    En el ejemplo anterior, NEW_KEYSTORE_PATH es la ruta de acceso al directorio en el que se encuentra el archivo del almacén de claves y NEW_KEYSTORE_PASSWORD es la contraseña del almacén de claves que se estableció cuando se crearon los certificados, como se explica en el Apéndice.

  5. Detén el servicio de Cassandra:
    /opt/apigee/apigee-service/bin/apigee-service \
    apigee-cassandra stop
    
  6. Reinicia el servicio de Cassandra:
    /opt/apigee/apigee-service/bin/apigee-service \
    apigee-cassandra start
    
  7. Cuando se establezca correctamente la comunicación entre todos los nodos, continúa con el siguiente nodo de Cassandra. Nota: Continúa al siguiente nodo solo si se establece correctamente la comunicación entre todos los nodos.

Apéndice

En el siguiente ejemplo, se explica cómo preparar los certificados del servidor necesarios para realizar los pasos de encriptación entre nodos. Los comandos que se muestran en el ejemplo usan los siguientes parámetros:

Parámetro Descripción
node0 Cualquier cadena única para identificar el nodo
keystore.node0 Un nombre de almacén de claves Los comandos suponen que este archivo se encuentra en el directorio actual.
keypass El pase de claves debe ser el mismo para el almacén de claves y la clave.
dname Identifica la dirección IP de node0 como 10.128.0.39.
-validity El valor establecido en esta marca hace que el par de claves generado sea válido por 10 años.
  1. Ve al siguiente directorio:
    cd /opt/apigee/data/apigee-cassandra
  2. Ejecuta el siguiente comando para generar un archivo llamado keystore.node0 en el directorio actual:
    keytool -genkey -keyalg RSA -alias node0 -validity 3650 \
    -keystore keystore.node0 -storepass keypass \
    -keypass keypass -dname "CN=10.128.0.39, OU=None, \
    O=None, L=None, C=None"

    Importante: Asegúrate de que la contraseña de la clave sea la misma que la del almacén de claves.

  3. Exporta el certificado a un archivo separado:
    keytool -export -alias node0 -file node0.cer \
    -keystore keystore.node0
  4. Asegúrate de que solo el usuario de apigee pueda leer el archivo y que nadie más pueda hacerlo:
    $ chown apigee:apigee \
    /opt/apigee/data/apigee-cassandra/keystore.node0
    $ chmod 400 /opt/apigee/data/apigee-cassandra/keystore.node0
  5. Importa el certificado generado node0.cer al almacén de confianza del nodo:
    keytool -import -v -trustcacerts -alias node0 \
    -file node0.cer -keystore truststore.node0

    En el comando anterior, se te solicita que configures una contraseña. Esta es la contraseña del almacén de confianza y puede ser diferente de la contraseña del almacén de claves que configuraste antes. Si se te solicita confiar en el certificado, ingresa yes.

  6. Usa openssl para generar un archivo PEM del certificado sin claves. Ten en cuenta que cqlsh no funciona con el certificado en el formato generado.
    $ keytool -importkeystore -srckeystore keystore.node0 \
    -destkeystore node0.p12 -deststoretype PKCS12 -srcstorepass \
    keypass -deststorepass keypass
    $ openssl pkcs12 -in node0.p12 -nokeys -out node0.cer.pem \
    -passin pass:keypass
    $ openssl pkcs12 -in node0.p12 -nodes -nocerts -out node0.key.pem -passin pass:keypass
  7. Para la encriptación de nodo a nodo, copia el archivo node0.cer en cada nodo y, luego, impórtalo al almacén de confianza de cada nodo.
    keytool -import -v -trustcacerts -alias node0 \
    -file node0.cer -keystore truststore.node1
  8. Usa keytool -list para verificar si hay certificados en los archivos del almacén de claves y del almacén de confianza:
    $ keytool -list -keystore keystore.node0
    $ keytool -list -keystore truststore.node0

Cómo trabajar con almacenes de claves de BCFKS para sistemas operativos compatibles con FIPS

Cuando trabaje con sistemas operativos habilitados para FIPS, utilice FIPS Keystores (BCFKS) de BouncyCastle. En la siguiente sección, se describe cómo trabajar con almacenes de claves de tipo BCFKS. Los demás pasos para trabajar con almacenes de claves (como la propiedad de los archivos, la ubicación de los archivos y otros) siguen siendo los mismos que se mencionan en este apéndice.

Para generar un almacén de claves de tipo BCFKS, usa el siguiente comando:

keytool -genkeypair -keyalg RSA -alias node0 -validity 365 -keystore keystore.node0 \
-storepass keypass -keypass keypass -v \
-dname "EMAILADDRESS=youremail@domain.com, CN=yourcn, OU=yourou, O=youro, L=yourl, C=yourc" \
-storetype BCFKS -providerpath /opt/apigee/edge-gateway/lib/thirdparty/bc-fips-1.0.2.4.jar \
-providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -providername BCFIPS

Nota: La contraseña del almacén de claves y la contraseña de la clave deben ser iguales.

Nota: Se puede usar el jar bc-fips que envía Apigee, o bien se puede descargar el mismo jar desde los repositorios de BouncyCastle. Consulta la documentación de BouncyCastle para obtener más detalles sobre cómo generar un almacén de claves de BCFKS.

Exporta el certificado a un archivo separado:

keytool -export -v -alias node0 -file node0.cer -keystore keystore.node0 -storepass keypass \
-storetype BCFKS -providerpath /opt/apigee/edge-gateway/lib/thirdparty/bc-fips-1.0.2.4.jar \
-providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -providername BCFIPS

Importa el certificado generado node0.cer al almacén de confianza del nodo:

keytool -import -v -alias node0 -file node0.cer -keystore truststore.node0 -storepass storepass \
-storetype BCFKS -providerpath /opt/apigee/edge-gateway/lib/thirdparty/bc-fips-1.0.2.4.jar \
-providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -providername BCFIPS