Hadoop集羣集成kerberos

上週週會領導讓研究kerberos,要在我們的大集羣中使用,研究任務指派給了我。這周的話也是用測試集羣大概的做了一遍。目前爲止的研究還比較粗糙,網上衆多資料都是CDH的集羣,而我們的集羣是不是用的CDH,所以在集成kerberos的過程中有一些不同之處。

測試環境是由5臺機器搭建的集羣,hadoop版本是2.7.2。5臺機器host分別是
rm1、rm2、test-nn1、test-nn2、10-140-60-50。選取rm1爲kdc服務器。

1、安裝軟件
rm1上安裝krb5、krb5-server和krb5-client
命令行執行 : yum install krb5-server krb5-libs krb5-auth-dialog krb5-workstation -y
其它4臺機器安裝krb5-level、krb5-workstation
4臺機器命令行分別執行 : yum install krb5-devel krb5-workstation -y

2、配置文件修改
kdc服務器涉及到的配置文件有3個
/etc/krb5.conf 、/var/kerberos/krb5kdc/kdc.conf 、/var/kerberos/krb5kdc/kadm5.acl
krb5.conf文件內容如下:
這裏寫圖片描述

其中的ticket_lifetime和renew_lifetime是比較重要的參數,這兩個參數都是時間參數,前者表示的是訪問憑證的有效時間,默認是24小時,這裏我已經做了修改,修改成了10000天。因爲有效期過期後,再在節點上執行hadoop fs -ls類似的命令都會失效,憑證默認存放在/tmp下,文件格式爲krb5cc_xxx(xxx是用戶代碼,即/etc/passwd中用戶對應的代碼)。如何修改下文會介紹。
另外可以修改的就是[libdefaults]中的default_realm參數,圖中爲EXAMPLE.COM,這裏可以任意命名字符串,大寫,以.COM結尾。[realms]中的參數也需要對應修改,前面介紹了我選擇的是rm1作爲kdc服務器。
配置完後將該文件分發到其它所有節點的/etc下。

kdc.conf文件內容如下:
這裏寫圖片描述
這裏還是配置了max_life和max_renewlife參數的值爲10000天,其它都是默認值。

kadm5.acl文件可以不做改動。

集羣每個節點安裝JCE,需要安裝與當前java版本相同的JCE。我使用的是java1.7的,下載鏈接如下:
http://www.oracle.com/technetwork/java/embedded/embedded-se/downloads/jce-7-download-432124.html
下載完後得到的壓縮包解壓,將其中的local_policy.jar以及US_export_policy.jar複製到JAVA_HOME/jre/lib/security下。

3、創建數據庫
軟件安裝完畢後,需要在rm1上運行初始化數據庫命令,命令行執行:
kdb5_util create -r JAVACHEN.COM -s。這裏要根據krb5.conf中default-realm中對應的值。運行完畢後在/var/kerberos/krb5kdc/下生成principal數據庫。

4、啓動服務
在rm1命令行上執行:
service krb5kdc start
service kadmin start

5、創建principals
在rm1命令行上鍵入kadmin.local後,而後鍵入

addprinc -randkey hadoop/rm1@EXAMPLE.COM(我這裏配置文件中的是EXAMPLE.COM)
addprinc -randkey hadoop/rm2@EXAMPLE.COM
addprinc -randkey hadoop/test-nn1@EXAMPLE.COM
addprinc -randkey hadoop/test-nn2@EXAMPLE.COM
addprinc -randkey hadoop/10-140-60-50@EXAMPLE.COM
addprinc -randkey HTTP/rm1@EXAMPLE.COM
addprinc -randkey HTTP/rm2@EXAMPLE.COM
addprinc -randkey HTTP/test-nn1@EXAMPLE.COM
addprinc -randkey HTTP/test-nn2@EXAMPLE.COM
addprinc -randkey HTTP/10-140-60-50@EXAMPLE.COM

因爲集羣所有的服務都是以hadoop用戶啓動的,所以僅需要創建hadoop的principals。CDH集羣則需要hdfs、yarn、mapred3個用戶

6、創建keytab文件
rm1命令行執行:

kadmin.local -q "xst  -k hadoop.keytab  hadoop/rm1@EXAMPLE.COM"
kadmin.local -q "xst  -k hadoop.keytab  hadoop/rm2@EXAMPLE.COM"
kadmin.local -q "xst  -k hadoop.keytab  hadoop/test-nn1@EXAMPLE.COM"
kadmin.local -q "xst  -k hadoop.keytab  hadoop/test-nn2@EXAMPLE.COM"
kadmin.local -q "xst  -k hadoop.keytab  hadoop/10-140-60-50@EXAMPLE.COM"
kadmin.local -q "xst  -k HTTP.keytab  HTTP/rm1@EXAMPLE.COM"
kadmin.local -q "xst  -k HTTP.keytab  HTTP/rm2@EXAMPLE.COM"
kadmin.local -q "xst  -k HTTP.keytab  HTTP/test-nn1@EXAMPLE.COM"
kadmin.local -q "xst  -k HTTP.keytab  HTTP/test-nn2@EXAMPLE.COM"
kadmin.local -q "xst  -k HTTP.keytab  HTTP/10-140-60-50@EXAMPLE.COM"

這樣會在/var/kerberos/krb5kdc目錄下生成hadoop.keytab和HTTP.keytab文件。
繼續rm1命令行鍵入 ktutil
繼而鍵入 rkt hadoop.keytab 回車
再次鍵入 rkt HTTP.keytab 回車
最後鍵入 wkt hdfs.keytab 回車
這樣即生成文件hdfs.keytab,用klist命令顯示列表(部分內容)
這裏寫圖片描述

7、部署keytab文件
將rm1上生成的hdfs.keytab文件分發到各個節點的/etc/hadoop 下。安全起見,可以將該文件權限設置爲400。

8、停止集羣所有服務

9、修改相關配置文件
a、core-site.xml,加入

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

b、hdfs-site.xml,加入

<property>
  <name>dfs.block.access.token.enable</name>
  <value>true</value>
</property>
<property>
  <name>dfs.https.enable</name>
  <value>true</value>
</property>
<property>
  <name>dfs.https.policy</name>
  <value>HTTPS_ONLY</value>
</property>
<property>
  <name>dfs.namenode.https-address.pin-cluster1.testnn1</name>
  <value>test-nn1:50470</value>
</property>
<property>
  <name>dfs.namenode.https-address.pin-cluster1.testnn2</name>
    <value>test-nn2:50470</value>
    </property>
<property>
  <name>dfs.https.port</name>
    <value>50470</value>
    </property>
<property>
  <name>dfs.namenode.keytab.file</name>
  <value>/usr/local/hadoop/etc/hadoop/hdfs.keytab</value>
</property>
<property>
  <name>dfs.namenode.kerberos.principal</name>
  <value>hadoop/[email protected]</value>
</property>
<property>
  <name>dfs.namenode.kerberos.internal.spnego.principal</name>
  <value>HTTP/[email protected]</value>
</property>
<property>
  <name>dfs.datanode.data.dir.perm</name>
  <value>700</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>
<property>
  <name>dfs.datanode.keytab.file</name>
  <value>/usr/local/hadoop/etc/hadoop/hdfs.keytab</value>
</property>
<property>
  <name>dfs.datanode.kerberos.principal</name>
  <value>hadoop/[email protected]</value>
</property>
<property>
<property>
  <name>dfs.journalnode.keytab.file</name>
  <value>/usr/local/hadoop/etc/hadoop/hdfs.keytab</value>
</property>
<property>
  <name>dfs.journalnode.kerberos.principal</name>
  <value>hadoop/[email protected]</value>
</property>
<property>
  <name>dfs.journalnode.kerberos.internal.spnego.principal</name>
  <value>HTTP/[email protected]</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>/usr/local/hadoop/etc/hadoop/hdfs.keytab</value>
</property>

注意 : dfs.https.policy項,一定是https而不是http,否則啓動服務會報錯。

c、yarn-site.xml,加入

<property>
  <name>yarn.resourcemanager.keytab</name>
  <value>/usr/local/hadoop/etc/hadoop/hdfs.keytab</value> 
</property>
<property>
  <name>yarn.resourcemanager.principal</name>
  <value>hadoop/[email protected]</value>
