Configurazione di SSL/TLS per ZooKeeper
È possibile configurare SSL o TLS per ZooKeeper quando si utilizza il clustering a disponibilità elevata ThingWorx:
Configurazione di ZooKeeper
1. Assicurarsi di eseguire una versione di ZooKeeper che supporta SSL o TLS.
2. Ottenere il certificato SSL e il truststore. Attenersi alla procedura descritta di seguito.
1. Creare il keystore ZooKeeper.
2. Utilizzare la chiave pubblica del keystore ZooKeeper e creare il truststore ZooKeeper.
|
|
Le uniche estensioni accettabili per i certificati sono JKS, PEM e PKCS12(p12).
|
3. Passare ad apache-zookeeper-[versione]-bin/conf e aggiornare o creare il file zoo.cfg.
4. Aggiungere le voci riportate di seguito.
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
Per attivare il quorum tra i nodi ZooKeeper, impostare la variabile sslQuorum=truenel file zoo.cfg. I nodi utilizzeranno il sistema SSL generato automaticamente per proteggere il quorum.
ZooKeeper utilizza TLS unidirezionale, non TLS reciproco (mTLS). La proprietà ssl.clientAuth accetta i seguenti valori:
◦ none - Non è richiesto alcun certificato client (SSL unidirezionale).
◦ want - Zookeeper richiede un certificato client, ma non lo impone.
◦ need - Zookeeper richiede un certificato client valido (mTLS completo).
5. Nella directory specificata dal percorso dataDir in zoo.cfg, creare un file denominato myid per ogni nodo. Il file deve contenere un singolo ID numerico corrispondente al nodo:
◦ Per il nodo 1, immettere 1 nella prima riga, quindi salvare e chiudere il file.
◦ Ripetere la procedura per ogni nodo (ad esempio, il nodo 2 deve includere 2, il nodo 3 deve includere 3 e così via).
Assicurarsi che il file contenga solo cifre senza spazi vuoti aggiuntivi e che sia leggibile dall'utente del servizio ZooKeeper (in genere, zookeeper). Se l'ID non corrisponde alla configurazione, il nodo non si unisce al cluster.
6. Alla fine di zoo.cfg, aggiungere le voci nel seguente formato: server.X=<hostname or IP>:<peerPort>:<electionPort>
Esempio per un ensemble a 3 nodi:
# 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
Assicurarsi che i numeri di server.X corrispondano al file myid su ciascun nodo. Le directory dataDir e dataLogDir devono esistere ed essere scrivibili dall'utente ZooKeeper. L'eliminazione automatica è consigliata in fase di produzione, per evitare la crescita del disco.
7. Modificare lo script di avvio di ZooKeeper.
◦ Per le distribuzioni in un ambiente Linux, procedere come segue:
Modificare <percorso_zookeeper>/bin/zkServer.sh e aggiungere export SERVER_JVMFLAGS="...".
◦ Per le distribuzioni in un ambiente Windows, procedere come segue:
In caso di distribuzione in Windows, attenersi alle seguenti istruzioni modificate:
a. Modificare <path to zookeeper>/bin/zkServer.cmd.
b. Utilizzare il comando set anziché export: set SERVER_JVMFLAGS=....
c. Lo script non è preconfigurato per gestire questa variabile. È necessario dichiarare la variabile e referenziarla nel comando di avvio di Java. Ad esempio:
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. Avviare ZooKeeper:
./zkServer.sh start
9. Nei log verificare che la configurazione sia corretta.
tail -f apache-zookeeper-3.5.6-bin/logs/<zookeeper-log-file>
Configurazione di ThingWorx
1. Copiare i certificati ZooKeeper nell'istanza o assicurarsi che siano disponibili nel computer in cui ThingWorx è in esecuzione.
|
|
Gli utenti Tomcat devono avere accesso ai certificati o copiarli nella directory ThingworxPlatform.
|
2. Modificare il file platform-settings.json in modo da includere quanto segue come elemento radice alla fine del file, allo stesso livello di 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. Cercare la porta 2181 di default di ZooKeeper e sostituirla con la porta sicura 2281.
4. Assicurarsi che tutte le voci CoordinatorHosts e address-resolver > connection ports siano aggiornate in modo da corrispondere al valore secureClientPort di zoo.cfg.
Configurazione di Ignite
1. Copiare il keystore e il truststore ZooKeeper nel computer Ignite o assicurarsi che siano disponibili nel computer in cui è in esecuzione il server Ignite.
2. Impostare la variabile di ambiente ZOOKEEPER_CONNECTION e individuare la variabile di ambiente JVM_XOPTS utilizzata per avviare Ignite, quindi aggiornarla nel modo seguente:
# 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>"
Configurazione del server connessioni
1. Copiare i certificati ZooKeeper nell'istanza o assicurarsi che siano disponibili nel computer in cui è in esecuzione il server connessioni.
2. Aggiornare la porta per il cx-server.discovery.connectionString nel file di configurazione del server connessioni in modo da utilizzare la porta protetta.
Ad esempio, cx-server.discovery.connectionString = "{zookeeper-host}:2281".
3. Aggiungere le proprietà di sistema riportate di seguito alla variabile di ambiente CONNECTION_SERVER_OPTS.
Ad esempio:
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>"
Crittografia delle password con ThingWorx Security Management Tool
|
|
Dopo aver completato l'impostazione del server con tutti i componenti, è consigliabile crittografare le password per migliorare la sicurezza.
|
Se si desidera evitare di inserire password semplici nel file platform-settings.json, è possibile crittografare le password all'interno di twx-keystore utilizzando lo strumento di protezione. È necessario crittografare la password utilizzando encrypt.zk.keystore.password ed encrypt.zk.truststore.password per le password del keystore e del truststore, rispettivamente.
./security-common-cli keystore.conf set encrypt.zk.keystore.password "ptcptc"
Quindi, modificare il file platform-settings.json in modo che ThingWorx selezioni la password dal keystore:
"KeyStorePass": "encrypt.zk.keystore.password",
"TrustStorePass": "encrypt.zk.truststore.password"
Passi successivi
Per completare l'impostazione di Ignite, fare riferimento agli argomenti seguenti: