Kerberos與各大組件的集成


1. 概述

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

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

  集群機器信息為:

ip hostname
192.168.1.150 cdh1
192.168.1.151 cdh2
192.168.1.152 cdh3

2. Cloudera Manager添加Kerberos

  注:這里的Cloudera Manager版本為5.6。

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/admin@EXAMPLE.COM: 
[root@master ~]# klist 
Ticket cache: KEYRING:persistent:0:0
Default principal: cloudera-scm/admin@EXAMPLE.COM

Valid starting       Expires              Service principal
07/01/2020 11:51:17  07/02/2020 11:51:16  krbtgt/BOCLOUD.COM@EXAMPLE.COM
    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個屬性,前者表示服務端允許的Service ticket最大生命周期,后者表示服務端允許的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/DOMAIN.COM@DOMAIN.COM進行更新,也無濟於事。
  • 在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. KDC Account 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開啟HTTP Web

   HBase 開啟REST認證

2.3. Cloudera Manager禁用Kerberos

2.3.1. 停止整個hadoop集群

  在CDH界面停止整個集群

2.3.2. 修改相關組件參數

  • Zookeeper:
    • 取消勾選enableSecurity和quorum.auth.enableSasl

                 

  • 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方面的相關配置。

  注:hadoop版本為2.7.3.

3.1. 創建kerberos用戶和keytab  

  在kerberos數據庫中增加hadoop、HTTP兩個用戶。各個hadoop組件都使用這兩個用戶訪問kerberos。

kadmin.local -q "addprinc -randkey hadoop/cdh1@EXAMPLE.COM"
kadmin.local -q "addprinc -randkey hadoop/cdh2@EXAMPLE.COM"
kadmin.local -q "addprinc -randkey hadoop/cdh3@EXAMPLE.COM"
kadmin.local -q "addprinc -randkey hadoop@EXAMPLE.COM"

kadmin.local -q "addprinc -randkey HTTP/cdh1@EXAMPLE.COM"
kadmin.local -q "addprinc -randkey HTTP/cdh2@EXAMPLE.COM"
kadmin.local -q "addprinc -randkey HTTP/cdh3@EXAMPLE.COM"

  

   為hdfs和HTTP兩個用戶創建keytab,這里HTTP只能大寫,不能小寫

cd /opt/hadoop/etc/
kadmin.local -q "xst -k hadoop.keytab hadoop/cdh1@EXAMPLE.COM"
kadmin.local -q "xst -k hadoop.keytab hadoop/cdh2@EXAMPLE.COM"
kadmin.local -q "xst -k hadoop.keytab hadoop/cdh3@EXAMPLE.COM"
kadmin.local -q "xst -k hadoop.keytab hadoop@EXAMPLE.COM"

kadmin.local -q "xst -k hadoop.keytab HTTP/cdh1@EXAMPLE.COM"
kadmin.local -q "xst -k hadoop.keytab HTTP/cdh2@EXAMPLE.COM"
kadmin.local -q "xst -k hadoop.keytab HTTP/cdh3@EXAMPLE.COM"

  

  測試keytab是否可用:

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

3.2. 各個節點安裝jce

  在hadoop集群所有節點安裝jce,下載地址為:

https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

  解壓jce_policy-8.zip,把解壓后文件夾里面的jar包copy到$JAVA_HOME/jre/lib/security目錄下。

  不安裝的話后面啟動會有下面異常:

  

3.3. 為HADOOP添加Kerberos配置認證

   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/_HOST@EXAMPLE.COM</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/_HOST@EXAMPLE.COM</value>
</property>

<!-- DataNode Kerberos Config -->
<property>
    <name>dfs.datanode.kerberos.principal</name>
    <value>hadoop/_HOST@EXAMPLE.COM</value>
</property>
<property>
    <name>dfs.datanode.keytab.file</name>
    <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>

<!-- 配置WebHDFS安全 -->
<property>
  <name>dfs.webhdfs.enabled</name>
  <value>true</value>
</property>
<property>
    <name>dfs.web.authentication.kerberos.principal</name>
    <value>HTTP/_HOST@EXAMPLE.COM</value>
</property>
<property>
    <name>dfs.web.authentication.kerberos.keytab</name>
    <value>/opt/hadoop/etc/hadoop.keytab</value>
</property>

  hadoop為HA模式,則需要添加journalnode相關的kerberos配置:

<!-- Journalnode Kerberos Config -->
<property>
    <name>dfs.journalnode.kerberos.principal</name>
    <value>hadoop/_HOST@EXAMPLE.COM</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/_HOST@EXAMPLE.COM</value>
