1. 概述

  Kerberos是一种认证机制。

  目的是,通过密钥系统为客户端/服务器应用程序提供强大的认证系统:保护服务器防止错误的用户使用,同时保护它的用户使用正确的服务器,即支持双向验证;Kerberos协议的整个认证过程实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据,简而言之,Kerberos通过传统的加密技术(共享密钥)实现了一种可信任的第三方认证服务。 

  KDC(key distribution center):是一个网络服务,提供ticket和临时会话密钥。

  AS(Authentication Server):认证服务器

  TGS(Ticket Grantion Server):许可证服务器

  TGT:Ticket-grantion Ticket

  realm name:包含KDC和许多客户端的Kerberos网络,类似于域,俗称为领域;也是principal的一个“容器”或者“命名空间”。相对应的,principal的命名规则是"what_name_you_like@realm"。在kerberos,大家都约定俗成用大写来命名realm,比如“EXAMPLE.COM”

  password:某个用户的密码,对应于kerberos中的master_key。password可以存在一个keytab文件中。所以kerberos中需要使用密码的场景都可以用一个keytab作为输入。

  credential:credential是“证明某个人确定是他自己/某一种行为的确可以发生”的凭据。在不同的使用场景下,credential的具体含义也略有不同:对于某个principal个体而言,他的credential就是他的password;在kerberos认证的环节中,credential就意味着各种各样的ticket。

  authenticator:验证者,是服务器用于验证客户机用户主体的信息。验证者包含用户的主体名称、时间标记和其他数据。与票证不同,验证者只能使用一次,通常在请求访问服务时使用。

  principal:认证的主体,,也说安全个体,简单来说就是“用户名”。

  Ticket:一个记录,客户用它来向服务器证明自己的身份,包括服务的主体名称、用户的主体名称、用户主机的ip地址、时间标记、会话密钥、定义票证生命周期的时间戳。

  keytab:keytab是包含principals和加密principal key的文件。keytab文件对于每个host是唯一的,因为key中包含hostname。keytab文件用于不需要人工交互和保存纯文本密码,实现到kerberos上验证一个主机上的principal。因为服务器上可以访问keytab文件即可以以principal的身份通过kerberos的认证,所以,keytab文件应该被妥善保存,应该只有少数的用户可以访问。

1.1. kerberos原理

  为什么要有Kerberos这样一个中央认证机制?

  有A,B,C三个服务器,分别提供不同的服务,user要访问ABC都需要输入用户名密码,但是ABC没必要都存一份user的密码,所以就衍生出一个中央服务器D来专门存储用户名密码;如果user通过了D的认证,那就是合法的身份,就可以使用ABC任何一个服务,所以user需要告诉ABC它通过了D的认证。

  如何证明这个事情,以及信息在网络传输过程如何防止被截获篡改而假冒等等,解决这些问题就靠kerberos。

  Kerberos协议的工作过程:Client从KDC获取TGT,Client利用获取的TGT向KDC请求其他Service的Ticket(通过获取的session进行访问)。

  这个部分简单总结了kerberos协议的认证流程,如下:

  

  ② User向KDC中的AS请求身份验证,AS为user和TGS生成一个session key:SK_TGS,并发送{TGT,SK_TGS} K_USER;

    其中,{TGT,SK_TGS}K_USER表示使用user的密码加密的packet,包含了TGT和用户与TGS的session key;这个请求验证的过程实际上是使用kinit来完成的,kinit将username传给AS,AS查找username的密码,将TGT和SK_TGS使用用户密码加密后发送给kinit,kinit要求用户输入密码,解密后得到TGT和SK;其中,TGT使用TGS的密码加密,信息内容为{user,address,tgs_name,start_time,lisftime,SK_TGS} K_TGS

  ④ User向KDC中的TGS请求访问某个Service的ST,发送[ TGT,Authenticator];

    其中,Authenticator用于验证发送该请求的user就是TGT中所声明的user,内容为:{ user,address,start_time,lifetime};Authenticator使用的TGS和user之间的session key加密的,防止TGT被盗。TGS先使用自己的密码解开TGT获得它与user之间的session key,然后使用session key解密Authenticator,验证用户和有效期;

  ⑤ TGS判断无误后,为user和Service之间生成一个新的session key:SK_Service;然后发送给user一个包:[{ SK_Service } SK_TGS, ST];

    其中,ST是使用Service的密码加密的,SK_Service使用TGS和user之间的session key加密的;ST的内容为:{ user, address, start_time, lifetime, SK_Service } K_Service

  ⑥ User使用与TGS之间的会话密钥解开包得到与Service之间的会话密钥SK_Service,然后使用SK_Service生成一个Authenticator,向Service发送[ ST,Authenticator ];

    其中,此处的Authenticator是使用user和service之间的会话密钥加密的,Service收到包后先使用自己的密码解密ST,或者会话密钥SK_Service,然后使用SK_Service解密Authenticator来验证发送请求的用户就是票中所声明的用户。

  Service向用户发送一个包以证明自己的身份,这个包使用SK_Service加密。

  此后user与Service之间使用SK_Service进行通信,且在TGT有效期内,user直接跳过第一步直接从第二步使用TGT想TGS证明自己的身份。

  注意:user client会等待service server发送确认信息,如果不是正确的service server,就无法解开ST,也就无法获得会话密钥,从而避免用户使用错误的服务器。上述流程图也就是CAS的原理:用户访问某个应用程序,应用服务器接受请求后检查ST和TGT,如果都有则用户正常进行访问;如果没有或者不对(步骤1),转到CAS认证服务器的登录页面,通过安全认证后得到相应应用的TGT(步骤2-3)和该应用的ST(步骤4-5),再重定向到相关的应用服务器(步骤6),如果在会话周期内再定向到别的应用(步骤7),将出示TGT和该应用的ST(如果没有,就直接通过步骤4-5得到该应用的ST,步骤8)进行认证。

