概念

Pulsar 使用 Java 的 JAAS 机制来支持通过 Kerberos 做身份认证。JAAS 中一个用户信息对应一个 section 。对于 Kerberos 认证而言,一个用户信息最重要的是 principle 和 keytab,现在可以方便的封装成一个 section 里。最后将这些用户信息拼装到 jaas.conf 文件中。

jaas.conf 样例:

SectionName {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   storeKey=true
   useTicketCache=false
   keyTab="/etc/security/keytabs/pulsarbroker.keytab"
   principal="broker/localhost@EXAMPLE.COM";
};
 AnotherSectionName {
  ...
};

对于 Pulsar 如何使用 Kerberos 认证,从配置上而言,就是告知进程该以哪个 section 的身份来启动程序。以 broker 为例:

  1. 在 broker.conf 中指定服务使用的 section 。
  2. 而 section 信息是在 pulsar_env.sh 中通过指定 jaas.conf 文件来加载获得的。

注意事项

Notice 1:broker service principal 的 {hostname} 和advertisedAddress 保持一致

结论:例如 broker service 使用的 Principal 是 "broker/172.17.0.7@SNIO",则 advertisedAddress 也必须配置为相同的 IP: 172.17.0.7.

原因:客户端从 TGT Server 获取到的 broker 服务端 Principal 里面的 hostname 部分是advertisedAddress定义的 IP。

可从 kdc 日志(/var/log/krb5kdc.log)查看到问题。broker 服务会涉及两个 Principal,一个是 broker 服务注册的 Principal,另一个是 TGT Server 返回的 Principal。这会导致如果两个 Principal 内部的 IP 不一致,用户会永远无法访问到服务。毕竟用户一次只能携带一个服务端Principal 信息。

# ① broker 服务以 broker/172.17.0.7@SNIO 的 Principal 向 KDC 数据库注册自己是认证服务的身份
Jun 16 14:29:19 mysql-server-for-ranger krb5kdc[2003](info): AS_REQ (3 etypes {3 1 16}) 172.17.0.7: ISSUE: authtime 1655389759, etypes {rep=3 tkt=16 ses=1}, broker/172.17.0.7@SNIO for krbtgt/SNIO@SNIO
# ② 稍后有客户端 client@SNIO 申请获取 broker/172.17.0.7@SNIO TGT 票据
Jun 16 14:29:38 mysql-server-for-ranger krb5kdc[2003](info): AS_REQ (3 etypes {3 1 16}) 172.17.0.7: ISSUE: authtime 1655389778, etypes {rep=3 tkt=16 ses=1}, client@SNIO for krbtgt/SNIO@SNIO
# ③ TGT 返回的 Principal 是 broker/172.17.0.7@SNIO,其中IP 地址部分是由 advertisedAddress 确定的
Jun 16 14:29:38 mysql-server-for-ranger krb5kdc[2003](info): TGS_REQ (3 etypes {3 1 16}) 172.17.0.7: ISSUE: authtime 1655389778, etypes {rep=1 tkt=16 ses=1}, client@SNIO for broker/172.17.0.7@SNIO

一个错误访问的日志:

# ① broker 服务以 broker/172.17.0.7@SNIO 的 Principal 向 KDC 数据库注册自己是认证服务的身份
Jun 16 14:29:19 mysql-server-for-ranger krb5kdc[2003](info): AS_REQ (3 etypes {3 1 16}) 172.17.0.7: ISSUE: authtime 1655389759, etypes {rep=3 tkt=16 ses=1}, broker/172.17.0.7@SNIO for krbtgt/SNIO@SNIO
# ② 客户端 client@SNIO 申请获取 broker/20.232.197.169@SNIO TGT 票据
Jun 16 14:29:59 mysql-server-for-ranger krb5kdc[2003](info): AS_REQ (3 etypes {3 1 16}) 172.17.0.7: ISSUE: authtime 1655389799, etypes {rep=3 tkt=16 ses=1}, client@SNIO for krbtgt/SNIO@SNIO
# ③ 并未找到 broker/20.232.197.169@SNIO 服务(broker 报错: Failed to evaluate client token:,客户端报错:Unable to authenticate)
Jun 16 14:30:00 mysql-server-for-ranger krb5kdc[2003](info): TGS_REQ (3 etypes {3 1 16}) 172.17.0.7: ISSUE: authtime 1655389799, etypes {rep=1 tkt=16 ses=1}, client@SNIO for broker/20.232.197.169@SNIO

测试环境有特殊性,使用的是 Azure 公有云虚拟机,由 public IP 和 private IP 构成的 Principal 会被看成是两个不同的服务: