(原创推荐文章)kerberos服务器端与客户端

#环境

两台装centos7的虚拟机即可。

kerberos服务器端与客户端各一台

(本文档推荐使用Typora软件观看)

# 1.kerberos服务器端配置

## 1.1安装配置Kerberos Server

```bash
[[email protected] ~]# yum install krb5-server krb5-libs krb5-auth-dialog -y
[[email protected] ~]# vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88

[realms]
EXAMPLE.COM = {
#master_key_type = aes256-cts #由于,JAVA使用aes256-cts验证方式需要安装额外的jar包,更多参考2.2.9关于AES-256加密:。推荐不使用。
acl_file = /var/kerberos/krb5kdc/kadm5.acl #标注了admin的用户权限。文件格式是Kerberos_principal permissions [target_principal] [restrictions]支持通配符等。
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab #KDC进行校验的keytab(密钥表)。后文会提及如何创建。
max_renewable_life = 7d
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
#supported_enctypes表示支持的校验方式。注意把aes256-cts去掉。
}
```

```bash
[[email protected] ~]# vi /etc/krb5.conf
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/

[logging]
default = FILE:/var/log/krb5libs.log #表示server端的日志的打印位置
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h #表明凭证生效的时限,一般为24小时。
renew_lifetime = 7d #表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,对安全认证的服务的后续访问则会失败。
forwardable = true
rdns = false
default_realm = EXAMPLE.COM #默认的realm,必须跟要配置的realm的名称一致。
default_ccache_name = KEYRING:persistent:%{uid}
# udp_preference_limit = 1 禁止使用udp可以防止一个Hadoop中的错误

[realms] #列举使用的realm。
EXAMPLE.COM = {
kdc = kerberos.example.com #代表要kdc的位置。格式是 机器:端口
admin_server = kerberos.example.com #代表admin的位置。格式是机器:端口
}

[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
```

## 1.2创建/初始化Kerberos database

```bash
[[email protected] ~]# /usr/sbin/kdb5_util create -s -r EXAMPLE.COM
[[email protected] krb5kdc]# ll /var/kerberos/krb5kdc
总用量 24
-rw-------. 1 root root 22 12月 7 2016 kadm5.acl
-rw-------. 1 root root 459 8月 23 10:45 kdc.conf
-rw-------. 1 root root 8192 8月 23 10:46 principal
-rw-------. 1 root root 8192 8月 23 10:42 principal.kadm5
-rw-------. 1 root root 0 8月 23 10:42 principal.kadm5.lock
-rw-------. 1 root root 0 8月 23 10:46 principal.ok
[-s]表示生成stash file,并在其中存储master server key(krb5kdc);还可以用[-r]来指定一个realm name —— 当krb5.conf中定义了多个realm时才是必要的。
如果需要重建数据库,将该目录下的principal相关的文件删除即可,其它两个不要删除
在此过程中,我们会输入database的管理密码。这里设置的密码一定要记住,如果忘记了,就无法管理Kerberos server,密码是test
```

## 1.3 添加database administrator数据库管理员

我们需要为Kerberos database添加administrative principals (即能够管理database的principals安全个体) —— 至少要添加1个principal来使得Kerberos的管理进程kadmind能够在网络上与程序kadmin进行通讯。

```bash
[[email protected] ~]# /usr/sbin/kadmin.local -q "addprinc admin/admin"
Authenticating as principal root/[email protected] with password.
WARNING: no policy specified for admin/[email protected]; defaulting to no policy
Enter password for principal "admin/[email protected]": testtest
Re-enter password for principal "admin/[email protected]": testtest
Principal "admin/[email protected]" created.
[[email protected] ~]#

添加佣有管理员权限的管理员ryan密码为123456
[[email protected] ~]# kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local: addprinc ryan/admin #添加ryan/admin
WARNING: no policy specified for ryan/[email protected]; defaulting to no policy
Enter password for principal "ryan/[email protected]": 123456
Re-enter password for principal "ryan/[email protected]": 123456
Principal "ryan/[email protected]" created.
kadmin.local: listprincs #查看有多少
K/[email protected]
admin/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kiprop/[email protected]
krbtgt/[email protected]
ryan/[email protected]
kadmin.local: delprinc ryan/admin #删除ryan/admin 不能只是ryan
Are you sure you want to delete the principal "ryan/[email protected]"? (yes/no): yes
Principal "ryan/[email protected]" deleted.
Make sure that you have removed this principal from all ACLs before reusing.
kadmin.local: modprinc -maxrenewlife 1week ryan/[email protected] #修改renewlife为7天
Principal "ryan/[email protected]" modified.
kadmin.local: exit

以下命令还不能使用:
[[email protected] ~]# kadmin
-bash: kadmin: 未找到命令
```

