最先据说KDC和Kerberos应该是大三的《应用密码学》,当时感受这套对称密钥分发机制比非对称密钥的PKI分发机制要好理解。但几年下来因为现实中使用SSL的场景比较比(主要是https)接触得也就比较多因此对PKI的认识反倒超过了KDC。html
Kerberos的接触印象中只有某运营商大数据平台一主机要ssh到其余主机时须要先kinit申请票据一把,具体原理不是很清楚,也没有深刻探究。这几天一是比较有空二是感受之后用得上因此来探究一番,本文能够认为是本连接文档的一次实现。数据库
另外,首先要明确Kerberos是KDC思想的一个具体实现,正如当下的数字签名证书是PKI思想的一个具体实现同样;只是他们都实现得都比较好,以致于与各自的思想基本成为同义词。服务器
将当前用户设置成sudo免密码。编缉/etc/sudoers文件追加如下内容(ls是我当前用户,操做时请改为本身的):网络
ls ALL=(ALL) NOPASSWD: ALL
将后续要使用的域名/主机名指向本地。编缉/etc/hosts写入如下内容(192.168.220.143是我电脑当前的IP,改为本身的;最后的ls-virtual-machine是我电脑当前的主机名,改为本身的;另外若是/etc/hosts存在有将主机名解析到127.0.0.1的条目,则应将其删除)dom
127.0.0.1 localhost 192.168.220.143 monarch.example.com monarch krb1.example.com krb1 ls-virtual-machine
sudo apt install krb5-admin-server krb5-kdc -y
安装krb5-admin-server时要确认几个问题(不一样操做系统用Kerberos形式可能有些许差异,但意思都差很少),以下输入直接回车便可。ssh
指定默认领域,使用EXAMPLE.COM:测试
Default Kerberos version 5 realm? EXAMPLE.COM
默认领域使用的Kerberos服务器,使用krb1.example.com(前边2.1咱们已将krb1.example.com也指向本地)大数据
Kerberos servers for your realm: krb1.example.com
默认领域使用的管理服务器,同样使用krb1.example.com:ui
Administrative server for your Kerberos realm: krb1.example.com
使用如下命令初始化前边配置的EXAMPLE.COM领域对应的数据库,并设置该领域的密码:加密
sudo krb5_newrealm
编缉/etc/krb5.conf,定位到[domain_realm]节区,追回如下内容:
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
继续编缉/etc/krb5.conf,在文件末尾追加如下内容,设置其日志文件目录:
[logging]
kdc = FILE:/var/log/kerberos/krb5kdc.log admin_server = FILE:/var/log/kerberos/kadmin.log default = FILE:/var/log/kerberos/krb5lib.log
因为/var/log/kerberos目录是不存在的,因此咱们还要把这日志目录和文件建立出来:
sudo mkdir /var/log/kerberos sudo touch /var/log/kerberos/{krb5kdc,kadmin,krb5lib}.log sudo chmod -R 750 /var/log/kerberos
最后为使以上配置生效,咱们须要重启服务:
sudo invoke-rc.d krb5-admin-server restart sudo invoke-rc.d krb5-kdc restart
策略集就是规则的集合,咱们这里建立admin/host/service/user四个策略集(minlength是策略集的密码长度,minclasses是密码的元素种类),过程以下:
ls@ls-virtual-machine:~$ sudo kadmin.local Authenticating as principal root/admin@EXAMPLE.COM with password. kadmin.local: add_policy -minlength 8 -minclasses 3 admin kadmin.local: add_policy -minlength 8 -minclasses 4 host kadmin.local: add_policy -minlength 8 -minclasses 4 service kadmin.local: add_policy -minlength 8 -minclasses 2 user kadmin.local: kadmin.local: quit
其中的user表示隶属user策略集,ls是用户名(ls是我当前用户名,改为本身的);设置的密码必定要记住,由于该帐号要获取票据时要使用该密码:
ls@ls-virtual-machine:~$ sudo kadmin.local Authenticating as principal root/admin@EXAMPLE.COM with password. kadmin.local: addprinc -policy user ls Enter password for principal "ls@EXAMPLE.COM": Re-enter password for principal "ls@EXAMPLE.COM": Principal "ls@EXAMPLE.COM" created. kadmin.local: kadmin.local: quit
通过以上步骤,咱们已经安装好了Kerberos,如今来演示如何使用kerberos完成ssh认证和登陆。
sudo apt install openssh-server openssh-client
编缉/etc/ssh/sshd_config,启用如下项(其中最后的“UsePAM yes”通常已启用):
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
GSSAPIKeyExchange yes
UsePAM yes
重启ssh使配置生效:
sudo invoke-rc.d ssh restart
service仍然是咱们前面添加的service策略集;host是telnet/rsh/ssh等服务在kerberos中的统称,monarch.example.com是规则适用的主机名:
ls@ls-virtual-machine:~$ sudo kadmin.local Authenticating as principal root/admin@EXAMPLE.COM with password. kadmin.local: addprinc -policy service -randkey host/monarch.example.com Principal "host/monarch.example.com@EXAMPLE.COM" created. kadmin.local: ktadd -k /etc/krb5.keytab -norandkey host/monarch.example.com Entry for principal host/monarch.example.com with kvno 1, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/monarch.example.com with kvno 1, encryption type arcfour-hmac added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/monarch.example.com with kvno 1, encryption type des3-cbc-sha1 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/monarch.example.com with kvno 1, encryption type des-cbc-crc added to keytab WRFILE:/etc/krb5.keytab. kadmin.local: kadmin.local: quit
ls是我当前的用户名,改为本身的;获取票据的密码是2.5中建立规则时设的密码(klist -f用于查看当前存在的票据):
ls@ls-virtual-machine:~$ kinit ls Password for ls@EXAMPLE.COM: ls@ls-virtual-machine:~$ ls@ls-virtual-machine:~$ klist -f Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: ls@EXAMPLE.COM Valid starting Expires Service principal 2019-08-06T15:56:52 2019-08-07T01:56:52 krbtgt/EXAMPLE.COM@EXAMPLE.COM renew until 2019-08-07T15:54:39, Flags: FPRIA
使用使用获取票据的用户(ls)及可经过票据登陆的主机(monarch.example.com),以下不须要密码便可直接登陆:
由于有很多概念本身也不太肯定,理解可能有误差甚至错误,因此在阅读时须要自行斟酌。
角色:密钥分发中心KDC、用户A、用户B。KDC保存有与用户A、用户B通讯的对称密钥,用户A、用户B保存有与KDC通讯的对称密钥。
指望操做:用户A想和用户B进行通讯。
实现过程:用户A向KDC,使用Ka-kdc加密,发送想与用户B通讯的请求。
KDC接收到请求后,使用Ka-kdc解密,生成Ka-b,并将其使用Ka-kdc加密发送给A、使用Kb-kdc加密发送给B。
A和B接收到后,分别使用Ka-kdc和Kb-kdc解密出Ka-b。
A使用Ka-b向B发送加密消息。
说明:能够看到,在此模式中KDC须要存储与全部用户通讯的Key,而全部用户只须要存储与KDC通讯的Key,用户与用户之间的Key是动态生成和分发的。
角色:认证服务器AS、票据承认服务器TGS、服务器端DS、客户端A;前二者至关于KDC,前三者是Kerberos所指的三个服务器。前三者存放有相互通讯所用的对称密钥,客户端A不存听任何对称密钥。
指望操做:客户端A想和服务器端DS进行通讯。
实现过程:客户端A向AS,以明文形式,索取访问TGS的票据。
AS收到请求后,验证A发来的用户名密码,若是正确则生成Ka-tgs,并将其使用借助密码生成的Ka-as加密发送给A、使用Kas-tgs加密发送给TGS。
A收到后根据也根据密码生成Ka-as解密,TGS也使用Kas-tgs解密。
A使用获得的Ka-tgs,加密,向TGS请求与B进行通讯。
TGS接收到请求后,使用Ka-tgs解密,根据其意向,生成Ka-b,并将其分别使用Ka-tgs加密发送给A、使用Kb-tgs加密发送给B。
A和B接收到后,分别使用Ka-tgs和Kb-tgs解密出Ka-b。
A使用Ka-b向B发送加密消息。
说明:Kerberos将KDC拆分为AS和TGS两个服务,这样的好处是,Ka-tgs是有有效期的再也不像前边Ka-kdc同样长期有效,当Ka-tgs过时以后用户能够经过输入密码获取新的Ka-tgs。
角色对应:Kerberos启了哪些进程/服务尚未分析哪一个是AS哪一个是TGS就先不懂,SSH服务端至关于DS,SSH客户端至关于客户端A。
操做对应:2.1.5的建立帐号,就是在AS数据库中导入帐号信息。
2.2.4中kinit ls,就是向AS申请访问TGS的票据。
2.2.5中登陆时,SSH客户端才向TGS请求访问SSH服务端。
从最终效果上看,KDC和PKI都完成了对称密钥的分发,即效果是同样的。
从前置条件上看,首先KDC在仍意环境中都须要一个专门的服务(器),其次其要存储的用户数据(用户名、密码或对称密钥)会随用户的增加而增加,最后因为用户和KDC之间使用的是对称密钥因此非否性可能会有问题。
总的而言,感受KDC适用于内部网络服务之间的通讯,PKI适用于外部网络客户端与服务器之间的通讯。
参考:
http://techpubs.spinlocksolutions.com/dklar/kerberos.html#krb-install