2. 安装部署

2.1. 安装规划

  操作系统:Centos 7.4

  操作用户:root

  软件角色分布如下:

角色 部署节点
KDC,AS,TGS 192.168.1.150
Kerberos Agent 192.168.1.[151-153]

  假设/etc/hosts文件如下:

192.168.1.150 cdh0
192.168.1.151 cdh1
192.168.1.152 cdh2
192.168.1.153 cdh3

2.2. 服务端安装kerberos

  在192.168.1.150上安装服务端:

yum -y install krb5-server openldap-clients

  在安装完上述的软件之后,会在KDC主机上生成配置文件/etc/krb5.conf和/var/kerberos/krb5kdc/kdc.conf。

2.2.1. 配置krb5.conf

  /etc/krb5.conf:包含Kerberos的配置。例如,KDC的位置,Kerberos的admin realms等。需要所有使用的Kerberos的机器上的配置文件都同步。这里仅列举需要的基本配置。

  请替换DOMAIN.COM为自定义域名:

[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log [libdefaults]
default_realm = EXAMPLE.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
# default_ccache_name = KEYRING:persistent:%{uid} [realms]
EXAMPLE.COM = {
kdc = cdh0
admin_server = cdh0
} [domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM

  说明:

  • [logging]:表示server端的日志的打印位置
  • [libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置
    • default_realm = EXAMPLE.COM 默认的realm,必须跟要配置的realm的名称一致。
    • udp_preference_limit = 1 禁止使用udp,可以防止一个Hadoop中的错误
    • ticket_lifetime表明凭证生效的时限,一般为24小时
    • renew_lifetime表明凭证最长可以被延期的时限,一般为一周。当凭证过期之后,对安全认证的服务的后续访问则会失败。  
  • [realms]:列举使用的realm。
    • kdc:代表kdc的位置,格式是:机器hostname或ip地址
    • admin_server:代表admin的位置,格式是:机器hostname或ip地址
    • default_domain:代表默认的域名
  • [appdefaults]:可以设定一些针对特定应用的配置,覆盖默认配置。

  注:这里需要分发krb5.conf至所有client主机

2.2.2. 配置kdc.conf

  默认放在/var/kerberos/krb5kdc/kdc.conf

[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88 [realms]
EXAMPLE.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = 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
max_life = 25h
max_renewable_life = 8d
}

说明:

  • EXAMPLE.COM:是设定的realms,名字随意。Kerberos可以支持多个realms,会增加复杂度。一般为大写。
  • max_renewable_life = 8d 涉及到是否能进行ticket的renew必须配置。
  • master_key_type:和supported_enctyps默认使用aes256-cts。由于,JAVA使用aes256-cts验证方式需要安装额外的jar包,推荐不使用。
  • acl_file:标注了admin的用户权限。文件格式是Kerberos_principal permissions [target_principal] [restrictions]支持通配符等。
  • admin_keytab:KDC进行校验的keytab。
  • supported_enctypes:支持的校验方式。注意把aes256-cts去掉。

2.2.3. 配置kadm5.acl

  修改服务端192.168.1.150上的配置文件/var/kerberos/krb5kdc/kadm5.acl,以允许具备匹配条件的admin用户进行远程登录权限:

*/admin@EXAMPLE.COM	*

  说明:

  • 标注了admin的用户权限,需要用户自己创建。文件格式是Kerberos_principal permissions [target_principal] [restrictions]支持通配符等。最简单的写法是*/admin@EXAMPLE.COM * 代表名称匹配*/admin@EXAMPLE.COM都认为是admin,权限是*代表全部权限。

2.2.4. 创建Kerberos数据库

  在192.168.1.150上对数据库进行初始化,默认的数据库路径为/var/kerberos/krb5kdc,如果需要重建数据库,将该目录下的principal相关的文件删除即可,请牢记数据库密码。

kdb5_util create -r EXAMPLE.COM -s

  说明:

  • [-s] 表示生成stash file,并在其中存储master server key(krb5kdc)
  • [-r] 来指定一个realm name,当krb5.conf中定义了多个realm时使用
  • 当Kerberos database创建好了之后,在/var/kerberos/中可以看到生成的principal相关文件

2.2.5. 启动Kerberos服务

  在192.168.1.150上执行:

# 启动服务命令
systemctl start krb5kdc
systemctl start kadmin # 加入开机启动项
systemctl enable krb5kdc
systemctl enable kadmin

2.2.6. 创建Kerberos管理员principal

# 需要设置两次密码
kadmin.local -q "addprinc root/admin"

  pincipal的名字的第二部分是admin,那么根据之前配置的kadm5.acl文件,该principal就拥有administrative privileges,这个账号将会被CDH用来生成其他用户/服务的principal。

  注意:需要先kinit保证已经有principal缓存。

[root@master ~]# kinit root/admin
Password for root/admin@EXAMPLE.COM:
[root@master ~]# klist
Ticket cache: KEYRING:persistent:0:0
Default principal: root/admin@EXAMPLE.COM Valid starting Expires Service principal
07/14/2020 11:51:17 07/15/2020 11:51:16 krbtgt/EXAMPLE.COM@EXAMPLE.COM
renew until 07/21/2020 11:51:16

  Kerberos客户端支持两种,一是使用principal + Password,二是使用principal + keytab。前者适合用户进行交互式应用,例如hadoop fs -ls 这种,后者适合服务,例如yarn的rm、nm等。principal + keytab就类似于ssh免密码登录,登录时不需要密码了。

2.3. 客户端安装kerberos

  在192.168.1.[150-153]上安装客户端:

yum -y install krb5-devel krb5-workstation

  在安装完上述的软件之后,在kerberos客户端主机上生成配置文件/etc/krb5.conf。

  把192.168.1.150服务端的/etc/krb5.conf文件拷贝到其他各节点客户端同路径/etc/krb5.conf中。

3. 用法

  Kerberos常用命令:

  操作               命令
启动kdc服务 systemctl start krb5kdc
启动kadmin服务 systemctl start kadmin
进入kadmin kadmin.local / kadmin
创建数据库 kdb5_util create -r EXAMPLE.COM -s
修改当前密码 kpasswd
测试keytab可用性 kinit -k -t /home/xiaobai/xb.keytab xiaobai@EXAMPLE.COM
查看当前票据 klist
查看keytab klist -e -k -t /home/xiaobai/xb.keytab 
通过keytab文件认证登录  kinit -kt /home/xiaobai/xb.keytab xiaobai@EXAMPLE.COM
通过密码认证登录 kinit xiaobai@EXAMPLE.COM / kint xiaobai 
清除缓存 kdestroy

  kadmin模式下常用命令:

操作 命令
查看principal listprincs
生成随机key的principal addprinc -randkey root/admin@EXAMPLE.COM
生成指定key的principal addprinc -pw xxx root/admin@EXAMPLE.COM
修改root/admin的密码 cpw -pw xxx root/admin
添加/删除principal addprinc/delprinc root/admin
直接生成到keytab

ktadd -k /home/xiaobai/xb.keytab xiaobai@EXAMPLE.COM

xst -norandkey -k /home/xiaobai/xb.keytab xiaobai@EXAMPLE.COM

注意:在生成keytab文件时需要加参数"-norandkey",否则导致直接使用kinit xiaobai@EXAMPLE.COM初始化时提示密码错误。

设置密码策略(policy)  addpol -maxlife "90 days" -minlife "75 days" -minlength 8 -minclasses 3 -maxfailure 10 -history 10 user
修改密码策略  modpol -maxlife "90 days" -minlife "75 days" -minlength 8 -minclasses 3 -maxfailure 10 user
添加带有密码策略  addprinc -policy user hello/admin@EXAMPLE.COM
修改用户的密码策略  modprinc -policy user1 hello/admin@EXAMPLE.COM
 删除密码策略  delpol [-force] user

  备注:Kerberos进入admin管理模式需要使用root用户。

总结

【参考资料】

https://www.jianshu.com/p/f84c3668272b

https://www.cnblogs.com/xiaodf/p/5968178.html

https://www.cnblogs.com/seaspring/articles/7210388.html

https://blog.csdn.net/u011026329/article/details/79167884  Cloudera Manager CDH 集成 Kerberos

https://www.jianshu.com/p/fc2d2dbd510b

https://www.cnblogs.com/felixzh/p/9855029.html

https://www.cnblogs.com/chwilliam85/p/9679845.html  Kerberos 常用命令

Kerberos基本原理、安装部署及用法的更多相关文章

  1. 161209、简要分析ZooKeeper基本原理及安装部署

    一.ZooKeeper 基本概念 1.ZooKeeper 是什么? Zookeeper官网地址: http://zookeeper.apache.org/ Zookeeper官网文档地址:http:/ ...

  2. Ansible安装部署以及常用模块详解

    一.  Ansible 介绍Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于py ...

  3. PRESTO安装部署和参数说明(一)

    PRESTO部署和参数说明(一) 一,概要 在部署和使用presto的过程中,在此记录一下部署记录和使用记录以及需要注意的事项.本人使用的presto版本是0.214,3台redhat虚拟机.使用背景 ...

  4. redis常用服务安装部署

    常用服务安装部署   学了前面的Linux基础,想必童鞋们是不是更感兴趣了?接下来就学习常用服务部署吧! 安装环境: centos7 + vmware + xshell 即将登场的是: mysql(m ...

  5. Ansible安装部署及常用模块详解

    Ansible命令使用 Ansible语法使用ansible <pattern_goes_here> -m <module_name> -a <arguments> ...

  6. 安装部署Apache Hadoop (本地模式和伪分布式)

    本节内容: Hadoop版本 安装部署Hadoop 一.Hadoop版本 1. Hadoop版本种类 目前Hadoop发行版非常多,有华为发行版.Intel发行版.Cloudera发行版(CDH)等, ...

  7. 基于HDP版本的YDB安装部署(转)

    第三章 YDB依赖环境准备 一.硬件环境 硬件如何搭配,能做到比较高的性价比,不存在短板.合理的硬件搭配,对系统的稳定性也很关键. 1.CPU不是核数越高越好,性价比才是关键. 经常遇到很多的企业级客 ...

  8. Ranger安装部署

    1. 概述 Apache Ranger是大数据领域的一个集中式安全管理框架,目的是通过制定策略(policies)实现对Hadoop组件的集中式安全管理.用户可以通过Ranger实现对集群中数据的安全 ...

  9. CDH构建大数据平台-Kerberos高可用部署【完结篇】

    CDH构建大数据平台-Kerberos高可用部署[完结篇] 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.安装Kerberos相关的软件包并同步配置文件 1>.实验环境 ...

随机推荐

  1. IDEA tomcat启动报错----Artifact is being deployed, please wait...解决

    今天学习遇到了这个错误,记录下自己遇到的错误和解决方法! 这个报错的意思是: Artifact 正在部署中,请稍候- 实际上有可能就是jar包没有导进去.检查项目打包情况:file-->Proj ...

  2. MPEG2网马实验

    实验目的 了解MPEG2网马的工作原理. 能分析简单的网马. 实验原理 通常被挂马的目标网站是会插入一段代码.比如: <iframe src="/muma.htm"; width="0" hei ...

  3. [杂记]LeTeX中使用tikz画图的一些实例

    出处:http://www.texample.net/tikz/examples/all/ 上述网站中的实例非常丰富,将代码修改一下再编译就能明白是什么意思,故不再赘述.

  4. Linux:保证数据安全落盘

    背景 在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据.但是我们都知道,linux系统的IO路径还是很复杂的,分为很多层,每一层都可能会有buffer ...

  5. Django ORM 多表操作

    目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...

  6. idea常用快捷键及配置

    目录 常用快捷键 常用配置 配置修改项 版本2019.1.3,配置.破解插件见网盘 2020.3.4 链接:https://pan.baidu.com/s/1WHsS8-yvHGf1iRopLbKIu ...

  7. oracle 12c RAC 重启

    转至:https://blog.csdn.net/weixin_40283570/article/details/81511072 关闭顺序 :关闭PDB----->关闭数据库------> ...

  8. Qt:打包成可执行文件(exe文件)后出现Driver not Loaded的解决方法

    问题 在当前电脑上打包为exe可以正常执行,发送给另一台电脑后却无法执行,并且出现"Driver not loaded"的提示框. 可能原因 1.另一台电脑上没有MySQL(或ex ...

  9. Anaconda 下 Jupyter 更改默认启动路径方法(转)

    https://www.cnblogs.com/awakenedy/p/9075712.html

  10. OS模块的补充使用---执行终端命令

    Python基础至os模块 由于近期的项目需要用到对应的终端命令去调用其他程序,因此温习一下os.system()函数: 参考文献:https://zhuanlan.zhihu.com/p/51716 ...