一、背景说明

最早听说KDC和Kerberos应该是大三的《应用密码学》,当时感觉这套对称密钥分发机制比非对称密钥的PKI分发机制要好理解。但几年下来由于现实中使用SSL的场景比较比(主要是https)接触得也就比较多所以对PKI的认识反倒超过了KDC。

Kerberos的接触印象中只有某运营商大数据平台一主机要ssh到其他主机时需要先kinit申请票据一把,具体原理不是很清楚,也没有深入探究。这几天一是比较有空二是感觉以后用得上所以来探究一番,本文可以认为是本链接文档的一次实现。

另外,首先要明确Kerberos是KDC思想的一个具体实现,正如当下的数字签名证书是PKI思想的一个具体实现一样;只是他们都实现得都比较好,以至于与各自的思想基本成为同义词。

二、Kerberos+SSH安装配置

2.1 安装配置Kerberos

2.1.1 前置操作

将当前用户设置成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的条目,则应将其删除)

127.0.0.1  localhost
192.168.220.143 monarch.example.com monarch krb1.example.com krb1 ls-virtual-machine

2.1.2 安装Kerberos服务

sudo apt install krb5-admin-server krb5-kdc -y

安装krb5-admin-server时要确认几个问题(不同操作系统用Kerberos形式可能有些许差别,但意思都差不多),如下输入直接回车即可。

指定默认领域,使用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:

Administrative server for your Kerberos realm: krb1.example.com

2.1.3 初始化配置

使用以下命令初始化前边配置的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

2.1.4 创建策略集

策略集就是规则的集合,我们这里创建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 -minclasses admin
kadmin.local: add_policy -minlength -minclasses host
kadmin.local: add_policy -minlength -minclasses service
kadmin.local: add_policy -minlength -minclasses user
kadmin.local:
kadmin.local: quit

2.1.5 在规则集下创建具体账号

其中的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

2.2 ssh集成Kerberos

经过以上步骤,我们已经安装好了Kerberos,现在来演示如何使用kerberos完成ssh认证和登录。

2.2.1 安装ssh

sudo apt install openssh-server openssh-client

2.2.2 配置ssh支持Kerberos认证

编缉/etc/ssh/sshd_config,启用以下项(其中最后的“UsePAM yes”一般已启用):

GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
GSSAPIKeyExchange yes
UsePAM yes

重启ssh使配置生效:

sudo invoke-rc.d ssh restart

2.2.3 创建ssh登录相关规则

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 , encryption type aes256-cts-hmac-sha1- added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/monarch.example.com with kvno , encryption type arcfour-hmac added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/monarch.example.com with kvno , encryption type des3-cbc-sha1 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/monarch.example.com with kvno , encryption type des-cbc-crc added to keytab WRFILE:/etc/krb5.keytab.
kadmin.local:
kadmin.local: quit

2.2.4 获取用户票据

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
--06T15:: --07T01:: krbtgt/EXAMPLE.COM@EXAMPLE.COM
renew until --07T15::, Flags: FPRIA

2.2.5 登录测试

使用使用获取票据的用户(ls)及可通过票据登录的主机(monarch.example.com),如下不需要密码即可直接登录:

三、原理分析

因为有不少概念自己也不太确定,理解可能有偏差甚至错误,所以在阅读时需要自行斟酌。

3.1 KDC原理

角色:密钥分发中心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是动态生成和分发的。

3.2 Kerberos过程

角色:认证服务器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

3.3 SSH中的Kerberos过程

角色对应:Kerberos启了哪些进程/服务还没有分析哪个是AS哪个是TGS就先不懂,SSH服务端相当于DS,SSH客户端相当于客户端A。

操作对应:2.1.5的创建账号,就是在AS数据库中导入账号信息。

2.2.4中kinit ls,就是向AS申请访问TGS的票据。

2.2.5中登录时,SSH客户端才向TGS请求访问SSH服务端。

3.4 KDC与PKI的优劣分析

从最终效果上看,KDC和PKI都完成了对称密钥的分发,即效果是一样的。

从前置条件上看,首先KDC在仍意环境中都需要一个专门的服务(器),其次其要存储的用户数据(用户名、密码或对称密钥)会随用户的增长而增长,最后由于用户和KDC之间使用的是对称密钥所以非否性可能会有问题。

总的而言,感觉KDC适用于内部网络服务之间的通信,PKI适用于外部网络客户端与服务器之间的通信。

参考:

http://techpubs.spinlocksolutions.com/dklar/kerberos.html#krb-install