</property>

  hadoop為非HA模式,且帶有secondarynamenode,則配置相關kerberos:

  <!-- Secondnode Kerberos Config -->
  <property>
       <name>dfs.secondary.namenode.kerberos.principal</name>
       <value>hadoop/_HOST@HADOOP.COM</value>
  </property>
  <property>
       <name>dfs.secondary.namenode.keytab.file</name>
       <value>/home/redpeak/hadoop.keytab</value>
  </property>
  <property>
       <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
       <value>HTTP/_HOST@HADOOP.COM</value>
  </property>

  

  Yarn支持兩種容器實現方式,一種是yarn容器,一種是Linux容器,Linux容器比較Yarn容器具有更好的擴展性和隔離性。本文將講述Linux容器的配置。yarn-site.xml添加的配置內容為:

<!--配置resourcemanager kerberos config-->
<property>
  <name>yarn.resourcemanager.principal</name>
  <value>hadoop/_HOST@EXAMPLE.COM</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/_HOST@EXAMPLE.COM</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/_HOST@EXAMPLE.COM</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>
<property>
  <name>yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users</name>
  <value>false</value>
  <description>Whether all applications should be run as the NodeManager process' owner.When false, applications are launched instead 
as the application owner</description> </property>

  注:分別設置容器類為LinuxContainerExecutor;允許使用的用戶組為:hadoop;第三個為可選項,配置是否限制NodeManager用戶作為應用用戶。

  container-executor.cfg修改配置內容:

#configured value of yarn.nodemanager.linux-container-executor.group 確保容器運行組是hadoop
yarn.nodemanager.linux-container-executor.group=hadoop 
#comma separated list of users who can not run applications  禁用用戶
banned.users=hdfs,yarn,mapred,bin
#Prevent other super-users 禁用其他系統用戶
min.user.id=1000
##comma separated list of system users who CAN run applications 誰可以運行該應用
allowed.system.users=root,hadoop
feature.tc.enabled=false
# 創建兩個目錄 yarn.nodemanager.local-dirs=$HADOOP_HOME/logs/yarn/local yarn.nodemanager.log-dirs=$HADOOP_HOME/logs/yarn/log

  

  HADOOP_HOME/etc/hadoop/container-executor.cfg配置文件的權限,和他上層目錄的user(所屬者)必須是root。這個container-executor.cfg配置文件的所有上層目錄都變成root,就是說/opt,/opt/app,/opt/app/hadoop3.1.4,etc,hadoop這幾個目錄都要變成root:root。如:

chown root:root /opt/app/
chown root:root /opt/app/hadoop-3.1.4/
chown root:root /opt/app/hadoop-3.1.4/etc
chown root:root /opt/app/hadoop-3.1.4/etc/hadoop
chown root:root /opt/app/hadoop-3.1.4/etc/hadoop/container-executor.cfg 

  另外還需要修改HADOOP_HOME/bin下面的container-executor的權限,root:hadoop的hadoop是上面配置的“yarn.nodemanager.linux-container-executor.group=hadoop”

chown root:hadoop /opt/app/hadoop-3.1.4/bin/container-executor 

chmod 6050 /opt/app/hadoop-3.1.4/bin/container-executor

 

  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/_HOST@EXAMPLE.COM</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.4. datanode的配置方式

  因為DataNode數據傳輸協議不使用Hadoop RPC框架,DataNode必須使用由dfs.datanode.address和dfs.datanode.http.address指定的特權端口進行身份驗證。此身份驗證基於以下假設:攻擊者將無法在DataNode主機上獲得root權限。

  以root用戶身份執行hdfs datanode命令時,服務器進程首先綁定特權端口,然后刪除特權並以HADOOP_SECURE_DN_USER指定的用戶賬號運行。此啟動過程使用安裝到JSVC_HOME的jsvc程序。你必須在啟動時(在hadoop-env.sh中)指定HADOOP_SECURE_DN_USER和JSVC_HOME作為環境變量。

  從版本2.6.0起,SASL可用於驗證數據傳輸協議。在此配置中,安全集群不再需要使用jsvc以root身份啟動DataNode並綁定到特權端口。要啟用SASL數據傳輸協議,請在hdfs-site.xml中設置dfs.data.transfer.protection,為dfs.datanode.address設置非特權端口,將dfs.http.policy設置為HTTPS_ONLY,並確保HADOOP_SECURE_DN_USER環境變量未定義。請注意,如果dfs.datanode.address設置為特權端口,則不能在數據傳輸協議上使用SASL。出於向后兼容性的原因,這是必需的。

  datanode啟動有兩種方式,一:在2.6版本之前,可以使用配置jsvc方式啟動datanode,二:在2.6版本之后,新增可以使用配置sasl方式啟動datanode。這里我主要使用sasl方式。

