hadoop的kerberos認證

言歸正傳,介紹過hadoop的simple認證和kerberos後,咱們在這一章介紹hadoop的kerberos認證html

咱們還使用hadoop集羣的機器。java

OS 版本: Centos6.4node

Kerberos版本: krb5-1.10.3linux

環境配置web

機器名數據庫

Ip地址apache

功能安全

安裝模塊服務器

ganglia.localdomain網絡

192.168.124.140

Kerberos server

krb5-libs

krb5-server

krb5-workstation

krb5-devel

hadoop1.localdomain

192.168.124.135

Namenode

Datanode

Jobtracker

tasktracker

krb5-libs

krb5-workstation

krb5-appl-clients

hadoop2.localdomain

192.168.124.136

Datanode

tasktracker

Krb5-libs

Krb5-workstation

krb5-appl-servers

hadoop3.localdomain

192.168.124.137

Datanode

tasktracker

Krb5-libs

Krb5-workstation

krb5-appl-servers

kerberos的安裝,這裏就不介紹了,咱們建立了一個LOCALDOMAIN域的數據庫

咱們仍是要給出配置文件的信息給你們參考

vi /etc/krb5.conf 主要修改realm

 

[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
default_realm = LOCALDOMAIN
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true

[realms]
LOCALDOMAIN = {
kdc = ganglia.localdomain
admin_server = ganglia.localdomain
}

[domain_realm]
.example.com = LOCALDOMAIN
example.com = LOCALDOMAIN

 

vi /var/kerberos/krb5kdc/kdc.conf

[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88

[realms]
LOCALDOMAIN = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
max_renewable_life=10d
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}

 

vi /var/kerberos/krb5kdc/kadm5.acl

*/admin@LOCALDOMAIN     *

 

在hadoop中,kerberos須要建立principle和生成keytab文件。

1. 建立principle

hadoop的kerberos認證,須要三種principle: hadoop, host, HTTP

addprinc -randkey hadoop/hadoop1.localdomain@LOCALDOMAIN

addprinc -randkey hadoop/hadoop2.localdomain@LOCALDOMAIN

addprinc -randkey hadoop/hadoop3.localdomain@LOCALDOMAIN

addprinc -randkey host/hadoop1.localdomain@LOCALDOMAIN

addprinc -randkey host/hadoop2.localdomain@LOCALDOMAIN

addprinc -randkey host/hadoop3.localdomain@LOCALDOMAIN

addprinc -randkey  HTTP/hadoop1.localdomain@LOCALDOMAIN

addprinc -randkey  HTTP/hadoop2.localdomain@LOCALDOMAIN

addprinc -randkey  HTTP/hadoop3.localdomain@LOCALDOMAIN

使用listprincs查看一下結果

 

2. 建立keytab文件:hadoop.keytab

ktadd -norandkey -k /root/hadoop.keytab hadoop/hadoop1.localdomain@LOCALDOMAIN

ktadd -norandkey -k /root/hadoop.keytab hadoop/hadoop2.localdomain@LOCALDOMAIN

ktadd -norandkey -k /root/hadoop.keytab hadoop/hadoop3.localdomain@LOCALDOMAIN

ktadd -norandkey -k /root/hadoop.keytab host/hadoop1.localdomain@LOCALDOMAIN

ktadd -norandkey -k /root/hadoop.keytab host/hadoop2.localdomain@LOCALDOMAIN

ktadd -norandkey -k /root/hadoop.keytab host/hadoop3.localdomain@LOCALDOMAIN

ktadd -norandkey -k /root/hadoop.keytab HTTP/hadoop1.localdomain@LOCALDOMAIN

ktadd -norandkey -k /root/hadoop.keytab HTTP/hadoop2.localdomain@LOCALDOMAIN

ktadd -norandkey -k /root/hadoop.keytab HTTP/hadoop3.localdomain@LOCALDOMAIN

 

查看一下結果

klist -kt /root/hadoop.keytab

將/root/hadoop.keytab 上傳到hadoop1,hadoop2和hadoop3上

修改三個bug

  1. Jdk,須要下載jce(Java Cryptography Extension)1.6.32不須要安裝,低一點的版本須要。http://www.oracle.com/technetwork/java/javase/downloads/index.html
  2. 時間同步問題,kdc和運行hadoop的服務器,時間必須是同步的,若是在虛擬機中運行,若是時間不一致,也會形成credential失效。
  3. Kdc默認不支持renew功能的,運行kinit 後」valid starting" and "renew until"的值是相同的時間,或者運行kinit –R後出現 kinit: Ticket expired while renewing credentials

有兩種方法能夠解決此問題,第一種方式就是在建立domain以前,在kdc.conf中增長 max_renewable_life = 7d,而後建立domain。第二種方式使用modprinc修改全部的principle,modprinc -maxrenewlife 7days krbtgt/ganglia.localdoamin/LOCALDOMAIN

modprinc -maxrenewlife 7days K/M/LOCALDOMAIN

modprinc -maxrenewlife 7days hadoop/hadoop1.localdomain/LOCALDOMAIN

modprinc -maxrenewlife 7days hadoop/hadoop2.localdomain/LOCALDOMAIN

modprinc -maxrenewlife 7days hadoop/hadoop3.localdomain/LOCALDOMAIN

modprinc -maxrenewlife 7days host/hadoop1.localdomain/LOCALDOMAIN

modprinc -maxrenewlife 7days host/hadoop2.localdomain/LOCALDOMAIN

modprinc -maxrenewlife 7days host/hadoop3.localdomain/LOCALDOMAIN

modprinc -maxrenewlife 7days HTTP/hadoop1.localdomain/LOCALDOMAIN

modprinc -maxrenewlife 7days HTTP/hadoop2.localdomain/LOCALDOMAIN

modprinc -maxrenewlife 7days HTTP/hadoop3.localdomain/LOCALDOMAIN

 

配置hadoop

vi conf/core-site.xml

<configuration>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/home/hadoop/repo4/tmp</value>

        <description>A base for other temporary directories.</description>

    </property>

    <property>

        <name>fs.default.name</name>

        <value>hdfs://hadoop1.localdomain:9000</value>

    </property>

    <property>

        <name>hadoop.security.authorization</name>

        <value>true</value>

    </property>

    <property>

        <name>hadoop.security.authentication</name>

        <value>kerberos</value>

    </property>

</configuration>

修改conf/hadoop-env.sh,增長下面一句

export HADOOP_SECURE_DN_USER=hadoop

 

啓動hdfs

在hadoop1上運行: bin/hadoop namenode

在hadoop1,hadoop2和hadoop3上運行: sudo bin/hadoop datanode

若是按照上面的步驟作,應該是能夠可以啓動hdfs的。

 

下面咱們再配置一下mapred

vi conf/hdfs-site.xml

<configuration>

    <property>

        <name>dfs.replication</name>

        <value>2</value>

    </property>

    <property>

        <name>dfs.name.dir</name>

        <value>/home/hadoop/repo4/name</value>

    </property>

    <property>

        <name>dfs.data.dir</name>

        <value>/home/hadoop/repo4/data</value>

    </property>

 

    <property>

        <name>dfs.webhdfs.enabled</name>

        <value>true</value>

    </property>

    <property>

        <name>dfs.web.authentication.kerberos.principal</name>

        <value>HTTP/_HOST@LOCALDOMAIN</value>

    </property>

    <property>

        <name>dfs.namenode.kerberos.https.principal</name>

        <value>host/_HOST@KERBEROS_HADOOP</value>

    </property>

    <property>

        <name>dfs.web.authentication.kerberos.keytab</name>

        <value>/home/hadoop/hadoop-1.2.1/conf/hadoop.keytab</value>

    </property>

 

    <property>

        <name>dfs.namenode.keytab.file</name>

        <value>/home/hadoop/hadoop-1.2.1/conf/hadoop.keytab</value>

    </property>

    <property>

        <name>dfs.namenode.kerberos.principal</name>

        <value>hadoop/_HOST@LOCALDOMAIN</value>

    </property>

    <property>

        <name>dfs.namenode.kerberos.https.principal</name>

        <value>host/_HOST@LOCALDOMAIN</value>

    </property>

    <property>

      <name>dfs.secondary.namenode.keytab.file</name>

      <value>/home/hadoop/hadoop-1.2.1/conf/hadoop.keytab</value>

    </property>

    <property>

        <name>dfs.secondary.namenode.kerberos.principal</name>

        <value>hadoop/_HOST@LOCALDOMAIN</value>

    </property>

    <property>

        <name>dfs.secondary.namenode.kerberos.https.principal</name>

        <value>host/_HOST@LOCALDOMAIN</value>

    </property>

 

    <property>

        <name>dfs.datanode.keytab.file</name>

        <value>/home/hadoop/hadoop-1.2.1/conf/hadoop.keytab</value>

    </property>

    <property>

        <name>dfs.datanode.kerberos.principal</name>

        <value>hadoop/_HOST@LOCALDOMAIN</value>

    </property>

    <property>

         <name>dfs.datanode.kerberos.https.principal</name>

         <value>host/_HOST@LOCALDOMAIN</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>

</configuration>

 

  1. 修改conf/mapred-site.xml

<configuration>

    <property>

        <name>mapred.job.tracker</name>

        <value>http://hadoop1.localdomain:9001</value>

    </property>

 

    <property>

        <name>mapreduce.jobtracker.kerberos.principal</name>

        <value>mapred/_HOST@LOCALDOMAIN</value>

    </property>

    <property>

        <name>mapreduce.jobtracker.kerberos.https.principal</name>

        <value>host/_HOST@LOCALDOMAIN</value>

    </property>

    <property>

        <name>mapreduce.jobtracker.keytab.file</name>

        <value>/home/hadoop/hadoop-1.2.1/conf/mapred.keytab</value>

    </property>

 

    <property>

        <name>mapreduce.tasktracker.kerberos.principal</name>

        <value>mapred/_HOST@LOCALDOMAIN</value>

    </property>

    <property>

        <name>mapreduce.tasktracker.kerberos.https.principal</name>

        <value>host/_HOST@LOCALDOMAIN</value>

    </property>

    <property>

        <name>mapreduce.tasktracker.keytab.file</name>

        <value>/home/hadoop/hadoop-1.2.1/conf/mapred.keytab</value>

    </property>

 

    <property>

        <name>mapred.task.tracker.task-controller</name>

        <value>org.apache.hadoop.mapred.LinuxTaskController</value>

    </property>

    <property>

        <name>mapreduce.tasktracker.group</name>

        <value>hadoop</value>

    </property>

</configuration>

 

修改後xml配置文件後,還須要作以下幾步

1. 修改tasktracker的配置文件

先修改conf/taskcontroller.cfg

mapred.local.dir=/home/hadoop/repo4/mapred/local

hadoop.log.dir=/home/hadoop/hadoop-1.2.1/logs

mapreduce.tasktracker.group=hadoop

banned.users=hdfs

在建立mapred.local.dir和hadoop.log.dir指定的目錄

2. 啓動一下tasktracker來看一下  bin/hadoop tasktracker

出現了第一個異常: /etc/hadoop/taskcontroller.cfg not found,緣由是bin/tasktracker默認使用etc/hadoop位置的taskcontroller.cfg

咱們將taskcontroller.cfg複製到/etc/hadoop

  sudo mkdir /etc/hadoop

  sudo scp conf/taskcontroller.cfg /etc/hadoop/

3. 啓動tasktracer: bin/hadoop tasktracker

可執行文件task-controller的所屬者必須是root

咱們改變一下文件的所屬者

  sudo chown root:root bin/task-controller

4. 繼續啓動tasktracker: bin/hadoop tasktracker

異常繼續出現:配置的組必須等於task-controller所屬組

咱們繼續改變一下文件的所屬着和所屬組

  sudo chown root:hadoop bin/task-controller

5. 繼續啓動tasktracker: bin/hadoop tasktracker

檢查其餘用戶還有異常:task-controller其餘用戶不能有寫和執行權限

運行命令去改變用戶權限

  sudo chmod o-rx bin/task-controller

6.  繼續啓動tasktracker: bin/hadoop tasktracker

task-controller還須要被設置setuid標誌位

運行命令去設置setuid標誌位

  sudo chmod u+s bin/task-controller

7. 繼續啓動tasktracker: bin/hadoop tasktracker

用戶的id比1000小

Cat /etc/passwd,查看一下用戶id,而後設置參數min.user.id,一般普通用戶建立,都是從500開始,由於咱們能夠修改sudo vi /etc/hadoop/taskcontroller.cfg

min.user.id=500

 

測試一下mapred程序,咱們仍是用wordcount做爲例子

前面咱們已經啓動了hdfs,再啓動mapred

在hadoop1運行:bin/hadoop jobtracker

在hadoop1,hadoop2和hadoop2上運行: bin/hadoop tasktracker

建立一個輸入目錄:

  bin/hadoop  dfs -mkdir /user/hadoop/input

上傳一些文件

  bin/hadoop dfs -copyFromLocal  conf/* /user/hadoop/input/

查看一下結果

  bin/hadoop dfs -ls /user/hadoop/input/

啓動mapred程序

 

 

使用kerberos認證的缺點

  1. 存在單點失敗:它須要KDC中心服務器的服務。當KDC掛掉時,整個系統有可能癱瘓。Hadoop花了不少時間來解決namenode的單點問題。幸好這個缺陷能夠經過使用複合Kerberos服務器和缺陷認證機制彌補
  2. Kerberos須要時間同步技術,Kerberos要求參與通訊的主機的時鐘同步,若是主機的時鐘與Kerberos服務器的時鐘不一樣步,認證會失敗。默認設置要求時鐘的時間相差不超過10分鐘。一般用網絡時間協議後臺程序(NTP)來保持主機時鐘同步。
  3. 配置很是繁瑣,一般配置好一個100個節點的服務器,須要三天時間。並且還會存在一個大的問題:用戶權限的問題,原來系統上的數據不能訪問。這一點還須要完善。
  4. 由於全部用戶使用的密鑰都存儲於中心服務器中,危及服務器的安全的行爲將危及全部用戶的密鑰。

總結

Kerberos是一種性能比較高的認證和受權,而且可以進行數據加密的安全系統,可是並非特別適合hadoop,緣由有三點:1. Hadoop集羣節點數多,配置和維護一個使用kerberos系統高性能,穩定的hadoop集羣難度很是高。2. Hadoop中的hdfs是一個文件系統,用戶的認證和受權比較複雜,難度不低於linux系統的用戶和組管理。加上kerberos後,用戶和用戶組的管理更加複雜,一般一個合適的用戶不能訪問hdfs上的文件。 3. Hadoop加上kerberos後,一般原來的用戶和文件,可能都失效致使數據流失。尤爲是一些根目錄,每每須要格式化整個系統才能使用。增長一個新用戶也是比較難的。由於要考慮各個節點間的訪問權限。 我認爲可能輕量級的LDAP會適合hadoop系統,後面有時間來實現一下。

相關文章
相關標籤/搜索