Configuration de SSL/TLS pour ZooKeeper
Vous pouvez configurer SSL ou TLS pour ZooKeeper dans un environnement ThingWorx de cluster haute disponibilité :
Configuration de ZooKeeper
1. Assurez-vous que vous exécutez une version de ZooKeeper qui prend en charge SSL ou TLS.
2. Obtenez votre certificat SSL et le magasin d'approbations.
Les seules extensions acceptables pour les certificats sont JKS, PEM et PKCS12 (p12).
3. Accédez à apache-zookeeper-[version]-bin/conf et mettez à jour ou créez le fichier zoo.cfg.
4. Ajoutez les entrées suivantes :
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
Pour activer le quorum entre les noeuds ZooKeeper, définissez la variable sslQuorum=true dans le fichier zoo.cfg. Les noeuds utiliseront le SSL généré automatiquement pour sécuriser le quorum.
5. Modifiez le fichier <chemin d'accès à zookeeper>/bin/zkServer.sh.
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
6. Démarrez ZooKeeper :
./zkServer.sh start
7. Dans les journaux, vérifiez que la configuration est correcte :
tail -f apache-zookeeper-3.5.6-bin/logs/<zookeeper-log-file>
Configuration de ThingWorx
1. Copiez les certificats ZooKeeper dans votre instance ou assurez-vous qu'ils sont disponibles sur la machine sur laquelle ThingWorx est en cours d'exécution.
2. Modifiez votre fichier platform-settings.json pour inclure les éléments suivants en tant qu'élément racine à la fin du fichier, au même niveau 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. Recherchez le port ZooKeeper par défaut 2181 et remplacez-le par le port sécurisé 2281.
4. Assurez-vous que toutes les entrées CoordinatorHosts et que address-resolver > connection ports sont mis à jour pour correspondre à la valeur de secureClientPort du fichier zoo.cfg.
Configuration d'Ignite
1. Copiez les certificats Ignite dans votre instance ThingWorx ou assurez-vous qu'ils sont disponibles sur la machine sur laquelle le serveur Ignite est en cours d'exécution.
2. Définissez la variable d'environnement ZOOKEEPER_CONNECTION, puis recherchez la variable d'environnement JVM_XOPTS utilisée pour démarrer Ignite et mettez-la à jour comme suit :
# 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>
Configuration du serveur de connexion
1. Copiez les certificats ZooKeeper dans votre instance ThingWorx ou assurez-vous qu'ils sont disponibles sur la machine sur laquelle le serveur de connexion est en cours d'exécution.
2. Mettez à jour le port pour que l'élément cx-server.discovery.connectionString du fichier de configuration du serveur de connexion utilise le port sécurisé.
Par exemple, cx-server.discovery.connectionString = "{zookeeper-host}:2281".
3. Ajoutez les propriétés système suivantes à la variable d'environnement CONNECTION_SERVER_OPTS.
Par exemple :
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>"
Chiffrement des mots de passe à l'aide de l'outil de gestion ThingWorx Security
Si vous souhaitez éviter d'insérer les mots de passe en texte brut dans le fichier platform-settings.json, vous pouvez les chiffrer dans twx-keystore à l'aide de l'outil de sécurité. Vous devez chiffrer le mot de passe à l'aide de encrypt.zk.keystore.password et encrypt.zk.truststore.password pour les mots de passe du magasin de clés et du magasin d'approbations respectivement.
./security-common-cli keystore.conf set encrypt.zk.keystore.password "ptcptc"
Modifiez ensuite le fichier platform-settings.json afin que ThingWorx récupère le mot de passe dans le keystore :
"KeyStorePass": "encrypt.zk.keystore.password",
"TrustStorePass": "encrypt.zk.truststore.password"