前言

下面的所有配置,都以centos为基础操作系统进行

服务端安装

组件安装

yum install krb5-libs krb5-server krb5-workstation

配置krb5.conf

默认路径为/etc/krb5.conf

该配置的主要配置了realm 对应的kdc的host,kadmin所在服务器,以及一些domain到realm的映射关系,以及日志存储文件等信息,一般分为如下四块:

  • logging 记录kerberos库、kdc、kadmin server对应的日志文件

[logging]

default = FILE:/var/log/krb5libs.log

kdc = FILE:/var/log/krb5kdc.log

admin_server = FILE:/var/log/kadmind.log

```

  • libdefaults 整个kerberos组件相关的默认配置,如果不显示执行相关配置项,则默认这些值

    [libdefaults]
    default_realm = TEST.COM
    dns_lookup_realm = false
    dns_lookup_kdc = false
    ticket_lifetime = 24h
    renew_lifetime = 7d
    forwardable = true
  • realms 。其中配置了该realm中kdc、kadmin server对应的host地址

    [realms]
    TEST.COM = {
    kdc = host1.mydomain.nl
    admin_server = host1.mydomain.nl
    }
  • domain_realm 配置域名或host映射的realm 。 由于kerberos本身是支持多realm的,这个配置可以用来将不同的host或domain映射到不同的realm

    [domain_realm]
    .example.com = TEST.COM
    example.com = TEST.COM

上述几块组合起来就是完整的配置,总体demo如下

[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log [libdefaults]
default_realm = TEST.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true [realms]
TEST.COM = {
kdc = host1.mydomain.nl
admin_server = host1.mydomain.nl
} [domain_realm]
.example.com = TEST.COM
example.com = TEST.COM

其中realm一般按惯例是所属公司的域名大写,这里做demo写的是TEST.COM ,实际配置需要替换成具体的公司域名

配置kdc.conf

默认路径为/var/kerberos/krb5kdc/kdc.conf。kdc是整个Kerberos网络的核心,它存储了所有principal的账号数据,并对principal的请求,进行认证,与Principal之间的访问票据分发。

一个典型的kdc.conf配置如下

[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88 [realms]
TEST.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 = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
max_life = 24h 0m 0s
max_renewable_life = 7d 0h 0m 0s
}

kdcdefaults块配置了kdc服务监听的端口

realms 配置了该kdc管辖的realm的相关配置,具体为

  • acl_file 配置具有管理员权限的访问控制列表kadm5.acl,具体释义,见下文
  • dict_file 配置principal密码约束文件,dict_file 文件中一个字符串一行,这些字符串相当于黑名单,配置其中的字符串都不能用作密码。
  • admin_keytab kdc的admin的免交互式认证文件存储地址
  • supported_enctypes kerberos网络中,各组件通信时所能使用的加密协议
  • max_life kdc分发的票据,最大有效期
  • max_renewable_life 指定一个合法票据(注意是合法,如果一个票据已经失效,是不能够被续期的),在多长时间内可被续期。有些分布式组件,处理一个任务可能会耗很长时间,甚至大于一个票据的最大生命周期。max_renewable_life 就是指,一个票据被分发后的一段时间内,该票据可以被续期,从而使其不过期。续期的命令是kinit -R , hue就专门有一个续期的服务,定时去调用kinit -R进行票据续期。一般max_renewable_life 默认值是0,也即不允许续期,所以记得要在kdc中配置该值,否则有些依赖Kerberos的服务会工作不正常,比如hue

配置kadm5.acl

默认路径/var/kerberos/krb5kdc/kadm5.acl

该文件相当于一个访问列表,其中配置了哪些Principal拥有管理kdc的数据库的名单。比如下属配置

 */admin@TEST.COM    *

该配置表示名为TEST.COM的realm 中,为*/admin的pricipal将拥有所有的权限,第一个星表示用户名通配符,vincent/admin或者tom/admin都能满足这个规则,第二个星表示拥有所有的权限

创建kdc数据库

kdb5_util create -s

该命令会创建一个kdc数据库,该数据库实际存放所有principal的账号。命令敲击后,会类似如下样子

Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'TEST.COM',
master key name 'K/M@TEST.COM'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key:
Re-enter KDC database master key to verify:

它会让用户属于一个密码,该密码是用来管理kdc数据库的,访问该数据的用户名为K/M@TEST.COM。kdc每次重启,都会要求输密码,以访问该数据库,为了跳过这个人工干预,所以这里加了-s参数,表示将数据登录认证进行暂存,这样下次kdc可以直接启动

在server端创建一个管理员账号,方便远程登录管理kerberos

在server所在的机器上执行命令kadmin.local -q "addprinc tunde/admin",该命令会直接访问kdc的数据库,并在其中创建一个tunde/admin的principal,该principal显然满足满足kadm5.acl访问控制列表的规范,可以作为kdc的管理员

正式启动kerberos server

$ service krb5kdc start #启动kdc
$ service kadmin start #启动kadmin server,该服务使得我们可以远程通过kadmin去管理kdc数据库中的Principal
$ chkconfig krb5kdc on
$ chkconfig kadmin on

服务端进阶配置

上述配置,已经完成了一个kerberos 服务的基本配置。下面来说一些进阶配置

服务端高可用配置

在两个机器上,分别启动kdc。 他们拥有独立的数据库,平时连其中一个,当挂掉后,启动另一个服务器上的kdc。两个kdc之间的数据库需要自己写脚本来复制。这种方式不是真正的高可用,且数据复制较为麻烦。

服务端同LDAP集成配置

https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/kdc_conf.html#dbdefaults

上述配置中,kdc默认的数据库是在本地文件系统上的一个文件。可以将kerberos同LDAP整合,实现将用户的账户、甚至组织机构信息存储在ldap中,而不是本地的文件中。一个跟LDAP整合的样例配置如下:

[kdcdefaults]
kdc_ports = 88 [realms]
ATHENA.MIT.EDU = {
kadmind_port = 749
max_life = 12h 0m 0s
max_renewable_life = 7d 0h 0m 0s
master_key_type = aes256-cts-hmac-sha1-96
supported_enctypes = aes256-cts-hmac-sha1-96:normal aes128-cts-hmac-sha1-96:normal
database_module = openldap_ldapconf
} [logging]
kdc = FILE:/usr/local/var/krb5kdc/kdc.log
admin_server = FILE:/usr/local/var/krb5kdc/kadmin.log [dbdefaults]
ldap_kerberos_container_dn = cn=krbcontainer,dc=mit,dc=edu [dbmodules]
openldap_ldapconf = {
db_library = kldap
disable_last_success = true
ldap_kdc_dn = "cn=krbadmin,dc=mit,dc=edu"
# this object needs to have read rights on
# the realm container and principal subtrees
ldap_kadmind_dn = "cn=krbadmin,dc=mit,dc=edu"
# this object needs to have read and write rights on
# the realm container and principal subtrees
ldap_service_password_file = /etc/kerberos/service.keyfile
ldap_servers = ldaps://kerberos.mit.edu
ldap_conns_per_server = 5
}
  • 其中dbdefaults下的ldap_kerberos_container_dn 属性,指定的是整个kerberos管理的Principal所在ldap的父entry地址,它相当于一个容器,装在了所有的Principal账户,所以名字上有container字样体现

  • db_library = kldap 表示我们整合的数据库类型是LDAP

  • disable_last_success = true 用户登录的时候,默认会记录用户上次成功登录的时间。但记录这个是有性能开销的。所以可以通过这个选项,禁用掉 对成功登录信息的记录。当然禁用掉会影响管理员去排除登录问题,你都不知道用户上次成功登录时什么时候了。对应的文档地址:https://web.mit.edu/kerberos/krb5-1.14/doc/admin/lockout.html

  • ldap_kdc_dn 该属性配置 krb5kdc守护进程在ldap中的账号dn(dn也即我们普通理解的id),该节点需要拥有对ldap_kerberos_container_dn entry的读写权限

  • ldap_kadmind_dn 该属性配置 kadmind进程的账号dn,该节点需要拥有对ldap_kerberos_container_dn entry的读写权限

  • ldap_service_password_file kerberos本身的守护进程krb5kdc和kadmind在对ldap中的principal信息进行管理时,首先这些守护进程自己需要有权限登录到ldap。而使用交互方式输入密码显然不现实。所以需要将krb5kdc和kadmind对应的ldap密码信息放到一个文件里。该属性就是来配置这个密码认证文件的。kerberos提供了工具kdb5_ldap_util 来将对应的ldap账号,做成文件

    kdb5_ldap_util stashsrvpw -f /home/andrew/conf_keyfile cn=service-kdc,o=org

    这里-f 指定将要用于存储密码的文件,后面紧跟的是对应的ldap dn。该命令会进入交互界面,让我们输入对应账号的密码,认证成功后,将在指定文件生成对应的认证记录。该工具的参考资料为:https://web.mit.edu/kerberos/www/krb5-latest/doc/admin/admin_commands/kdb5_ldap_util.html

  • ldap_servers 配置LDAP的连接地址

  • ldap_conns_per_server 配置kerberos同LDAP服务器之间保有的连接数

客户端安装

组件安装

 yum install krb5-workstation krb5-libs

与server不同的是,少了krb5-server组件的安装

krb5.conf配置

一般情况,client的该配置,同服务端一样,所以拷过来即可

日常运维

kadmin和kadmin.local的区别

kadmin 是通过访问kadmin server进程,来实现对Kdc中的principal进行管理

而kadmin.local是在kdc所在的服务器上,直接访问kdc的数据库,它不依赖kadmin server,只要kdc数据库创建后,即可进行操作。

除此之外,两者功能类似

kadmin

两种操作形态

直接使用kadmin时,kadmin相当一个命令行操作系统,一旦进入后,就可以在里面交互式的执行很多Principal管理命令。命令后面加了中文注释

[root]$ kadmin -p tunde/admin
Authenticating as principal tunde/admin with password.
Password for tunde/admin@TEST.COM: #list principals -- see which users can get a kerberos ticket
kadmin: list_principals #列出现在kdc中拥有的principal列表 #add a new principal
kadmin: addprinc user1 #添加一个principal
WARNING: no policy specified for user1@TEST.COM; defaulting to no policy
Enter password for principal "user1@TEST.COM":
Re-enter password for principal "user1@TEST.COM":
Principal "user1@TEST.COM" created. #delete principal
kadmin: delprinc user1 #删除一个principal
Are you sure you want to delete the principal "user1@TEST.COM"? (yes/no): yes
Principal "user1@TEST.COM" deleted.
Make sure that you have removed this principal from all ACLs before reusing. #let's add the user1 principal back
kadmin: addprinc user1 #再次添加user1这个principal
WARNING: no policy specified for user1@TEST.COM; defaulting to no policy
Enter password for principal "user1@TEST.COM":
Re-enter password for principal "user1@TEST.COM":
Principal "user1@TEST.COM" created. kadmin: exit #突出整个kadmin的交互session

值得注意的是,上述addprinc user1,会以交互的方式让用户输入这个principal的密码。如果添加的Principal本身不给用户交互使用,而是直接以keytab文件方式做为认证文件。那么也可以在新建principal的时候加上-randkey参数,表示给新建的用户随机生成一个密码。这样通过kadmin.local 生成keytab文件时,比如addprinc -randkey user1再分发给到目的地就好。keytab的创建方式见下文。

当然,如果只是想直接直接执行一个命令,而不想进入上述的交互界面,也可以直接加参数-q 去执行后即退出,比如

kadmin -p tunde/admin -q "list_principals"

直接使用kadmin的错误

直接使用kadmin命令时,默认登录的principal是当前linux登录用户的加realm组合而来的。比如当前登录用户是ops。那么kadmin会试登录用户为ops/admin@TEST.COM。很可能KDC数据库中,根本就没有这个Principal,所以会报如下错误

Authenticating as principal ops/admin@TEST.COM with password.

解决办法是对kadmin加-p参数,显示指定实际存在的admin principal来进行登录, 如kadmin -p tunde/admin

登录认证kinit

在安有kerberos 客户端或服务器的机器上,直接使用kinit user1命令,即可以交互的形式输入密码,去kdc认证登录。

已认证票据查询klist

登录成功后,可以使用klist -e看下票据的有效期等信息

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: user1@TEST.COM Valid starting Expires Service principal
02/03/14 02:32:42 02/04/14 02:32:42 krbtgt/TEST.COM@TEST.COM
renew until 02/03/14 02:32:42, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96

登出票据销毁kdestroy

就在登录的那台机器上使用kdestroy命令,销毁认证的票据。然后使用klist去看是否销毁成功,销毁成功后显示

 klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)

票据续期

使用kinit -R可以实现对已登录认证的票据进行续期,防止失效。hue有一个专门的 Ticket Renewal 实例来做这个事情

生成keytab文件

前面说过,通过kinit方式认证一个principal是需要用输入密码的方式进行交互。而如果两个互访的Principal本身就是两个机器,显然没办法以交互的方式进行认证。keytab文件就可以解决这个问题,它存储了多个principal及其对应的密码信息。

keytab文件的创建方式为,在kadmin命令行中使用ktadd命令,命令的完整形式为ktadd -k keytab_file_path principal。demo如下

kadmin: ktadd -k /tmp/foo-new-keytab host/foo.mit.edu
Entry for principal host/foo.mit.edu@ATHENA.MIT.EDU with kvno 3,
encryption type aes256-cts-hmac-sha1-96 added to keytab
FILE:/tmp/foo-new-keytab
kadmin:

从keytab中移除对应的principal使用的命令为ktremove,具体使用方式不再赘述

一些注意事项

max_life and max_renewable_life

前面说了max_life是设置票据的生存时长

max_renewable_life是设置票据可以被续期的时长,也即在指定的时间段内,票据可以被续期。当然续期后的票据长度还是max_life。

这两个属性跟principal是绑定的,所以如果配置这两个属性之前,已经创建了许多principal,那修改这两个属性重启kdc后,这两个属性依然不会生效。有两种方式来解决。

第一种,删除数据库后重做,数据库对应的文件,一般在/var/kerberos/krb5kdc目录下

第二种,直接修改对应Principal的属性值,比如

$ kadmin: modprinc -maxlife 1days -maxrenewlife 7days +allow_renewable krbtgt/TEST.COM
$ kadmin: modprinc -maxlife 1days -maxrenewlife 7days +allow_renewable

参考资料

https://godatadriven.com/blog/kerberos-basics-and-installing-a-kdc/

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system-level_authentication_guide/configuring_a_kerberos_5_client

kerberos安装配置的更多相关文章

  1. [转] kerberos安装配置与使用

    [From] https://blog.csdn.net/lovebomei/article/details/79807484 1.Kerberos协议: Kerberos协议主要用于计算机网络的身份 ...

  2. 【大数据安全】Kerberos集群安装配置

    1. 概述 Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份.它也指由麻省理工实现此协议,并发布的一套免费软件.它的设计主要针对 ...

  3. Kerberos+SSH安装配置使用教程

    一.背景说明 最早听说KDC和Kerberos应该是大三的<应用密码学>,当时感觉这套对称密钥分发机制比非对称密钥的PKI分发机制要好理解.但几年下来由于现实中使用SSL的场景比较比(主要 ...

  4. Kerberos安装及使用

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 2. 安装 Kerberos2.1. 环境配置 安装kerberos前,要确保主机名可以被解析. 主机名 内网IP 角色 ...

  5. MongoDB C Driver and APIinstances linux MongoDB安装配置

    <一,linux平台MongoDB安装配置>在这我们使用的Centos6 yum部署的,你想搞编译,自个干!

  6. Kerberos主从配置文档

    Kerberos主从配置文档   1. Kerberos主从同步机制 在Master上通过以下命令同步数据: kdb5_util dump /var/kerberos/krb5kdc/slave_db ...

  7. kerberos系列之kerberos安装

    最近搞了一下kerberos,准备写一个系列,介绍kerberos的安装,和常用组件kerberos配置,今天进入第一篇:kerberOS安装 具体kerberos是什么东西,大家可以百度查一下,这里 ...

  8. Hive安装配置指北(含Hive Metastore详解)

    个人主页: http://www.linbingdong.com 本文介绍Hive安装配置的整个过程,包括MySQL.Hive及Metastore的安装配置,并分析了Metastore三种配置方式的区 ...

  9. Hive on Spark安装配置详解(都是坑啊)

    个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/p/a7f75b868568 简介 本文主要记录如何安装配置Hive on Sp ...

随机推荐

  1. Centos7下搭建gitbook环境踩坑记录

    1.安装npm yum -y install npm 2.配置npm仓 npm config set registry https://mirrors.tencent.com/npm/ 3.安装git ...

  2. Redis数据结构—跳跃表

    目录 Redis数据结构-跳跃表 跳跃表产生的背景 跳跃表的结构 利用跳跃表查询有序链表 Redis跳跃表图示 Redis跳跃表数据结构 小结 Redis数据结构-跳跃表 大家好,我是白泽,最近学校有 ...

  3. SpringBoot简明教程

    一.SpringBoot简介 1.什么是SpringBoot SpringBoot用来简化spring应用开发,约定大于配置,去繁从简,是J2EE一站式解决方案 2.SpringBoot的优点 快速创 ...

  4. 数据库和SQL概述

    一.数据库的概念 1.DB 数据库(database):存储数据的"仓库".它保存了一系列有组织的数据. 2.DBMS 数据库管理系统(Database Management Sy ...

  5. 折腾Linux内核编译

    计网提高实验.指导书给的是远古版本2.6.39.2,轻易在某hub上找到下载地址 查表 看起来Ubuntu 11.04离得最近,遂下一个镜像 懒得上google检索了,编译准备先follow这篇博客试 ...

  6. foreign key 多对一 多对对 一对一

    使用foreign key 要清除先有哪张表再有哪张表,后表对应前表 例如现有部门再有员工,所以员工对应部门 现有作者后有书,所以书对应作者 现有潜在顾客后有顾客,所以顾客对应潜在顾客 多对多建立3张 ...

  7. GO反射类实例

    变量的内在机制 类型信息:是静态的元信息,是预先定义好的 值信息:是程序运行过程中动态改变的 反射的使用 获取类型信息:reflect.TypeOf,是静态的 获取值信息:reflect.ValueO ...

  8. [web] 系统运维--单机

    处理过程 浏览器发送请求经过网络到达web服务器 web服务器处理请求并响应数据 响应数据从web服务器发送到用户端 用户浏览器接收数据,本地计算渲染 指标 响应时间 吞吐量 响应时间 响应时间 = ...

  9. Play-book格式写法

    Play-Book playbook的组成 play 角色(主机或者主机组) task 任务,演戏的动作 总结:playbook是有多个play组成,一个play有多个task:剧本由一个或者多个演员 ...

  10. bond4以及vlan子接口配置

    场景: 前提,交换机的配置由网络工程师配合! 1.跨交换机做bond,模式为LACP,linux双网卡做bond4,模式为4: 2.系统为centos7.0-123: 3.服务器仅有两张万兆网卡,为e ...