安全場景下的大數(shù)據(jù)集群的使用相比非安全的集群具有更高的復(fù)雜度渔欢。關(guān)于kerberos認(rèn)證的講解資料較多扼倘,本文不在贅述。僅針對(duì)HADOOP和ZOOKEEPER的的認(rèn)證進(jìn)行簡單分析和對(duì)比并給出一些kerberos訪問的一下Tip。
安全HADOOP的使用:
使用過安全hadoop的小伙伴都知道在安全集群中掉蔬,如果需要對(duì)集群(hdfs,yarn,hive,hbase,spark thriftserver)的訪問矾瘾,都需要先進(jìn)行認(rèn)證:
1. 在命令行/測試場景下一般使用kinit命令完成用戶的認(rèn)證女轿,然后“任意”訪問集群中的組件
2. 在線上應(yīng)用中一般使用UserGroupInformation.loginUserFromKeytab(principalName, keytabFilename)來完成kerberos認(rèn)證
安全HADOOP的訪問的實(shí)現(xiàn):
HADOOP的安全認(rèn)證與狹義的hdfs,yarn實(shí)現(xiàn)了分離壕翩,獨(dú)立封裝出hadoop-common*.jar給上層各組件使用蛉迹,應(yīng)用層調(diào)用UserGroupInformation類完成認(rèn)證
/*直接成longinContext*/
login = newLoginContext(HadoopConfiguration.KEYTAB_KERBEROS_CONFIG_NAME,subject, new HadoopConfiguration());
login.login();
/*在loginContext的init方法中獲取登錄信息,此時(shí)的config為hadoop實(shí)現(xiàn)的Config*/
AppConfigurationEntry[] entries = config.getAppConfigurationEntry(name);
/*此類中定義了keytab放妈,principal北救,loginModule等信息,此處使用的longinModule為Krb5LoginModule*/
private static final AppConfigurationEntry KEYTAB_KERBEROS_LOGIN =
new AppConfigurationEntry(KerberosUtil.getKrb5LoginModuleName(),
LoginModuleControlFlag.REQUIRED,
KEYTAB_KERBEROS_OPTIONS);
安全Zookeeper的使用
我們知道在進(jìn)行安全Zookeeper訪問時(shí)芜抒,需要進(jìn)行kerberos認(rèn)證珍策,而Zookeeper認(rèn)證時(shí)需要傳入對(duì)應(yīng)的jaas.conf配置文件。通常該文件的配置如下:
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/etc/zookeeper/conf/zkcli.keytab"
storeKey=true
useTicketCache=false
principal="zkcli@HADOOP.COM";
};
該配置的含義是在進(jìn)行zookeeper認(rèn)證時(shí)宅倒,使用的認(rèn)證類時(shí)Krb5longinModule類攘宙,使用keytab文件認(rèn)證,認(rèn)證時(shí)不使用OS緩存的tgt拐迁,而是使用配置的keyTab和principal蹭劈。 配置文件中的Client表示認(rèn)證的上下文的段(Login Context section),應(yīng)用層如果需要再不同的服務(wù)訪問時(shí)唠亚,使用不同的用戶链方,則可以配置多個(gè)不同的Login Context section。 只要實(shí)現(xiàn)對(duì)該文件的解析邏輯即可灶搜。
安全zookeper場景下的認(rèn)證實(shí)現(xiàn):
/*此時(shí)的Configuration.getConfiguration返回的是sun.security.provider.ConfigFile祟蚀,通過該類和jaas.conf配置文件獲取認(rèn)證信息*/
Configuration.getConfiguration().getAppConfigurationEntry(clientSection)
/*在初始化zookeeper的封裝login類初始化時(shí),調(diào)用login方法割卖,使用loginContext類完成用戶的kerberos的認(rèn)證*/
LoginContext loginContext = new LoginContext(loginContextName,callbackHandler);
loginContext.login();
LOG.info("successfully logged in.");
總結(jié):
HADOOP和zookeeper的的認(rèn)證本質(zhì)是一致的
在安全認(rèn)證時(shí)前酿,均使用的是kerberos的認(rèn)證機(jī)制,客戶端的認(rèn)證實(shí)現(xiàn)都是通過底層jdk的代碼LonginContext鹏溯,Krb5longinModule等模塊實(shí)現(xiàn)罢维,本質(zhì)上來講,HADOOP和zookeeper的認(rèn)證是一回事丙挽。
認(rèn)證信息的解析方式不同
zookeeper的認(rèn)證通過解析應(yīng)用配置的jaas.conf配置文件得到相關(guān)的信息完成
而HADOOP的認(rèn)證模塊則是內(nèi)部定義了部分配置肺孵,只需要用戶傳入principal和keytab即可匀借。
HADOOP和zookeeper為何沒有使用同一的接口實(shí)現(xiàn)
zookeeper為何不使用HADOOP的認(rèn)證方式的可能原因 :HADOOP最初的實(shí)現(xiàn)沒有引入相關(guān)的安全機(jī)制; Zookeeper作為底層的分布式協(xié)調(diào)器平窘,不應(yīng)當(dāng)對(duì)上層的組件有依賴吓肋;作者不想用。
HADOOP為何不使用zookeeper的認(rèn)證方式的可能原因:jaas.conf的配置相對(duì)復(fù)雜瑰艘,作者用起來不爽
各個(gè)組件使用的認(rèn)證方式
組件如Hive,HBase是鬼,Spark等組件使用的認(rèn)證都是hadoop-common的實(shí)現(xiàn)
Kafka和zookeeper使用的均為配置jaas.conf的方式進(jìn)行kerberos認(rèn)證。大概是kafka本身對(duì)hadoop沒有依賴關(guān)系紫新,僅僅對(duì)zk有相關(guān)的依賴均蜜,為了保持統(tǒng)一風(fēng)格,因此選擇了Zookeeper的認(rèn)證
關(guān)于kerberos的一些Tips
KRB5CCNAME環(huán)境變量:
在客戶端與kdc進(jìn)行認(rèn)真時(shí)會(huì)生成tgt文件芒率,默認(rèn)會(huì)緩存在/tmp/krb5cc_${uid}的文件中囤耳,如果使用不同的終端同樣的用戶登錄機(jī)器分別使用kinit命令,則會(huì)造成用戶沖突敲董,可能引發(fā)各種異常紫皇。因此可通過設(shè)置KRB5CCNAME環(huán)境變量的方式進(jìn)行認(rèn)證時(shí)用戶隔離
KRB5_CONFIG環(huán)境變量:
* 在客戶端與kdc交互時(shí),使用使用到krb5.conf的配置文件腋寨,該配置文件默認(rèn)存儲(chǔ)在/etc目錄下聪铺。 如果執(zhí)行kinit等命令時(shí)需要使用特定的krb5.conf配置文件,可通過設(shè)置KRB5_CONFIG實(shí)現(xiàn)
* 同樣如果是在java進(jìn)程中需要使用特定的krb5.conf配置文件萄窜,則可通過設(shè)置-Djava.security.krb5.conf來完成
操作 | 功能 | 備注 |
---|---|---|
export KRB5CCNAME=/path/${tgtcacheFileName} | 指定私有的tgt緩存文件铃剔,與其他tgt文件隔離,當(dāng)前session有效查刻,不影響其他用戶使用 | |
export KRB5_CONFIG=/path/krb5.conf | 執(zhí)行kinit,klist命令行時(shí)键兜,指定特定的krb5.conf配置文件 | |
-Djava.security.krb5.conf=/path/krb5.conf | java命令行中指定特定的krb5.conf配置文件 | |
-Djava.security.auth.login.config=/path/jaas.conf | 指定特定的jaas.conf配置文件 |