目录
一、安装前需知
二、安装前准备
三、安装步骤
1.NTP时钟同步
2.目录设置
3.配置hosts
4.安装软件
5.主kdc节点创建realm
6.启动服务
7.从KDC节点配置(同步配置文件)
8.主从同步
9.hadoop客户端节点配置
10.快速测试
四、添加用户和生成认证文件
五、问题处理
1、我们安装的方案为kerberos5解决方案,所以我们所有的KDC 都能够处理 Kerberos 5 客户端,不考虑kerberos4兼容性。
2、在选择运行 Kerberos KDC 的部署平台时,真正需要考虑的是可靠性。安装KDC的操作系统需要考虑磁盘布局问题。我们强烈建议使用一个单独的磁盘(或者更好的选择,使用一组 RAID 磁盘)来存放 Kerberos数据库,以及使用一个单独的分区来存放所有日志文件。将日志文件保存在单独的分区中,可以防止有意或无意的日志文件溢出影响到系统或 Kerberos 数据库分区。
3、如果你正在建立一个新的 Kerberos realm,那么首先需要为你的 KDC 选择一个 Kerberos 实现。Kerberos KDC 实现不能混合,例如,MIT Kerberos KDC 不能对 Windows 域控制器进行复制。另外,各类 Kerberos 实现使用了不同管理协议。也就是说,MIT KDC 中包含的管理接口不能用于向 Heimdal KDC 添加用户,反之亦然。
4、MIT KDC、Heimdal KDC:MIT Kerberos 包含对标准 Kerberos 加密类型的支持,特别是单DES和三重DES的支持。MIT 是一个很好的选择,因为它具有广泛的支持和应用程序兼容性。Heimdal不受出口法规的约束所以如果你打算为你的 KDC 使用 Unix 类型的主机,Heimdal 是一个不错的选择。
5、构建MIT KDC安装包:有两种方法可以安装它:从源代码构建或者从 Unix 供应商那里获得二进制发行版。至于 Linux 的话,许多流行的 Linux 发行版都有预构建 MIT Kerberos 5 的二进制包。
操作系统:CentOS Linux release 7.4.1708 (Core)
机器分配:(以下两台主从都不在hadoop上,也可以放在hadoop节点上;客户端装在hadoop机器上)
192.168.0.49 主KDC kdc kadmin,服务端
192.168.0.114 从KDC
需要kerberos认证的hadoop机器需安装kdc客户端
安装kerberos版本:Linux 预构建 MIT Kerberos 5 的二进制包 rpm
请参考我另一篇笔记linux时间同步配置
kerberos 配置文件目录:/export/common/kerberos5/
kerberos 日志目录:/export/logs/kerberos5/
所有kdc主从或应用相关机器hosts加入以下两列,具体IP和hostname根据现场情况确定:
$ sudo vi /etc/hosts
192.168.0.49 v0106-c0a80073.4eb06.c.local
192.168.0.114 v0106-c0a80072.4eb06.c.local
192.168.0.25 v0106-c0a80049.4eb06.c.local
... ...
所有主从kdc节点都执行以下操作:
yum -y install krb5-server krb5-libs krb5-workstation
或者:
rpm -ivh krb5-libs-1.15.1-37.el7_6.x86_64.rpm
rpm -ivh libkadm5-1.15.1-37.el7_6.x86_64.rpm
rpm -ivh krb5-server-1.15.1-37.el7_6.x86_64.rpm
rpm -ivh krb5-workstation-1.15.1-37.el7_6.x86_64.rpm
所有kdc客户端都执行以下操作:
yum -y install krb5-libs krb5-workstation
或者:
rpm -ivh krb5-libs-1.15.1-37.el7_6.x86_64.rpm
rpm -ivh libkadm5-1.15.1-37.el7_6.x86_64.rpm
rpm -ivh krb5-workstation-1.15.1-37.el7_6.x86_64.rpm
注意:yum时kerberos版本问题,实验中用yum安装的krb5版本为1.15.1-18.el7_6时,有bug,后换成1.15.1-37.el7_6,下载rpm包后可以了。
1) 配置 kerberos 配置文件 :krb5.conf
$ vi /etc/krb5.conf
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/export/logs/kerberos5/krb5libs.log
kdc = FILE:/export/logs/kerberos5/krb5kdc.log
admin_server = FILE:/export/logs/kerberos5/kadmind.log
[libdefaults]
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 7d
renew_lifetime = 7d
forwardable = true
udp_preference_limit = 1
# rdns = false
default_realm = HADOOP.COM
# default_ccache_name = KEYRING:persistent:%{uid}
default_tkt_enctypes = des-cbc-md5 des-cbc-crc des3-cbc-sha1
default_tgs_enctypes = des-cbc-md5 des-cbc-crc des3-cbc-sha1
permitted_enctypes = des-cbc-md5 des-cbc-crc des3-cbc-sha1
[realms]
HADOOP.COM = {
kdc = 192.168.0.49:88
admin_server = 192.168.0.49
kdc = 192.168.0.114:88
admin_server = 192.168.0.114
default_domain = HADOOP.COM
}
[domain_realm]
.hadoop.com = HADOOP.COM
hadoop.com = HADOOP.COM
说明:
[logging]:表示 server 端的日志的打印位置
[libdefaults]:每种连接的默认配置
default_realm = HADOOP.ROCK:设置 Kerberos 应用程序的realm。
ticket_lifetime: 凭证生效的时限,设置为7天。
renew_lifetime: 凭证最长可以被延期的时限,一般为7天。当凭证过期之后,对安全认证的服务的后续访问则会失败。
forwardable:是否允许转发
renewable:是否允许票据延迟
udp_preference_limit = 1 禁止使用udp可以防止一个Hadoop中的错误
[realms]:列举使用的 realm域。
kdc:代表要 kdc 的位置。格式是 机器:端口
admin_server:代表 admin 的位置。格式是 机器:端口
[domain_realm]:realm域和域名的映射。
2) 配置KDC 配置文件,kdc.conf
$ vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
HADOOP.COM = {
#master_key_type = aes256-cts
master_key_type = des3-hmac-sha1
acl_file = /export/common/kerberos5/kadm5.acl
dict_file = /export/common/kerberos5/words
admin_keytab = /export/common/kerberos5/kadm5.keytab
database_name = /export/common/kerberos5/principal
key_stash_file = /export/common/kerberos5/stash
# supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
supported_enctypes = des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
default_principal_flags = +preauth
说明
HADOOP. COM:是设定的realms
max_renewable_life = 7d 涉及到是否能进行ticket的renew必须配置。#master_key_type:和supported_enctypes默认使用aes256-cts。
master_key_type:和supported_enctypes默认使用aes256-cts。此处不建议使用,因为JAVA8使用aes256-cts验证方式需要安装额外的jar包。
acl_file:标注了admin的用户权限。文件格式是 :Kerberos_principal permissions [target_principal] [restrictions]支持通配符等。admin_keytab:KDC进行校验的keytab。
admin_keytab:KDC进行校验的keytab。
supported_enctypes:支持的校验方式。
default_principal_flags:指定在此realm中创建principal时的默认属性。可指定多个默认属性字段,每个字段用逗号隔开; +: 表示启用, -:禁用。默认启用的属性: postdateable, forwardable, tgt-based, renewable,proxiable, dup-skey,allow-tickets, 和service
preauth:如果在客户端主体上启用了此标志,则需要该主体在接收任何票据之前对KDC进行预认证。在服务主体上,启用此标志意味着该主体的服务票证将只颁发给具有已设置预验证位的TGT的客户端。
3) 配置acl 文件
$ cp /var/kerberos/krb5kdc/kadm5.acl /export/common/kerberos5/
$ vim /export/common/kerberos5/kadm5.acl
4) 初始化realm
用户Key等重要信息都存储在KDC数据库中。配置一个全新的KDC需要初始化KDC数据库,并设置KDC数据库的master密码。密码设置为:datalink_test
$ kdb5_util create -r HADOOP.COM -s
现在已经初始化realm,并且已经创建了一些基本的主体。看看kdb5_util为我们创建了什么: $ ls -a /var/kerberos/krb5kdc/
principal 和 principal.ok 文件是我们的 Kerberos 数据库文件。principal.kadm5 和 principal.kadm5.lock 文件分别是 Kerberos 管理数据库和管理数据库锁文件。最后的 .k5.HADOOP.COM 文件是我们的通过在 kdb5_util 中添加 -s 选项创建的贮藏文件。
来看看 kdb5_util 为我们创建了什么主体。我们将使用的程序是kadmin.local。kadmin 是 Kerberos 数据库的管理接口;在kadmin中,Kerberos管理员可以添加主体、修改主体、删除主体、更改密码和进行其他管理任务。因为现在我们还没有添加任何主体,更不用说管理主体了,所以我们必须使用 kadmin.local 访问我们新创建的数据库。执行命令:$ kadmin.local。一旦进入 kadmin.local,我们就可以列出目前我们的 KDC 存在中的主体。
5) 向KDC添加一个管理主体用户admin
现在我们将创建一个管理主体。具有管理特权的主体的传统命名方案,是管理员的用户名加上 admin 实例部分。因此,如果你的普通用户名是 admin,那么你的管理主体就是 admin/admin。下面的 kadmin 命令将向你的 KDC 添加一个名为 admin/admin 的主体,此处密码设置为了‘admin’。
$ kadmin.local
$ kadmin.local: addprinc admin/[email protected]
附加命令:
1)查看用户
listprincs
2)添加用户
addprinc
-randkey 随机设置密码
3)删除用户
delprinc admin/[email protected]
4)远程连接 kadmin
$ sudo kadmin -p admin/admin
addprinc -randkey hdfs/[email protected]
在主 KDC 上运行 krb5kdc 和 kadmind 进程,命令如下:
$ systemctl start/restart/status krb5kdc (第一次启动用start)
$ systemctl start/restart/status kadmin (第一次启动用start)
或者:
$ cd /usr/sbin & krb5kdc
$ cd /usr/sbin & kadmind
把kdc master节点配置拷贝到slave节点(从192.168.0.49复制到192.168.0.114),在主节点192.168.0.49上执行以下命令:
$ scp -P 51888 /etc/krb5.conf [email protected]:/etc/krb5.conf
$ scp -r -P 51888 /var/kerberos/krb5kdc [email protected]:/var/kerberos/
$ scp -P 51888 /export/common/kerberos5/kadm5.acl [email protected]:/export/common/kerberos5/
$ scp -P 51888 /export/common/kerberos5/kadm5.keytab [email protected]:/export/common/kerberos5/
从KDC节点用来同步主KDC的数据库并响应客户端请求。原理是:从 KDC 具有 Kerberos 数据库的只读副本。所有更新都必须通过主 KDC 。在推送(push)模型中,更新被定期分发到从 KDC。在主 KDC 上运行的 cron 作业,定期通过加密的、经过身份验证的连接,将 Kerberos 数据库的完整副本发送到从 KDC。
1)创建kpropd.acl
只需要在每个从 KDC 的 kpropd.acl 文件中列出主 KDC 的主机主体。但是,将所有的 KDC 都列在这个文件中,是一个很好的策略,这样在主 KDC 发生故障、长时间不可用的情况下,让另一个 KDC 临时成为主 KDC,会比较容易。
vim /var/kerberos/krb5kdc/kpropd.acl
host/[email protected]
host/[email protected]
接下来,在每个 KDC 的 /etc/inetd.conf 文件中创建一个条目,以便监听到 Kerberos 数据库传播服务的连接。在每个 KDC 中插入如下的条目,并根据需要更改程序路径:
krb5_prop stream tcp nowait root /usr/local/sbin/kpropd kpropd
确保在 /etc/services 文件中有 krb5_prop 条目。如果条目不存在,请在 /etc/services 文件中添加以下行:
krb5_prop 754/tcp
在修改 inetd.conf 文件之后,重新启动 inetd,使得更改生效。
2)启动kpopd服务,并加入系统自启动
systemctl enable kprop
systemctl start kprop
systemctl status kprop
3)同步数据
现在我们有 ACL 文件了,可以继续转储数据库,并将副本发送到从 KDC。在主 KDC 上执行的以下命令,这将创建 Kerberos 数据库的副本,然后将该副本发送到从 KDC:
master# kdb5_util dump /var/kerberos/krb5kdc/master.dump
master# kprop -f /var/kerberos/krb5kdc/master.dump v0106-c0a80072.4eb06.c.local
Database propagation to slave.wedgie.org: SUCCEEDED
如果您收到的不是上述的成功信息,而是错误信息,请检查机器的主机名和DNS名称是否匹配,每个KDC上是否已经创建了具有相应的主机主体的 keytab,并且从 KDC 上的 ACL 文件是否列出了其他 KDC 的主机主体。
4)定期同步配置
现在是最后一步。虽然我们已经成功地通过网络将主 KDC 的数据库传输到一个从 KDC 上,但是如果我们希望这个过程定期发生,就需要将其自动化。为此,我们需要创建一个 cron 作业,它将转储 Kerberos 数据库并将其分发给从 KDC。下面是执行此任务的示例 shell 脚本:
#!/bin/sh
# Distribute KDC database to slave servers
# Created by Jason Garman for use with MIT Kerberos 5
# Configurables
slavekdcs="v0106-c0a80072.4eb06.c.local 其他slave hosts"
krb5prefix="/usr/local"
slavedata=/var/krb5kdc/slavedata"
success=1
${krb5prefix}/sbin/kdb5_util dump ${slavedata}
error=$?
if [ $error -ne 0 ]
then
echo "Kerberos database dump failed with exit code $error. Exiting."
exit 1
fi
for kdc in $slavekdcs
do
${krb5prefix}/sbin/kprop -f ${slavedata} ${kdc}
error=$?
if [ $error -ne 0 ]
then
echo "Propagation of database to host ${kdc} failed with exit code $error."
echo "Continuing with other slave servers."
success=0
fi
done
if [ $success -eq 1 ]
then
echo "Kerberos database successfully replicated to all slaves."
fi
最后,将这个 shell 脚本放在主 KDC 的 crontab 中,以便定期执行。数据库间复制的典型时间间隔是一个小时。
步骤同第7节
测试示例1:认证用户-kinit获取 admin/[email protected] 主体的票据(不用keytab):
$ kinit admin/admin
之后键入密码admin即可成功。
测试示例2:示例1的另一种写法(用keytab),在主KDC节点执行以下命令:
$ admin.local
$ kadmin.local:ktadd admin/admin(krb5.keytab会生成在/etc/下)
或
$ kadmin.local:ktadd -k /export/common/kerberos5/kadm5.keytab admin/admin(kadm5.keytab会生成在/export/common/kerberos5/下)
或
$ kadmin.local:xst -k /export/common/kerberos5/kadm5.keytab admin/[email protected]
ktadd命令和xst命令均可以生成同步账号的keytab文件,默认文件生成/etc/krb5.keytab下,生成多个账号则在krb5.keytab基础上追加。在主节点生成keytab文件后,记得拷贝到从节点:
$ scp -P 51888 /export/common/kerberos5/kadm5.keytab [email protected]:/export/common/kerberos5/
$ kinit -kt /export/common/kerberos5/kadm5.keytab admin/admin(可以所有节点执行)
执行成功,说明kerberos服务已安装配置成功。
1、在KDC中添加需要认证的用户具体用户看情况而定(hadoop集群主要由hdfs管理,所以除了建hdfs账户还有HTTP账户,另外还有hive、hbase、dwetl也会访问hadoop集群。如有别的用户可用这种方式另行添加,最后如下图:)
格式为:用户名/主机[email protected]
kadmin.local -q "addprinc -randkey HTTP/[email protected]"
kadmin.local -q "addprinc -randkey hive/[email protected]"
kadmin.local -q "addprinc -randkey hbase/[email protected]"
kadmin.local -q "addprinc -randkey hdfs/[email protected]"
kadmin.local -q "addprinc -randkey presto/[email protected]"
kadmin.local -q "addprinc -randkey dwetl/[email protected]"
2、按用户批量生成 keytab
kadmin.local -q "xst -k /export/common/kerberos5/hdfs.keytab HTTP/[email protected]"
kadmin.local -q "xst -k /export/common/kerberos5/hive.keytab hive/[email protected]"
kadmin.local -q "xst -k /export/common/kerberos5/hbase.keytab hbase/[email protected]"
kadmin.local -q "xst -k /export/common/kerberos5/hdfs.keytab hdfs/[email protected]"
kadmin.local -q "xst -k /export/common/kerberos5/presto-server.keytab presto/[email protected]"
kadmin.local -q "xst -k /export/common/kerberos5/dwetl.keytab dwetl/[email protected]"
会在当前 /export/common/kerberos5目录生成 相应用户的keytab 文件。再将 hadoop.keytab 分发到每台机器,包括从kdc和客户端(注意:分发后,由于是不同用户访问keytab,要给keytab文件赋相应权限)。
示例:测试在主kdc执行以下命令把hdfs的kertab同步到192.168.0.58的kdc客户端上:
scp -P 51888 /export/common/kerberos5/hdfs.keytab [email protected]:/export/common/kerberos5/
把hdfs.keytab拷贝到58上后再给keytab文件赋权chown hdfs:hadoop hdfs.keytab,便可以供hdfs用户使用。其他用户类似。也可以使用cd /export/common/kerberos5 && scp -P 51888 hdfs.keytab hive.keytab dwetl.keytab hbase.keytab [email protected]:/export/common/kerberos5/把所有用户一次性拷贝。
1、命令$ kadmin.local后,报错如下:
Authenticating as principal root/[email protected] with password.
kadmin.local: Cannot open DB2 database '/var/kerberos/krb5kdc/principal': No such file or directory while initializing kadmin.local interface。
解决:最后发现是kdb5_util create时两次密码不一样,重新初始化:kdb5_util create -r HADOOP.COM -s
2、安装后,测试远程连接命令kadimin,命令$ kadmin -p admin/[email protected]后,报错如下:
Authenticating as principal admin/[email protected] with password.
kadmin: Missing parameters in krb5.conf required for kadmin client while initializing kadmin interface。
解决:配置的krb5.conf和kdc.conf中的ream没有匹配上,配置有问题,改完后如现在配置一样。之后再从第二节的第4点开始重新初始化ream开始再做。
3、测试时命令:kinit admin/admin时,报错如下:
init: Cannot find KDC for realm "HADOOP.COM" while getting initial credentials
解决:解决方案与问题2同一个原因
4、测试命令:kinit admin/admin后,报错:kinit: Password incorrect while getting initial credentials
分析:此命令输入密码后报上面的错。后发现是在kadmin.local中addprinc命令后,又执行了ktadd命令,ktadd会生成随机密钥keytab,使密码无效了。
解决:addprincs添加admin/admin主体命令执行后,不必再执行ktadd和xst命令。
5、测试命令:kinit -kt /export/common/kerberos5/kadm5.keytab admin/admin,报错:kinit: Password incorrect while getting initial credentials
解决:在子节点执行此命令时,注意把主节点新生成的kadm5.keytab文件复制到子节点。$ scp -P 51888 /export/common/kerberos5/kadm5.keytab [email protected]:/export/common/kerberos5/
6、测试命令:kinit -R,报错:ExitCodeException exitCode=1: kinit: KDC can't fulfill requested option while renewing credentials
分析:kdc不能更新票据。然后查了下klist命令,确实没有“renew until”关键字。
解决:vim /etc/krb5.conf,在libdefaults下,配置ticket_lifetime = 24h renew_lifetime = 7d forwardable = true。然后删除再重新建立kdc数据库,重新生成票据再分发到所有机器即可。