Kerberos+SSH安装配置使用教程的更多相关文章

  1. webpack安装配置使用教程详解

    webpack安装配置使用教程详解 www.111cn.net 更新:2015-09-01 编辑:swteen 来源:转载 本文章来为各位详细的介绍一下关于webpack安装配置使用教程吧,这篇文章对 ...

  2. Emacs 安装配置使用教程

    Emacs 安装配置使用教程 来源 https://www.jianshu.com/u/a27b97f900f7 序|Preface 先来一篇有趣的简介:Emacs和Vim:神的编辑器和编辑器之神 - ...

  3. 【转】Android Studio安装配置学习教程指南 下载和安装--不错

    背景 相信大家对Android Studio已经不陌生了,Android Studio是Google于2013 I/O大会针对Android开发推出的新的开发工具,目前很多开源项目都已经在采用,Goo ...

  4. Clion+Cmake+Qt5+Qwt+msys2+MinGW在Windows下的安装配置使用教程

    摘要: CLion, a cross-platform C/C++ IDE. 本文主要介绍基于Clion作为IDE, MinGW作为编译器,CMake作为项目构建工具,开发基于Qt5.qwt的C++图 ...

  5. Ubuntu16.04安装配置Caffe教程(GPU版)

    推荐博客:https://www.linuxidc.com/Linux/2017-11/148629.htmhttps://blog.csdn.net/yggaoeecs/article/detail ...

  6. Linux安装配置samba教程(CentOS 6.5)

    一.服务端安装配置samba 1.1 服务端安装samba yum install -y samba 1.2 创建共享目录并写入配置文件 以/samba为共享目录为例,为了更直观地观测我们在该目录中创 ...

  7. openfire安装配置完全教程

    Java领域的IM解决方案 Java领域的即时通信的解决方案可以考虑openfire+spark+smack. Openfire是基于Jabber协议(XMPP)实现的即时通信服务器端,最新版本是3. ...

  8. Ubuntu Server 13.10 安装配置图解教程

    一.Ubuntu Server 13.10系统安装 Ubuntu分为桌面版(desktop)和服务器版(Server),下面为大家介绍服务器版本Ubuntu Server 13.10的详细安装过程. ...

  9. MySQL 5.7.33 超级详细下载安装配置测试教程(可以安装成功版)

    目录 1.引言及注意事项 (1) 引言: (2) 注意: 2.MySQL下载 3.配置环境变量 4.配置my.ini文件(重点) 5.安装MySQL(重点) 6.设置密码 7.测试MySQL是否安装成 ...

随机推荐

  1. Spring Cloud gateway 七 Sentinel 注解方式使用

    Sentinel 注解支持 @SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项. @SentinelResource 注解包含以下属性: value:资 ...

  2. [ISE调试] 在ISE调试过程中,遇到过的error以及消除办法

    1.Incompatible IOB's are locked to the same bank 15,具体如右图, 于是去查引脚配置,发现 也就是说,在bank=15的这组IO里面,我既选了LVAM ...

  3. 动手造轮子:实现简单的 EventQueue

    动手造轮子:实现简单的 EventQueue Intro 最近项目里有遇到一些并发的问题,想实现一个队列来将并发的请求一个一个串行处理,可以理解为使用消息队列处理并发问题,之前实现过一个简单的 Eve ...

  4. 超速入门AT指令集 | 我的物联网成长记

    [摘要] 在物联网中,AT命令集可用于控制&调测设备.通信模块入网等.本文为您介绍NB-IoT常用的AT命令集及其调测工具. 什么是AT指令集 AT命令,用来控制TE(Terminal Equ ...

  5. HTTP基础及telnet简单命令

    一.HTTP概况 20世纪90年代初期,一个主要的新兴应用即万维网(World Wide Web)登上了舞台.Web是一个引起公众注意的因特网应用.Web的应用层协议是超文本传输协议(HTTP),它是 ...

  6. python3 之 判断字符串是否只为数字(isdigit()方法、isnumeric()方法)

    Isdigit()方法 - 检测字符串是否只由数字组成 语法:   str.isdigit() 参数: 无 返回值: 如果字符串只包含数字,则返回True,否则返回False. 实例: 以下实例展示了 ...

  7. 新闻实时分析系统 Spark Streaming实时数据分析

    1.Spark Streaming功能介绍1)定义Spark Streaming is an extension of the core Spark API that enables scalable ...

  8. promise实现图片按照指定的加载顺序执行

    promise实现图片按照指定的加载顺序执行,先加载第二张,再加载第一张,最后加载第三张 <!DOCTYPE html> <html lang="en"> ...

  9. Java中的Calendar 类和SimpleDateFormat 类

    1.Calendar 类:import java.util.Calendar;               Calendar cal = Calendar.getInstance();        ...

  10. 小白学 Python 爬虫(9):爬虫基础

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...