## 1.4 为database administrator设置ACL权限

```bash
[[email protected] krb5kdc]# cat /var/kerberos/krb5kdc/kadm5.acl
*/[email protected] *
# 代表名称匹配*/[email protected]的,都认为是admin,权限是 *。代表全部权限。
在KDC上我们需要编辑acl文件来设置权限,该acl文件的默认路径是 /var/kerberos/krb5kdc/kadm5.acl(也可以在文件kdc.conf中修改)。Kerberos的kadmind daemon会使用该文件来管理对Kerberos database的访问权限。对于那些可能会对pincipal产生影响的操作,acl文件也能控制哪些principal能操作哪些其他pricipals。

```

# 1.5 在master KDC启动Kerberos daemons

```bash
[[email protected] krb5kdc]# systemctl status krb5kdc
● krb5kdc.service - Kerberos 5 KDC
Loaded: loaded (/usr/lib/systemd/system/krb5kdc.service; disabled; vendor preset: disabled)
Active: inactive (dead)
[[email protected] krb5kdc]# systemctl start krb5kdc
[[email protected] krb5kdc]# systemctl enable krb5kdc

[[email protected] krb5kdc]# systemctl status kadmin
● kadmin.service - Kerberos 5 Password-changing and Administration
Loaded: loaded (/usr/lib/systemd/system/kadmin.service; disabled; vendor preset: disabled)
Active: inactive (dead)
[[email protected] krb5kdc]# systemctl start kadmin
[[email protected] krb5kdc]# systemctl enable kadmin

[[email protected] krb5kdc]# tail -f /var/log/krb5kdc.log
otp: Loaded
8月 23 11:17:20 localhost.localdomain krb5kdc[4914](info): setting up network...
8月 23 11:17:20 localhost.localdomain krb5kdc[4914](info): listening on fd 9: udp 0.0.0.0.88 (pktinfo)
krb5kdc: setsockopt(10,IPV6_V6ONLY,1) worked
8月 23 11:17:20 localhost.localdomain krb5kdc[4914](info): listening on fd 10: udp ::.88 (pktinfo)
krb5kdc: setsockopt(11,IPV6_V6ONLY,1) worked
8月 23 11:17:20 localhost.localdomain krb5kdc[4914](info): listening on fd 12: tcp 0.0.0.0.88
8月 23 11:17:20 localhost.localdomain krb5kdc[4914](info): listening on fd 11: tcp ::.88
8月 23 11:17:20 localhost.localdomain krb5kdc[4914](info): set up 4 sockets
8月 23 11:17:20 localhost.localdomain krb5kdc[4915](info): commencing operation
[[email protected] krb5kdc]# tail -f /var/log/kadmind.log
8月 23 11:17:32 localhost.localdomain kadmind[4940](info): listening on fd 10: udp ::.464 (pktinfo)
kadmind: setsockopt(11,IPV6_V6ONLY,1) worked
8月 23 11:17:32 localhost.localdomain kadmind[4940](info): listening on fd 12: tcp 0.0.0.0.464
8月 23 11:17:32 localhost.localdomain kadmind[4940](info): listening on fd 11: tcp ::.464
8月 23 11:17:32 localhost.localdomain kadmind[4940](info): listening on fd 13: rpc 0.0.0.0.749
kadmind: setsockopt(14,IPV6_V6ONLY,1) worked
8月 23 11:17:32 localhost.localdomain kadmind[4940](info): listening on fd 14: rpc ::.749
8月 23 11:17:32 localhost.localdomain kadmind[4940](info): set up 6 sockets
8月 23 11:17:32 localhost.localdomain kadmind[4941](info): Seeding random number generator
8月 23 11:17:32 localhost.localdomain kadmind[4941](info): starting
```

现在KDC已经在工作了。这两个daemons将会在后台运行,可以查看它们的日志文件(/var/log/krb5kdc.log 和 /var/log/kadmind.log)。
可以通过客户端命令kinit来检查这两个daemons是否正常工作。

# 2.客户端操作

## 2.1安装客户端

```bash
[[email protected] ~]# yum install -y krb5-workstation krb5-libs krb5-auth-dialog
```

## 2.2 配置krb5.conf

配置这些主机上的/etc/krb5.conf,这个文件的内容与KDC服务器中的文件保持一致即可。

## 2.3验证后登录

登录到管理员账户: 如果在本机上,可以通过kadmin.local直接登录。其它机器的,先使用kinit进行验证。

