1. 程式人生 > 實用技巧 >Kerberos與各大元件的整合

Kerberos與各大元件的整合

1. 概述

  Kerberos可以與CDH整合,CDH裡面可以管理與hdfs、yarn、hbase、yarn、kafka等相關元件的kerberos憑證。但當我們不使用CDH的時候,也需要了解hdfs、yarn、hbase和kafka是如何配置關聯kerberos的。

  該文是建立在Kerberos基本原理、安裝部署及用法部落格的前提上的,需要首先了解Kerberos的基本原理、安裝用法,才能閱讀下文。

2. Cloudera Manager新增Kerberos

2.1.建立Kerberos管理員principal

# 需要設定兩次密碼 
//使用cloudera-scm/admin作為CM建立其它principals的超級使用者
kadmin.local -q "addprinc cloudera-scm/admin"

  principal的名字的第二部分是admin,是根據Kerberos安裝部署文章裡面提到的配置acl檔案,該principal就擁有administrative privileges,這個賬號將會被CDH用來生成其他使用者/服務的principal。

  注意:需要先kinit保證已經有principal快取。

[root@master ~]# kinit cloudera-scm/admin
Password for cloudera-scm/[email protected]: 
[root@master 
~]# klist Ticket cache: KEYRING:persistent:0:0 Default principal: cloudera-scm/[email protected] Valid starting Expires Service principal 07/01/2020 11:51:17 07/02/2020 11:51:16 krbtgt/[email protected] renew until 07/08/2020 11:51:16

2.2. Cloudera Manager新增Kerberos  

  在此之前,請確保一下前序工作完成:

  • KDC已經安裝好並且正在執行
  • 將KDC配置為允許renewable tickets with non-zerolifetime,我們在之前修改kdc.conf檔案的時候已經添加了max_life和max_renewable_life這2個屬性,前者表示服務端允許的Serviceticket最大生命週期,後者表示服務端允許的Service ticket更新週期。這2個屬性必須分別大於等於客戶端對應的配置ticket_lifetime和renew_lifetime。我們假設,不這樣進行配置:ticket_lifetime=8d,max_life=7d,renew_lifetime=25h, max_renew_life=24h,那麼可能造成的結果就是當service持有的票據超過24小時沒有更新,在第24.5小時的時候去進行更新,請求會遭到拒絕,報錯:Ticket expired while renewing credentials,永遠無法進行正常更新。對於Cloudera來說,因為更新機制被透明(Cloudera有renew程序會去定期更新),即使我們手動使用modprinc -maxrenewlife 1 week krbtgt/[email protected]進行更新,也無濟於事。
  • 在Clouder Manager Server上安裝openldap-clients
  • 為Cloudera Manager建立了超級管理員principal,使其能夠有許可權在KDC中建立其他的principals,如上面建立的cloudera-scm;

  再次確認完畢後進入如下步驟:

2.2.1. 啟動Kerberos

  

2.2.2.確認完成後啟用Kerbero前的準備

2.2.3.KDC資訊

  要注意的是:這裡的Kerberos Encryption Types必須跟KDC實際支援的加密型別匹配(即kdc.conf中的值)

2.2.4.KDB5資訊

2.2.5. KDCAccount Manager

2.2.6.匯入KDC Account Manager憑據

2.2.7.Kerberos Principals

  如下為,CDH為各個元件自動生成的principals:

  

2.2.8. Set HDFS Port

2.2.9.重啟服務

  之後Cloudera Manager會自動重啟叢集服務,啟動之後會提示Kerberos已啟用。在Cloudera Manager上啟用Kerberos的過程中,會自動做以下的事情:

  • 叢集中有多少個節點,每個賬號就會生成對應個數的principal;
  • 為每個對應的principal建立keytab;  
  • 部署keytab檔案到指定的節點中;
  • 在每個服務的配置檔案中加入有關kerberos的配置;

  啟用之後訪問叢集的所有資源都需要使用相應的賬號來訪問,否則會無法通過Kerberos的authentication。對於HDFS,Yarn,需要開啟Web Console的認證,以防未認證使用者訪問資源介面。

2.2.10.開啟HTTP Web認證

  HDFS開啟HTTP Web:

  Yarn開啟HTTPWeb

  HBase開啟REST認證

2.3. Cloudera Manager禁用Kerberos

2.3.1. 停止整個hadoop叢集

  在CDH介面停止整個叢集

2.3.2. 修改相關元件引數

  • Zookeeper:
    • 取消勾選enableSecurity

  

  • HDFS:
    • hadoop.security.authentication設定為:Simple
    • hadoop.security.authorization取消勾選(FALSE)

      

    • dfs.datanode.address from 1004(for Kerberos)修改為50010(default)
    • dfs.datanode.http.address from 1006(for Kerberos)修改為50075(default)

      

    • Data Directory Permissions from 700修改為755

      

  • HBase:
    • hbase.security.authentication設定為:Simple
    • hbase.security.authorization取消勾選(FALSE)

    

  • Hue:
    • Kerberos Ticket Renewer刪除或停止role 