</property>
<property>
  <name>yarn.nodemanager.keytab</name>
  <value>/usr/local/hadoop/etc/hadoop/hdfs.keytab</value>
</property>
<property>
  <name>yarn.nodemanager.principal</name>
  <value>hadoop/[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>
<property>
  <name>yarn.https.policy</name>
  <value>HTTPS_ONLY</value>
</property>

d、mapred-site.xml,加入

<property>
  <name>mapreduce.jobhistory.keytab</name>
  <value>/usr/local/hadoop/etc/hadoop/hdfs.keytab</value>      
</property>
<property>
  <name>mapreduce.jobhistory.principal</name>
  <value>hadoop/[email protected]</value>
</property>
<property>
  <name>mapreduce.jobhistory.http.policy</name>
  <value>HTTPS_ONLY</value>
</property>

e、zookeeper的配置文件zoo.cfg,加入
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
同時在同目錄下新建文件jaas.conf :

Server {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/usr/local/hadoop/etc/hadoop/hdfs.keytab"
    storeKey=true
    useTicketCache=true
    principal="hadoop/[email protected]";
};

principal要根據不同的主機變化。

再新建文件java.env文件:

export JVMFLAGS="-Djava.security.auth.login.config=/usr/local/zookeeper/conf/jaas.conf"

f、hadoop-env.sh,加入

export HADOOP_SECURE_DN_USER=hadoop
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_HOME}/sec_pids
export HADOOP_SECURE_DN_LOG_DIR=/data/hadoop/data12/hadoop-sec-logs
export JSVC_HOME=/usr/local/jsvc

這裏jsvc是需要另外安裝的,下面會介紹。

g、container-executor.cfg,加入

allowed.system.users=##comma separated list of system users who CAN run applications
yarn.nodemanager.local-dirs=/data/hadoop/data1/yarn/data,/data/hadoop/data2/yarn/data,/data/hadoop/data3/yarn/data,/data/hadoop/data4/yarn/data,/data/hadoop/data5/yarn/data,/data/hadoop/data6/yarn/data,/data/hadoop/data7/yarn/data,/data/hadoop/data8/yarn/data,/data/hadoop/data9/yarn/data,/data/hadoop/data10/yarn/data,/data/hadoop/data11/yarn/data,/data/hadoop/data12/yarn/data
yarn.nodemanager.linux-container-executor.group=hadoop
yarn.nodemanager.log-dirs=/data/hadoop/data1/yarn/log,/data/hadoop/data2/yarn/log,/data/hadoop/data3/yarn/log,/data/hadoop/data4/yarn/log,/data/hadoop/data5/yarn/log,/data/hadoop/data6/yarn/log,/data/hadoop/data7/yarn/log,/data/hadoop/data8/yarn/log,/data/hadoop/data9/yarn/log,/data/hadoop/data10/yarn/log,/data/hadoop/data11/yarn/log,/data/hadoop/data12/yarn/log
#banned.users=hadoop
min.user.id=1

yarn-nodemanager.local-dirs和yarn.nodemanager.log-dirs要和yarn-site.xml中配置一致。min.user.id也要注意,這裏設定的是可以使用提交任務用戶id的最小值,用戶id就是 /etc/passwd中用戶對應的id。默認是1000如果不配置的話,這樣如果用戶id小於1000,則提交任務報錯。所以這裏設定成了1.原本1000是爲了防止其它的超級用戶使用集羣的。

10、編譯源碼
因爲container-executor(在 HADOOP_HOME/bin下)要求container-executor.cfg這個文件及其所有父目錄都屬於root用戶,否則啓動nodemanager會報錯。配置文件container-executor.cfg默認的路徑在HADOOP_HOME/etc/hadoop/container-executor.cfg。如果,按照默認的路徑修改所有父目錄都屬於root,顯然不可能。於是,把路徑編譯到/etc/container-executor.cfg中。

下載hadoop-2,7,2-src源碼包解壓,進入src目錄下,執行
mvn package -Pdist,native -DskipTests -Dtar -Dcontainer-executor.conf.dir=/etc
執行過程時間較長。(公司有專門的編譯服務器使用)
完後,進入hadoop-2.7.2/src/hadoop-dist/target下,新編譯完成的代碼已經生成,當然,編譯源碼需要搭建相應的環境,這裏不做介紹。
將新生成的container-executor替換所有節點原來的container-executor,並且所有節點上均要將HADOOP_HOME/etc/hadoop下的container-executor.cfg文件複製到/etc 下,且設置權限爲root:root。在bin文件夾下執行

