1. 程式人生 > >Hive/impala的kerberos和sentry相關問題

Hive/impala的kerberos和sentry相關問題

self application通過kerbeos認證的四種方式

Simple Hadoop Client

  • 這種方法不包含任何的認證,他依賴於當前機器已經取得TGT,這對於服務或者需要長時間執行的程式不適用,因為TGT可能會過期。每個使用者在使用時都需要kinit先獲取TGT
  • 這種方法為Kerberos建立一個service account(服務的principal),所有的使用者都將使用這個service account來進行認證,而不是每個使用者都需要使用自己的賬戶進行認證。隨之帶來的問題是,由於所有的使用者都使用相同的service account來進行認證,無法在HDFS上建立基於使用者的許可權控制。 步驟如下
    • 1.建立Service Principal
 kadmin -q "addprinc -randkey myapplication/myhost@CLOUDERA"
Authenticating as principal cloudera-scm/admin@CLOUDERA with password.
Password for cloudera-scm/admin@CLOUDERA:
WARNING: no policy specified for myapplication/myhost@CLOUDERA; defaulting to no policy
Principal "myapplication/myhost@CLOUDERA
"
created.
  • 注: 其中-randkey是為了使用一個隨機的金鑰進行加密,而不是使用使用者的密碼加密。

    • 2.為了檢視Principal是否生成,可以執行以下程式碼
kadmin -q "getprinc myapplication/myhost"
Principal: myapplication/myhost@CLOUDERA
Expiration date: [never]
Last password change: Tue Jul 28 14:35:16 PDT 2015
  • 3.然後,將此Principal倒入keytab檔案。後面我們將使用這個keytab檔案來認證。
kadmin -q "xst -k myapplication.keytab myapplication/myhost"

注:上面的xts是指對所有的加密方式都生成一個Principal。
* 4.可以通過Klist檢視keytab

klist -ke myapplication.keytab
  • 5.示例程式碼如下:
class FileCount {
public static void main(final String[] args) throws IOException, FileNotFoundException, InterruptedException{

UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("myapplication/myhost", "myapplication.keytab");
ugi.doAs( new PrivilegedExceptionAction() {
    public Void run() throws Exception {
        String path = "/";
        if( args.length > 0 )
            path = args[0];

        FileSystem fs = FileSystem.get(new Configuration());
        FileStatus[] status = fs.listStatus(new Path("hdfs://quickstart.cloudera:8020" + path));
        System.out.println("File Count: " + status.length);

        return null;
    }
} );
}
}

Kerberos Impersonation

  • 這種方法相當於結合了上面的兩種方法的優點,使用統一的service Principal來認證,同時,使用proxyuser,可以在使用者層面進行許可權控制。
  • 所有的使用者操作,不再依賴於使用者登陸到相應的叢集上而是相當於登陸到我們的程式裡,然後進行操作。
  • 方法如下:建立 service Pincipal和keytab 的方法和上面相同,然後修改core-site.xml
<property>
<name>hadoop.proxyuser.myapplication.groups</name>
<value>group1,group2</value>
</property>
<property>
<name>hadoop.proxyuser.myapplication.hosts</name>
<value>apphost</value>
</property>
myapplication用我們建立的principal替代。group1,group2為service principal所允許的group,*表示允許所有的組。apphost用application的server的hostname代替
然後enable service auth,修改core-site.xml. 
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
  • 這裡有個小問題:在core-site.xml中配置這些,並不生效,需要在cloudera執行時產生的執行檔案中如:/run/cloudera-scm-agent/process/721-hdfs-HTTPFS/core-site.xml中去修改才會生效。但每次重啟叢集都需要重新配置。
  • 示例程式碼如下:
class FileCount {
    public static void main(final String[] args) throws IOException, FileNotFoundException, InterruptedException{

        UserGroupInformation app_ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("myapplication/myhost", "myapplication.keytab");
        UserGroupInformation proxy_ugi = UserGroupInformation.createProxyUser("{user}", app_ugi);

        proxy_ugi.doAs( new PrivilegedExceptionAction() {
            public Void run() throws Exception {
                String path = "/";
                if( args.length > 0 )
                    path = args[0];

                FileSystem fs = FileSystem.get(new Configuration());
                FileStatus[] status = fs.listStatus(new Path("hdfs://quickstart.cloudera:8020" + path));
                System.out.println("File Count: " + status.length);

                return null;
            }
        } );
    }
}

