摘要:這中場(chǎng)景下情況會(huì)變得非常復(fù)雜,這時(shí)如果把認(rèn)證的過程移到程序中就會(huì)簡(jiǎn)單很多,每個(gè)程序中獲取各自的憑證,及時(shí)多個(gè)進(jìn)程同時(shí)運(yùn)行也不會(huì)產(chǎn)生相互影響。
本文由作者周梁偉授權(quán)網(wǎng)易云社區(qū)發(fā)布。
一般我們?cè)谑褂胟bs登陸hadoop服務(wù)時(shí)都直接在shell中調(diào)用kinit命令來獲取憑證,這種方式簡(jiǎn)單直接,只要獲取一次憑證之后都可以在該會(huì)話過程中重復(fù)訪問。但是這種方式一個(gè)明顯的問題就是如果在本次shell中會(huì)間隔調(diào)用不同的java程序,而這些程序需要訪問不同權(quán)限的問題,需要在訪問前調(diào)用各自的ktab文件獲得授權(quán)。這中場(chǎng)景下情況會(huì)變得非常復(fù)雜,這時(shí)如果把kbs認(rèn)證的過程移到j(luò)ava程序中就會(huì)簡(jiǎn)單很多,每個(gè)java程序中獲取各自的憑證,及時(shí)多個(gè)進(jìn)程同時(shí)運(yùn)行也不會(huì)產(chǎn)生相互影響。我這里介紹兩種java中獲取kbs憑證的方法,分別使用 org.apache.hadoop.security.SecurityUtil 和 org.apache.hadoop.security.UserGroupInformation 兩個(gè)類實(shí)現(xiàn)。
一、 使用ktab文件簡(jiǎn)單登錄方式
登錄操作函數(shù)
/**
* 嘗試使用kerberos認(rèn)證登錄hfs *@params * conf: 配置,其中帶有keytab相關(guān)配置屬性 * keytab_KEY: 表示conf中代表keytab文件屬性的鍵值 * principal_KEY: 表示conf中代表principal屬性的鍵值 * @throws IOException */ static void tryKerberosLogin(Configuration conf, String keytab_KEY, String principal_KEY) throws IOException { boolean useSec = true; LOG.info("Hadoop Security enabled: " + useSec); if (!useSec) { return; } try { @SuppressWarnings("rawtypes") Class c = Class.forName("org.apache.hadoop.security.SecurityUtil"); // get method login(Configuration, String, String); @SuppressWarnings("unchecked") Method m = c.getMethod("login", Configuration.class, String.class, String.class); m.invoke(null, conf, keytab_KEY, principal_KEY); LOG.info("successfully authenticated with keytab"); } catch (Exception e) { LOG.error( "Flume failed when attempting to authenticate with keytab " + SimpleConfiguration.get().getKerberosKeytab() + " and principal "" + SimpleConfiguration.get().getKerberosPrincipal() + """, e); return; } }
配置
...
flume.security.kerberos.principal
flume.security.kerberos.keytab resources/flume.keytab
…
Sample
//調(diào)用例子
public FileSystem getFileSystem(Configuration conf) {
String KEYFILE_key = "flume.security.kerberos.keytab"; String PRINCIPAL_key = "flume.security.kerberos.principal"; try { // 嘗試用kerberos登錄 tryKerberosLogin(conf, KEYFILE_key, PRINCIPAL_key); // 獲取一個(gè)hdfs實(shí)例 instance = FileSystem.get( conf); } catch (IOException e) { LOG.error("try getFileSystem fail()", e); } catch (URISyntaxException e) { LOG.error("try getFileSystem fail()", e); } } return instance; }
二、 通過UserGroupInformation獲取代理用戶方式
package com.netease.backend.bigdata.wa.jobs;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.log4j.Logger;
import org.hsqldb.lib.StringUtil;
import com.netease.backend.bigdata.wa.core.ConfKeys;
/**
代理用戶信息認(rèn)證工具
*
@author zhouliangwei
*
*/
public class ProxyUGI {
private static Logger LOG = Logger.getLogger(ProxyUGI.class); private static UserGroupInformation instance = null; /** * 從Configuration中獲取代理用戶的相關(guān)配置,并獲取UserGroupInformation * @return * @throws IOException */ public synchronized static UserGroupInformation getProxyUGI(Configuration conf) { if (instance != null) return instance; try { String username = conf.get(ConfKeys.MR_USER_NAME, ""); String proxyPrincipal = conf.get(ConfKeys.WDA_PROXY_PRINCIPAL, ""); String proxyKtab = conf.get(ConfKeys.WDA_PROXY_KEYTAB, ""); if (StringUtil.isEmpty(username) || StringUtil.isEmpty(proxyPrincipal) || StringUtil.isEmpty(proxyKtab)) { LOG.warn("config properties: [" + ConfKeys.MR_USER_NAME + ", " + ConfKeys.WDA_PROXY_PRINCIPAL + ", " + ConfKeys.WDA_PROXY_KEYTAB + "] in config file "./conf/wda-core.xml" must be set!, quite use proxy mechanism"); return null; } instance = UserGroupInformation.createProxyUser(username, UserGroupInformation.loginUserFromKeytabAndReturnUGI( proxyPrincipal, proxyKtab)); } catch (IOException ex) { //just ignore; } return instance; }
}
調(diào)用方式
...
public static void main(final String[] args) throws Exception {
UserGroupInformation ugi = ProxyUGI.getProxyUGI(); if (ugi != null) { ugi.doAs(new PrivilegedExceptionAction() { public EventJobClient run() throws Exception { EventJobClient mr = new EventJobClient(); int code = ToolRunner.run(mr, args); System.exit(code); return mr; } }); System.exit(1); } else { int exitCode = ToolRunner.run(new EventJobClient(), args); System.exit(exitCode); } }
….
文章來源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25351.html
大數(shù)據(jù)開發(fā)系列五:kafka& zookeeper 配置kerberos認(rèn)證 img{ display:block; margin:0 auto !important; width:100%; } body{ ...
摘要:對(duì)不同驅(qū)動(dòng)分別說明之。,認(rèn)證與連接池集成方案對(duì)情況,比較簡(jiǎn)單,滿足兩個(gè)代碼塊執(zhí)行的時(shí)序性即可。即確保在連接池實(shí)例化前,執(zhí)行認(rèn)證的代碼塊。,認(rèn)證與連接池集成方案考慮到創(chuàng)建是連接池類內(nèi)部的函數(shù)。而認(rèn)證代碼塊是對(duì)創(chuàng)建這一過程本身進(jìn)行包裹。 1 兩種jbdc驅(qū)動(dòng),kerberos認(rèn)證的區(qū)別描述 1-1 hive-jdbc驅(qū)動(dòng)與kerberos認(rèn)證 對(duì)于hive-jdbc驅(qū)動(dòng),kerbe...
閱讀 766·2023-04-25 17:33
閱讀 3626·2021-07-29 14:49
閱讀 2480·2019-08-30 15:53
閱讀 3435·2019-08-29 16:27
閱讀 2000·2019-08-29 16:11
閱讀 1030·2019-08-29 14:17
閱讀 2432·2019-08-29 13:47
閱讀 2016·2019-08-29 13:28