ZooKeeper SASL与SSL安全配置
认证和加密是安全加固核心。
SASL认证配置
认证方式对比:
| 方式 | 说明 | 适用场景 |
|---|---|---|
| Kerberos | 强认证,单点登录 | 企业级生产 |
| DIGEST-MD5 | 用户密码认证 | 中等安全要求 |
Kerberos配置:
JAAS配置文件:
properties
// zk_server_jaas.conf
Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/path/to/zookeeper.keytab"
storeKey=true
useTicketCache=false
principal="zookeeper/_HOST@REALM";
};
zoo.cfg配置:
Bash
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
kerberos.removeHostFromPrincipal=true
kerberos.removeRealmFromPrincipal=true
启动参数:
properties
export KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/zk_server_jaas.conf"
zkServer.sh start
DIGEST-MD5配置:
Java
# zoo.cfg
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
JAAS配置:
Bash
// zk_server_jaas.conf
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_admin="admin_password"
user_app="app_password";
};
客户端认证:
properties
// Kerberos客户端
System.setProperty("java.security.auth.login.config", "/path/to/zk_client_jaas.conf");
// DIGEST客户端
System.setProperty("java.security.auth.login.config", "/path/to/zk_client_jaas.conf");
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("host:2181")
.authorization("digest", "user:password".getBytes())
.build();
注意:Kerberos需提前配置KDC服务和keytab文件。
SSL/TLS加密
证书生成:
Java
# 生成服务端证书
keytool -genkeypair -alias zookeeper -keyalg RSA -keysize 2048
-dname "CN=zookeeper" -validity 365
-keystore zookeeper.keystore -storepass password
# 导出证书
keytool -exportcert -alias zookeeper -keystore zookeeper.keystore
-file zookeeper.cer -storepass password
# 客户端导入信任证书
keytool -importcert -alias zookeeper -file zookeeper.cer
-keystore client.truststore -storepass password
服务端配置:
properties
# zoo.cfg
ssl.clientAuth=need
ssl.keyStore.location=/path/to/zookeeper.keystore
ssl.keyStore.password=password
ssl.trustStore.location=/path/to/zookeeper.truststore
ssl.trustStore.password=password
# 端口配置
clientPort=2181 # 普通端口(建议禁用)
secureClientPort=2281 # SSL端口
客户端配置:
Bash
System.setProperty("zookeeper.clientCnxnSocket", "org.apache.zookeeper.ClientCnxnSocketNetty");
System.setProperty("zookeeper.ssl.keyStore.location", "/path/to/client.keystore");
System.setProperty("zookeeper.ssl.keyStore.password", "password");
System.setProperty("zookeeper.ssl.trustStore.location", "/path/to/client.truststore");
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("host:2281")
.build();
双向认证配置:
text
ssl.clientAuth=need # 需要客户端证书
# 服务端验证客户端证书
SSL端口使用:
text
# 使用SSL端口连接
zkCli.sh -server host:2281
# 客户端必须配置证书才能连接
安全端口建议:
| 建议 | 说明 |
|---|---|
| 禁用普通端口 | 只开放SSL端口 |
| 双向认证 | 验证客户端身份 |
| 定期更新证书 | 设置合理有效期 |
提示:生产环境建议禁用普通端口,只开放SSL端口。
要点总结
- Kerberos适合企业级安全场景
- DIGEST-MD5适合中等安全要求
- JAAS文件配置认证方式和用户
- keytool生成SSL证书
- secureClientPort配置SSL端口
- ssl.clientAuth=need启用双向认证
- 生产环境禁用普通端口,只用SSL
📝 发现内容有误?点击此处直接编辑