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. MyBatis功能点一应用:二级缓存整合redis

    Mybatis提供了默认的cache实现PerpetualCache,那为什么还要整合第三方的框架redis?因为Mybatis提供的cache实现为单机版,无法实现分布式存储(即本机存储的数据,其他 ...

  2. spring boot全局配置文件优先级

    前两篇介绍的application配置文件,即为spring boot全局配置文件.那么spring boot加载配置文件的时候,怎么确定加载哪个目录下哪个文件呢? spring boot默认的配置文 ...

  3. 日行一算(Consecutive Integer-连续整数)

    题目 题目描述 2005年的百度之星初赛有这么一道题,一个正整数有可能可以被表示为 m(m>1) 个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 15=7+8 但现在你的任务 ...

  4. 图解python | 安装与环境设置

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...

  5. 菜鸟到大神之多图预警——从 RAID 到分布式系统中的副本分布

    我们知道,在面对大规模数据的计算和存储时,有两种处理思路: 垂直扩展(scale up):通过升级单机的硬件,如 CPU.内存.磁盘等,提高计算机的处理能力. 水平扩展(scale out):通过添加 ...

  6. sql注入之报错注入and boolean注入

    1.sql注入之报错注入 正常传参,返回页面正常: 加入'  返回页面报错,出现"zhangsan"' 报错注入使用的函数 在这里我们使用 select updatexml(1,c ...

  7. Java并发杂谈(一):volatile的底层原理,从字节码到CPU

    volatile的特性 volatile是Java中用于修饰变量的关键字,其主要是保证了该变量的可见性以及顺序性,但是没有保证原子性:其是Java中最为轻量级的同步关键字: 接下来我将会一步步来分析v ...

  8. ORACLE 12c RAC日常维护命令

    转至:https://blog.51cto.com/ixdba/901545 CRS提供了很多命令可以管理和查看集群服务状态,常用的有crs_stat.crs_start.crs_stop.crsct ...

  9. spring 核心容器api

    spring api : https://docs.spring.io/spring-framework/docs/current/javadoc-api/ BeanFactory 才是 Spring ...

  10. appium滚动查找屏幕外的控件

    嗯,还是把自己做的实验保存一下 Appium1.12.1+python2.7 实验滚动,查找屏幕外控件以及控制seekbar scroll() 是根据页面中两个元素位置之间的距离进行滑动. 滑动寻找屏 ...