1. 生成zookeeper的keytab文件
#添加zookeeper的principal
kadmin.local -q "addprinc -randkey zookeeper/$hostname@REALM.COM"
#生成zookeeper的keytab
kadmin.local -q "xst -kt /tmp/keytabs/zookeeper.keytab zookeeper/$hostname@REALM.COM"
生成的zookeeper.keytab就在/tmp/keytabs路径下,我们需要在集群每个节点提前创建一个存放keytab证书的目录。注意,集群中安装zookeeper的每个节点都需要创建对应的principal,即将$hostname替换为对应节点的hostname即可。生成keytab时,可以将所有节点的principal的密钥生成到一个keytab中,也可以每个节点单独生产一个keytab。然后将生成的keytab证书发送到对应节点的 /tmp/keytabs 目录下。注意,其他用户如果对该文件有读权限,就可以冒充 keytab 中指定的用户身份访问集群中的服务,所以 keytab 文件需要确保只对 owner(我这里的owner是hadoop用户) 有读权限。
#修改keytab存放目录的用户和用户组
chown -R hadoop:hadoop /tmp/keytabs/zookeeper.keytab
#修改zookeeper.keytab证书的权限为500
chmod 500 /tmp/keytabs/zookeeper.keytab
2. zookeeper配置kerberos认证
在$ZOOKEEPER_HOME/conf/zoo.cfg里面添加以下内容:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
kerberos.removeHostFromPrincipal=true
kerberos.removeRealmFromPrincipal=true
在$ZOOKEEPER_HOME/conf下创建zookeeper_jaas.conf,并在里面添加以下内容:
Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
useTicketCache=false
keyTab="/etc/security/keytabs/zookeeper.keytab" #keytab证书的位置
principal="zookeeper/$hostname@REALM.COM";
};
在$ZOOKEEPER_HOME/conf下创建zookeeper_client_jaas.conf,并在里面添加以下内容:
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=false
useTicketCache=true;
};
在$ZOOKEEPER_HOME/conf/java.env里面添加以下内容:
export SERVER_JVMFLAGS="$SERVER_JVMFLAGS -Djava.security.auth.login.config=$ZOOKEEPER_HOME/conf/zookeeper_jaas.conf"
export CLIENT_JVMFLAGS="$CLIENT_JVMFLAGS -Djava.security.auth.login.config=$ZOOKEEPER_HOME/conf/zookeeper_client_jaas.conf"
重启每个节点的zookeeper:
$ZOOKEEPER_HOME/bin/zkServer.sh start
查看zookeeper状态:
$ZOOKEEPER_HOME/bin/zkServer.sh status
连接zookeeper的Client:
$ZOOKEEPER_HOME/bin/zkCli.sh -server $hostname:2181