Single Sign On

  • 沒太理解

總結

  • 最後,我們選取了第三種方法Kerberos Impersonation來進行kerberos認證,通過以上的示例程式碼,可以通過FileSystem來操作HDFS。但是如果想要使用WebHDFS來操作HDFS呢。

獲取Kerberos Token。

  • Webhdfs使用不同的REST來操作HDFS,如果想要使用REST訪問受kerbeos保護的資源,可以先獲取kerberos的token。(這裡獲取kerberos token的keytab必須要有HTTP//[email protected]的principal)
  • 使用FileSystem的getDelegationToken函式。示例程式碼如下:
 public String getDelegationToken( String doas){
        Logger.getLogger(FileSystemClient.class.getName()).log(Level.INFO,"getDelegationToken:"+doas);
        final HdfsResult result = new HdfsResult();
        try{
                UserGroupInformation doas_ugi = UserGroupInformation.createProxyUser(doas, UserGroupInformation.loginUserFromKeytabAndReturnUGI("myapplication/myhost", "myapplication.keytab"));
                doas_ugi.doAs(new PrivilegedExceptionAction(){
                @Override
                public Object run() throws Exception {
                    FileSystem fs = getFileSystem(rootURI_kerberos);
                     Token <?> token = fs.getDelegationToken("hdfs");//to be ensure
                     String res = token.encodeToUrlString();
                     result.setData(res);
                    fs.close();
                    return null;
                }
            });

        }catch(IOException | InterruptedException ex){
            Logger.getLogger(FileSystemClient.class.getName()).log(Level.SEVERE, null, ex);
        }

        return result.getData();
    }
  • 通過這樣,獲取到kerberos的Token,然後在每個REST請求的後面加上delegation=”+token即可。
String token = FileSystemClientFactory.getCliet().getDelegationToken(doas);
            uri = rootURI + dir  + "?op=MKDIRS"+"&delegation="+token;

總結

  • 到這裡,我們已經能夠在kerberos的環境下使用FileSystem和Webhdfs來訪問HDFS了下面,HIVE如何通過Kerberos認證呢。

HIVE通過Kerberos。

  • 我們是通過JDBC來連線hive的,以下皆為JDBC連線情況下如何通過Kberberos認證。
  • hive 通過kerberos很簡單,只要在獲取connection之前進行認證即可。
  • 示例程式碼如下
Configuration conf = new Configuration();
conf.set("hadoop.security.authentication", "Kerberos");
UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab("myapplication/myhost", "myapplication.keytab");
  • 接下來就按照之前沒有kerberos的情況下去正常獲取connection即可。

  • 問題: 這樣獲取的連線,都是使用相同的使用者(principal代表的使用者),這樣沒有辦法進行許可權控制。

  • 解決辦法:如同上面HDFS一樣,通過產生proxyUser來獲取連線,在cloudera中叫做hive impersonation。程式碼不再貼出。
  • 問題:在配置了kerberos之後,無法跑成作業的問題,在hive的cli中報錯
execution error return code 2 from org.apache.hadoop.hive.ql.exec.mr.mapredtask state 08s01 code 2 
  • 通過這個報錯,查看不出什麼資訊。到resource manager中檢視,發現:
main : run as user is root
main : requested yarn user is root
user root is not allowd
  • 即,root使用者不被允許跑hive作業。至此,找到錯誤,在yarn的security中,有配置
    • min.user.id(預設為1000)
    • allowed systen user
    • banned system user
  • 這裡的root和hdfs使用者的userid都是小於1000的,而且在banned system user中,所以不能跑通hive作業。
  • 問題: 在這裡,我將min.user.id改為0,並將root和hdfs從banned中去除,仍然是跑不了hive作業。好奇怪。但無論如何,換成普通使用者是可以跑通hive作業的。

Impala通過Kerberos

  • 如果叢集未開啟kerberos,且impala和hive使用相同的驅動hive2.則imapala通過kerberos的方式和hive相同。不再多說。

HIVE 在開啟sentry後的問題

  • 在hive開啟sentry後hive impersonation不再可用(cloudera解釋說,這是因為sentry和impersonation是兩種不同的認證授權方式,不可同時使用。)。所以之前使用hive impersonation通過kerberos的方法不再可行。
  • cloudera裡,看到關於trust delegation的描述,通過受信任的使用者通過認證,然後在產生proxyUser即可通過認證,同時可以進行許可權控制,程式碼很簡單,只需要在獲取connection的url中加入
jdbc:hive2://myHost.myOrg.com:10000/default;principal=hive/[email protected];hive.server2.proxy.user=bob

這裡的principal使用者,如果是自定義的,需要在core-site.xml中配置,但我們可以偷偷的使用hue使用者(自己新增一個類似hue/[email protected]的principal),這樣,就免去配置了。

Impala 在開啟sentry後的問題

  • 在開啟sentry之前,impala是使用和hive一樣的方式來通過kerberos認證的,那末,在開啟sentry之後,是否也能使用相同的辦法來進行kerberos下的sentry許可權管理呢,很可惜,答案是不能。
  • 在google中,有人提到可以在impala的jdbc的url後面想hive一樣,新增impala.proxy.user和impala.doas.user來完成,但經過實驗,這兩種方式都不行。
  • 由於impala和hive使用相同的jdbc驅動,會不會是這裡出現了問題呢。於是我將impala的驅動換為impala自己的simba。
  • 在simba的文件中,解決方案如下:
Configuration conf = new Configuration();
        conf.set("hadoop.security.authentication", "Kerberos");
        UserGroupInformation.setConfiguration(conf);
//            UserGroupInformation.loginUserFromKeytab(ConfigurationUtil.getValue("kerberos.principal.name", ConfigurationUtil.getRequestURL()), ConfigurationUtil.getValue("kerberos.principal.location", ConfigurationUtil.getRequestURL()));
        UserGroupInformation app_ugi=UserGroupInformation.loginUserFromKeytabAndReturnUGI(ConfigurationUtil.getValue("kerberos.principal.name", ConfigurationUtil.getRequestURL()), ConfigurationUtil.getValue("kerberos.principal.location", ConfigurationUtil.getRequestURL()));

        try{
            con=  (Connection) app_ugi.doAs(new PrivilegedExceptionAction(){//這裡按說應是doas_gui,但doas_gui卻不生效,待考慮。
              @Override
              public Object run() throws Exception {
                Connection   con = DriverManager.getConnection(rootURI+";AuthMech=1;KrbRealm="+krbRealm +
                ";KrbHostFQDN="+hostFQDN+";KrbServiceName=impala"+";DelegationUID="+doas);
                  return con;
              }
          });
        }catch(IOException | InterruptedException ex){
            Logger.getLogger(ImpalaConnection.class.getName()).log(Level.SEVERE, null, ex);
        }   
  • 這裡是使用delegationUID來進行不同使用者的區分的。

呼~~~~

相關推薦

Hive/impala的kerberossentry相關問題

self application通過kerbeos認證的四種方式 Simple Hadoop Client 這種方法不包含任何的認證,他依賴於當前機器已經取得TGT,這對於服務或者需要長時間執行的程式不適用,因為TGT可能會過期。每個使用者在使用時都需

hive記錄-cdh配置hivesentry

組件 讀寫 groupadd 測試 mys user 開啟 訪問 show 1.cdh添加組件-sentry-選擇主機-配置數據庫 2.配置數據庫 1)mysql -uroot -p 2) create database sentry DEFAULT CHARSET utf

