설치 및 업그레이드 > ThingWorx 설치 > 보안 구성 > TLS 구성 > ZooKeeper에 대한 SSL/TLS 구성
ZooKeeper에 대한 SSL/TLS 구성
ThingWorx HA 클러스터링을 사용할 때 ZooKeeper에 대한 SSL 또는 TLS를 구성할 수 있습니다.
ZooKeeper 구성
1. 실행 중인 ZooKeeper 버전에서 SSL 또는 TLS를 지원하는지 확인합니다.
2. SSL 인증서 및 신뢰 저장소를 가져옵니다. 다음 단계를 수행하십시오.
1. ZooKeeper 키 저장소를 만듭니다.
2. ZooKeeper 키 저장소의 공개 키를 사용하고 ZooKeeper 신뢰 저장소를 만듭니다.
* 
인증서에 유일하게 허용되는 확장은 JKS, PEM 및 PKCS12(p12)입니다.
3. apache-zookeeper-[버전]-bin/conf로 이동하여 zoo.cfg를 업데이트하거나 만듭니다.
4. 다음 엔트리를 추가합니다.
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
ZooKeeper 노드 간에 쿼럼을 활성화하려면 zoo.cfg 파일에서 sslQuorum=true 변수를 설정합니다. 노드는 자동 생성된 SSL을 사용하여 쿼럼을 보호합니다.
ZooKeeper는 상호 TLS(mTLS)가 아닌 단방향 TLS를 사용합니다. ssl.clientAuth 속성은 다음을 허용합니다.
none - 클라이언트 인증서가 필요하지 않습니다(단방향 SSL).
want - ZooKeeper는 클라이언트 인증서를 요청하지만 필수 사항은 아닙니다.
need – ZooKeeper는 유효한 클라이언트 인증서를 요구합니다(전체 mTLS).
5. zoo.cfgdataDir 경로로 지정된 디렉터리에서 각 노드에 대해 myid 파일을 생성합니다. 파일에는 노드에 해당하는 단일 숫자 ID가 포함되어야 합니다.
노드 1의 경우 첫 번째 줄에 1을 입력한 다음 파일을 저장하고 닫습니다.
각 노드에 대해 이 과정을 반복합니다. 예를 들어, 노드 2에는 2, 노드 3에는 3 등을 입력해야 합니다.
파일에는 공백 없이 숫자만 포함되어야 하며 ZooKeeper 서비스 사용자(일반적으로 zookeeper)가 읽을 수 있어야 합니다. ID가 구성과 일치하지 않으면 노드가 클러스터에 참여하지 못합니다.
6. zoo.cfg의 끝에 server.X=<hostname or IP>:<peerPort>:<electionPort> 형식의 엔트리를 추가합니다.
3개 노드 앙상블 구성 예:
# 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
각 노드의 server.X 번호가 myid 파일의 번호와 일치하는지 확인합니다. dataDirdataLogDir 디렉터리가 존재해야 하며 ZooKeeper 사용자가 쓰기 가능해야 합니다. 생산 환경에서는 디스크 증가를 방지하기 위해 자동 제거 수행을 강력히 권장합니다.
7. ZooKeeper 시작 스크립트를 수정합니다.
Linux 배포의 경우:
<ZooKeeper 경로>/bin/zkServer.sh를 수정하고 export SERVER_JVMFLAGS="..."를 추가합니다.
Windows 배포의 경우:
Windows에 배포하는 경우 조정된 지침을 따릅니다.
a. <path to zookeeper>/bin/zkServer.cmd를 수정합니다.
b. export 대신 set 명령을 사용합니다. set SERVER_JVMFLAGS=....
c. 스크립트는 이 변수를 처리하도록 미리 구성되어 있지 않습니다. 변수를 선언하고 Java 실행 명령에서 참조해야 합니다. 예를 들면, 다음과 같습니다.
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. ZooKeeper를 시작합니다.
./zkServer.sh start
9. 로그에서 구성이 올바른지 확인합니다.
tail -f apache-zookeeper-3.5.6-bin/logs/<zookeeper-log-file>
ThingWorx 구성
1. ZooKeeper 인증서를 인스턴스에 복사하거나 ThingWorx를 실행하는 시스템에서 이 인증서를 사용할 수 있는지 확인합니다.
* 
Tomcat 사용자는 인증서에 대한 액세스 권한이 있거나 인증서를 ThingworxPlatform 디렉터리에 복사해야 합니다.
2. platform-settings.json을 수정하여 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. 기본 ZooKeeper 포트 2181을 검색하여 보안 포트 2281로 바꿉니다.
4. 모든 CoordinatorHosts 엔트리 및 address-resolver > connection ports가 업데이트되어 zoo.cfgsecureClientPort 값과 일치하는지 확인합니다.
Ignite 구성
1. ZooKeeper 키 저장소 및 신뢰 저장소를 Ignite 시스템에 복사하거나 Ignite 서버가 실행 중인 시스템에서 사용할 수 있는지 확인합니다.
2. ZOOKEEPER_CONNECTION 환경 변수를 설정하고, Ignite를 시작하는 데 사용되는 JVM_XOPTS 환경 변수를 찾아 다음과 같이 업데이트합니다.
# 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>"
Connection Server 구성
1. ZooKeeper 인증서를 인스턴스에 복사하거나 Connection Server를 실행하는 시스템에서 이 인증서를 사용할 수 있는지 확인합니다.
2. Connection Server 구성 파일에서 보안 포트를 사용하도록 cx-server.discovery.connectionString에 대한 포트를 업데이트합니다.
예를 들면 다음과 같습니다. cx-server.discovery.connectionString = "{zookeeper-host}:2281"
3. 다음 시스템 속성을 CONNECTION_SERVER_OPTS 환경 변수에 추가합니다.
4. ThingWorx에서 TLS를 사용 중인 경우 이에 대한 환경 변수를 설정합니다. 자세한 내용은 Setting an Environment Variable When Using SSL/TLS를 참조하십시오.
예를 들면, 다음과 같습니다.
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>"
ThingWorx Security 관리 도구를 사용하여 암호 암호화
* 
모든 구성 요소로 서버 설정을 완료한 후에는 보안 강화를 위해 암호를 암호화하는 것을 권장합니다.
platform-settings.json 파일에 일반 암호를 삽입하는 것을 방지하려는 경우 보안 도구를 사용하여 twx-keystore 내의 암호를 암호화하면 됩니다. 키 저장소 암호 및 신뢰 저장소 암호에 각각 encrypt.zk.keystore.passwordencrypt.zk.truststore.password를 사용하여 암호를 암호화해야 합니다.
./security-common-cli keystore.conf set encrypt.zk.keystore.password "ptcptc"
그런 다음 ThingWorx가 키 저장소에서 암호를 선택하도록 platform-settings.json 파일을 변경합니다.
"KeyStorePass": "encrypt.zk.keystore.password",
"TrustStorePass": "encrypt.zk.truststore.password"
다음 단계
Ignite 설정을 완료하려면 다음 항목을 참조하십시오.
도움이 되셨나요?