参考另一篇笔记:hadoop集群部署
或者按照Cloudera的官方文档:CDH3 Installation Guide.
二、环境说明
1、主机名
之前部署hadoop集群时,没有使用节点的hostname,而是在hosts文件里添加了ip要域名的解析,部署后的hadoop没有问题,但是在为集群添加kerberos认证时因为这一点,遇到很多的问题。所以,建议还是使用节点的hostname来做解析。
集群中包含一个NameNode/JobTracker,两个DataNode/TaskTracker。
hosts文件
172.18.6.152 nn.hadoop.local
172.18.6.143 dn143.hadoop.local
172.18.6.145 dn145.hadoop.local
注意:hosts文件中不要包含127.0.0.1的解析。
2、hadoop安装部署相关
hadoop 和kerberos的部署需要hadoop-sbin和hadoop-native。
如果使用的是rpm部署的hadoop,需要安装上面的两个rpm包。
我的集群使用的是tar包部署的,所以默认是包含这两部分文件的,可以检查一下:
hadoop-sbin对应的文件是:
/usr/local/hadoop/sbin/Linux-amd64-64
文件夹中包含两个文件:jsvc、task-controller
hadoop-native对应的目录是:
/usr/local/hadoop/lib/native
3、AES-256加密
我的系统使用的是centos6.2和centos5.7,对于使用centos5.6及以上的系统,默认使用AES-256来加密的。这就需要集群中的所有节点和hadoop user machine上安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File
打开上面的链接,在页面的下方,下载jdk对应的文件,jdk1.6.0_22下载下面的文件:
注:如果后面出现login failed的错误,应先检查是否是从官方网站下载的JCE。
下载的文件是一个zip包,解开后,将里面的两个文件放到下面的目录中:
/usr/java/jdk1.6.0_22/jre/lib/security
注:也可以不使用AED-256加密,方法见官方文档对应的部分。
三、部署KDC
1、安装kdc server
只需要在kdc中安装
yum install krb5-server.x86_64 krb5-devel.x86_64
2、配置文件
kdc服务器涉及到三个配置文件:
/etc/krb5.conf、
/var/kerberos/krb5kdc/kdc.conf、
/var/kerberos/krb5kdc/kadm5.acl
hadoop集群中其他服务器涉及到的kerberos配置文件:/etc/krb5.conf。
将kdc中的/etc/krb5.conf拷贝到集群中其他服务器即可。
集群如果开启selinux了,拷贝后可能需要执行restorecon -R -v /etc/krb5.conf
/etc/krb5.conf
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = for_hadoop
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 2d
forwardable = true
renewable = true
[realms]
for_hadoop = {
kdc = 172.18.6.152:88
admin_server = 172.18.6.152:749
}
[domain_realm]
[kdc]
profile=/var/kerberos/krb5kdc/kdc.conf
/var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
for_hadoop = {
master_key_type = aes256-cts
max_life = 25h
max_renewable_life = 4w
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md
5:normal des-cbc-crc:normal
}
/var/kerberos/krb5kdc/kadm5.acl
*/admin@for_hadoop *
3、创建数据库
#kdb5_util create -r for_hadoop -s
该命令会在/var/kerberos/krb5kdc/目录下创建principal数据库。
4、关于kerberos的管理
可以使用kadmin.local或kadmin,至于使用哪个,取决于账户和访问权限:
kadmin.local(on the KDC machine)or kadmin (from any machine)
如果有访问kdc服务器的root权限,但是没有kerberos admin账户,使用kadmin.local
如果没有访问kdc服务器的root权限,但是用kerberos admin账户,使用kadmin
5、创建远程管理的管理员
#kadmin.local
addprinc root/admin@for_hadoop
密码不能为空,且需妥善保存。
6、创建测试用户
#kadmin.local
addprinc test
7、常用kerberos管理命令
#kadmin.local
列出所有用户 listprincs
查看某个用户属性,如 getprinc hdfs/nn.hadoop.local@for_hadoop
注意,是getprinc,没有's'
添加用户 addprinc
更多,查看帮助
8、添加kerberos自启动及重启服务
chkconfig --level 35 krb5kdc on
chkconfig --level 35 kadmin on
service krb5kdc restart
service kadmin restart
9、测试
使用之前创建的test用户
# kinit test
Password for test@for_hadoop:
#
1、首先客户端向KDC发送一个会话密钥申请。这个申请的内容可以简单概括为”我是某客户端,我需要个Session Key用于与某服务器通话“。2、KDC在接收到这个请求的时候,生成一个会话密钥。为了保证这个会话密钥仅仅限于发送请求的客户端和它希望访问的服务器知道,KDC会为这个会话密钥生成两个副本,分别被客户端和服务器使用。然后从账户数据库中提取客户端和服务器的主密钥分别对这两个副本进行对称加密。对于服务器,与会话密钥一起被加密的还包含关于客户端的一些信息,以便对发起连接请求的客户端进行身份认证。
3、通过上面的过程,客户端实际上获得了两组信息:一个是通过自己主密钥加密的会话密钥;另一个是被Server的主密钥加密的数据包,包含会话密钥和关于自己的一些确认信息。在这个基础上,我们再来看看服务器是如何对客户端进行认证的。
4、客户端通过用自己的主密钥对KDC加密的会话密钥进行解密从而获得会话密钥,随后创建认证符(Authenticator,包括客户端信息和时间戳(Timestamp)),并用会话密钥对其加密。最后连同从KDC获得的、被服务器的主密钥加密过的数据包(客户端信息和会话密钥)一并发送到服务器端。我们把通过服务器的主密钥加密过的数据包称为服务票证(Session Ticket)。
5、当服务器接收到这两组数据后,先使用它自己的主密钥对服务票证进行解密,从而获得会话密钥。随后使用该会话密钥解密认证符,通过比较由客户端发送来的认证符中的客户端信息(Client Info)和服务票证中的客户端信息实现对客户端身份的验证。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)