java程式碼連線Hive(開啟Kerberossentry)

在開啟Kerberos認證之後,使用者需要進入登入Hive CLI或beeline需要用到keytab。為此,我們現在Kerberos資料庫中建立user1和user2兩個principal。 生成user1和user2的keytab kadmin.

hive集成sentry的sql使用語法

hiveSentry權限控制通過Beeline(Hiveserver2 SQL 命令行接口)輸入Grant 和 Revoke語句來配置。語法跟現在的一些主流的關系數據庫很相似。需要註意的是:當sentry服務啟用後,我們必須使用beeline接口來執行hive查詢,Hive Cli並不支持sentry。CRE

URLConnection HttpURLConnection 相關

details com logs cti hive aes article net .com 來源:http://blog.csdn.net/caesardadi/article/details/8622266 來源:http://blog.csdn.net/iijse/a

StringStringBuffer相關

mage -- edi 實參 設置 自己 span 也會 但是 在http://www.cnblogs.com/aishangJava/p/7262577.html這裏看到了一個題目,就去嘗試了一下,代碼如下: /* * To change this template,

[圖形學][轉載]圓心角圓周角相關問題,補充相關解答

都是 解答 連接 最小 width 情況 details article csdn 轉自:http://blog.csdn.net/silangquan/article/details/18450199 題目:兩圓相交,只有2交點A、B,過A點做線段CAD,CA、AD為兩圓