strings container-executor | grep etc

如果結果是/etc而非../etc,則表示操作成功了。另外最重要的是將bin下的container-executor
文件權限設定爲root:hadoop和4750,如果權限不是4750,則啓動nodemanager時會報錯,報錯是不能提供合理的container-executor.cfg文件。

10、啓動服務
a、zookeeper啓動與正常一樣啓動
b、journalnode啓動與正常一樣啓動
c、namenode啓動與正常一樣啓動
d、zkfc啓動與正常一樣啓動
e、nodemanager啓動與正常一樣啓動
以上所有服務均用hadoop用戶啓動
f、datanode啓動要用root用戶啓動,且需要安裝jsvc

jsvc安裝需要下載commons-daemon-1.0.15-src.tar.gz
解壓後進入 commons-daemon-1.0.15-src/src/native/unix
按步執行:
sh support/buildconf.sh
./configure 這裏要在/etc/profile中配置好JAVA_HOME。
make
3步過後即可。這時在當前目錄有文件jsvc,將其路徑配置到前文敘述過的hadoop-env.sh中即可,配置前可試一下是否有用。使用命令在當前目錄執行./jsvc -help
最後以root用戶啓動datanode即可。
(之後發現,其實不必須使用root啓動datanode,在hdfs-site.xml中添加

<property>
<name>ignore.secure.ports.for.testing</name>
<value>true</value>
</property>
即可)

11、檢查
全部服務啓動完畢後,namenode頁面出現Security is on。
使用hadoop用戶執行

kinit -k -e /usr/local/hadoop/etc/hadoop/hdfs.keytab hadoop/rm1@EXAMPLE.COM
kinit -k -e /usr/local/hadoop/etc/hadoop/hdfs.keytab hadoop/rm2@EXAMPLE.COM
kinit -k -e /usr/local/hadoop/etc/hadoop/hdfs.keytab hadoop/test-nn1@EXAMPLE.COM
kinit -k -e /usr/local/hadoop/etc/hadoop/hdfs.keytab hadoop/test-nn2@EXAMPLE.COM
kinit -k -e /usr/local/hadoop/etc/hadoop/hdfs.keytab hadoop/10-140-60-50@EXAMPLE.COM

5條指令在5臺機器上分別執行。這樣便會在/tmp下生成krb5cc_xxx文件,前文已經交代過用處。
這時再用hadoop用戶在任意節點執行 hadoop fs -ls 即可成功,否則報錯,錯誤爲無法找到tgt。之前將ticket_lifetime改爲10000也是因爲這裏,過了24小時的話,再執行hadoop fs 又會報錯,因爲默認ticket時間只有24小時,需要加長。

這裏ticket_lifetime和renew_lifetime查看和修改方式做一下介紹
這兩個時間的確定是由
(1)Kerberos server上 /var/kerberos/krb5kdc/kdc.conf中的max_life和max_renewable_life
(2)建立Principal時自動內置了這兩個時間,可用命令查看和修改
(3)/etc/krb5.conf中的ticket_lifetime和renew_lifetime
(4)kinit -l 命令後跟的時間參數
這4箇中中最小的一個值決定.
使用kinit -l 命令後面加時間回車之後,提示需要輸入密碼,經測試,該密碼並非添加principals時指定的密碼,所以還未知如何修改。建議修改完配置文件中的ticket_lifetime後再添加principals,可保證時間修改。

配置文件改動即可,該完後需要重啓服務
service krb5kdc restart
service kadmin restart

查看Principal相關信息使用命令
kadmin.local : getprinc {principal}

修改命令
kadmin.local : modprinc -maxlife 10000days {principal}
kadmin.local : modprinc -maxrenewlife 10000days {principal}

至此,hadoop層面集成kerberos完成,當然還遠遠不夠,還需要後續跟進很多測試,得出結論是否可行。還有hbase、hive、hbase等服務也需要集成kerberos,任重而道遠~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章