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 {
...
};
SectionName
:指定了用户名标识,内部封装了一个 Kerberos 用户信息。对于 Pulsar 如何使用 Kerberos 认证,从配置上而言,就是告知进程该以哪个 section 的身份来启动程序。以 broker 为例:
broker.conf
中指定服务使用的 section 。pulsar_env.sh
中通过指定 jaas.conf
文件来加载获得的。结论:例如 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 会被看成是两个不同的服务: