Configuración de SSL/TLS para Zookeeper
Se puede configurar SSL o TLS para ZooKeeper al utilizar la agrupación de alta disponibilidad de ThingWorx.
Configuración de Zookeeper
1. Asegúrese de que se ejecute una versión de Zookeeper que soporta SSL o TLS.
2. Obtenga el certificado SSL y el truststore. Realice los siguientes pasos:
1. Cree el keystore de ZooKeeper.
2. Utilice la clave pública del keystore de ZooKeeper y cree el truststore de ZooKeeper.
* 
Las únicas extensiones aceptables para los certificados son JKS, PEM y PKCS12(p12).
3. Vaya a apache-zookeeper-[version]-bin/conf y actualice o cree zoo.cfg.
4. Añada las siguientes entradas:
dataDir=/<path-to-zookeeper-data>/data
dataLogDir=/<path-to-zookeeper-datalog>/datalog
secureClientPort=2281
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
admin.enableServer=true
standaloneEnabled=false
quorumListenOnAllIPs=true
sslQuorum=true
ssl.clientAuth=none
Para activar el quórum entre los nodos de Zookeeper, defina la variable sslQuorum=true en el fichero zoo.cfg. Los nodos utilizarán el SSL generado automáticamente para proteger el quórum.
ZooKeeper utiliza TLS unidireccional, no TLS mutuo (mTLS). La propiedad ssl.clientAuth acepta lo siguiente:
none: no se requiere ningún certificado de cliente (SSL unidireccional).
want: ZooKeeper solicita un certificado de cliente, pero no lo impone.
need: ZooKeeper requiere un certificado de cliente válido (mTLS completo).
5. En el directorio especificado por la ruta de dataDir en zoo.cfg, cree un fichero denominado myid para cada nodo. El fichero debe contener un único ID numérico que corresponda al nodo:
Para el nodo 1, introduzca 1 en la primera línea y, a continuación, guarde y cierre el fichero.
Repita los pasos para cada nodo (por ejemplo, el nodo 2 debe tener 2, el nodo 3 debe tener 3, etc.).
Asegúrese de que el fichero contenga solo dígitos sin espacios en blanco adicionales y que sea legible para el usuario del servicio ZooKeeper (normalmente zookeeper). Si el ID no coincide con la configuración, el nodo no podrá incorporarse al clúster.
6. Al final de zoo.cfg, añada entradas con el siguiente formato: server.X=<hostname or IP>:<peerPort>:<electionPort>
Ejemplo para un conjunto de 3 nodos:
# 3-Node ensemble configuration
# Format: server.X=<hostname or IP>:<peerPort>:<electionPort>
server.1=10.0.0.1:2888:3888
server.2=10.0.0.2:2888:3888
server.3=10.0.0.3:2888:3888
Asegúrese de que los números de server.X coincidan con el fichero myid de cada nodo. Los directorios dataDir y dataLogDir deben existir y el usuario de ZooKeeper debe tener acceso para escribir en ellos. Se recomienda encarecidamente la depuración automática en el entorno de producción para evitar el crecimiento del almacenamiento en el disco.
7. Modifique el script de inicio de ZooKeeper.
Para implementaciones de Linux:
Modifique <ruta a zookeeper>/bin/zkServer.sh y añada lo siguiente: export SERVER_JVMFLAGS="...".
Para implementaciones de Windows:
Si se implementa en Windows, siga estas instrucciones ajustadas:
a. Modifique <path to zookeeper>/bin/zkServer.cmd.
b. Utilice el comando set en lugar de export: set SERVER_JVMFLAGS=....
c. El script no está preconfigurado para gestionar esta variable. La variable se debe declarar y es necesario hacer referencia a ella en el comando de inicio de Java. Por ejemplo:
export SERVER_JVMFLAGS="
-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
-Dzookeeper.ssl.keyStore.location=<path-to-zookeeper-certificates>/zookeeper.p12
-Dzookeeper.ssl.keyStore.password=<certificate-password>
-Dzookeeper.ssl.trustStore.location=<path-to-zookeeper-certificates>/truststore.p12
-Dzookeeper.ssl.trustStore.password=<truststore-password>
-Dzookeeper.ssl.quorum.keyStore.location=<path-to-zookeeper-certificates>/zookeeper.p12
-Dzookeeper.ssl.quorum.keyStore.password=<certificate-password>
-Dzookeeper.ssl.quorum.trustStore.location=<path-to-zookeeper-certificates>/truststore.p12
-Dzookeeper.ssl.quorum.trustStore.password=<truststore-password>
-Dzookeeper.ssl.quorum.hostnameVerification=false"
8. Inicie Zookeeper:
./zkServer.sh start
9. En los registros, verifique que la configuración sea correcta:
tail -f apache-zookeeper-3.5.6-bin/logs/<zookeeper-log-file>
Configuración de ThingWorx
1. Copie los certificados de Zookeeper en la instancia o asegúrese de que estén disponibles en el ordenador en el que se ejecuta ThingWorx.
* 
Los usuarios de Tomcat deben tener acceso a los certificados o copiarlos en el directorio ThingworxPlatform.
2. Modifique platform-settings.json para incluir lo siguiente como elemento raíz al final del fichero, en el mismo nivel que PlatformSettingsConfig.
"ZookeeperSettings": {
"SSLEnabled": "true",
# If SSL is enabled, you must include the following; trust store is optional:
"KeyStorePath": "<path-to-zookeeper-certificates>/zookeeper.p12",
"KeyStorePass": "<certificate-password>",
"TrustStorePath": "<path-to-zookeeper-certificates>/truststore.p12",
"TrustStorePass": "<truststore-password>"
"SASLEnabled": "false",
# If SASL is enabled, you must include the following:
"JaasConfPath": "/tmp1/jaas.conf",
"Krb5ConfPath": "/tmp1/krb5.conf"
}
3. Busque el puerto de Zookeeper por defecto 2181 y reemplácelo por el puerto seguro 2281.
4. Asegúrese de que todas las entradas de CoordinatorHosts y address-resolver > connection ports estén actualizadas para que coincidan con el valor secureClientPort de zoo.cfg.
Configuración de Ignite
1. Copie el keystore y el truststore de ZooKeeper en el ordenador de Ignite o asegúrese de que estén disponibles en el ordenador en el que se ejecuta el servidor de Ignite.
2. Defina la variable de entorno de ZOOKEEPER_CONNECTION y busque la variable de entorno JVM_XOPTS que se utiliza para iniciar Ignite y actualícela de la siguiente manera:
# zookeeper1 represents the host name where zookeeper is available and 2281 the secure port from zoo.cfg
export ZOOKEEPER_CONNECTION=zookeeper1:2281,zookeeper2:2281,zookeeper3:2281
# update the JVM_XOPTS
JVM_XOPTS="-Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty -Dzookeeper.client.secure=true -Dzookeeper.ssl.keyStore.location=<path-to-zookeeper-certificates>/zookeeper.p12 -Dzookeeper.ssl.keyStore.password=<keystore-password> -Dzookeeper.ssl.trustStore.location=<path-to-zookeeper-certificates>/truststore.p12 -Dzookeeper.ssl.trustStore.password=<truststore-password>"
Configuración de Connection Server
1. Copie los certificados de Zookeeper en la instancia o asegúrese de que estén disponibles en el ordenador en el que se ejecuta Connection Server.
2. Actualice el puerto de cx-server.discovery.connectionString en el fichero de configuración de Connection Server para utilizar el puerto seguro.
Por ejemplo, cx-server.discovery.connectionString = "{zookeeper-host}:2281".
3. Añada las siguientes propiedades del sistema a la variable de entorno CONNECTION_SERVER_OPTS.
4. Si ThingWorx utiliza TLS, defina la variable de entorno correspondiente. Para obtener más información, consulte Setting an Environment Variable When Using SSL/TLS.
Por ejemplo:
export CONNECTION_SERVER_OPTS="
-Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
-Dzookeeper.client.secure=true
-Dzookeeper.ssl.keyStore.location=<path-to-zookeeper-certificates>/zookeeper.p12
-Dzookeeper.ssl.keyStore.password=<keystore-password>
-Dzookeeper.ssl.trustStore.location=<path-to-zookeeper-certificates>/truststore.p12
-Dzookeeper.ssl.trustStore.password=<truststore-password>"
Cifrado de contraseñas con la herramienta de gestión ThingWorx Security
* 
Después de completar la configuración del servidor con todos los componentes, recomendamos cifrar las contraseñas para mejorar la seguridad.
Para evitar la inserción de contraseñas sin formato en el fichero platform-settings.json, se pueden cifrar las contraseñas dentro de twx-keystore con la herramienta de seguridad. Las contraseñas se deben cifrar con encrypt.zk.keystore.password y encrypt.zk.truststore.password para las contraseñas del almacén de claves y el almacén de confianza, respectivamente.
./security-common-cli keystore.conf set encrypt.zk.keystore.password "ptcptc"
A continuación, cambie el fichero platform-settings.json para que ThingWorx seleccione la contraseña del almacén de claves:
"KeyStorePass": "encrypt.zk.keystore.password",
"TrustStorePass": "encrypt.zk.truststore.password"
Pasos siguientes
Para completar la configuración de Ignite, consulte los siguientes temas:
¿Fue esto útil?