2.3.3. 刪除相應的ZNode目錄

  當CDH部署Kerberos後,zookeeper裡面的節點目錄hbase、kafka、hdfs會帶有許可權;而當CDH去掉Kerberos後,這些目錄仍然有許可權,需要先刪除再重新建立。

  1. 在CDH介面開啟zookeeper的配置,搜尋java關鍵字:

  2.新增-Dzookeeper.skipACL=yes配置,關閉zookeeper的許可權檢查配置項:

    

  3.重啟zookeeper服務

  4.登入zookeeper shell:zkCli.sh -server ip:port

  5.刪除HBase znode:rmr /hbase

  6.刪除RM znode:rmr /rmstore/ZKRMStateRoot

  7.刪除zkfc znode:rmr /hadoop-ha/nameservice-test1

  8.刪除kafka znode:rmr /kafka

  9.刪除-Dzookeeper.skipACL=yes配置項

  10.重啟zookeeper及相應服務

3. Hadoop整合Kerberos  

  上面2節點是CDH整合hadoop,會自動配置hadoop相關的kerberos配置,如果不依賴CDH的話,我們也需要了解HDFS與Kerberos方面的相關配置。

3.1.建立kerberos使用者和keytab  

  在kerberos資料庫中增加hadoop、HTTP兩個使用者。各個hadoop元件都使用這兩個使用者訪問kerberos。

kadmin.local -q "addprinc -randkey hadoop/[email protected]"
kadmin.local -q "addprinc -randkey hadoop/[email protected]"
kadmin.local -q "addprinc -randkey hadoop/[email protected]"

kadmin.local -q "addprinc -randkey HTTP/[email protected]"
kadmin.local -q "addprinc -randkey HTTP/[email protected]"
kadmin.local -q "addprinc -randkey HTTP/[email protected]"

  為hdfs和HTTP兩個使用者建立keytab,這裡HTTP只能大寫,不能小寫

cd /opt/hadoop/etc/
kadmin.local -q "xst -k hadoop.keytab hadoop/[email protected]"
kadmin.local -q "xst -k hadoop.keytab hadoop/[email protected]"
kadmin.local -q "xst -k hadoop.keytab hadoop/[email protected]"

kadmin.local -q "xst -k hadoop.keytab HTTP/[email protected]"
kadmin.local -q "xst -k hadoop.keytab HTTP/[email protected]"
kadmin.local -q "xst -k hadoop.keytab HTTP/[email protected]"

  測試keytab是否可用:

kinit -kt /opt/hadoop/etc/hadoop.keytab hadoop/cdh1
klist

3.2.為HADOOP新增認證

  core-site.xml新增的配置內容為:

<property>
    <name>hadoop.security.authorization</name>
    <value>true</value>
</property>
<property>
    <name>hadoop.security.authentication</name>
    <value>kerberos</value>
</property>

  

  hdfs-site.xml新增的配置內容為:

<!--NameNode Kerberos Config-->
<property>
    <name>dfs.block.access.token.enable</name>
    <value>true</value>
</property>
<property>
    <name>dfs.namenode.kerberos.principal</name>
    <value>hadoop/[email protected]</value>
</property>
<property>
    <name>dfs.namenode.keytab.file</name>
    <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>
<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
    <value>HTTP/[email protected]</value>
</property>

<!-- DataNode Kerberos Config -->
<property>
    <name>dfs.datanode.kerberos.principal</name>
    <value>hadoop/[email protected]</value>
</property>
<property>
    <name>dfs.datanode.keytab.file</name>
    <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>
<property>
    <name>dfs.datanode.address</name>
    <value>0.0.0.0:1004</value>
</property>
<property>
    <name>dfs.datanode.http.address</name>
    <value>0.0.0.0:1006</value>
</property>

<!-- Journalnode Kerberos Config -->
<property>
    <name>dfs.journalnode.kerberos.principal</name>
    <value>hadoop/[email protected]</value>
</property>
<property>
    <name>dfs.journalnode.keytab.file</name>
    <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>
<property>
<name>dfs.journalnode.kerberos.internal.spnego.principal</name>
    <value>HTTP/[email protected]</value>
</property>

<!-- 配置WebHDFS安全 -->
<property>
  <name>dfs.webhdfs.enabled</name>
  <value>true</value>
</property>
<property>
    <name>dfs.web.authentication.kerberos.principal</name>
    <value>HTTP/[email protected]</value>
</property>
<property>
    <name>dfs.web.authentication.kerberos.keytab</name>
    <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>

  

  yarn-site.xml新增的配置內容為:

<!--配置resourcemanager kerberos config-->
<property>
  <name>yarn.resourcemanager.principal</name>
  <value>hadoop/[email protected]</value>
</property>
<property>
  <name>yarn.resourcemanager.keytab</name>
  <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>

