Step by Step 實(shí)現(xiàn)基于 Cloudera 5.8.2 的企業(yè)級(jí)安全大數(shù)據(jù)平臺(tái) -?如何使用Java Client訪問(wèn)Kerberos + TLS Enabled Impala服務(wù)

該向?qū)п槍?duì) Windows 7 和 CentOS 7.2 兩種環(huán)境進(jìn)行編寫,不適用于其他情況崩掘。

Cloudera Manager 集群支持安全模式訪問(wèn)琴儿,集成了基于Kerberos 5的身份認(rèn)證和TLS(傳輸層加密)。Kerberos認(rèn)證需要向服務(wù)端提交有效的認(rèn)證信息纺酸,Windows用戶以密鑰文件+客戶端的形式進(jìn)行認(rèn)證提交嘲碱,CentOS用戶以客戶端的形式進(jìn)行認(rèn)證提交金砍。傳輸層加密,需要客戶端生成公鑰私鑰對(duì)進(jìn)行加解密麦锯,公鑰需要封裝成x509 v3自簽名證書捞魁。

環(huán)境說(shuō)明

  • 軟件版本:
    • Java SDK 1.8.0+;
    • MIT Kerberos 5离咐;
    • Eclipse;
  • 核心訪問(wèn)方式:Cloudera Impala JDBC;
  • Jar包依賴:
Jar包名稱 版本
commons-codec 1.3
commons-collections 3.2.2
commons-configuration 1.6
commons-logging 1.1.1
guava 11.0.2
hadoop-auth 2.6.0-cdh5.8.2
hadoop-common 2.6.0-cdh5.8.2
hive-metastore 1.1.0-cdh5.8.2
hive-service 1.1.0-cdh5.8.2
hive-common 1.1.0-cdh5.8.2
hive-exec 1.1.0-cdh5.8.2
httpclient 4.2.5
httpcore 4.2.5
ImpalaJDBC41 2.5.35
libfb303 0.9.0
libthrift 0.9.0
log4j 1.2.17
ql N/A
sl4j-api 1.7.5
sl4j-log4j12 1.7.5
TCLIServiceClient N/A
zookeeper 3.4.6

Windows 7 用戶訪問(wèn)

必須理解的術(shù)語(yǔ):

  • Impala服務(wù)端:提供Impala查詢轉(zhuǎn)發(fā)的網(wǎng)關(guān)服務(wù)器宵蛀;
  • 客戶端:業(yè)務(wù)代碼所運(yùn)行的服務(wù)器昆著,即Windos 7這臺(tái)機(jī)器;

以下信息是你訪問(wèn)集群需要的:

  • Impala服務(wù)端IP地址192.168.1.1和內(nèi)網(wǎng)全域名v001001.dc1.domain.com术陶;
  • 客戶端Kerberos配置文件krb5.ini凑懂,內(nèi)容和我們之前配置的 krb5.conf 完全一致;
  • 客戶端Kerberos principal${USERNAME}/impala_user@DOMAIN.COM和密碼梧宫,其中${USERNAME}為Kerberos管理員分配的用戶名接谨;
  • Impala服務(wù)端連接字符串jdbc:impala://v001001.dc1.domain.com:21050/${DB_NAME},其中${DB_NAME}是需要訪問(wèn)的數(shù)據(jù)庫(kù)名稱塘匣,示例代碼連接的是default數(shù)據(jù)庫(kù)脓豪;
  • 環(huán)境說(shuō)明中依賴基礎(chǔ)jar包;

Step1. 使用Hosts進(jìn)行域名解析

用管理員方式打開并編輯C:\Windows\System32\drivers\etc\hosts忌卤,在最后一行添加指定的Impala服務(wù)器域名解析:

192.168.1.1 v001001.dc1.domain.com

點(diǎn)擊保存扫夜,在CMD中進(jìn)行測(cè)試以驗(yàn)證解析是否成功:

ping v001001.dc1.domain.com

如果失敗,請(qǐng)關(guān)閉DNS Client驰徊,并設(shè)置手動(dòng)啟動(dòng):

  1. 開始-> 搜索程序和文件中搜索管理工具笤闯,并打開;
  2. 雙擊服務(wù)并打開棍厂;
  3. 在列表中選擇DNS Client右鍵點(diǎn)擊屬性颗味;
  4. 啟動(dòng)類型選擇手動(dòng),服務(wù)狀態(tài)點(diǎn)擊停止牺弹,并點(diǎn)擊確定保存浦马;

再在CMD中進(jìn)行ping測(cè)試,驗(yàn)證是否成功:

ping v001001.dc1.domain.com

Step2. 安裝 MIT Kerberos 客戶端

