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 TrustStore. Procédez comme suit :
1. Créez le KeyStore ZooKeeper.
2. Utilisez la clé publique du KeyStore ZooKeeper et créez le TrustStore ZooKeeper.
|
|
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
ssl.clientAuth=none
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.
ZooKeeper utilise le protocole TLS unidirectionnel et non le protocole TLS mutuel (mTLS). La propriété ssl.clientAuth accepte les valeurs suivantes :
◦ none : aucun certificat client n'est requis (SSL unidirectionnel).
◦ want : ZooKeeper demande un certificat client, mais ne l'applique pas.
◦ need : ZooKeeper requiert un certificat client valide (mTLS complet).
5. Dans le répertoire spécifié par le chemin dataDir dans zoo.cfg, créez un fichier nommé myid pour chaque noeud. Le fichier doit contenir un ID numérique unique correspondant au noeud :
◦ Pour le noeud 1, entrez 1 sur la première ligne, puis enregistrez et fermez le fichier.
◦ Répétez l'opération pour chaque noeud (entrez 2 pour le noeud 2, 3 pour le noeud 3, et ainsi de suite).
Assurez-vous que le fichier ne contient que des chiffres, sans espaces ajoutés, et qu'il est lisible par l'utilisateur du service ZooKeeper (généralement zookeeper). Si l'ID ne correspond pas à la configuration, le noeud ne pourra pas rejoindre le cluster.
6. A la fin de zoo.cfg, ajoutez des entrées au format suivant : server.X=<hostname or IP>:<peerPort>:<electionPort>
Exemple pour un ensemble à 3 noeuds :
# 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
Assurez-vous que les numéros server.X correspondent au fichier myid sur chaque noeud. Les répertoires dataDir et dataLogDir doivent exister et être accessibles en écriture par l'utilisateur ZooKeeper. Des purges automatiques sont vivement recommandées en production pour éviter une croissance excessive du disque.
7. Modifiez le script de démarrage de ZooKeeper.
◦ Pour les déploiements sous Linux :
Modifiez <chemin vers zookeeper>/bin/zkServer.sh et ajoutez ce qui suit : export SERVER_JVMFLAGS="...".
◦ Pour les déploiements sous Windows :
En cas de déploiement sous Windows, suivez les instructions ajustées suivantes :
a. Modifiez le fichier <path to zookeeper>/bin/zkServer.cmd.
b. Utilisez la commande set au lieu de export : set SERVER_JVMFLAGS=....
c. Le script n'est pas préconfiguré pour gérer cette variable. Vous devez déclarer la variable et la référencer dans la commande de démarrage Java. Par exemple :
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. Démarrez ZooKeeper :
./zkServer.sh start
9. 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.
|
|
Les utilisateurs de Tomcat doivent avoir accès aux certificats ou les copier dans le répertoire ThingworxPlatform.
|
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 le KeyStore et le TrustStore ZooKeeper sur la machine Ignite ou assurez-vous qu'ils sont disponibles sur la machine sur laquelle le serveur Ignite s'exécute.
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
|
|
Une fois que vous avez terminé la configuration du serveur avec tous les composants, nous vous recommandons de chiffrer les mots de passe pour renforcer la sécurité.
|
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"
Etapes suivantes
Pour terminer la configuration d'Ignite, reportez-vous aux rubriques suivantes :