3.4.1. 配置sasl方式啟動datanode

  sasl方式需要設置dfs.http.policy為HTTPS_ONLY。https要求集群中有一個CA,它會生成ca_key和ca_cert,想要加入這個集群的節點,需要拿到這2個文件,然后經過一連串的動作生成keystore,並在hadoop的ssl-server.xml和ssl-client.xml中指定這個keystore的路徑和密碼,這樣各個節點間就可以使用https進行通信了。

3.4.1.1 CA服務器的證書和密碼

  在cdh1節點上創建目錄

mkdir -p  /home/hadoop/CA/private

openssl req -new -x509 -keyout /home/hadoop/CA/private/hadoop_ca_key -out /home/hadoop/CA/private/hadoop_ca_cert -days 9999 -subj '/C=CN/ST=guangdong/L=shenzhen/O=hongshan/OU=security/CN=hadoop.com'

  輸入hadoop_ca_key的密碼:hadoop

-new:表示生成一個新的證書簽署請求;
-x509:專用於生成CA自簽證書;
-keyout 指定生成密匙文件路徑
-out :指定生成的證書的保存路徑;
-days:指定證書的有效期限,單位為day,默認是365天;
-subj :證書的描述,也可以不寫,生成證書的時候填寫
C => Country 
ST => stateOrProvinceName
L => Locality  (eg, city)
O  => Organization 
OU =>  Organizational Unit
CN => Common Name

   通過 ll 在/home/hadoop/CA/private目錄查看生成的密碼和證書

   scp到hadoop集群的每個節點

scp -r CA  hadoop@cdh2:/home/hadoop/
scp -r CA  hadoop@cdh3:/home/hadoop/

3.4.1.2 在hadoop集群的各個節點上執行

  每個節點只需修改CN的hostname,在每個節點把下面所有命令全部執行。注意下面輸入的keystore和trustkeystore的密碼,后面配置ssl-client.xml、ssl-server.xml會用上。注意這里的keystore和trustkeystore的密碼可以保持一致,方便記憶,這里默認密碼為hadoop,這里包括上面步驟的hadoop_ca_key的密碼也是一致。

     進入到/home/hadoop/CA/private目錄。

     a) 生成密鑰和證書,創建keystore密碼和key passwd:hadoop  

keytool -keystore keystore -alias localhost -validity 9999 -genkey -keyalg RSA -keysize 2048 -dname "CN=cdh1, OU=test, O=test, L=shenzhen, ST=guangdong, C=cn";

  b) 創建trustkeystore密碼:hadoop

keytool -keystore truststore -alias CARoot -import -file hadoop_ca_cert;

        c) 執行下面的命令,

keytool -certreq -alias localhost -keystore keystore -file cert;

  d) 輸入hadoop_ca_key的密碼:hadoop

openssl x509 -req -CA hadoop_ca_cert -CAkey hadoop_ca_key -in cert -out cert_signed -days 9999 -CAcreateserial

        e) 輸入keystore密碼:hadoop

keytool -keystore keystore -alias CARoot -import -file hadoop_ca_cert 

         f) 再次輸入keystore密碼:hadoop

keytool -keystore keystore -alias localhost -import -file cert_signed 

        g) 查看生成文件,並檢查客戶端證書

ll /home/hadoop/CA/private

keytool  -list -v -keystore keystore  -storepass hadoop

3.4.1.3 修改hdfs-site.xml

   https模式默認的web端口不是50070,這里配置成一樣的。

 <property>
       <name>dfs.datanode.address</name>
       <value>0.0.0.0:61004</value>
  </property>
  <property>
       <name>dfs.datanode.http.address</name>
       <value>0.0.0.0:61006</value>
  </property>

  <property>
       <name>dfs.http.policy</name>
       <value>HTTPS_ONLY</value>
  </property>
  <property>
       <name>dfs.data.transfer.protection</name>
       <value>integrity</value>
  </property>

  <property>
        <name>dfs.namenode.https-address</name>
        <value>bridge1:50070</value>
   </property>

  注:這里的dfs.datanode.address和dfs.datanode.http.address配置成非特權端口,分別為61004和61006,均大於1024端口。

  如果hadoop集群為非HA模式,帶有secondarynamenode,還需要配置

  <property>
        <name>dfs.namenode.secondary.https-address</name>
        <value>bridge1:50072</value>
   </property>

3.4.1.4 修改ssl-client.xml

  ssl-client.xml主要修改為上面生成的keystore和truststore的路徑,填寫keystore密碼,key passwd,truststore密碼

<configuration>

<property>
  <name>ssl.client.truststore.location</name>
  <value>/home/hadoop/CA/private/truststore</value>
  <description>Truststore to be used by clients like distcp. Must be
  specified.
  </description>