Kerberos客戶端是用于獲取ticket的例驹,只有具有有效的ticket捐韩,用戶才能通過(guò)認(rèn)證進(jìn)行數(shù)據(jù)訪問(wèn)。

  1. 在線環(huán)境鹃锈,請(qǐng)選擇合適的版本進(jìn)行下載安裝:

    64位版本的msi包涵蓋了32位和64位的庫(kù)屎债,但是32位版本的msi包只有32位的庫(kù)仅政。

    離線環(huán)境,對(duì)應(yīng)的msi文件存放在用戶手冊(cè)的msis文件夾中盆驹。

  2. 雙擊msi包進(jìn)行安裝圆丹;

  3. 按照Instructions完成安裝;

  4. 安裝完成后點(diǎn)擊Finished躯喇;

  5. 在CMD中直接運(yùn)行kinit命令辫封,確認(rèn)安裝是否成功 :

kinit

Step3. 新建用于訪問(wèn)服務(wù)的 Kerberos Principal

cdh-master/admin 是我們?cè)谥?Step by Step 實(shí)現(xiàn)基于 Cloudera 5.8.2 的企業(yè)級(jí)安全大數(shù)據(jù)平臺(tái) - Kerberos的整合 中定義的 Kerberos 超級(jí)管理員:

ssh 192.168.1.1
kinit cdh-master/admin
kadmin
kadmin > addprinc test/impala_user

Step4. 生成驗(yàn)證用的 Ticket

  1. 把Kerberos配置文件krb5.ini硝枉,保存至C:\Windows\krb5.ini,注意保存格式必須為ANSI倦微,如何保證格式妻味?請(qǐng)使用記事本軟件進(jìn)行另存,編碼選擇ANSI欣福;
  2. 修改Windows環(huán)境變量:開始- 計(jì)算機(jī)- 右鍵選擇屬性- 點(diǎn)擊高級(jí)系統(tǒng)設(shè)置- 選擇高級(jí)選項(xiàng)卡 - 點(diǎn)擊環(huán)境變量- 在系統(tǒng)變量中新建KRB5CCNAME责球,賦值為:C:\Users\${WINDOWS_USER}\krbcc5_${WINDOWS_USER},這里的${WINDOWS_USER}為當(dāng)前登錄Windows的用戶名拓劝;
  3. 通過(guò)MIT Kerberos生成ticket:
    • 程序里打開MIT Kerberos Ticket Manager雏逾;
    • 點(diǎn)擊Get Ticket
    • Principal填寫test/impala_user@DOMAIN.COM郑临,Password填寫對(duì)應(yīng)的密碼栖博;
  4. 認(rèn)證是有有效周期的,周期為21小時(shí)牧抵,如果重啟應(yīng)用笛匙,請(qǐng)記得Renew Ticket

Step5. 生成帶客戶端證書的keystore

在Windows客戶端的CMD中執(zhí)行如下命令犀变,生成帶有客戶端JKS證書的keystore文件:

${JAVA_HOME}\bin\keytool -genkeypair -keystore ${JAVA_HOME}\jre\lib\security\impala_jdbc.jks -keyalg RSA -alias impala_jdbc -dname "CN=${IMPALA_CLIENT_FQDN},OU=Bigdata,O=Domain,L=Hangzhou,ST=Zhejiang,C=CN" -storepass ${KEYSTORE_PASS} -keypass ${KEYSTORE_PASS}
JAVA_HOME # Java根目錄
IMPALA_CLIENT_FQDN # Windows客戶端全域名妹孙;
KEYSTORE_PASS # Keystore文件的存儲(chǔ)密碼,牢記获枝;

Step6. 使用Java SDK進(jìn)行數(shù)據(jù)訪問(wèn)(以Eclipse為例)

創(chuàng)建工程蠢正,并引入上文環(huán)境說(shuō)明中提到的jar包,jar包存放在用戶手冊(cè)的jars文件夾下省店;

示例代碼如下嚣崭,訪問(wèn) default 數(shù)據(jù)庫(kù)的hosts表,查詢前10行數(shù)據(jù)懦傍,這里的${KEYSTORE_PASS}是生成keystore時(shí)指定的密碼雹舀,表 hosts 請(qǐng)讀者自己進(jìn)行創(chuàng)建和創(chuàng)建測(cè)試數(shù)據(jù):

package com.domain.bigdata.demo.impala.jdbc;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import com.cloudera.impala.jdbc41.*;
 
public class impalaConnector {
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        ResultSet rs = null;
        Statement stmt = null;
         