```bash
验证:
[[email protected] ~]# kinit ryan/[email protected]
Password for ryan/[email protected]: 123456
登录:
[[email protected] ~]# kadmin
Authenticating as principal ryan/[email protected] with password.
Password for ryan/[email protected]:
kadmin: list_principals #列出所有帐户
K/[email protected]
admin/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kiprop/[email protected]
krbtgt/[email protected]
ryan/[email protected]
kadmin:
查看当前的认证用户:
[[email protected] ~]# klist
Ticket cache: KEYRING:persistent:0:0
Default principal: ryan/[email protected]

Valid starting Expires Service principal
2017-08-23T14:01:32 2017-08-24T14:01:32 krbtgt/[email protected]
renew until 2017-08-30T14:01:32
[[email protected] ~]#
```

## 2.4 创建keytab

```bash
[[email protected] tmp]# mkdir -p /var/kerberos/krb5kdc/
[[email protected] tmp]# kinit ryan/[email protected]
[[email protected] tmp]# kadmin
#创建key table(密钥表)命令(第一种)
kadmin: xst -k /var/kerberos/krb5kdc/kadm5.keytab ryan/[email protected]
Entry for principal ryan/[email protected] with kvno 25, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 25, encryption type des3-cbc-sha1 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 25, encryption type arcfour-hmac added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 25, encryption type camellia256-cts-cmac added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 25, encryption type camellia128-cts-cmac added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 25, encryption type des-hmac-sha1 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 25, encryption type des-cbc-md5 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
#创建key table(密钥表)命令(第二种)
kadmin: ktadd -k /var/kerberos/krb5kdc/kadm5.keytab ryan/[email protected]
Entry for principal ryan/[email protected] with kvno 24, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 24, encryption type des3-cbc-sha1 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 24, encryption type arcfour-hmac added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 24, encryption type camellia256-cts-cmac added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 24, encryption type camellia128-cts-cmac added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 24, encryption type des-hmac-sha1 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
Entry for principal ryan/[email protected] with kvno 24, encryption type des-cbc-md5 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
kadmin:
查看keytab里添加了哪些密钥(每个帐户有不同类型的)
[[email protected] ~]# klist -e -k -t /var/kerberos/krb5kdc/kadm5.keytab
```

## 2.5使用密钥表的方式登录(无需输入密码)

```bash
使用之前的密码方式登录,会报密码错误,因为生成密钥表的时候,会重新生成一个随机密钥,然后再写入keytab密钥表文件中。以下kinit验证步骤可省略:
[[email protected] ~]# kinit -kt /var/kerberos/krb5kdc/kadm5.keytab ryan/[email protected]
[[email protected] ~]# kadmin -kt /var/kerberos/krb5kdc/kadm5.keytab -p ryan/[email protected]
Authenticating as principal ryan/[email protected] with keytab /var/kerberos/krb5kdc/kadm5.keytab.
kadmin: ?
```

## 2.6删除当前认证缓存

```bash
[[email protected] ~]# kdestroy
```

## 2.7延长凭证过期时间

```bash
[[email protected] ~]# kinit -kt /var/kerberos/krb5kdc/kadm5.keytab ryan/[email protected]
[[email protected] ~]# kinit -R #延长凭证过期时间
kinit: KDC can‘t fulfill requested option while renewing credentials
注:提示无法延长凭证过期时间,可能是因为renewlife参数设置为0day了。

[[email protected] ~]# kadmin.local
kadmin.local: modprinc -maxrenewlife 1week ryan/[email protected]
Principal "ryan/[email protected]" modified.

[[email protected] ~]# kinit -kt /var/kerberos/krb5kdc/kadm5.keytab ryan/[email protected]
[[email protected] ~]# kinit -R
[[email protected] ~]# #没有返回信息,说明已经成功延长凭证过期时间了
```

# 3.常见错误

```bash
[[email protected] ~]# /usr/sbin/kdb5_util create -s -r EXAMPLE.COM
kdb5_util: Required parameters in kdc.conf missing while initializing the Kerberos admin interface
配置文件中的supported_enctypes的某个加密类型不可用。

```

```bash
[[email protected] ~]# /usr/sbin/kadmin.local -q "addprinc admin/admin"
Authenticating as principal root/[email protected] with password.
kadmin.local: Cannot find master key record in database while initializing kadmin.local interface
需要重新运行创建kerberos数据库的命令,即/usr/sbin/kdb5_util create -s -r EXAMPLE.COM
```

```bash
[[email protected] ~]# kinit ryan/[email protected]
kinit: Cannot contact any KDC for realm ‘EXAMPLE.COM‘ while getting initial credentials
KDC服务器的防火墙没关,或者KDC服务器服务没启动
```

```bash
[[email protected] ~]# kinit ryan/[email protected]
Password for ryan/[email protected]:
kinit: Password incorrect while getting initial credentials
提示密码错误,或者是因为执行创建密钥表的操作,重新生成随机密钥,写入密钥表文件中。
```

4.参考文章

