CentOS 7.3环境中部署Kerberos集群

发布于:2025-06-11 ⋅ 阅读:(24) ⋅ 点赞:(0)

CentOS 7.3环境中部署Kerberos集群


官网介绍

环境

Linux版本:Centos 7.3

操作用户:root

Kerberos分为客户端(kerberos client)和服务端(kerberos server)

HA的的实现是主从复制的形式,由主服务将数据库备份,然后发送给从服务。

安装服务包

检查服务器上是否安装kerberos 服务

yum list installed | grep krb5

kerberos server安装命令

 yum -y install krb5-libs krb5-workstation krb5-server

kerberos client安装安装命令

 yum -y install krb5-devel krb5-workstation

Kerberos MS 规划

IP地址 hostname、域名 服务包 启动服务
192.168.1.1 hadoop3test1-09.test.com kerberos server、kerberos client KDC、 KADMIN
192.168.1.2 hadoop3test1-10.test.com kerberos server、kerberos client KDC
192.168.1.3 hadoop3test1-11.test.com kerberos client

realm就采用EXAMPLM.COM

安装 KDC Master Server

配置文件

kdc服务涉及三个配置文件/etc/krb5.conf/var/kerberos/krb5kdc/kdc.conf/var/kerberos/krb5kdc/kadm5.acl

/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
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 default_realm = EXAMPLE.COM
 # default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 EXAMPLE.COM = {
  kdc = 192.168.1.1
  kdc = 192.168.1.2
  admin_server = 192.168.1.1
#  default_domain = kerberos.com
 }

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

相关参数说明:

  • [logging]:日志的位置
  • [libdefaults]:每种连接的默认配置
    • dns_lookup_realm:是否通过 dns 查找需使用的 realm。false代表禁用。
    • ticket_lifetime:凭证的有效时限
    • renew_lifetime:凭证最长可以被延期的时限
    • forwardable:ticket 是否可以被转发(如果用户已经有了一个TGT,当他登入到另一个远程系统,KDC会为他重新创建一个TGT,而不需要让用户重新进行身份认证)
    • rdns:如果为 true,则除根据 hostname 正向查找外,同时反向查找对应的 principal。如果 dns_canonicalize_hostname 设置为 false,则此标志不起作用。
    • pkinit_anchors:受信任锚(根)证书的位置;如果用户在命令行上指定X509_anchors,则不使用该配置。在KDC中配置pkinit的位置
    • default_realm:默认的 realm,必须跟要配置的 realm 名称一致
    • default_ccache_name:指定默认凭据缓存的名称。默认值为 DEFCCNAME。不推荐使用该参数。
  • [realms]:列举使用的 realm
    • kdc:kdc服务器地址。格式 [主机名或域名]:端口, 默认端口是88,默认端口可不写
    • admin_server:kdc 数据库管理服务运行的机器,地址格式 [主机名或域名]:端口, 默认端口749,默认端口可不写
  • [domain_realm]:指定DNS域名和Kerberos域名之间映射关系。配置 domain name 或 hostname 对应的 releam

参考支持的日期与时间的格式,时间单位:d代表天数;h代表小时数;m代表分钟数;s代表秒数。

/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
  max_renewable_life = 7d
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal 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
 }

相关参数说明:

  • [kdcdefaults]:KDC 默认配置
    • kdc_ports:UDP 端口号
    • kdc_tcp_ports:TCP 端口号
  • [realms]:realm 数据库配置
    • master_key_type:主密钥的密钥类型;默认值为 aes256-cts-hmac-sha1-96。
    • acl_file:用于指定哪些用户可以访问 kdc 数据库的控制文件;如果不需要现在用户访问,该值可以设为空
    • dict_file:字典文件位置,该文件中的单词不能被用于密码;如果文件为空,或者没有为用户分配策略,则不会执行密码字典检查。
    • admin_keytab:KDC 进行校验的 keytab。
    • supported_enctypes:支持的加密方式。
/var/kerberos/krb5kdc/kadm5.acl
*/admin@EXAMPLE.COM     *

示例

kadm5.acl 文件中的以下项授予 HADOOP.COM 领域中包含 admin instance 实例的任何主体对 Kerberos 数据库的所有权限:

*/admin@HADOOP.COM     *

Kerberos kadmind 使用该文件来管理对 Kerberos 数据库的访问权限。对于影响 principa 的操作,ACL 文件还控制哪些 principa 可以对哪些其他 principa 进行操作。文件格式如下:principal permissions [target_principal [restrictions] ]

ACL 文件中的行顺序很重要,会使用第一个匹配的行来设置用户权限。