        try {
            Class.forName("com.cloudera.impala.jdbc41.Driver");
            conn = DriverManager       .getConnection("jdbc:impala://v001001.dc1.domain.com:21050/default;"
                    + "AuthMech=1;"
                    + "SSL=1;"
                    + "AllowSelfSignedCert=1;"
                    + "CAIssueCertNameMismatch=1;"
                    + "KrbHostFQDN=v001001.dc1.domain.com;"
                    + "KrbRealm=DOMAIN.COM;"
                    + "KrbServiceName=impala;"
                    + "SSLKeyStore=${JAVA_HOME}\jre\lib\security\impala_jdbc.jks;"
                    + "SSLKeyStorePwd=${KEYSTORE_PASS};"
                    + "LogLevel=5;LogPath=C:\temp\impala_jdbc_demo.log");
            String sql = "SELECT * FROM hosts LIMIT 10";
            System.out.println(conn.getAutoCommit());
            stmt = conn.createStatement();
            rs = stmt.excuteQuery(sql);
            while (rs.next()) {
                System.out.println(rs.getString(2) + "|" + rs.getString(3)
                    + "|" + rs.getString(4));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
    }
}

CentOS 7.2 用戶訪問(wèn)

必須理解的術(shù)語(yǔ):

  • Impala服務(wù)端:提供Impala查詢轉(zhuǎn)發(fā)的網(wǎng)關(guān)服務(wù)器;
  • 客戶端:業(yè)務(wù)代碼所運(yùn)行的服務(wù)器粗俱,即CentOS 7.2這臺(tái)機(jī)器说榆;

以下信息是你訪問(wèn)集群需要的:

  • Impala服務(wù)端IP地址192.168.1.1和內(nèi)網(wǎng)全域名v001001.dc1.domain.com
  • 客戶端Kerberos配置文件krb5.conf寸认,內(nèi)容和我們之前配置的 krb5.conf 完全一致签财;
  • 客戶端Kerberos principal${USERNAME}/impala_user@DOMAIN.COM和密碼,其中${USERNAME}為Kerberos管理員分配的用戶名偏塞;
  • Impala服務(wù)端連接字符串jdbc:impala://v001001.dc1.domain.com:21050/${DB_NAME}唱蒸,其中${DB_NAME}是需要訪問(wèn)的數(shù)據(jù)庫(kù)名稱,示例代碼連接的是default數(shù)據(jù)庫(kù)灸叼;
  • 環(huán)境說(shuō)明中依賴基礎(chǔ)jar包神汹;

Step1. 使用Hosts進(jìn)行域名解析

用管理員方式(sudo)打開并編輯/etc/hosts sudo vim /etc/hosts庆捺,在最后一行添加指定的Impala服務(wù)器域名解析:

192.168.1.1 v001001.dc1.domain.com

點(diǎn)擊保存,測(cè)試以驗(yàn)證解析是否成功:

ping v001001.dc1.domain.com

Step2. 安裝 MIT Kerberos 客戶端

Kerberos客戶端是用于獲取ticket的慎冤,只有具有有效的ticket疼燥,用戶才能通過(guò)認(rèn)證進(jìn)行數(shù)據(jù)訪問(wèn)。

在線環(huán)境請(qǐng)使用yum安裝:

sudo yum install krb5-devel krb5-workstation -y

離線環(huán)境請(qǐng)使用rpm安裝蚁堤,rpm包存放在用戶手冊(cè)的rpms文件夾下:

sudo rpm -ivh krb5-devel-1.13.2-10.el7.x86_64.rpm
sudo rpm -ivh krb5-workstation-1.13.2-10.el7.x86_64.rpm

安裝完成后使用kinit命令驗(yàn)證是否成功。

Step3. 新建用于訪問(wèn)服務(wù)的 Kerberos Principal

cdh-master/admin 是我們?cè)谥?Step by Step 實(shí)現(xiàn)基于 Cloudera 5.8.2 的企業(yè)級(jí)安全大數(shù)據(jù)平臺(tái) - Kerberos的整合 中定義的 Kerberos 超級(jí)管理員:

ssh 192.168.1.1
kinit cdh-master/admin
kadmin
kadmin > addprinc test/impala_user

Step4. 生成驗(yàn)證用的 Ticket

拷貝客戶端配置文件但狭,并覆蓋/etc/krb5.conf披诗;

在本地通過(guò)kinit生成本地ticket cache:

kinit test/impala_user@DOMAIN.COM

認(rèn)證是有有效周期的,周期為21小時(shí)立磁,如果重啟應(yīng)用呈队,請(qǐng)記得重新kinit一次;

Step5. 生成帶客戶端證書的keystore

在終端中執(zhí)行如下命令唱歧,生成帶有客戶端JKS證書的keystore文件:

${JAVA_HOME}/bin/keytool -genkeypair -keystore ${JAVA_HOME}/jre/lib/security/impala_jdbc.jks -keyalg RSA -alias impala_jdbc -dname "CN=${IMPALA_CLIENT_FQDN},OU=Bigdata,O=Domain,L=Hangzhou,ST=Zhejiang,C=CN" -storepass ${KEYSTORE_PASS} -keypass ${KEYSTORE_PASS}
JAVA_HOME # Java根目錄
IMPALA_CLIENT_FQDN # CentOS客戶端全域名宪摧;
KEYSTORE_PASS # keystore文件的存儲(chǔ)密碼,牢記颅崩;

