一、自身的认证配置
1.Flink自身自动刷新kerberos认证的配置:
flink run-application \
-t yarn-application \
-Dsecurity.kerberos.login.keytab=/path/to/local/user.keytab \
-Dsecurity.kerberos.login.principal=user@HADOOP.COM
./examples/streaming/TopSpeedWindowing.jar
Flink实现了给connector自动添加kerberos票据的机制,所以同一个集群内,只需要以上参数,就可以,connector不再需要单独的keytab去刷新认证。
2.Spark自身自动刷新kerberos认证的配置:
spark-submit \
--principal user@HADOOP.COM \
--keytab /path/to/local/user.keytab \
...
spark这个keytab只能给自身和hive、hbase提供认证。如果需要给其他组件比如Kafka认证,就需要自己实现org.apache.spark.security.HadoopDelegationTokenProvider,将实现类名字写入META-INF/services文件里,如果不自己实现参考下一案例,来实现kafka的kerberos认证
二、自有kafka集群的kerberos认证
1.Flink读写kafka认证
由于Flink实现自动添加kerberos认证,所以只需要指定:
-Dsecurity.kerberos.login.contexts=KafkaClient
就可以实现Kafka的jaas认证,如果zookeeper也开启了认证,就指定:
-Dsecurity.kerberos.login.contexts=Client,KafkaClient
这个参数可以直接配置到flink.yaml或者最新版的config.yaml里,就不用再在程序里指定了。
其他认证参数就参考connector里的配置参数就行了。
比如:
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka
2.Spark读写kafka认证
Spark由于没有默认的实现,可以通过指定keytab的方式来实现kerberos认证
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \
useKeyTab=true \
storeKey=true \
keyTab="user_kafka.keytab" \
principal="user@HADOOP.COM";
这里需要注意的是,由于kafka认证需要的keytab是在executor端,所以需要通过–files参数来提交keytab文件,自动分发到所有executor的工作目录里,所以sasl.jaas.config里只需要指定文件名称就可以,不需要把所有nodemanager节点都手动放一份keytab文件,有些同学不懂–files原理,经常干这事。
提交参数样例如下:
spark-submit \
--principal user@HADOOP.COM \
--keytab /path/to/local/user.keytab \
--files /path/to/local/user_kafka.keytab \
...
注意虽然user.keytab和user_kafka.keytab名字不同,实际是同一个文件,因为–files会和–keytab参数冲突,所以要复制一份不同名字的keytab给kafka实用。
三、跨集群读写两个不同kerberos认证的kafka
1.Flink的kafka认证
这种场景下,由于需要用到不同的keytab来进行kafka认证,所以,理论上需要禁用flink自身对kafka生成的认证,转而使用跟spark类似的方式,将两个keytab文件分发到所有taskmanager节点进行认证,这个时候就需要使用flink里跟spark的–files类似的参数,也就是-Dyarn.ship-files=/path/to/local/user1.keytab,/path/to/local/user2.keytab
然后,在consumer和producer的配置参数中使用sasl.jaas.config配置keytab认证。此处不再举例,可以参看以上Spark的配置。
2.Spark的kafka认证
spark的认证就没有特殊的地方了,参考以上Spark读写单集群的kafka的配置,将两个keytab文件都在–files里指定,然后分别配置sasl.jaas.config就可以。