Kerberos简介
Kerberos概述:
Kerberos由麻省理工学院创建,作为解决这些网络安全问题的解决方案。是一种通过网络提供安全验证处理的客户机/服务器体系结构。通过验证,可保证网络事务的发送者和接收者的身份真实。该服务还可以检验来回传递的数据的有效性(完整性),并在传输过程中对数据进行加密(保密性)。
使用 Kerberos 服务,可以安全登录到其他计算机、执行命令、交换数据以及传输文件。此外,该服务还提供授权服务,这样,管理员便可限制对服务和计算机的访问。而且,作为 Kerberos 用户,您还可以控制其他用户对您帐户的访问。
精简总结下就是:Kerberos始于20世纪80年代早期麻省理工学院(MIT)的一个研究项目,是一个网络身份验证系统。Kerberos提供的完整定义是安全的、单点登录的、可信的第三方相互身份验证服务。
1.安全的
Kerberos是安全的,因为它从不在网络上明文传输密码。Kerberos的独特之处在于它使用票据、有时间限制的加密消息,这些消息可以向给定的服务器证明用户的身份,而不需要通过网络发送密码或在本地用户的硬盘上缓存密码。
2.单点登录的
单点登录意味着最终用户只需登录一次,就可以访问支持Kerberos的所有网络资源。一旦用户在登录会话开始时对Kerberos进行了身份验证,那么他的凭证就会透明地传递到他当天访问的所有其他资源。
3.可信的第三方
可信的第三方指的是Kerberos通过一个集中式身份验证服务器工作,网络中的所有系统本质上都信任这个服务器。所有身份验证请求都通过集中式Kerberos服务器路由。
4.相互身份验证
相互身份验证不仅确保键盘后面的人是他声称的人,而且还证明了与他通信的服务器是他声称的那个人。相互身份验证通过确保与用户通信的服务是真实的,保护了敏感信息的机密性。
使用Kerberos 时,一个客户端需要经过三个步骤来获取服务:
l 认证:客户端向认证服务器发送一条报文,并获取一个含时间戳的 Ticket-Granting Ticket(TGT)。
l 授权:客户端使用 TGT 向 Ticket-Granting Server(TGS)请求一个服务 Ticket。
l 服务请求:客户端向服务器出示服务 Ticket ,以证实自己的合法性。

