Hadoop(HDP)集群kerberos认证实现方案
!!出于安全问题,本文隐藏了部分系统名称及服务名称,修改了部分可能造成信息泄露的部分。部分配置为虚拟机配置文件副本,相关主机名称仅供参考。
!!本文适用于HDP部署了ambari平台的kerberos认证操作。其他环境供参考。
文档中相关图片不上传了。
部署环境:Hadoop2.7.3 HDP2.5.3
本文档参考了kerberos官方文档,Hadoop官方文档及HDP官方文档.相关链接如下:
http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/SecureMode.html
http://web.mit.edu/kerberos/krb5-current/doc/
http://docs.hortonworks.com/index.html
如有错误,请不吝指教。谢谢!!
Hadoop(HDP)集群kerberos认证实现方案
1. 版本选择
MIT当前版本为 krb5-1.14.4
系统自带版本为1.10:
选择自带版本。
2. 软件安装
系统环境:
需要完成IP及hostname的配置,在hosts文件中将IP与名称进行配对,一般Hadoop集群已经完成这些步骤,在Hadoop集群的机器的hosts文件中加入认证服务器的IP与hostname。在认证服务器上需要将相应的配置复制过来,保证不需要DNS解析也能完成直接ping主机名互通。
注意:
Kerberos中的计算机的时钟需要与运行KDC的机器进行同步。建议KDC及Hadoop集群使用统一的时钟源进行同步。
KDC服务器需要安装以下文件:
krb5-server-1.10.3-15.1.x86_64.rpm
krb5-devel-1.10.3-15.1.x86_64.rpm
krb5-libs-1.10.3-15.1.x86_64.rpm
krb5-auth-dialog-0.13-3. x86_64.rpm
客户机安装:
krb5-workstation-1.10.3-15. 1.x86_64.rpm
krb5-libs-1.10.3-15.1.x86_64.rpm
krb5-auth-dialog-0.13-3.x86_64.rpm
3. 系统规划
Realm 名称、端口、是否使用slave服务器等。
Kerberos中有三种角色:客户机、应用服务器、认证服务器。应用服务器是用来为客户提供网络服务的主机,客户机为普通主机,认证服务器为kerberos的KDC。
KDC安装在CLUSTER02上面。其他93台服务器根据其提供的服务以及功能,作为应用服务器以及客户机角色,大部分服务器同时具备两种角色。
设置realm名称为REALM.COM,服务使用kerberos默认端口,避免与其他服务冲突。
KDC是kerberos服务的核心服务器,服务器的安全以及稳定是整个服务安全及稳定的基础。建议使用单独的机器,不安装任何其他服务,只启动kerberos服务。
但是本环境没有单独主机,暂定使用snamenode服务器安装KDC。
4. 环境准备
Ambari及相关组件已经安装完成。
安装JCE,在所有的服务器上部署JCE policy。
准备 jce_policy-8.zip文件,同时把文件复制到/var/lib/ambari-server/resources目录下。
unzip -o -j -q jce_policy-8.zip -d $jdkdir/jre/lib/security/
注意jce的版本要对应,部署后,ambari-server重新启动ambari服务
设置Hadoop用户:
将principal与username进行mapping。(可选)
在core-site.xml文件中
增加:
ULE:[1:$1@$0](ambari-qa-cluster@REALM.COM)s/.*/ambari-qa/
RULE:[1:$1@$0](hdfs-cluster@REALM.COM)s/.*/hdfs/
RULE:[1:$1@$0](spark-cluster@REALM.COM)s/.*/spark/
RULE:[1:$1@$0](.*@REALM.COM)s/@.*//
RULE:[2:$1@$0](amshbase@REALM.COM)s/.*/ams/
RULE:[2:$1@$0](amszk@REALM.COM)s/.*/ams/
RULE:[2:$1@$0](dn@REALM.COM)s/.*/hdfs/
RULE:[2:$1@$0](hive@REALM.COM)s/.*/hive/
RULE:[2:$1@$0](jhs@REALM.COM)s/.*/mapred/
RULE:[2:$1@$0](nm@REALM.COM)s/.*/yarn/
RULE:[2:$1@$0](nn@REALM.COM)s/.*/hdfs/
RULE:[2:$1@$0](rm@REALM.COM)s/.*/yarn/
RULE:[2:$1@$0](yarn@REALM.COM)s/.*/yarn/
DEFAULT
###如使用通配符的如下:
RULE:[1:$1@$0](.*@REALM\.COM)s/@.*//
RULE:[2:$1@$0](.*@REALM\.COM)s/@.*//
DEFAULT
5. KDC配置
设置全局环境变量(最后一行需要在所有机器上配置):
/etc/profile末尾增加配置文件的全局环境变量:
#Export KRB5_CONFIG=/etc/krb5.conf
#Export KRBT_KDC_PROFILE=/var/kerberos/krb5kdc/kdc.conf
#export KRB5CCNAME=/hadoop/hadoop/krb5cc_pub_$$
export KRB5CCNAME=/hadoop/ker/krb5cc_$UID
最后一行为设定票据的保存目录,如果不设定,则票据保存在/tmp目录下,存在隐患。
保存后执行
Source /etc/profile生效。
配置文件:
Kdc的配置文件有三个:krb5.conf kdc.conf kadm5.acl
其配置步骤如下:
krb5.conf
krb5.conf是核心配置文件,一般位于/etc/文件夹下。其配置参考如下:
[root@namenode Packages]# more /etc/krb5.conf
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
#logging文件的位置
[libdefaults]
default_realm = REALM.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 300d
renew_lifetime = 300d
forwardable = true
#参数配置,需要修改default_realm 这里定义为HADOOP.COM 这个名称
#可以自定,保持一致即可。
由于Hadoop集群一直在运行,所有配置要保证票据的有效期足够长,避免频繁进行kinit授权操作。这里设置为300天,也可以对不同进程在初始化时配置其票据时长
[realms]
REALM.COM = {
# kdc = kerberos.example.com
admin_server = 22.224.41.4
kdc = 22.224.41.4
# admin_server = kerberos.example.com
}
#kdc admin_server的机器名称
[root@namenode Packages]#
krb5.conf文件配置完成后复制到各个客户机的相同目录下。
如果集群开启了selinux,需要执行 restorecon -R -v /etc/krb5.conf
建议关闭selinux。
kdc.conf
kdc.conf的配置,文件位于/var/kerberos/krb5kdc/kdc.conf。这个文件是对KDC服务器的相关配置,只需在KDC服务器上配置。
root@namenode Packages]# more /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
#配置端口,保证与其他服务没有冲突。
[realms]
REALM.COM = {
#master_key_type = aes256-cts
max_life = 300d
max_renewable_life = 300d
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-md5:normal des-cbc-crc:normal
}
#配置realms,只需修改realm的名字即可,其他保持默认。
[root@namenode Packages]#
数据库生成:
kdb5_util create -r REALM.COM -s
会运行一定时间,并会要求输入密码,此密码为数据库管理密码。这个密码如果输入错误(两次不匹配,注意,包括任何按键,比如退格键),那么只能重新执行命令。
完成后检查指定目录下是否存在生成文件,会生成5个文件,一般包括:
kadm5.keytab principal principal.kadm5 principal.kadm5.lock principal.ok
注意:kadm5.keytab 有些版本不会自动生成,此时无法使用kadmin进行管理,会报错。
在通过网络启动管理后台服务(kadmind)之前,需要手动创建一个包含密钥的keytab文件,
需要输入:
kadmin.local:
ktadd -k /var/kerberos/krb5kdc/kadm5.keytab kadmin/admin
ktadd -k /var/kerberos/krb5kdc/kadm5.keytab kadmin/changepw完成kadmin的keytab文件的生成。
这个文件必须保证只有root有读权限。(注意,这里要操作修改内置principal krbtgt的maximum ticket life,可在kadmin命令行下用getprinc命令查看默认的最大时长,否则时长被限制在24小时,并且无法renew)
kadmin.local: addprinc admin/admin@REALM.COM
modprinc -maxrenewlife 300days K/M
modprinc -maxlife 300days K/M
modprinc -maxrenewlife 300days krbtgt/REALM.COM
modprinc -maxlife 300days krbtgt/REALM.COM
退出后,重新启动
service krb5kdc restart
service kadmin restart
kadmind
kinit admin/admin@REALM.COM
配置kadm5.acl
[root@namenode Packages]# more /var/kerberos/krb5kdc/kadm5.acl
*/admin@HADOOP.COM *
[root@namenode Packages]#
#这个文件需要修改realm的名称。
默认为admin用户能够访问和修改数据库文件。
将管理员加入kerberos 的数据库
进入kadmin.local命令模式。
kadmin.local: addprinc admin/admin@REALM.COM
会要求输入密码,输入密码后完成用户添加。
配置启动kerberos服务
输入krb5kdc kadmind,启动服务。
然后初始化:
kinit admin/admin@REALM.COM
输入认证密码后,即可完成初始化,如果不销毁或过期(过期时间在kdc.conf中设置,Hadoop因为24小时运行,这个值要设置成300天),过期前不需要再次输入。
在终端输入:klist 可以看到授权的情况。
建议KDC开机启动服务,加入启动项(这需要预先生产stash文件,位置在kdc.conf文件里边确定):
在终端下输入(需要root权限)
Chkconfig krb5kdc on
Chkconfig kadmin on
查看相关配置:
[root@namenode ~]# chkconfig
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ip6tables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
kadmin 0:off 1:off 2:on 3:on 4:on 5:on 6:off
kprop 0:off 1:off 2:off 3:off 4:off 5:off 6:off
krb5kdc 0:off 1:off 2:on 3:on 4:on 5:on 6:off
lvm2-monitor 0:off 1:on 2:on 3:on 4:on 5:on 6:off
……
……
修正前面的几个文件的SELINUX设置(可选)
#restorecon -R -V /var/kerberos/krb5kdc/
#restorecon -R -V /var/log/
#restorecon -R -V /etc/krb5.conf
6. 关于时间以及tgt目录问题
票据缓存目录:
由/tmp改为/Hadoop/krb目录:
编辑/etc/profile
export KRB5_CONFIG=/yourdir/krb5.conf(可选)
export KRB5_KDC_PROFILE=/yourdir/kdc.conf(可选)
export KRB5CCNAME=/Hadoop/hadoop/krb5cc_$UID
ticket时间问题:
4个要注意:
Krb5.conf中的时间设置
Kdc.conf中的时间设置
krbtgt/REALM.COM@REALM.COM的时间设置
kadmin.local: addprinc admin/admin@REALM.COM
modprinc -maxrenewlife 300days K/M
modprinc -maxlife 300days K/M
modprinc -maxrenewlife 300days krbtgt/REALM.COM
modprinc -maxlife 300days krbtgt/REALM.COM
kinit admin/admin@REALM.COM
ticket lifetime
Kerberos ticket具有lifetime,超过此时间则ticket就会过期,需要重新申请或renew。ticket lifetime取决于以下5项设置中的最小值:
1Kerberos server上/var/kerberos/krb5kdc/kdc.conf中max_life
2内置principal krbtgt的maximum ticket life,可在kadmin命令行下用getprinc命令查看
3你的principal的maximum ticket life,可在kadmin命令行下用getprinc命令查看
4 Kerberos client上/etc/krb5.conf的ticket_lifetime
5 kinit -l 参数后面指定的时间
ticket renew lifetime
ticket过期后,如果想延长,一种方法是重新申请(需要输入密码),另一种是renew(不需要输入密码),每renew一次,就延长一个lifetime。不过renew操作本身也有lifetime,即在ticket renew lifetime,在此lifetime之内,才能进行renew操作。与上面的很相似,ticket renew lifetime取决于5项设置中的最小值:
Kerberos server上/var/kerberos/krb5kdc/kdc.conf中max_renewable_life。
内置principal krbtgt的maximum renewable life,可在kadmin命令行下用getprinc命令查看。
principal的maximum renewable life,可在kadmin命令行下用getprinc命令查看。
Kerberos client上/etc/krb5.conf的renew_lifetime。
kinit -r 参数后面指定的时间。
7. 测试
在客户端kinit admin/admin
添加一个测试principal test
Kinit test
Klist 可以查看test的票据
8. 应用服务器端的配置
保证将集群的所有hosts文件及用户都是一致的。同时时间要与KDC一样。
将KDC的/etc/krb5.conf文件复制到集群的各个机器。
9. 客户端的配置
保证将集群的所有hosts文件及用户都是一致的。同时时间要与KDC一样。
将KDC的/etc/krb5.conf文件复制到集群的各个机器。
机器输入kinit admin/admin,完成初始化。
然后输入kadmin,输入密码,可以进入远程管理模式。
输入klist。查看缓存的票据信息。
[root@data1 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: root/admin@HADOOP.COM
Valid starting Expires Service principal
12/02/16 14:25:18 12/03/16 14:25:17 krbtgt/HADOOP.COM@HADOOP.COM
renew until 12/02/16 14:25:18
kinit, klist, and kdestroy
如果客户机需要访问不同的远程主机,则在KDC中将转发设置为true。
10. Hadoop(HDP)集群配置
HDP中用户principal名称以及keytab的定义:
使用已经安装好的MIT kerberos系统,系统配置要保存。
确认具有kdc的admin用户及权限
确认JCE policy已经部署
确认所有客户端可以直接连接,时间同步。
使用ambari平台部署kerberos,在部署过程中会生成不同组件的principal以及keytab。
安装过程根据ambari的页面的指示进行操作,注意在实施时需要填写已经安装的KDC的相关用户名和密码,REALM等。
需要追加修改相关的时间参数。
HDP使用ambari部署时会删除yarn的log。
完成部署后需要检查krb5.的配置和KDC的配置中krbtgt的时间参数:
进入kadmin.local :getprinc krbtgt
Lifetime和renewtime都没变,则初始化各个主机,如果时间改变,则重新配置其时间为300d,然后进行初始化。
11. 安装完成后用户操作说明:
使用一个具有访问相应keytab权限的用户执行:
例如,在某台datanode上面,要初始化,使用一个用户,具有对datanode的keytab的读取权限,一般来说是hdfs用户,使用hdfs用户,在终端输入:
kinit -kt /etc/security/keytabs/dn.service.keytab dn/hostname
klist
查看票据的信息。
如果是hive用户,则对hive对应服务和客户端的keytab有读取权限,所有在使用hive用户的时候,在终端输入:
kinit -kt /etc/security/keytabs/ spnego.service.keytab HTTP/hostname
相关用户及principal和keytab对应见前面10中的对应表格。
或者对应下表。
取得票据后,即可进行业务操作。注意部分脚本需要修改后才能在部署认证的服务器上运行。
注意:
kerberos不建议使用多用户,但hadoop用户账号众多,kerberos对不同用户是严格区分的,不同的用户有不同的票据,票据不能通用。所以当切换用户后,如果是第一次使用这个用户进行操作,需要进行这个用户的kerberos的认证工作。也就是进行kinit,取得用户合法票据后,才可以使用相应的服务。如果没有进行初始化或没有成功取得认证的票据,则对Hadoop集群的操作会失败,出现连接错误。
为了保证Hadoop集群的连续运行不受影响,设置了票据的有效期为300天,也就是每个用户在取得票据的情况下,在300天内可以不要再次进行初始化认证,但是当系统票据被删除的时候,则用户的认证会失败,需要重新进行初始化认证,这有可能会造成某些自动化的脚本的失效或者任务运行失败。
某些脚本的编写是按照没有认证的方式编写的,在启用验证的集群里,建议重新测试并完善脚本,使脚本适合认证集群环境。
12. 相关命令说明:
(一) Kadmin
kadmin: ?
Available kadmin requests:
add_principal, addprinc, ank
Add principal
delete_principal, delprinc
Delete principal
modify_principal, modprinc
Modify principal
rename_principal, renprinc
Rename principal
change_password, cpw Change password
get_principal, getprinc Get principal
list_principals, listprincs, get_principals, getprincs
List principals
add_policy, addpol Add policy
modify_policy, modpol Modify policy
delete_policy, delpol Delete policy
get_policy, getpol Get policy
list_policies, listpols, get_policies, getpols
List policies
get_privs, getprivs Get privileges
ktadd, xst Add entry(s) to a keytab
ktremove, ktrem Remove entry(s) from a keytab
lock Lock database exclusively (use with extreme caution!)
unlock Release exclusive database lock
purgekeys Purge previously retained old keys from a principal
get_strings, getstrs Show string attributes on a principal
set_string, setstr Set a string attribute on a principal
del_string, delstr Delete a string attribute on a principal
list_requests, lr, ? List available requests.
quit, exit, q Exit program.
kadmin:
kadmin: listprincs
K/M@HADOOP.COM
admin/admin@HADOOP.COM
host/namenode.localdomain@HADOOP.COM
kadmin/admin@HADOOP.COM
kadmin/changepw@HADOOP.COM
kadmin/namenode.localdomain@HADOOP.COM
krbtgt/HADOOP.COM@HADOOP.COM
root/admin@HADOOP.COM
kadmin:
(二) Klist
[root@namenode krb5kdc]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/admin@HADOOP.COM
Valid starting Expires Service principal
12/05/16 08:36:57 12/06/16 08:36:57 krbtgt/HADOOP.COM@HADOOP.COM
renew until 12/05/16 08:36:57
[root@namenode krb5kdc]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/admin@HADOOP.COM
Valid starting Expires Service principal
12/05/16 08:36:57 12/06/16 08:36:57 krbtgt/HADOOP.COM@HADOOP.COM
renew until 12/05/16 08:36:57
[root@namenode krb5kdc]# klist -kt
[root@namenode ~]# klist -kt
Keytab name: FILE:/etc/krb5.keytab
KVNO Timestamp Principal
---- ----------------- --------------------------------------------------------
2 12/02/16 13:30:21 host/data1.localdomain@HADOOP.COM
2 12/02/16 13:30:21 host/data1.localdomain@HADOOP.COM
2 12/02/16 13:30:21 host/data1.localdomain@HADOOP.COM
2 12/02/16 13:30:21 host/data1.localdomain@HADOOP.COM
2 12/02/16 13:30:21 host/data1.localdomain@HADOOP.COM
2 12/02/16 13:30:21 host/data1.localdomain@HADOOP.COM
3 12/05/16 09:38:49 host/namenode.localdomain@HADOOP.COM
3 12/05/16 09:38:49 host/namenode.localdomain@HADOOP.COM
3 12/05/16 09:38:49 host/namenode.localdomain@HADOOP.COM
3 12/05/16 09:38:49 host/namenode.localdomain@HADOOP.COM
3 12/05/16 09:38:49 host/namenode.localdomain@HADOOP.COM
3 12/05/16 09:38:49 host/namenode.localdomain@HADOOP.COM
3 12/05/16 09:39:33 host/data1.localdomain@HADOOP.COM
3 12/05/16 09:39:33 host/data1.localdomain@HADOOP.COM
3 12/05/16 09:39:33 host/data1.localdomain@HADOOP.COM
3 12/05/16 09:39:33 host/data1.localdomain@HADOOP.COM
3 12/05/16 09:39:33 host/data1.localdomain@HADOOP.COM
3 12/05/16 09:39:33 host/data1.localdomain@HADOOP.COM
4 12/05/16 15:19:14 host/namenode.localdomain@HADOOP.COM
4 12/05/16 15:19:14 host/namenode.localdomain@HADOOP.COM
4 12/05/16 15:19:14 host/namenode.localdomain@HADOOP.COM
4 12/05/16 15:19:14 host/namenode.localdomain@HADOOP.COM
4 12/05/16 15:19:14 host/namenode.localdomain@HADOOP.COM
4 12/05/16 15:19:14 host/namenode.localdomain@HADOOP.COM
2 12/05/16 15:22:21 ssh/namenode.localdomain@HADOOP.COM
2 12/05/16 15:22:21 ssh/namenode.localdomain@HADOOP.COM
2 12/05/16 15:22:21 ssh/namenode.localdomain@HADOOP.COM
2 12/05/16 15:22:21 ssh/namenode.localdomain@HADOOP.COM
2 12/05/16 15:22:21 ssh/namenode.localdomain@HADOOP.COM
2 12/05/16 15:22:21 ssh/namenode.localdomain@HADOOP.COM
5 12/05/16 21:09:24 host/namenode.localdomain@HADOOP.COM
5 12/05/16 21:09:24 host/namenode.localdomain@HADOOP.COM
5 12/05/16 21:09:24 host/namenode.localdomain@HADOOP.COM
5 12/05/16 21:09:24 host/namenode.localdomain@HADOOP.COM
5 12/05/16 21:09:24 host/namenode.localdomain@HADOOP.COM
5 12/05/16 21:09:24 host/namenode.localdomain@HADOOP.COM
2 12/05/16 21:09:31 ftp/namenode.localdomain@HADOOP.COM
2 12/05/16 21:09:31 ftp/namenode.localdomain@HADOOP.COM
2 12/05/16 21:09:31 ftp/namenode.localdomain@HADOOP.COM
2 12/05/16 21:09:31 ftp/namenode.localdomain@HADOOP.COM
2 12/05/16 21:09:31 ftp/namenode.localdomain@HADOOP.COM
2 12/05/16 21:09:31 ftp/namenode.localdomain@HADOOP.COM
3 12/06/16 13:47:35 ftp/namenode.localdomain@HADOOP.COM
3 12/06/16 13:47:35 ftp/namenode.localdomain@HADOOP.COM
3 12/06/16 13:47:35 ftp/namenode.localdomain@HADOOP.COM
3 12/06/16 13:47:35 ftp/namenode.localdomain@HADOOP.COM
3 12/06/16 13:47:35 ftp/namenode.localdomain@HADOOP.COM
3 12/06/16 13:47:35 ftp/namenode.localdomain@HADOOP.COM
2 12/06/16 14:11:03 vsFTPd/namenode.localdomain@HADOOP.COM
2 12/06/16 14:11:03 vsFTPd/namenode.localdomain@HADOOP.COM
2 12/06/16 14:11:03 vsFTPd/namenode.localdomain@HADOOP.COM
2 12/06/16 14:11:03 vsFTPd/namenode.localdomain@HADOOP.COM
2 12/06/16 14:11:03 vsFTPd/namenode.localdomain@HADOOP.COM
2 12/06/16 14:11:03 vsFTPd/namenode.localdomain@HADOOP.COM
[root@namenode ~]#
(三) Kdestroy
销毁凭证,再次进入认证模式需要输入认证密码并重新初始化:
[root@namenode krb5kdc]# kdestroy
[root@namenode krb5kdc]# klist
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)
[root@namenode krb5kdc]#
(四) kinit
kinit -k -t /etc/security/keytabs/dn.service.keytab dn/hostname@REALM.COM
初始化,取得票据
Kinit -R 更新票据的日期,延长使用时间。
kinit -l 100d -r 100d my_principal
可以设定票据过期时长,这里是100天
(五) kdb5_util
kdb5_util create -r REALM.COM -s
创建数据库
13. 关键参数说明:
关键文件及位置:
krb5.conf
krb5.keytab
位于:/etc/
kdc.conf
kadmin5.acl
位于:/var/kerberos/krb5kdc
drwxr-xr-x 3 root root 4096 Nov 28 09:31 ..
-rw------- 1 root root 71 Dec 1 14:00 .k5.HADOOP.COM
-rw------- 1 root root 0 Dec 1 13:20 principal.kadm5.lock
-rw------- 1 root root 0 Dec 6 14:11 principal.ok
-rw------- 1 root root 24576 Dec 6 14:11 principal
-rw------- 1 root root 67 Dec 1 09:48 .k5.HADOOP
-rw------- 1 root root 404 Nov 28 10:29 kdc.conf
-rw------- 1 root root 21 Nov 28 10:27 kadm5.acl
-rw------- 1 root root 8192 Dec 6 14:10 principal.kadm5
-rw------- 1 root root 1 Dec 5 13:19 slave_datatrans.dump_ok
-rw-r--r-- 1 root root 71 Dec 5 12:11 kpropd.acl.old
-rw------- 1 root root 1160 Dec 5 13:47 kadm5.keytab
-rw------- 1 root root 11504 Dec 5 13:19 slave_datatrans
drwxr-xr-x 2 root root 4096 Dec 5 13:57 .
角色:
三种:KDC、APP server 、client
服务生成顺序:
A. 在kdc生成principal。
B. 然后在服务提供主机上生成keytab,并导出到本地。
C. 在KDC主机上生成服务提供主机的keytab,并导出到KDC的本地。
例如:
在KDC增加服务的principal,并且导出生成server自己的钥匙
server#kadmin
kadmin:addprinc -randkey host/server.example.com #krb5-telnet和ssh的principal都是host
kadmin:addprinc -randkey ftp/server.example.com #gssftp 的principal是ftp
导出到本地
kadmin:ktadd -k /etc/krb5.keytab host/server.example.com
kadmin:ktadd -k /etc/krb5.keytab ftp/server.example.com
检查防火墙和selinux
因为要做双向验证,所以我们在kdc上也把sshd服务注册一下,登录到kdc.example.com
#kadmin.local
kadmin.local:addprinc -randkey host/server.example.com
kadmin.local:ktadd -k /etc/krb5.conf host/server.example.com
检查防火墙和selinux
Keytab 文件
Kerberos server需要keytab文件作为KDC认证的凭证,此文件只有使用的用户具有读取权限。
Principal:
在Kerberos中,Principal是参加认证的基本实体。
一般来说有两种,一种用来表示Kerberos数据库中的用户, 另一种用来代表某一特定主机。简单来说, Principal是用来表示客户端和服务端身份的实体。
Principal是由三个部分组成:名字(name),实例(instance),REALM(域)。比如一个标准的 Kerberos的用户是:name/instance@REALM。
Name:第一部分。在代表客户方的情况,它是一个用户名;在代表主机的情况,它是写成host。
Instance:第二部分。对name的进一步描述,例如name所在的主机名或name的类型等,可省略。它与第一部分之间用‘ / ’分隔,但是作为主机的描述时写成host/Instance。
Realm:第三部分。是Kerberos在管理上的划分,在 KDC中所负责的一个域数据库称作为Realm。
举例如下: 格式为:name/instance@REALM。
kadmin: listprincs
K/M@HADOOP.COM
admin/admin@HADOOP.COM ………… admin=NAME,用户名。Admin=instance,对name的描述。第三部分为realm的名称。
hdfs/data1.localdomain@HADOOP.COM
hdfs/data2.localdomain@HADOOP.COM
hdfs/namenode.localdomain@HADOOP.COM
host/data1.localdomain@HADOOP.COM…………代表主机的时候,name为host,
host/data2.localdomain@HADOOP.COM
host/namenode.localdomain@HADOOP.COM
kadmin/admin@HADOOP.COM
kadmin/changepw@HADOOP.COM
krbtgt/HADOOP.COM@HADOOP.COM
mapred/data1.localdomain@HADOOP.COM
mapred/data2.localdomain@HADOOP.COM
mapred/namenode.localdomain@HADOOP.COM
部分默认参数:
ticket_lifetime (duration string.) Sets the default lifetime for initial ticket requests. The default value is 1 day.
renew_lifetime (duration string.) Sets the default renewable lifetime for initial ticket requests. The default value is 0.
max_renewable_life (duration string.) Specifies the maximum time period during which a valid ticket may be renewed in this realm. The default value is 0.
max_life (duration string.) Specifies the maximum time period for which a ticket may be valid in this realm. The
default value is 24 hours.
The keytab file
All Kerberos server machines need a keytab file to authenticate to the KDC. By default on UNIX-like systems this file
is named DEFKTNAME. The keytab file is an local copy of the host’s key. The keytab file is a potential point of entry for a break-in, and if compromised, would allow unrestricted access to its host. The keytab file should be readable only
by root, and should exist only on the machine’s local disk. The file should not be part of any backup of the machine,unless access to the backup data is secured as tightly as access to the machine’s root password.
In order to generate a keytab for a host, the host must have a principal in the Kerberos database. The procedure for adding hosts to the database is described fully in Adding, modifying and deleting principals. (See Create host keytabs
for slave KDCs for a brief description.) The keytab is generated by running kadmin and issuing the ktadd command.
For example, to generate a keytab file to allow the host trillium.mit.edu to authenticate for the services host,
ftp, and pop, the administrator joeadmin would issue the command (on trillium.mit.edu):
trillium% kadmin
kadmin5: ktadd host/trillium.mit.edu ftp/trillium.mit.edu
pop/trillium.mit.edu
kadmin: Entry for principal host/trillium.mit.edu@ATHENA.MIT.EDU with
kvno 3, encryption type DES-CBC-CRC added to keytab
FILE:/etc/krb5.keytab.
kadmin: Entry for principal ftp/trillium.mit.edu@ATHENA.MIT.EDU with
kvno 3, encryption type DES-CBC-CRC added to keytab
FILE:/etc/krb5.keytab.
kadmin: Entry for principal pop/trillium.mit.edu@ATHENA.MIT.EDU with
kvno 3, encryption type DES-CBC-CRC added to keytab
FILE:/etc/krb5.keytab.
kadmin5: quit
trillium%
安装过程中相关错误提示:
在安装过程中,配置文件的增加或修改都可能引起错误,错误提示并不能具体说明原因。具体原因要具体分析。
[root@namenode krb5kdc]# kprop -f slave_datatrans data1.localdomain
kprop: Server rejected authentication (during sendauth exchange) while authenticating to server
Generic remote error: Key version number for principal in key table is incorrect
kprop: Server rejected authentication (during sendauth exchange) while authenticating to server
Make sure that:
1. The time is synchronized between the master and slave KDCs.
2. The master stash file was copied from the master to the expected location on the slave.
3. The slave has a keytab file in the default location containing a host principal for the slave’s hostname.
14. 6台测试机
KDC server : 20.200.40.200 cluster5
REALM: REALM.COM REALM.COM
REALM.COM
PORT: 11899
Kerberos已经安装了 而且都装了服务器及客户机
[root@Cluster2 ~]# rpm -aq krb*
…………
[root@Cluster2 ~]#
JCE已经安装了
[root@Cluster4 security]# ll
total 164
-rw-r--r-- 1 root root 4054 Sep 23 12:20 blacklist
-rw-r--r-- 1 root root 1273 Sep 23 12:20 blacklisted.certs
-rw-r--r-- 1 root root 112860 Sep 23 12:20 cacerts
-rw-r--r-- 1 root root 2466 Sep 23 12:20 java.policy
-rw-r--r-- 1 root root 27358 Sep 23 12:20 java.security
-rw-r--r-- 1 root root 98 Sep 23 12:20 javaws.policy
-rw-r--r-- 1 root root 3405 Sep 23 12:31 local_policy.jar
-rw-r--r-- 1 root root 0 Sep 23 12:20 trusted.libraries
-rw-r--r-- 1 root root 2920 Sep 23 12:31 US_export_policy.jar
[root@Cluster4 security]# pwd
/usr/java/jdk1.8.0_112/jre/lib/security
[root@Cluster4 security]#
配置KDC
[root@Cluster5 krb5kdc]# more kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
REALM.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
max_renewable_life = 7d
max_life = 5d
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-md5:normal des-cbc-crc:norm
al
}
[root@Cluster5 krb5kdc]#
配置krb5.conf
[root@Cluster5 etc]# more 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 = REALM.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 5d
renew_lifetime = 7d
forwardable = true
[realms]
REALM.COM = {
kdc = Cluster5
admin_server = Cluster5
# admin_server = kerberos.example.com
}
[root@Cluster5 etc]#
序号 cluster cluster1 cluster2 cluster3 cluster4 cluster5
1 App Timeline Server DataNode DataNode DataNode DataNode DataNode
2 DataNode HCat Client HCat Client HCat Client HCat Client HCat Client
3 HCat Client HDFS Client HDFS Client HDFS Client HDFS Client HDFS Client
4 HDFS Client Hive Client Hive Client Hive Client Hive Client Hive Client
5 History Server Hive Metastore MapReduce2 Client MapReduce2 Client MapReduce2 Client MapReduce2 Client
6 Hive Client HiveServer2 Metrics Collector Metrics Monitor Metrics Monitor Metrics Monitor
7 MapReduce2 Client MapReduce2 Client Metrics Monitor NodeManager NodeManager NodeManager
8 Metrics Monitor Metrics Monitor NodeManager Pig Pig Pig
9 NameNode NodeManager Pig Spark Client Spark Client Spark Client
10 NodeManager Pig Spark Client Tez Client Tez Client Tez Client
11 Pig SNameNode Tez Client YARN Client YARN Client YARN Client
12 ResourceManager Spark Client YARN Client ZooKeeper Client ZooKeeper Client ZooKeeper Client
13 Spark Client Tez Client ZooKeeper Client ZooKeeper Server
14 Spark History Server WebHCat Server ZooKeeper Server
15 Tez Client YARN Client
16 YARN Client ZooKeeper Client
17 ZooKeeper Client ZooKeeper Server
18 ZooKeeper Server
Name Value
Ambari Metrics User ams
Smoke User ambari-qa
Hadoop Group hadoop
HDFS User hdfs
Proxy User Group users
HAWQ Admin User gpadmin
HBase User hbase
HCat User hcat
Hive User hive
WebHCat User hcat
Infra Solr User infra-solr
Livy Group livy
Livy User livy
Mapreduce User mapred
Ranger Group ranger
Ranger User ranger
Spark Group spark
Spark User spark
Spark Group spark
Spark User spark
Tez User tez
Yarn User yarn
zeppelin_group zeppelin
zeppelin_user zeppelin
ZooKeeper User zookeeper