Hadoop集群的kerberos认证
文章轉(zhuǎn)載自http://www.cnblogs.com/easycloud/p/3724437.html
轉(zhuǎn)載主要用于個(gè)人學(xué)習(xí)備查。
環(huán)境:
OS 版本: Centos6.4
Kerberos版本: krb5-1.10.3
環(huán)境配置
機(jī)器名
Ip地址
功能
安裝模塊
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的安裝,這里就不介紹了,我們創(chuàng)建了一個(gè)LOCALDOMAIN域的數(shù)據(jù)庫
我們還是要給出配置文件的信息給大家參考
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需要?jiǎng)?chuàng)建principle和生成keytab文件。
hadoop的kerberos認(rèn)證,需要三種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查看一下結(jié)果
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
查看一下結(jié)果
klist -kt /root/hadoop.keytab
將/root/hadoop.keytab 上傳到hadoop1,hadoop2和hadoop3上
修改三個(gè)bug
Jdk,需要下載jce(Java Cryptography Extension)1.6.32不需要安裝,低一點(diǎn)的版本需要。http://www.oracle.com/technetwork/java/javase/downloads/index.html
時(shí)間同步問題,kdc和運(yùn)行hadoop的服務(wù)器,時(shí)間必須是同步的,如果在虛擬機(jī)中運(yùn)行,如果時(shí)間不一致,也會(huì)造成credential失效。
Kdc默認(rèn)不支持renew功能的,運(yùn)行kinit 后”valid starting” and “renew until”的值是相同的時(shí)間,或者運(yùn)行kinit –R后出現(xiàn) kinit: Ticket expired while renewing credentials
有兩種方法可以解決此問題,第一種方式就是在創(chuàng)建domain之前,在kdc.conf中增加 max_renewable_life = 7d,然后創(chuàng)建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
<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>修改conf/hadoop-env.sh,增加下面一句
export HADOOP_SECURE_DN_USER=hadoop
啟動(dòng)hdfs
在hadoop1上運(yùn)行: bin/hadoop namenode
在hadoop1,hadoop2和hadoop3上運(yùn)行: sudo bin/hadoop datanode
如果按照上面的步驟做,應(yīng)該是可以能夠啟動(dòng)hdfs的。
下面我們?cè)倥渲靡幌耺apred
vi conf/hdfs-site.xml
<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>修改conf/mapred-site.xml
修改后xml配置文件后,還需要做如下幾步
先修改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
在創(chuàng)建mapred.local.dir和hadoop.log.dir指定的目錄
出現(xiàn)了第一個(gè)異常: /etc/hadoop/taskcontroller.cfg not found,原因是bin/tasktracker默認(rèn)使用etc/hadoop位置的taskcontroller.cfg
我們將taskcontroller.cfg復(fù)制到/etc/hadoop
sudo mkdir /etc/hadoop
sudo scp conf/taskcontroller.cfg /etc/hadoop/
可執(zhí)行文件task-controller的所屬者必須是root
我們改變一下文件的所屬者
sudo chown root:root bin/task-controller
異常繼續(xù)出現(xiàn):配置的組必須等于task-controller所屬組
我們繼續(xù)改變一下文件的所屬著和所屬組
sudo chown root:hadoop bin/task-controller
檢查其他用戶還有異常:task-controller其他用戶不能有寫和執(zhí)行權(quán)限
運(yùn)行命令去改變用戶權(quán)限
sudo chmod o-rx bin/task-controller
task-controller還需要被設(shè)置setuid標(biāo)志位
運(yùn)行命令去設(shè)置setuid標(biāo)志位
sudo chmod u+s bin/task-controller
用戶的id比1000小
Cat /etc/passwd,查看一下用戶id,然后設(shè)置參數(shù)min.user.id,通常普通用戶創(chuàng)建,都是從500開始,因?yàn)槲覀兛梢孕薷膕udo vi /etc/hadoop/taskcontroller.cfg
min.user.id=500
測試一下mapred程序,我們還是用wordcount作為例子
前面我們已經(jīng)啟動(dòng)了hdfs,再啟動(dòng)mapred
在hadoop1運(yùn)行:bin/hadoop jobtracker
在hadoop1,hadoop2和hadoop2上運(yùn)行: bin/hadoop tasktracker
創(chuàng)建一個(gè)輸入目錄:
bin/hadoop dfs -mkdir /user/hadoop/input
上傳一些文件
bin/hadoop dfs -copyFromLocal conf/* /user/hadoop/input/
查看一下結(jié)果
bin/hadoop dfs -ls /user/hadoop/input/
啟動(dòng)mapred程序
使用kerberos認(rèn)證的缺點(diǎn)
存在單點(diǎn)失敗:它需要KDC中心服務(wù)器的服務(wù)。當(dāng)KDC掛掉時(shí),整個(gè)系統(tǒng)有可能癱瘓。Hadoop花了很多時(shí)間來解決namenode的單點(diǎn)問題。幸虧這個(gè)缺陷可以通過使用復(fù)合Kerberos服務(wù)器和缺陷認(rèn)證機(jī)制彌補(bǔ)
Kerberos需要時(shí)間同步技術(shù),Kerberos要求參與通信的主機(jī)的時(shí)鐘同步,如果主機(jī)的時(shí)鐘與Kerberos服務(wù)器的時(shí)鐘不同步,認(rèn)證會(huì)失敗。默認(rèn)設(shè)置要求時(shí)鐘的時(shí)間相差不超過10分鐘。通常用網(wǎng)絡(luò)時(shí)間協(xié)議后臺(tái)程序(NTP)來保持主機(jī)時(shí)鐘同步。
配置非常繁瑣,通常配置好一個(gè)100個(gè)節(jié)點(diǎn)的服務(wù)器,需要三天時(shí)間。而且還會(huì)存在一個(gè)大的問題:用戶權(quán)限的問題,原來系統(tǒng)上的數(shù)據(jù)不能訪問。這一點(diǎn)還需要完善。
因?yàn)樗杏脩羰褂玫拿荑€都存儲(chǔ)于中心服務(wù)器中,危及服務(wù)器的安全的行為將危及所有用戶的密鑰。
總結(jié)
Kerberos是一種性能比較高的認(rèn)證和授權(quán),并且能夠進(jìn)行數(shù)據(jù)加密的安全系統(tǒng),但是并不是特別適合hadoop,原因有三點(diǎn):1. Hadoop集群節(jié)點(diǎn)數(shù)多,配置和維護(hù)一個(gè)使用kerberos系統(tǒng)高性能,穩(wěn)定的hadoop集群難度非常高。2. Hadoop中的hdfs是一個(gè)文件系統(tǒng),用戶的認(rèn)證和授權(quán)比較復(fù)雜,難度不低于linux系統(tǒng)的用戶和組管理。加上kerberos后,用戶和用戶組的管理更加復(fù)雜,通常一個(gè)合適的用戶不能訪問hdfs上的文件。 3. Hadoop加上kerberos后,通常原來的用戶和文件,可能都失效導(dǎo)致數(shù)據(jù)流失。尤其是一些根目錄,往往需要格式化整個(gè)系統(tǒng)才能使用。增加一個(gè)新用戶也是比較難的。因?yàn)橐紤]各個(gè)節(jié)點(diǎn)間的訪問權(quán)限。 我認(rèn)為可能輕量級(jí)的LDAP會(huì)適合hadoop系統(tǒng),后面有時(shí)間來實(shí)現(xiàn)一下
總結(jié)
以上是生活随笔為你收集整理的Hadoop集群的kerberos认证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mybatis异常Invalid bou
- 下一篇: 由于没有远程桌面授权服务器可以提供许可证