Kerberos相关概念:
(1)KDC(key Distribution Center):密钥分发中心,是统一认证服务,负责管理发放票据,记录授权。
(2)KDC Server:作为密钥分发中心(KDC)的计算机或服务器。
(3)KDC Client:集群中针对KDC进行身份验证的任何计算机。
(4)Realm:kerberos管理的领域的标识。
(5)Principal:用于验证一个用户或者服务的唯一标识,相当于一个账号,需要为其设置密码。
Principal的形式为:主名称/实例名@领域名。
主名称可以是用户名或者服务名,标识用于提供各种网络服务(比如hdfs、hive);
实例名,对于用户主体,实例名是可选的,对于服务主体,实例则是必须的。
一些主体名称示例:
主体名称 | 说明 |
username@EXAMPLE.COM | 普通用户的主体 |
username/admin@EXAMPLE.COM | admin主体,可用于管理KDC数据库 |
K/M@EXAMPLE.COM | 主密钥名称主体,一个主密钥名称主体可与每个主KDC关联 |
krbtgt/EXAMPLE.COM@EXAMPLE.COM | 生成票证授予票证时使用的主体 |
kadmin/host1.example.com@EXAMPLE.COM | 允许使用kadmin访问KDC的主KDC服务器的主体 |
ambari-qa-xxx@EXAMPLE.COM | Ambari用于执行服务“冒烟”检查并运行警报健康检查 |
HTTP/host1.example.com@EXAMPLE.COM | 用于访问Hadoop Web UI时用到的principal |
Kerberos安装
yum安装:
选择一台机器安装server服务器
yum -y install krb5-libs krb5-workstation krb5-server
集群所有机器安装client客户端
yum -y install krb5-libs krb5-workstation
配置:
1 kdc.conf
默认路径/var/kerberos/krb5kdc/kdc.conf,编辑修改如下:
[kdcdefaults]kdc_ports = 88kdc_tcp_ports = 88[realms]HADOOP.COM = {#master_key_type = aes256-ctsmax_renewable_life= 7d 0h 0m 0sacl_file = var/kerberos/krb5kdc/kadm5.acldict_file = usr/share/dict/wordsadmin_keytab = var/kerberos/krb5kdc/kadm5.keytabsupported_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}
注意:在[kdcdefaults]和[realms]前面不能有空格
说明:
HADOOP.COM:是自己设定的域,一般为了识别使用大写
max_renewable_life = 7d 涉及到是否能进行ticket的renwe必须配置。
master_key_type:和supported_enctypes默认使用aes256-cts。由于,JAVA使用aes256-cts验证方式需要安装额外的jar包,更多参考2.2.9关于AES-256加密:。推荐不使用。
acl_file:标注了admin的用户权限。文件格式是
Kerberos_principal permissions [target_principal] [restrictions]支持通配符等。
admin_keytab:KDC进行校验的keytab。后文会提及如何创建。
supported_enctypes:支持的校验方式。注意把aes256-cts去掉。
2 krb5.conf
默认路径/etc/krb5.conf,编辑修改如下:
# Configuration snippets may be placed in this directory as wellincludedir etc/krb5.conf.d/[logging]default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log[libdefaults]dns_lookup_realm = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = truerdns = falsepkinit_anchors = etc/pki/tls/certs/ca-bundle.crtdefault_realm = HADOOP.COM#default_ccache_name = KEYRING:persistent:%{uid}[realms]HADOOP.COM = {kdc = 10.138.93.202admin_server = 10.138.93.202}[domain_realm].hadoop.com = HADOOP.COMhadoop.com = HADOOP.COM
将krb5.conf同步到集群其他节点。
说明:
[logging]:表示server端的日志的打印位置
[libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置
default_realm = HADOOP.COM 默认的realm,必须跟要配置的realm的名称一致。
udp_preference_limit = 1 禁止使用udp可以防止一个Hadoop中的错误
oticket_lifetime表明凭证生效的时限,一般为24小时。
orenew_lifetime表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,
对安全认证的服务的后续访问则会失败。
kdc:代表要kdc的位置。格式是 机器:端口
admin_server:代表admin的位置。格式是机器:端口
default_domain:代表默认的域名
3 kadm5.acl
修改服务端的配置文件/var/kerberos/krb5kdc/kadm5.acl,以允许具备匹配条件的admin用户进行远程登录权限:
*/admin@HADOOP.COM *
说明:
*/admin代表admin实例的全部用户主体
HADOOP.COM代表领域
最后一个*代表所有权限
这里授权的意思就是admin实例的全部主体拥有HADOOP.COM领域的所有权限
4 创建Kerberos数据库
在服务端对数据库初始化,默认的数据库路径为/var/kerberos/krb5kdc,这里需要设置数据库初始密码,记起来。
kdb5_util create -r HADOOP.COM -s
说明:
[-r] 用来指定一个realm_name,当krb5.conf配置了多个realm时使用
[-s] 表示生成 stash file ,并在其中存储master server key(krb5kdc)
创建成功后在/var/kerberos/krb5kdc可以看到生成的相关principal文件
5 启动Kerberos
# 启动服务命令
systemctl start krb5kdcsystemctl start kadmin
# 加入开机启动项
systemctl enable krb5kdcsystemctl enable kadmin
服务对应的日志文件(/var/log/krb5kdc.log 和 var/log/kadmind.log)
Kerberos操作
创建Kerberos管理员:
kadmin.local -q "addprinc admin/admin"
# 需要设置两次密码
# kadmin.local需在server端即KDC所在服务器执行
也可以在server端执行kadmin.local命令先登陆kerberos数据库
其他操作:
创建一个普通用户test:
kadmin.local -q "addprinc test"
为test用户生成keytab文件:
#方式1:
kadmin.local -q "xst -norandkey -k etc/test.keytab test"
#方式2:
kadmin.local -q "ktadd -norandkey -k /etc/test.keytab test"
[-norandkey] 表示创建keytab时,principal的密码不发生改变。如果不使用该参数,直接ktadd -k则会修改principal的密码。
查看keytab文件:
klist -kte /etc/test.keytab
认证用户:
方式1:(服务主体)使用keytab来认证
kinit -kt /etc/test.keytab test
方式2:(用户主体)使用密码来认证
kinit test
查看认证缓存(当前认证的用户):
klist -e
[-e] 查看当前kerberos账号的加密方式
退出当前认证的用户:
kdestroy
查看所有principal主体:
kadmin.local -q "list_principals"
也可以用kadmin然后输入admin管理员密码,然后list_principals
删除principal主体:
kadmin.local -q "delete_principal test"