```bash
http://dongxicheng.org/mapreduce/hadoop-kerberos-introduction/
http://blog.csdn.net/wulantian/article/details/42418231
http://idior.cnblogs.com/archive/2006/03/20/354027.html
```

```bash
http://docs.oracle.com/cd/E24847_01/html/819-7061/setup-9.html
http://www.cnblogs.com/xiaodf/p/5968178.html
```

时间: 2024-10-16 02:43:21

(原创推荐文章)kerberos服务器端与客户端的相关文章

实现服务器端与客户端的高频实时通信 SignalR(2)

说明:本篇文章与上篇文章 实现服务器端与客户端的实时通信 SignalR(1) 基本代码类似,只是做了些处理 高频 的改动. 一.本文出处:SignalR 实例介绍 (建议看原著里面有DEMO下载) 二.这篇文章介绍如何利用 VS2012 创建一个简单的实时高频反馈系统,建好后的样子如下:拖动某个窗口的红色框,其余窗口的红色框跟着运动. 三.Demo 创建 1.新建项目以及新建完成后的目录结构如上篇文章所示(项目名称为 MoveShape): 2.安装 SignalR 程序包,该包实现了服务端与

5.1-5.31推荐文章汇总

5.1-5.31推荐文章汇总 [移动开发] Android Volley完全解析(三),定制自己的Request guolin 雄踞AppStore榜首的游戏<别踩到白块儿>源代码分析和下载(一)touchsnow Cocos2d-x3.0游戏实例之<别救我>第四篇--乱入的主角笨木头 Android-自定义图像资源的使用(2)wwj_748 Android SQLite性能分析Horky <游戏脚本的设计与开发>-(RPG部分)3.6 队员列表和人物属性vipra C

TCP服务器端和客户端程序设计【转】

本文转载自:http://blog.csdn.net/yueguanghaidao/article/details/7035248# 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.实验目的 学习和掌握Linux下的TCP服务器基本原理和基本编程方法,体会TCP与UDP编程的不同,UDP编程:http://blog.csdn.net/yueguanghaidao/article/details/7055985 二.实验平台 Linux操作系统 三.实验内容 编写Linux下TCP服务器

6.1-6.30推荐文章汇总

6.1-6.30推荐文章汇总 [移动开发] Cocos2d-x Auto-batching 浅浅的"深入分析" 笨木头 OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)yanzi1225627 Unity3D游戏开发之回合制游戏原型的实现qinyuanpei iOS安全攻防(二十三):Objective-C代码混淆念茜 Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)guolin i

C#中使用Redis学习一 windows安装redis服务器端和客户端

学习背景 今天是2015年1月2日,新年刚开始的第二天,先祝大家元旦快乐啦(迟到的祝福吧^_^).前段时间一直写Jquery插件开发系列博文,这个系列文章暂停一段时间,最近一直在看redis,我将把redis作为一个系列写一下我的学习历程.正好现在项目中使用了redis,本着学习探索的精神,准备写一下我对redis的一个学习历程和自己的一点感悟.在学习过程中也走了很多弯路,希望能对看这篇博文的朋友们带来点帮助.也算是写这边博文的最大目的了. 我在认识redis之前没有接触过任何NoSql思想.对

10.1-10.31推荐文章汇总

10.1-10.31推荐文章汇总 [移动开发] Android ViewGroup拦截触摸事件详解        Mr-Simp1e Android 实现形态各异的双向侧滑菜单 自定义控件来袭        鸿洋_ Android应用开发-小巫CSDN博客客户端之嵌入有米广告        IT_xiao小巫 [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上)        秦元培 Android应用开发-小巫CSDN博客客户端Jsoup篇        IT_xiao小巫

Jerry的ABAP原创技术文章合集

我之前发过三篇和ABAP相关的文章: 1. Jerry的ABAP, Java和JavaScript乱炖 这篇文章包含我多年来在SAP成都研究院使用ABAP, Java和JavaScript工作过程中的一些感悟: 三种语言里一些具体技术点的横向比较.随便提一些: ABAP Load Vs Java Byte code ABAP和Java的weak reference比较 ABAP和Java的垃圾回收比较 ADBC和JDBC 用ABAP模拟闭包/柯里化/动态代理/Spring依赖注入 2. ABAP

基于C/S架构的3D对战网络游戏C++框架 _01服务器端与客户端需求分析

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

7.1-7.31推荐文章汇总

7.1-7.31推荐文章汇总 [移动开发] Android ActionBar应用实战.高仿微信主界面的设计        guolin Cocos2d-x-Lua 开发简单的小游戏(记数字踩白块)        IT_xiao小巫 是男人就下100层[第四层]--Crazy贪吃蛇(1)        阳光小强 SEAndroid安全机制框架分析        罗升阳 Android多线程分析之四:MessageQueue的实现        飘飘白云 美女图片採集器 (源代码+解析)