hive 安裝部署

def 環境 version etc odi onu base hive環境變量 tool 1.先安裝好hdfs和mapreduce 2.下載hive的安裝包, 下載地址:https://cwiki.apache.org/confluence/display/Hive/G

hive在hue中表相關註釋中文亂碼問題

修改字段 修改表 字符 alt params 問題 中文亂碼 val var alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8; //修改字段註釋字符集alter tab

優化公式排版Beamer相關知識

span repeat 符號 -1 sin fin limit font ldo 做優化的同學可能會碰到排列形如 max ******* s.t. ***** = * ***** > *** ... 的格式 既要要求 ma

grubgrub2相關概念

系統啟動 grub initramfs initrd grub2 一、GRUB(Boot loader) 二、Grub的命令行接口 三、/etc/grub/grub 四、進入單用戶模式 五、Grub損壞,修復 六、救援模式 七、ramdisk文件的管理和initrd 八、grub2詳解一、

與用戶相關的文件位置   --   學習筆記

用戶和組管理 下列文件內容是以“:”分隔,123...代表所在的位置/etc/passwd : root:x:0:0:root:/root:/bin/bash 1.“root”用戶帳戶登錄名稱 2.“x”使用x表示密碼占位符 3.“0”用戶帳戶的UID 4.“0”用戶帳戶的GID,即該用戶帳戶的基本組的ID

HTTP相關的web服務器內容

路徑 down 解析 服務器和客戶端 訪問網站 例如 cnblogs 正向代理 正向 一臺web服務器可以搭建多個獨立域名的網站,也可以作為通信路徑上的中轉服務器提升傳輸效率。 1. 用單臺虛擬主機實現多個域名 多個域名解析後對應的ip地址相同,需要在Host首部中包含完

泛微e-cologyOracle相關問題的解決方案

gen down 服務器 服務 帶來 輸入 朋友 開啟 開始 最近公司的泛微OA無法訪問,Oracle數據庫也無法正常啟動,嘗試了好多方法,終於解決了,先說說基本情況,希望能給碰到同樣問題的朋友帶來一點幫助。 服務器操作系統:Window s Server 2016

Hive sqlPresto sql的一些對比

ets ive 對比 簡單的 markdown pac pin down ring 最近由於工作上和生活上的一些事兒好久沒來博客園了,但是寫博客的習慣還是得堅持,新的一年需要更加努力,困知勉行,終身學習,每天都保持空杯心態.廢話不說,寫一些最近使用到的Presto SQL和

mysql的庫相關操作

ear dml 枚舉類型 mysqld grant 文件路徑 關系數據庫 通用 非關系型 一、數據庫介紹1、數據庫的由來我們之前所學,數據要想永久保存,都是保存於文件中,毫無疑問,一個文件僅僅只能存在於某一臺機器上,這樣就帶來了許多問題:(1)程序所有的組件就不可能運行在一

webpack3配置字體圖標打包相關問題

class AD ttf dev npm 路徑 col ash pub webpak配置字體圖標有兩種方式 一、將字體圖標和css打包到同一個文件中。 1.首先需要安裝url-loader npm install --save-dev url-loader

《Linux學習並不難》Linux常用操作命令(6):uname命令顯示計算機系統相關信息

Linux8.6 《Linux學習並不難》Linux常用操作命令(6):uname命令顯示計算機和系統相關信息 使用uname命令可以顯示計算機以及操作系統的相關信息,比如計算機硬件架構、內核發行號、操作系統名稱、計算機主機名等。 命令語法: uname [選項] 命令中各選項的

叢集分散式相關概念的區別與聯絡

先說區別: 一句話:分散式是並聯工作的,叢集是串聯工作的。 1:分散式是指將不同的業務分佈在不同的地方。 而叢集指的是將幾臺伺服器集中在一起,實現同一業務。 分散式中的每一個節點,都可以做叢集。 而叢集並不一定就是分散式的。 舉例:就比如新浪網,訪問的人多了,他可以做一個群集,前面放一個響應伺服器,

rediszk相關命令

1、zookeeper相關命令如下 zk server 命令: 1、啟動zk   sh bin/zkServer.sh start  2、關閉zk  sh bin/zkServer.sh stop 3、重啟zk  sh bin/zkS