principal:设置该 principal 的权限;principal 的每个部分都可以使用 *

permissions: 权限,见下表。如果字符是大写,则不允许该操作。如果字符是小写,则允许该操作

target_principal:目标 principal,目标 principal 的每个部分都可以使用 *。【可选】

restrictions:针对权限的一些补充限制,如:限制创建的 principal 的票据最长时效。【可选】

权限 说明
a 允许添加 principals 或policies
c 允许更改 principals 的密码
d 允许删除 principals 或policies
e 允许提取principal 的的keys信息
i 允许查询 principals 或policies
l 允许列出所有 principals 或policies
m 允许修改 principals 或policies
p 允许主数据库的传播(用于增量数据库传播
s 允许显式设置 principal 的密钥
x admcilsp的缩写。所有权限(e除外)
* x

服务端和客户端的/etc/krb5.conf配置一致。

创建Kerberos数据库

 kdb5_util create -r EXAMPLE.COM -s

-s:表示生成 stash file,并在其中存储 master server key(krb5kdc)

-r:指定 realm name

Kerberos 数据库的目录为:/var/kerberos/krb5kdc,如果需要重建数据库,可删除改目录/var/kerberos/krb5kdc/principal

启动与停止服务

启动服务

systemctl start krb5kdc;
systemctl start kadmin;

检查服务

systemctl status krb5kdc.service;
systemctl status kadmin.service;

停止kdc服务

systemctl stop krb5kdc;
systemctl stop kadmin;

创建管理员

Kerberos 服务管理机器上可以使用 kadmin.local来执行各种管理的操作。为了方便密码都是123456。

创建管理员主体,其Instance必然使用admin

kadmin.local -q "addprinc root/admin"

或者进入kadmin.local创建管理用户给客户端可以进行管理操作

kadmin.local; 
add_principal root/admin@EXAMPLE.COM
[root@hadoop3test1-09 ~]# kadmin.local
Authenticating as principal root/admin@EXAMPLE.COM with password.
kadmin.local:  add_principal root/admin@EXAMPLE.COM
WARNING: no policy specified for root/admin@EXAMPLE.COM; defaulting to no policy
Enter password for principal "root/admin@EXAMPLE.COM": 
Re-enter password for principal "root/admin@EXAMPLE.COM": 
Principal "root/admin@EXAMPLE.COM" created.

Kerberos 客户端机器上可以使用 kadmin 命令与管理员主体与密码进行登录操作。

创建普通用户

 # 在EXAMPLE.COM领域下创建用户bigdata与huatuo,指定其密码为123456
 kadmin.local -q "addprinc -pw 123456 bigdata@EXAMPLE.COM";
 kadmin.local -q "addprinc -pw 123456 huatuo@EXAMPLE.COM";
 # 为bigdata和huatuo用户产生秘钥文件keytab
 kadmin.local -q "ktadd -norandkey -kt /opt/keytabs/bigdata.keytab bigdata@EXAMPLE.COM";
 kadmin.local -q "ktadd -norandkey -kt /opt/keytabs/huatuo.keytab huatuo@EXAMPLE.COM";
 # 分发秘钥文件供客户端登录使用
 scp /opt/keytabs/huatuo.keytab root@192.168.1.3:/opt/keytabs/huatuo.keytab
 scp /opt/keytabs/bigdata.keytab root@192.168.1.3:/opt/keytabs/bigdata.keytab

 kadmin.local -q "addprinc -pw 123456 gudong@EXAMPLE.COM";
 kadmin.local -q "ktadd -norandkey -kt /opt/keytabs/gudong.keytab gudong@EXAMPLE.COM";
 scp /opt/keytabs/gudong.keytab root@192.168.1.3:/opt/keytabs/gudong.keytab

安装 KDC Salve Server

创建集群的host keytab文件

在KADMIN(Master Server)上创建集群节点主体账户,集群节点host账户格式host/主机名,生成集群的host keytab文件,默认/etc/krb5.keytab

# 创建
kadmin.local -q "addprinc -randkey host/hadoop3test1-06.test.com";
kadmin.local -q "addprinc -randkey host/hadoop3test1-07.test.com";

# 生成keytab文件,在/etc/krb5.keytab.
kadmin.local -q "ktadd  host/hadoop3test1-06.test.com";
kadmin.local -q "ktadd  host/hadoop3test1-07.test.com";

分发文件到KDC Salve Servers

将Master上的下列文件分发到salves

  • /etc/krb5.conf
  • /var/kerberos/krb5kdc/kdc.conf
  • /var/kerberos/krb5kdc/kadm5.acl
  • /etc/krb5.keytab
 scp root@192.168.1.1:/etc/krb5.keytab /root/gd/keytabs
 scp /root/gd/keytabs/krb5.keytab  root@192.168.1.2:/etc/krb5.keytab 

创建与主KDC服务相同库密码也相同

kdb5_util create -r EXAMPLE.COM -s

新增配置文件kpropd.acl

vim /var/kerberos/krb5kdc/kpropd.acl。文件内容需要master的host账户和此salve的账户。

host/hadoop3test1-06.test.com@EXAMPLE.COM
host/hadoop3test1-07.test.com@EXAMPLE.COM

启动kpropd服务

kpropd -S

Master备份账户信息,并发送到salve服务器

在Master Server上执行

[root@hadoop3test1-09 ~]# kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
[root@hadoop3test1-09 ~]# ll /var/kerberos/krb5kdc/
总用量 56
-rw-r--r-- 1 root root    26 69 11:42 kadm5.acl
-rw-r--r-- 1 root root   452 69 10:41 kdc.conf
-rw------- 1 root root  2922 69 11:47 krb5.keytab
-rw------- 1 root root 20480 69 14:59 principal
-rw------- 1 root root  8192 69 14:25 principal.kadm5
-rw------- 1 root root     0 69 14:25 principal.kadm5.lock
-rw------- 1 root root     0 69 14:59 principal.ok
-rw------- 1 root root 11135 69 15:01 slave_datatrans
-rw------- 1 root root     1 69 15:01 slave_datatrans.dump_ok
[root@hadoop3test1-09 ~]# kprop -f /var/kerberos/krb5kdc/slave_datatrans hadoop3test1-07.test.com
Database propagation to hadoop3test1-07.test.com: SUCCEEDED

启动与停止服务

启动服务

systemctl start krb5kdc;

检查服务

systemctl status krb5kdc.service;

停止kdc服务

systemctl stop krb5kdc;

安装KDC Client

配置文件/etc/krb5.conf

这个配置文件可以直接用服务端的。

用户登录

 # 命令交互式,输入密码
 kinit gudong@EXAMPLE.COM
 # 秘钥文件认证方式
 kinit -kt /opt/keytab/root.keytab gudong@EXAMPLE.COM

查询登录情况

klist

[root@hadoop3test1-06 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: gudong@EXAMPLE.COM

Valid starting       Expires              Service principal
2025-06-09T17:25:35  2025-06-10T17:25:35  krbtgt/EXAMPLE.COM@EXAMPLE.COM
        renew until 2025-06-16T17:25:35

验证刷新票据

kinit -R

[root@hadoop3test1-06 ~]# kinit -R
[root@hadoop3test1-06 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: gudong@EXAMPLE.COM

Valid starting       Expires              Service principal
2025-06-09T17:31:21  2025-06-10T17:31:21  krbtgt/EXAMPLE.COM@EXAMPLE.COM
        renew until 2025-06-16T17:25:35

遇到的问题

1、执行创建库kdb5_util create -r EXAMPLE.COM -s,长时间卡在loading random data

网上建议:因为/dev/random的随机数据产生的很少,可以适当的让网卡传输数据,这样有助于产生随机数据。解决:在等待loading random data,期间重新开启一个创建控制台窗口,执行cat /dev/vda > /dev/urandom命令,加快消耗CPU,增加随机数采集,从而加快创建库的操作。

#使用 lsblk 命令可以列出所有可用的块设备 找到i系统盘对于的块名称
lsblk

NAME                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                  11:0    1  434K  0 rom  
vda                 252:0    0   75G  0 disk 
├─vda1              252:1    0  500M  0 part /boot
└─vda2              252:2    0 74.5G  0 part 
  ├─systemvg-rootlv 253:0    0   10G  0 lvm  /
  ├─systemvg-swaplv 253:1    0   10G  0 lvm  
  ├─systemvg-usrlv  253:2    0   10G  0 lvm  /usr
  ├─systemvg-homelv 253:3    0    2G  0 lvm  /home
  ├─systemvg-tmplv  253:4    0    2G  0 lvm  /tmp
  ├─systemvg-varlv  253:5    0    8G  0 lvm  /var
  └─systemvg-optlv  253:6    0 32.5G  0 lvm  /opt
vdb                 252:16   0  100G  0 disk 
└─datavg1-datalv    253:7    0  100G  0 lvm  /data

但是无效果。

当服务器执行了一次创建Kerberos数据库之后,清理/var/kerberos/krb5kdc/principal后,再次执行创建库的操作,必然出现loading random data卡主的情况,无法缓解。