<!--配置nodemanager kerberos config-->
<property>
  <name>yarn.nodemanager.principal</name>
  <value>hadoop/[email protected]</value>
</property>
<property>
  <name>yarn.nodemanager.keytab</name>
  <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>
<property>
    <name>yarn.resourcemanager.webapp.spnego-principal</name>
    <value>HTTP/[email protected]</value>
</property>

<property>
  <name>yarn.nodemanager.container-executor.class</name>
<value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>
<property>
  <name>yarn.nodemanager.linux-container-executor.group</name>
  <value>hadoop</value>
</property>

  

  mapred-site.xml新增的配置內容為:

<property>
  <name>mapreduce.jobhistory.keytab</name>
  <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>
<property>
  <name>mapreduce.jobhistory.principal</name>
  <value>hdfs/[email protected]</value>
</property>

  當開啟Kerberos認證時,core-site.xml還需要新增各個元件的代理使用者,不然所有使用者都沒許可權訪問,配置內容為:

<!--hadoop user-->
<property>
    <name>hadoop.proxyuser.hadoop.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.hadoop.groups</name>
    <value>*</value>
</property>

<!--root user-->
<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

<!--HTTP user-->
<property>
    <name>hadoop.proxyuser.HTTP.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.HTTP.groups</name>
    <value>*</value>
</property>

3.3.測試

  • 首先,使用hadoop使用者kinit進行kerberos登入
kinit -kt /opt/hadoop/etc/hadoop.keytab [email protected]
klist
  • 然後,使用hadoopfs -ls /命令或者yarn application -list命令等
hadoop fs -ls /
yarn application -list

4. Hive整合Kerberos

4.1.為HIVE新增認證

  hive-site.xml新增的配置內容為:

<property>
    <name>hive.server2.authentication</name>
    <value>KERBEROS</value>
</property>

<property>
   <name>hive.server2.authentication.kerberos.principal</name>
    <value>hadoop/[email protected]</value>
</property>
<property>
    <name>hive.server2.authentication.kerberos.keytab</name>
    <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>

<property>
    <name>hive.metastore.kerberos.principal</name>
    <value>hadoop/[email protected]</value>
</property>
<property>
    <name>hive.metastore.kerberos.keytab.file</name>
    <value>/opt/hadoop/etc/hadoop.keytab</value>
    <description>The path to the Kerberos Keytab file containing the
    metastore thrift server's service principal.</description>
</property>

  core-site.xml還需要新增hive元件的代理使用者,配置內容為:

<!-- hive user -->
<property>
    <name>hadoop.proxyuser.hive.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.hive.groups</name>
    <value>*</value>
</property>

4.2. HIVE的beeline連線

  啟動hiveserver2後,使用beeline客戶端連線

  • 首先,使用hadoop使用者kinit進行kerberos登入
kinit -kt /opt/hadoop/etc/hadoop.keytab [email protected]
klist
  • 然後,beeline使用如下方式連線,注意:-u後面的引數需加雙引號,hadoop/cdh1為hiveserver2所在的節點
beeline -u "jdbc:hive2://cdh1:10000/default;principal=hadoop/[email protected]"

  或者

beeline
> !connect jdbc:hive2://cdh1:10000/default;principal=hadoop/[email protected]
使用者名稱密碼不輸入,直接回車

5. HBase整合Kerberos

5.1.為HBase新增認證

  hbase-site.xml新增的配置內容為:

<property>
    <name>hbase.security.authentication</name>
    <value>kerberos</value>
</property>

<!--master-->
<property>
    <name>hbase.master.kerberos.principal</name>
    <value>hadoop/[email protected]</value>
</property>
<property>
    <name>hbase.master.keytab.file</name>
    <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>

<!--regionserver-->
<property>
    <name>hbase.regionserver.kerberos.principal</name>
    <value>hadoop/[email protected]</value>
</property>
<property>
    <name>hbase.regionserver.keytab.file</name>
    <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>

<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
 <property>
    <name>hbase.coprocessor.master.classes</name>
    <value>org.apache.hadoop.hbase.security.access.AccessController</value>
  </property>
<property>
    <name>hbase.coprocessor.region.classes</name>
    <value>org.apache.hadoop.hbase.security.token.TokenProvider,
    org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint,
    org.apache.hadoop.hbase.security.access.AccessController</value>
</property>

  core-site.xml還需要新增hbase元件的代理使用者hadoop,配置內容為:

<!--hadoop user-->
<property>
    <name>hadoop.proxyuser.hadoop.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.hadoop.groups</name>
    <value>*</value>
</property>

【參考資料】

https://blog.csdn.net/u011026329/article/details/79167884Cloudera Manager5.11.1 整合Kerberos

https://www.jianshu.com/p/dd7b04b49c18CDH禁用Kerberos

http://blog.cheyo.net/222.htmlHadoop配置Kerberos認證(2.7.1)

https://www.cnblogs.com/yjt1993/p/11769515.htmlhdfs、yarn整合kerberos