</property>

<property>
  <name>ssl.client.truststore.password</name>
  <value>hadoop</value>
  <description>Optional. Default value is "".
  </description>
</property>

<property>
  <name>ssl.client.truststore.type</name>
  <value>jks</value>
  <description>Optional. The keystore file format, default value is "jks".
  </description>
</property>

<property>
  <name>ssl.client.truststore.reload.interval</name>
  <value>10000</value>
  <description>Truststore reload check interval, in milliseconds.
  Default value is 10000 (10 seconds).
  </description>
</property>

<property>
  <name>ssl.client.keystore.location</name>
  <value>/home/hadoop/CA/private/keystore</value>
  <description>Keystore to be used by clients like distcp. Must be
  specified.
  </description>
</property>

<property>
  <name>ssl.client.keystore.password</name>
  <value>hadoop</value>
  <description>Optional. Default value is "".
  </description>
</property>

<property>
  <name>ssl.client.keystore.keypassword</name>
  <value>hadoop</value>
  <description>Optional. Default value is "".
  </description>
</property>

<property>
  <name>ssl.client.keystore.type</name>
  <value>jks</value>
  <description>Optional. The keystore file format, default value is "jks".
  </description>
</property>

</configuration>

3.4.1.4 修改ssl-server.xml

<configuration>

<property>
  <name>ssl.server.truststore.location</name>
  <value>/home/hadoop/CA/private/truststore</value>
  <description>Truststore to be used by NN and DN. Must be specified.
  </description>
</property>

<property>
  <name>ssl.server.truststore.password</name>
  <value>hadoop</value>
  <description>Optional. Default value is "".
  </description>
</property>

<property>
  <name>ssl.server.truststore.type</name>
  <value>jks</value>
  <description>Optional. The keystore file format, default value is "jks".
  </description>
</property>

<property>
  <name>ssl.server.truststore.reload.interval</name>
  <value>10000</value>
  <description>Truststore reload check interval, in milliseconds.
  Default value is 10000 (10 seconds).
  </description>
</property>

<property>
  <name>ssl.server.keystore.location</name>
  <value>/home/hadoop/CA/private/keystore</value>
  <description>Keystore to be used by NN and DN. Must be specified.
  </description>
</property>

<property>
  <name>ssl.server.keystore.password</name>
  <value>hadoop</value>
  <description>Must be specified.
  </description>
</property>

<property>
  <name>ssl.server.keystore.keypassword</name>
  <value>hadoop</value>
  <description>Must be specified.
  </description>
</property>

<property>
  <name>ssl.server.keystore.type</name>
  <value>jks</value>
  <description>Optional. The keystore file format, default value is "jks".
  </description>
</property>

<property>
  <name>ssl.server.exclude.cipher.list</name>
  <value>TLS_ECDHE_RSA_WITH_RC4_128_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,
  SSL_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_WITH_DES_CBC_SHA,
  SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,
  SSL_RSA_WITH_RC4_128_MD5</value>
  <description>Optional. The weak security cipher suites that you want excluded
  from SSL communication.</description>
</property>

</configuration>

3.4.1.5 重啟hadoop

# 啟動namenode的兩種方式
hadoop-daemon.sh start namenode
hdfs --daemon start namenode

# 非HA模式,帶有secondarynamenode,啟動secondarynamenode的兩種方式
hadoop-daemon.sh start secondarynamenode
hdfs --daemon start secondarynamenode

# 啟動datanode
start-secure-dns.sh

3.5. 測試

  • 首先,使用hadoop用戶kinit進行kerberos登錄
kinit -kt /opt/hadoop/etc/hadoop.keytab hadoop@EXAMPLE.COM
klist
  • 然后,使用hadoop fs -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/_HOST@CHEYO.NET</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/_HOST@CHEYO.NET</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 hadoop@EXAMPLE.COM
klist
  • 然后,beeline使用如下方式連接,注意:-u 后面的參數需加雙引號,hadoop/cdh1為hiveserver2所在的節點
beeline -u "jdbc:hive2://cdh1:10000/default;principal=hadoop/cdh1@EXAMPLE.COM"

  或者

beeline
> !connect jdbc:hive2://cdh1:10000/default;principal=hadoop/cdh1@EXAMPLE.COM
用戶名密碼不輸入,直接回車

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/_HOST@EXAMPLE.COM</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/_HOST@EXAMPLE.COM</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/79167884 Cloudera Manager5.11.1 集成Kerberos

https://www.jianshu.com/p/dd7b04b49c18 CDH禁用Kerberos

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

https://www.cnblogs.com/yjt1993/p/11769515.html hdfs、yarn集成kerberos


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM