目录
一、kerberos简介
二、kerberos认证原理
三、kerberos集群安装
1.环境说明
2.集群安装前准备
3.安装kerberos服务器端
4.安装kerberos客户端
5.测试kerberos安装是否成功
6.kerberos常用命令
Kerberos是一种计算机网络认证协议,此协议可以保护网络实体免受窃听和重复攻击,它允许某实体在非安全网络环境下向另一个实体以一种安全的方式证明自己的身份。Kerberos由麻省理工实验室实现此协议并发布的一套免费软件。其设计主要是针对客户-服务器模型,且提供了一系列交互认证——用户和服务器都能高安全性的验证对方的身份。
Kerberos起源于希腊神话,是一支守护着冥界长着3个头颅的神犬,在keberos Authentication中,Kerberos的3个头颅代表中认证过程中涉及的3方:Client、Server和KDC。kerberos Authentication 其实说通俗点就是解决:如何证明某个人的确就是他所声称的那个人的问题,到底如何进行认证呢?kerberos 采用这样的方法认证:即如果有一个秘密(secret)仅仅存在于A和B之间,那么有个人对B说自己就是A,B则需要通过让A提供全世界只有A和B知道的这个秘密来证明这个人就是他所声称的A。
整个过程涉及到Client和Server,即上述的A和B,他们之间的这个秘密我们用 KServer-Client(对称加密算法)来表示。由于 KServer-Client 仅仅只有Client和Server知道,所以被Client使用 KServer-Client 加密过的Client Identity(客户端标识)只有Client和Server可以解密,而Server接收到Client传送的这个加密信息,先通过 KServer-Client 进行解密,随后将解密的数据在KDC数据库的客户端列表中进行比较,如果完全一样,则可以证明该Client就是这个世界上仅仅和自己知道这个 KServer-Client 秘密的人。Kerberos一个重要的优势在于它能够提供双向认证:不但Server可以对Client 进行认证,Client也能对Server进行认证。
通过上面Client和Server端相互认证的过程,我们知道这个 KServer-Client 加密的数据包需要在Client和Server之间传送,所以为了保证安全性这个数据包仅仅在Client和Server的一个Session中有效,所以我们称这个 KServer-Client 为Client和Server之间的Session Key(SServer-Client)。那么如何得到这个 SServer-Client 呢?这里我们要引入冥界神犬三个头颅之一:Kerberos Distribution Center-KDC,KDC是一个kerberos的重要组成部分即认证服务器(CA),在整个Kerberos Authentication中作为Client和Server共同信任的第三方起着重要的作用,而Kerberos的认证过程就是通过这三方共同协作完成的。KDC分发 SServer-Client 的简单的过程:首先Client向KDC发送一个“我是某个Client,我需要一个Session Key用于访问某个Server”的请求,KDC收到该请求后会生成一个Session Key,为了保证这个Session Key仅被发送请求的Client和他希望访问的Server知道,KDC服务器会自动为Client和Server生成这个Session Key的两个副本,然后从KDC的Account database中提取Client和Server的 Master Key 分别对这两个副本进行对称加密。Master Key是将你的密码进行Hash运算得到一个Hash code, 我们一般将这个Hash Code叫做 Master Key。由于Hash Algorithm是不可逆的,同时保证了密码和Master Key是一一对应的,所以既保证了你密码的安全性,又同时保证你的Master Key和密码本身在证明你身份的时候具有相同的作用。对于 Client 端,除了Session Key一起被加密外还包含关于Client派生的一些信息。KDC现在有了两个分别被Client和Server 的Master Key加密过的Session Key,那么这两个Session Key如何分别被Client和Server获得呢?Kerberos的做法很简单,将这两个被加密的副本一并发送给Client,属于Server的那份则由Client发送给Server。
通过上面的过程分析,Client实际上获得了两组信息:一个是通过自己Master Key加密的Session Key,另一个是被Sever的Master Key加密的数据包,这个数据包包含Session Key和关于自己Client的一些认证信息。虽然理论上只要通过一个双方知晓的Key就可以对对方身份进行有效的认证,但是在错综复杂的网络环境中,这种简单的做法显然是有安全隐患的,所以Client还需要提供更多的身份证明信息,我们把这种证明信息称为Authenticator,这个Authenticator实际上就是关于Client的一些信息和当前时间的一个Timestamp。那又为什么要使用Timestamp呢?我们试想这样的场景:Client向Server发送的数据包被某个恶意网络监听者截获,该监听者随后将该数据包作为自己的凭据去冒充该Client对Server进行访问,在这种情况下,该监听者依然可以成功获得Server的认证,所以为了解决这个问题,Client在 Authenticator 中会加入一个发送请求时的Timestamp。在Server对Authenticator中的Client信息和Session Ticket中的Client Info进行比较之前,会先提取Authenticator中的Timestamp,并同当前的时间进行比较,如果他们之间的偏差超出一个可以接受的时间范围(一般是5mins),Server会直接拒绝该Client的请求。在这里需要知道的是,Server维护着一个列表,这个列表记录着在这个可接受的时间范围内所有进行认证的Client和认证的时间,对于时间偏差在这个可接受的范围中的Client,Server会从这个列表中获得最近一个该Client的认证时间,只有当Authenticator中的Timestamp晚于一个Client的最近的认证通过时间的情况下,Server才会进行后续的认证流程,所以Kerberos集群安装需要做集群时间同步。
我们再来看看Server端如何对Client进行认证:Client使用自己的Master Key对KDC加密的Session Key进行解密从而获得Session Key,随后创建Authenticator(Client Info + Timestamp)并用Session Key对其加密,最后连同从KDC获得的Server使用Master Key加密过的数据包(Client Info + Session Key)一并发送到Server端。一般将Server端使用Master Key加密过的数据包称为Session Ticket。当Server接收到这两组数据后,先使用他自己的Master Key对Session Ticket进行解密,从而获得Session Key。随后使用该Session Key解密Authenticator,通过比较Authenticator中的Client Info和Session Ticket中的Client Info从而实现对Client的认证。
通过上面的介绍了解,我们发现Kerberos其实是一个基于Ticket(凭据)的认证方式。Client想要获取Server端的资源,先得通过Server的认证,而认证的前提条件就是Client必须向Server提供从KDC获得的一个包含Server的Master Key进行加密的Session Ticket(Session Key + Client Info)。Session Ticket是Client进入Server领域(realm)的一张门票,而这张门票必须从一个合法权威的Ticket颁发机构颁发,这个颁发机构就是Client和Server双方信任的KDC服务器, 同时这张Ticket票据具有超强的防伪标识,它是被Server的Master Key加密过的,这个Ticket票据在Kerberos中被称为Ticket Granting Ticket(简称:TGT),所以对Client来说, 获得TGT是整个认证过程中最为关键的部分,即我们经常使用命令:kinit -kt xxx.keytab $USER/$HOSTNAME去生成keytab的TGT(票据)。
kerberos认证原理参阅:https://blog.csdn.net/sky_jiangcheng/article/details/81070240
系统环境 | 集群节点分布 | |||
---|---|---|---|---|
名称 | 版本 | IP地址 | 主机名 | kerberos 服务分布 |
JDK版本 | 1.8 | 192.168.120.110 | hadoop01 | server/client |
Linux版本 | Centos7 | 192.168.120.111 | hadoop02 | client |
操作用户 | root | 192.168.120.112 | hadoop03 | client |
2.1 配置集群时间同步
2.2 确保集群可以连接外网
2.3 关闭防火墙
2.4 配置主机名及hosts映射
安装说明:kerberos的服务器只需要安装在一台节点上,其他节点安装kerberos客户端即可!我这里服务器安装在hadoop01节点上!
1.安装kerberos服务器端
yum install -y krb5-server krb5-libs krb5-workstation krb5-devel krb5-auth-dialog
2.配置/etc/krb5.conf文件
vim /etc/krb5.conf 然后修改配置其以下内容:
注意:以下的配置文件内容,只需要修改带#注释部分的内容,其他不需要动,可以直接copy!将以下内容配置完成后,还需要将该文件远程发送到集群其他节点对应的/etc/目录下!
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = HADOOP.COM #HADOOP.COM相当于namespace,可以自己修改
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h #票据的有效时长,可以自行修改
renew_lifetime = 7d #在票据失效后重新刷新的有效时长,可以自行修改
forwardable = true
rdns = false
udp_preference_limit = 1 #配置kerberos使用tcp而不使用udp协议,不配置hadoop集群可能会报错
[realms]
HADOOP.COM = { #这里的HADOOP.COM要跟上面的保持一致
kdc = hadoop01:88 #这里hadoop01是kdc服务器的安装节点的主机名
admin_server = hadoop01:749 #这里hadoop01是kdc服务器的安装节点的主机名,749是通讯端口
default_domain = HADOOP.COM #这里的HADOOP.COM要跟上面的保持一致
}
[domain_realm]
.HADOOP.COM = HADOOP.COM #这里的HADOOP.COM要跟上面的保持一致
HADOOP.COM = HADOOP.COM #这里的HADOOP.COM要跟上面的保持一致
3.配置 /var/kerberos/krb5kdc/kdc.conf 文件
注意:以下的配置文件内容,只需要修改带#注释部分的内容,其他不需要动,可以直接copy!
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
HADOOP.COM = { #HADOOP.COM必须跟/etc/krb5.conf中的realms保持一致
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
max_life = 24h 0m 0s
max_renewable_life = 7d
max_life = 1d
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
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
}
4.配置/var/kerberos/krb5kdc/kadm5.acl文件
注意:以下的配置文件内容,只需要修改带#注释部分的内容,其他不需要动,可以直接copy!
###############################################################################
#Kerberos_principal permissions [target_principal] [restrictions]
###############################################################################
*/[email protected] * #将原有的EXAMPLE.COM改为跟前两个配置文件中的realms保持一致
为了能够不直接访问 KDC 控制台而从 Kerberos 数据库添加或删除主体,请对 Kerberos 管理服务器指示允许哪些主体执行哪些操作。通过编辑文件 /var/kerberos/krb5kdc/kadm5.acl 完成此操作,ACL(访问控制列表)允许您精确指定特权。
5.添加kerberos默认的AES-256加密算法所需的jdk对应版本的jar包到$JAVA_HOME/jre/lib/security目录下
对于使用 centos5. 6及以上的系统,默认使用 AES-256 来加密的。这就需要集群中的所有节点上安装JDK,并且下载对应JDK版本的JCE包补丁
Java Cryptography Extension (JCE6) Unlimited Strength Jurisdiction Policy File
Java Cryptography Extension (JCE7) Unlimited Strength Jurisdiction Policy File
Java Cryptography Extension (JCE8) Unlimited Strength Jurisdiction Policy File
下载的文件是一个 zip 包,解压后将里面的两个文件放到下面的目录中:$JAVA_HOME/jre/lib/security下
6.创建生成kerberos的KDC数据库文件
在 hadoop01 上执行初始化数据库命令。其中 -r
指定对应 realm
kdb5_util create -r HADOOP.COM –s
注意:该命令会提示输入两次数据库密码,执行结束后会在 /var/kerberos/krb5kdc/
目录下创建 principal 数据库,如果遇到数据库已经存在的提示,可以把 /var/kerberos/krb5kdc/
目录下的 principal 的相关文件都删除掉,再次执行该命令即可。
7.启动kerberos服务
#启动krb5kdc服务
systemctl start krb5kdc
#启动kadmin服务
systemctl start kadmin
#启动完成后可以使用该命令查看kerberos服务是否启动正常
systemctl status krb5kdc kadmin
8.设置kdc、kadmin开机自启
systemctl enable krb5kdc kadmin
在除了安装kerberos服务器端所在节点外的其他节点上都必须执行下面的命令,安装kerberos客户端!
#安装kerberos客户端
yum install -y krb5-devel krb5-workstation krb5-client
##### 在kerberos的KDC安装节点执行新增管理员命令 #####
#手动输入两次密码,这里hadoop是新增的管理员名称,admin是管理员
kadmin.local -q "addprinc hadoop/admin"
或
#也可以不用手动输入密码,这里的两次root为密码
echo -e "root\nroot" | kadmin.local -q "addprinc hadoop/admin"
#####在kerberos任意客户端节点执行初始化及登录命令######
#在客户端进行管理员认证
kinit hadoop/admin
#认证完成后,登录KDC管理员账号
kadmin
klist # 查看当前生成的票据
kinit –R # 更新ticket
kdestroy # 销毁当前的ticket
kadmin.local -q "list_principals" # 列出Kerberos中的所有认证用户
kadmin.local -q "addprinc user1" # 添加认证用户,需要输入密码
kadmin.local -q "delprinc user1" # 删除认证用户
kinit user_name/[email protected] # 初始化证书
kinit user1 # 使用该用户登录,获取身份认证,需要输入密码
kpasswd admin_user_name/admin #修改管理员用户密码
需要注意的是,我们的票据在krb5.conf配置文件中指定的 ticket_lifetime = 24h ,所以最好在集群各节点使用crontab或其他定时调度组件定时获取有效票据TGT。如有错误或不当之处还请大牛及时纠正!