Step6. 使用Java SDK進(jìn)行數(shù)據(jù)訪問(wèn)

創(chuàng)建工程几于,并引入上文環(huán)境說(shuō)明中提到的jar包(我們已經(jīng)和用戶手冊(cè)一起提供,存放在jars文件夾下)沿后。和Windows不同的是沿彭,工程的目錄結(jié)構(gòu)需要我們自己組織,結(jié)構(gòu)如下(假設(shè)/home/admin/project為項(xiàng)目的根目錄尖滚,假設(shè)執(zhí)行代碼的用戶為admin):

  • /home/admin/project
    • src
      • impalaConnector
        • impalaConnector.java
    • bin
      • impalaConnector
        • impalaConnector.class
    • lib
      • 環(huán)境說(shuō)明中所有依賴的基礎(chǔ)jar包

示例代碼如下喉刘,訪問(wèn) default 數(shù)據(jù)庫(kù)的hosts表,查詢前10行數(shù)據(jù)漆弄,這里的${KEYSTORE_PASS}是生成keystore時(shí)指定的密碼:

package impalaConnector;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import com.cloudera.impala.jdbc41.*;
 
public class impalaConnector {
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        ResultSet rs = null;
        Statement stmt = null;
         
        try {
            Class.forName("com.cloudera.impala.jdbc41.Driver");
            conn = DriverManager
                    .getConnection("jdbc:impala://v001001.dc1.domain.com:21050/default;"
                    + "AuthMech=1;"
                    + "SSL=1;"
                    + "AllowSelfSignedCert=1;"
                    + "CAIssueCertNameMismatch=1;"
                    + "KrbHostFQDN=v001001.dc1.domain.com;"
                    + "KrbRealm=DOMAIN.COM;"
                    + "KrbServiceName=impala;"
                    + "SSLKeyStore=${JAVA_HOME}/jre/lib/security/impala_jdbc.jks;"
                    + "SSLKeyStorePwd=${KEYSTORE_PASS};"
                    + "LogLevel=5;LogPath=/tmp/impala_jdbc_demo.log");
            String sql = "SELECT * FROM hosts LIMIT 10";
            System.out.println(conn.getAutoCommit());
            stmt = conn.createStatement();
            rs = stmt.excuteQuery(sql);
            while (rs.next()) {
                System.out.println(rs.getString(2) + "|" + rs.getString(3)
                    + "|" + rs.getString(4));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
    }
}

把示例代碼拷貝至/home/admin/project/impalaConnector/src/impalaConnector睦裳,并進(jìn)行編譯:

cp impalaConnector.java /home/admin/project/impalaConnector/src/impalaConnector
cd /home/admin/project/impalaConnector/src/impalaConnector
${JAVA_HOME}/bin/javac impalaConnector.java

拷貝class文件到bin目錄下:

cp impalaConnector.class /home/admin/project/impalaConnector/bin/impalaConnector

執(zhí)行代碼:

cd /home/admin/project/impalaConnector/
${JAVA_HOME}/bin/java -cp lib/*:bin impalaConnector.impalaConnector
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市撼唾,隨后出現(xiàn)的幾起案子廉邑,更是在濱河造成了極大的恐慌,老刑警劉巖券坞,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鬓催,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡恨锚,警方通過(guò)查閱死者的電腦和手機(jī)宇驾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)猴伶,“玉大人课舍,你說(shuō)我怎么就攤上這事塌西。” “怎么了筝尾?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵捡需,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我筹淫,道長(zhǎng)站辉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任损姜,我火速辦了婚禮饰剥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摧阅。我一直安慰自己汰蓉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布棒卷。 她就那樣靜靜地躺著顾孽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪比规。 梳的紋絲不亂的頭發(fā)上若厚,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音苞俘,去河邊找鬼盹沈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吃谣,可吹牛的內(nèi)容都是我干的乞封。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼岗憋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肃晚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起仔戈,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤关串,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后监徘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晋修,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年凰盔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了墓卦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡户敬,死狀恐怖落剪,靈堂內(nèi)的尸體忽然破棺而出睁本,到底是詐尸還是另有隱情,我是刑警寧澤忠怖,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布呢堰,位于F島的核電站,受9級(jí)特大地震影響凡泣,放射性物質(zhì)發(fā)生泄漏枉疼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一鞋拟、第九天 我趴在偏房一處隱蔽的房頂上張望往衷。 院中可真熱鬧,春花似錦严卖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至汰扭,卻和暖如春稠肘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萝毛。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工项阴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笆包。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓环揽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親庵佣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歉胶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容