文件路径:“$OCK_HOME/conf/ock.conf”。
vim $OCK_HOME/conf/ock.conf
ock.zookeeper.server.url = IP:PORT ock.zookeeper.security.enable = false
其中ock.zookeeper.server.url参数值中的IP地址需要根据用户实际情况修改,IP地址为ZooKeeper的Server端IP地址,PORT为普通端口2181。
ZooKeeper安全特性默认是关闭状态的,用户需要自行配置打开。
以下介绍两种开启ZooKeeper安全特性的方法:TLS+Kerberos功能、Kerberos功能。
下文中提到的$OCK_HOME为OCK的安装目录,zkhostname为用户环境中ZooKeeper Server服务器的hostname,zkclihostname为用户环境中ZooKeeper Client服务器的hostname,“/usr/local/zookeeper”为ZooKeeper的安装路径。用户需要根据实际情况进行命令或代码的修改。
ARM平台取值为“linux-aarch64”。
export OCK_BINARY_TYPE=linux-aarch64
以下命令中IP1和IP2分别指的是OCKD Meta Server端和ZooKeeper Server端的IP地址,必须要加上,如果有多个Zookeeper Server,则其IP地址依次添加在后面,并以“,”分隔开。
keytool -genkey -alias example.com -keyalg RSA -keystore server.keystore.jks -keysize 2048 -ext SAN=ip:IP1,ip:IP2
keytool -export -alias example.com -file server.crt -keystore server.keystore.jks
keytool -import -trustcacerts -alias example.com -file server.crt -keystore client.truststore.jks
以下命令中IP1和IP2分别指的是OCKD Meta Server端和ZooKeeper Server端的IP地址,必须要加上,如果有多个Zookeeper Server,则其IP地址依次添加在后面,并以“,”分隔开。
该命令使用过程中需要输入自定义证书口令(请用户确保输入口令的复杂度以保证证书安全)。
keytool -genkey -alias example.com -keyalg RSA -keystore client.keystore.jks -keysize 2048 -ext SAN=ip:IP1,ip:IP2
keytool -export -alias example.com -file client.crt -keystore client.keystore.jks
keytool -import -trustcacerts -alias example.com -file client.crt -keystore server.truststore.jks
openssl x509 -inform DER -outform PEM -in client.crt -out client.crt.pem
openssl x509 -inform DER -outform PEM -in server.crt -out server.crt.pem
生成加密口令之前建议关闭系统历史记录功能,避免密码被记录下来,可在口令生成后再打开该功能,参见2.a.v。
set +o history
对生成TLS证书和pem证书时输入的口令进行加密,获得加密口令字符串,后续配置中会用到,进入kmc_tool所在目录。(请用户确保加密口令的复杂度以保证证书安全)。
若开启ZooKeeper的TLS功能,则每个节点都要运行,且需根据加密口令使用用户切换用户生成。将ock运行用户获得的pem证书加密口令字符串写入ock.conf的ock.zookeeper.security.certs参数,将提交spark任务用户获得的pem证书加密口令字符串写入ock.conf的ock.zookeeper.sdk.security.certs参数。
cd $OCK_HOME/ucache/23.0.0/linux-aarch64/bin LD_LIBRARY_PATH=$OCK_HOME/ucache/23.0.0/linux-aarch64/lib/common/ ./kmc_tool 0 --encrypt stdin (交互输入加密口令后回车)。
set -o history
对生成的TLS证书根据各用户分别拷贝至用户下指定目录,拷贝完成后修改各文件属主为用户,权限为400(若不拷贝,则需将文件赋予用户组可读权限。),各用户拷贝目录如下所示:
参考配置keytab和whitelist步骤7执行kdc_distribute.sh脚本(若已经执行过请跳过该步骤)。
将“$OCK_HOME/jars”目录下的JAR包拷贝到ZooKeeper根目录的“lib”目录下,若根目录下没有“lib”目录,则需要自行创建,权限与zookeeper原生jar权限保持一致。
[ockadmin@master jars]$ ll total 432K -r-xr-x---. 1 ockadmin ockadmin 99K May 27 16:55 ock-adaptive-tuning-23.0.0-for-spark-3.1.jar -r-xr-x---. 1 ockadmin ockadmin 9.8K May 27 16:55 ock-broadcast-sdk-23.0.0.jar -r-xr-x---. 1 ockadmin ockadmin 24K May 27 16:55 ock-launch-cluster-23.0.0.jar -r-xr-x---. 1 ockadmin ockadmin 87K May 27 16:55 ock-shuffle-manager-23.0.0-for-spark-3.1.jar -r-xr-x---. 1 ockadmin ockadmin 23K May 27 16:55 ock-shuffle-sdk-23.0.0.jar -r-xr-x---. 1 ockadmin ockadmin 6.6K May 27 16:55 ock-tuning-sdk-23.0.0.jar -r-xr-x--- 1 ockadmin ockadmin 87K May 27 16:55 zk-server-auth-plugin-keytab-23.0.0-assembly.jar -r-xr-x--- 1 ockadmin ockadmin 85K May 27 16:55 zk-server-auth-plugin-tls-23.0.0-assembly.jar
[Zookeeperadmin@master lib]# ll /usr/local/zookeeper/lib/ | grep zk -r-xr-x--- 1 zookeeperadmin ockadmin 87K May 27 16:55 zk-server-auth-plugin-keytab-23.0.0-assembly.jar -r-xr-x--- 1 zookeeperadmin ockadmin 85K May 27 16:55 zk-server-auth-plugin-tls-23.0.0-assembly.jar
1 | vim /usr/local/zookeeper/conf/zoo.cfg
|
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider jaasLoginRenew=3600000 secureClientPort=2281
1 | vim /usr/local/zookeeper/bin/zkEnv.sh
|
export SERVER_JVMFLAGS=" -Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory -Dzookeeper.ssl.keyStore.location=/home/cafile/server.keystore.jks -Dzookeeper.ssl.keyStore.password=*** -Dzookeeper.ssl.trustStore.location=/home/cafile/server.truststore.jks -Dzookeeper.ssl.trustStore.password=*** -Dzookeeper.ssl.trustStore.type=JKS -Dzookeeper.ssl.context.supplier.class=com.huawei.ock.zookeeper.SSLContext4Server -Dzookeeper.authProvider.ock=com.huawei.ock.zookeeper.OCKAuthenticationProvider -Dzookeeper.ssl.authProvider=ock -Dzookeeper.ssl.protocol=TLSv1.2 -Dzookeeper.ssl.ciphersuites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 $SERVER_JVMFLAGS" export CLIENT_JVMFLAGS=" -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty -Dzookeeper.client.secure=true -Dzookeeper.ssl.keyStore.location=/home/cafile/client.keystore.jks -Dzookeeper.ssl.keyStore.password=*** -Dzookeeper.ssl.keyStore.type=JKS -Dzookeeper.ssl.trustStore.location=/home/cafile/client.truststore.jks -Dzookeeper.ssl.trustStore.password=*** -Dzookeeper.ssl.trustStore.type=JKS -Dzookeeper.ssl.context.supplier.class=com.huawei.ock.zookeeper.SSLContext4Client -Dzookeeper.authProvider.ock=com.huawei.ock.zookeeper.OCKAuthenticationProvider -Dzookeeper.ssl.authProvider=ock -Dzookeeper.ssl.protocol=TLSv1.2 -Dzookeeper.ssl.ciphersuites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 $CLIENT_JVMFLAGS" export SERVER_JVMFLAGS=" -Djava.security.auth.login.config=/usr/local/zookeeper/conf/zk_server.conf -Dzookeeper.security.kmc.config=/usr/local/zookeeper/conf/kmc.conf $SERVER_JVMFLAGS" export CLIENT_JVMFLAGS=" -Djava.security.auth.login.config=/usr/local/zookeeper/conf/zk_client.conf -Dzookeeper.security.kmc.config=/usr/local/zookeeper/conf/kmc.conf $CLIENT_JVMFLAGS"
export SERVER_JVMFLAGS=" -Djava.security.auth.login.config=/usr/local/zookeeper/conf/zk_server.conf $SERVER_JVMFLAGS" export CLIENT_JVMFLAGS=" -Djava.security.auth.login.config=/usr/local/zookeeper/conf/zk_client.conf $CLIENT_JVMFLAGS"
vim /usr/local/zookeeper/conf/zk_server.conf
Server { com.huawei.ock.zookeeper.OCKKrb5LoginModule required useKeyTab=true keyTab="/home/Zookeeperadmin/huawei/ock/security/kdc/zookeeper_en.keytab" debug=true storeKey=true useTicketCache=false principal="zookeeper/zkhostname@HUAWEI.COM"; };
vim /usr/local/zookeeper/conf/zk_client.conf
Client { com.huawei.ock.zookeeper.OCKKrb5LoginModule required useKeyTab=true keyTab="/home/Sparkadmin/huawei/ock/security/kdc/krb5-client_en.keytab" storeKey=true useTicketCache=false principal="zkcli/zkclihostname@HUAWEI.COM"; };
vim /usr/local/zookeeper/conf/kmc.conf
kmc.ksf.primary.path=/home/Zookeeperadmin/huawei/ock/security/pmt/master/ksfa kmc.ksf.standby.path=/home/Zookeeperadmin/huawei/ock/security/pmt/standby/ksfb openssl.lib.path=$OCK_HOME/ucache/23.0.0/linux-aarch64/lib/common/openssl/libssl.so crypto.lib.path=$OCK_HOME/ucache/23.0.0/linux-aarch64/lib/common/openssl/libcrypto.so
zkEnv.sh
zkServer.sh restart
zkCli.sh -server IP:端口号
ock.conf文件中配置内容参考如下。
ock.zookeeper.security.enable = true ock.zookeeper.server.url = zk serverIP:2281 //若不开启TLS功能则端口号配成2181 ock.ucache.rpc.tls.ca.cert.path = /home/ockadmin/opt/ock/security/tls/server/ca.cert.pem ock.ucache.rpc.tls.key.encrypted = true ock.ucache.rpc.tls.key.path = /home/ockadmin/opt/ock/security/tls/server/server.private.key.pem ock.ucache.rpc.tls.cert.path = /home/ockadmin/opt/ock/security/tls/server/server.cert.pem ock.ucache.rpc.tls.key.pass.path = /home/ockadmin/opt/ock/security/tls/server/server.keypass.key ock.ucache.rpc.tls.sdk.ca.cert.path = /home/Sparkadmin/huawei/ock/security/tls/ca.cert.pem ock.ucache.rpc.auth.type = kerberos ock.ucache.rpc.auth.kerb.client.keytab = /home/Sparkadmin/huawei/ock/security/kdc/krb5-client_en.keytab ock.ucache.rpc.auth.kerb.server.keytab = /home/ockadmin/opt/ock/security/kdc/krb5-server_en.keytab ock.ucache.rpc.auth.kerb.keytab.encrypted = true ock.ucache.rpc.auth.domain = HUAWEI.COM ock.ucache.rpc.auth.server.principle.name = ock_server ock.ucache.rpc.auth.client.principle.name = ock_client ock.ucache.rpc.author.type = whitelist ock.ucache.rpc.author.file.path = /home/ockadmin/opt/ock/security/authorization/whitelist_en ock.ucache.rpc.author.file.encrypted = true ock.ucache.kmc.ksf.primary.path = /home/ockadmin/opt/ock/security/pmt/master/ksfa ock.ucache.kmc.ksf.standby.path = /home/ockadmin/opt/ock/security/pmt/standby/ksfb ock.ucache.kmc.ksf.backup.path = /home/ockadmin/opt/ock/security/pmt/kmcbakup ock.ucache.sdk.kmc.ksf.primary.path = /home/Sparkadmin/huawei/ock/security/pmt/master/ksfa ock.ucache.sdk.kmc.ksf.standby.path = /home/Sparkadmin/huawei/ock/security/pmt/standby/ksfb ock.ucache.sdk.kmc.ksf.backup.path = /home/Sparkadmin/huawei/ock/security/pmt/kmcbakup ock.zookeeper.security.principle.name = zookeeper ock.zookeeper.security.principle.hostname = zkhostname ock.zookeeper.security.strategy = GSSAPI ock.zookeeper.security.certs = /home/ockadmin/opt/ock/security/tls/server.crt.pem,/home/ockadmin/opt/ock/security/tls/client.crt.pem,/home/ockadmin/opt/ock/security/tls/client.pem,*** ock.zookeeper.sdk.security.client.principle = zkcli/master@HUAWEI.COM ock.zookeeper.sdk.security.client.keytab = /home/Sparkadmin/huawei/ock/security/kdc/krb5-client_en.keytab ock.zookeeper.sdk.security.certs = /home/Sparkadmin/huawei/ock/security/tls/server.crt.pem,/home/Sparkadmin/huawei/ock/security/tls/client.crt.pem,/home/Sparkadmin/huawei/ock/security/tls/client.pem,*** ock.zookeeper.security.client.principle = zkcli/master@HUAWEI.COM ock.zookeeper.security.client.keytab = /home/ockadmin/opt/ock/security/kdc/krb5-server_en.keytab ock.zookeeper.security.isKeytabEncrypt = true
ock.zookeeper.security.enable = true ock.zookeeper.server.url = zk serverIP:2181 //若不开启TLS功能则端口号配成2181 ock.ucache.rpc.tls.ca.cert.path = /home/ockadmin/opt/ock/security/tls/server/ca.cert.pem ock.ucache.rpc.tls.key.encrypted = true ock.ucache.rpc.tls.key.path = /home/ockadmin/opt/ock/security/tls/server/server.private.key.pem ock.ucache.rpc.tls.cert.path = /home/ockadmin/opt/ock/security/tls/server/server.cert.pem ock.ucache.rpc.tls.key.pass.path = /home/ockadmin/opt/ock/security/tls/server/server.keypass.key ock.ucache.rpc.tls.sdk.ca.cert.path = /home/Sparkadmin/huawei/ock/security/tls/ca.cert.pem ock.ucache.rpc.auth.type = kerberos ock.ucache.rpc.auth.kerb.client.keytab = /home/Sparkadmin/huawei/ock/security/kdc/krb5-client_en.keytab ock.ucache.rpc.auth.kerb.server.keytab = /home/ockadmin/opt/ock/security/kdc/krb5-server_en.keytab ock.ucache.rpc.auth.kerb.keytab.encrypted = true ock.ucache.rpc.auth.domain = HUAWEI.COM ock.ucache.rpc.auth.server.principle.name = ock_server ock.ucache.rpc.auth.client.principle.name = ock_client ock.ucache.rpc.author.type = whitelist ock.ucache.rpc.author.file.path = /home/ockadmin/opt/ock/security/authorization/whitelist_en ock.ucache.rpc.author.file.encrypted = true ock.ucache.kmc.ksf.primary.path = /home/ockadmin/opt/ock/security/pmt/master/ksfa ock.ucache.kmc.ksf.standby.path = /home/ockadmin/opt/ock/security/pmt/standby/ksfb ock.ucache.kmc.ksf.backup.path = /home/ockadmin/opt/ock/security/pmt/kmcbakup ock.ucache.sdk.kmc.ksf.primary.path = /home/Sparkadmin/huawei/ock/security/pmt/master/ksfa ock.ucache.sdk.kmc.ksf.standby.path = /home/Sparkadmin/huawei/ock/security/pmt/standby/ksfb ock.ucache.sdk.kmc.ksf.backup.path = /home/Sparkadmin/huawei/ock/security/pmt/kmcbakup ock.zookeeper.security.principle.name = zookeeper ock.zookeeper.security.principle.hostname = zkhostname ock.zookeeper.security.strategy = GSSAPI ock.zookeeper.security.certs = false ock.zookeeper.sdk.security.client.principle = zkcli/master@HUAWEI.COM ock.zookeeper.sdk.security.client.keytab = /home/Sparkadmin/huawei/ock/security/kdc/krb5-client_en.keytab ock.zookeeper.sdk.security.certs = false ock.zookeeper.security.client.principle = zkcli/master@HUAWEI.COM ock.zookeeper.security.client.keytab = /home/ockadmin/opt/ock/security/kdc/krb5-server_en.keytab ock.zookeeper.security.isKeytabEncrypt = true
unset LD_LIBRARY_PATH
ZooKeeper提供管理服务AdminServer,允许通过URL进行ZooKeeper管理,容易受到攻击。建议关闭ZooKeeper服务端的AdminServer功能。
开源的ZooKeeper允许通过JMX(java management extensions)监测ZooKeeper的节点信息、连接信息等运行情况。由于JMX的访问不需要认证和鉴权,如果内存中存在用户口令明文等敏感信息,则存在敏感信息泄露的风险,因此建议关闭ZooKeeper服务端的JMX功能。
屏蔽JMX端口
开源的ZooKeeper允许通过JMX(java management extensions)监测ZooKeeper的节点信息、连接信息等运行情况。由于JMX的访问不需要认证和鉴权,如果内存中存在用户口令明文等敏感信息,则存在敏感信息泄露的风险,因此应关闭ZooKeeper服务端的JMX功能。
使用方法:设置“JMXDISABLE”为“true”。
屏蔽AdminServer
ZooKeeper提供管理服务AdminServer,允许通过URL进行ZooKeeper管理,容易受到攻击。应关闭ZooKeeper服务端的AdminServer功能。
使用方法:设置“-DZooKeeper.admin.enableServer”为“false”。
参考开启ZooKeeper安全特性步骤开启安全特性。