目录
一、集群规划
二、主机环境准备
1、配置主机名
2、配置HOSTS
3、关闭防火墙
4、关闭SELINUX
5、修改时区
三、安装kerberos
1、安装软件包
2、配置/etc/krb5.conf
3、配置/var/kerberos/krb5kdc/kdc.conf
4、配置/var/kerberos/krb5kdc/kadm5.acl
5、初始化KDC数据库
6、添加数据库管理主体
7、启动服务
8、登录测试
9、创建KDC服务器host主体
10、查看keytab
四、配置主从高可用
1、主节点创建全量节点host主体
2、查看keytab
3、拷贝配置文件至备节点
4、备节点配置/var/kerberos/krb5kdc/kprop/kpropd.acl
5、在备节点启动kpropd服务
6、数据备份、同步
7、备节点启动服务
五、配置定时全量同步
1、主节点编写同步脚本/var/kerberos/krb5kdc/dump/krb5prop.sh
2、主节点配置crontab定时任务
3、测试kinit是否正常
六、配置增量同步(主节点直接同步备节点1、备节点2)
1、主、备节点配置/var/kerberos/krb5kdc/kdc.conf
2、主节点创建备节点kiprop主体
3、拷贝更新后的krb5.keytab到备节点
4、主、备节点配置同步权限/var/kerberos/krb5kdc/kadm5.acl
5、重启主、备节点服务
6、查看同步信息
七、配置增量同步(主节点同步备节点1;备节点1同步备节点2)
1、主、备节点配置/var/kerberos/krb5kdc/kdc.conf(同上)
2、主节点创建备节点kiprop主体(同上)
3、拷贝更新后的krb5.keytab到备节点(同上)
4、主、备节点配置同步权限/var/kerberos/krb5kdc/kadm5.acl(同上)
5、备节点1修改kadmin启动配置/etc/sysconfig/kadmin
6、备节点2修改kprop启动配置/etc/sysconfig/kprop
7、重启主、备节点服务(同上)
八、Kerberos认证原理
1、名词解释
2、认证过程
九、参考资料
本次测试采用2台虚拟机,操作系统版本为centos7.6
kerberos采用默认YUM源安装,版本为:1.15.1-55
提示:Kerberos最新版本可从官网下载,下载地址为:https://web.mit.edu/kerberos/
IP地址 | 主机名 | KDC |
192.168.121.101 | node101.cc.local | KDC master |
192.168.121.102 | node102.cc.local | KDC slaver 1级 |
192.168.121.103 | node103.cc.local | KDC slaver 2级 |
### 在node1节点均执行操作 ###
hostnamectl set-hostname node101.cc.local
### 在node2节点均执行操作 ###
hostnamectl set-hostname node102.cc.local
### 在每个节点均执行操作 ###
cat << EOF > /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.121.101 node101.cc.local node101
192.168.121.102 node102.cc.local node102
EOF
### 在每个节点均执行操作 ###
systemctl stop firewalld.service
systemctl disable firewalld.service
### 在每个节点均执行操作 ###
sed -i.bak$DATE '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
setenforce 0
### 在每个节点均执行操作 ###
#timedatectl set-timezone "Asia/Shanghai"
krb5-server:Kerberos服务端程序,KDC所在节点。
krb5-workstation: 包含一些基本Kerberos程序,比如(kinit, klist, kdestroy,kpasswd),使用Kerberos的所有节点都应该部署。
krb5-libs:包含Kerberos程序的各种支持类库等。
yum -y install krb5-libs krb5-server krb5-workstation
# 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
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
default_realm = CC.LOCAL
#default_ccache_name = KEYRING:persistent:%{uid}[realms]
CC.LOCAL = {
kdc = node101.cc.local:88
kdc = node102.cc.local:88
kdc = node103.cc.local:88
admin_server = node101.cc.local:749
}[domain_realm]
.cc.local= CC.LOCAL
cc.local= CC.LOCAL
说明:
[logging]:日志输出设置
[libdefaults]:默认配置,未指定Kerberos域时生效
dns_lookup_realm:DNS查找域名,默认禁用
ticket_lifetime:凭证生效的时限,设置为24h。
renew_lifetime:凭证最长可以被延期的时限,一般为7天
forwardable:转发票据,默认开启,KDC可以基于该类型TGT发放新的TGT,无需用户再身份验证
rdns:反向解析,默认禁用即可
pkinit_anchors:配置pkinit的位置,默认即可
default_realm:设置默认领域
default_ccache_name:默认的缓存名称,不推荐使用该参数
[realms]:列举使用的 realm
admin_server:admin服务地址,格式 [主机名或域名]:端口, 默认端口749,默认端口可不写
kdc:kdc服务器地址,格式?[主机名或域名]:端口, 默认端口是88,默认端口可不写
[domain_realm]:指定DNS域名和Kerberos域名之间映射关系
[kdc]:kdc的配置信息。即指定kdc.conf的位置
profile:kdc的配置文件路径,默认没有配置,如果是默认路径,可以不写
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88[realms]
CC.LOCAL = {
#master_key_type = aes256-cts
max_renewable_life = 7d
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 camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
说明:
kdc_ports:指定KDC的默认端口,默认88,如果多个以逗号分隔
kdc_tcp_ports:指定KDC的TCP协议默认端口,默认88,如果多个以逗号分隔
[realms]:该部分列出每个领域的配置。
master_key_type:和 supported_enctypes 默认使用 aes256-cts。JAVA 使用 aes256-cts 验证方式需要安装 JCE包(推荐不使用),默认为注释的
max_renewable_life:可重获取票据最大时间,默认为0
acl_file:admin 的用户权限的文件,默认即可,若文件不存在,需要用户自己创建。
dict_file:该参数指向包含潜在可猜测或可破解密码的文件,默认即可
admin_keytab:KDC 进行校验的 keytab,默认即可
supported_enctypes:指定此KDC支持的各种加密类型,默认即可。
kws/[email protected] *
说明:
CC.LOCAL领域中的kws/admin主体可修改KDC中的主体或策略。缺省安装包括一个*,以匹配所有的admin主体,但此缺省安装可能会造成安全风险,故设置一个所有admin主体的列表会更安全。
kdb5_util create -r CC.LOCAL -s
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'CC.LOCAL',
master key name 'K/[email protected]'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key: cckdc!101
Re-enter KDC database master key to verify: cckdc!101
说明:
[-s] 表示生成stash file,并在其中存储master server key(krb5kdc)
[-r] 来指定一个realm name,当krb5.conf中定义了多个realm时才是必要的。
如果需要重建数据库,将/var/kerberos/krb5kdc目录下的principal相关的文件删除即可
kadmin.local -q "addprinc kws/admin"
Authenticating as principal root/[email protected] with password.
WARNING: no policy specified for kws/[email protected]; defaulting to no policy
Enter password for principal "kws/[email protected]": kws!101
Re-enter password for principal "kws/[email protected]": kws!101
Principal "kws/[email protected]" created.
systemctl start krb5kdc
systemctl start kadmin
systemctl enable krb5kdc
systemctl enable kadmin
kadmin -p kws/[email protected]
Authenticating as principal kws/[email protected] with password.
Password for kws/[email protected]: kws!101
kadmin: list_principals
K/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kiprop/[email protected]
krbtgt/[email protected]
kws/[email protected]
kadmin.local
创建node101服务器host的principal
Authenticating as principal root/[email protected] with password.
kadmin.local: addprinc -randkey host/node101.cc.local
WARNING: no policy specified for host/[email protected]; defaulting to no policy
Principal "host/[email protected]" created.
生成keytab文件
kadmin.local: ktadd host/node101.cc.local
Entry for principal host/node101.cc.local with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type des3-cbc-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type camellia256-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type camellia128-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type des-hmac-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type des-cbc-md5 added to keytab FILE:/etc/krb5.keytab.
按照以上步骤,创建node102、node103的principal,并生成keytab文件
kadmin.local: addprinc -randkey host/node102.cc.local
kadmin.local: ktadd host/node102.cc.local
#klist -ekt /etc/krb5.keytab
Keytab name: FILE:/etc/krb5.keytab
KVNO Timestamp Principal
---- ------------------- ------------------------------------------------------
2 08/01/2023 11:59:57 host/[email protected] (aes256-cts-hmac-sha1-96)
2 08/01/2023 11:59:57 host/[email protected] (aes128-cts-hmac-sha1-96)
2 08/01/2023 11:59:57 host/[email protected] (des3-cbc-sha1)
2 08/01/2023 11:59:57 host/[email protected] (arcfour-hmac)
2 08/01/2023 11:59:57 host/[email protected] (camellia256-cts-cmac)
2 08/01/2023 11:59:57 host/[email protected] (camellia128-cts-cmac)
2 08/01/2023 11:59:57 host/[email protected] (des-hmac-sha1)
2 08/01/2023 11:59:57 host/[email protected] (des-cbc-md5)
2 08/01/2023 12:03:44 host/[email protected] (aes256-cts-hmac-sha1-96)
2 08/01/2023 12:03:44 host/[email protected] (aes128-cts-hmac-sha1-96)
2 08/01/2023 12:03:44 host/[email protected] (des3-cbc-sha1)
2 08/01/2023 12:03:44 host/[email protected] (arcfour-hmac)
2 08/01/2023 12:03:44 host/[email protected] (camellia256-cts-cmac)
2 08/01/2023 12:03:44 host/[email protected] (camellia128-cts-cmac)
2 08/01/2023 12:03:44 host/[email protected] (des-hmac-sha1)
2 08/01/2023 12:03:44 host/[email protected] (des-cbc-md5)
kadmin.local
创建node101服务器host的principal
Authenticating as principal root/[email protected] with password.
kadmin.local: addprinc -randkey host/node101.cc.local
WARNING: no policy specified for host/[email protected]; defaulting to no policy
Principal "host/[email protected]" created.
生成keytab文件
kadmin.local: ktadd host/node101.cc.local
Entry for principal host/node101.cc.local with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type des3-cbc-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type camellia256-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type camellia128-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type des-hmac-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/node101.cc.local with kvno 2, encryption type des-cbc-md5 added to keytab FILE:/etc/krb5.keytab.
按照以上步骤,创建node102、node103的principal,并生成keytab文件
kadmin.local: addprinc -randkey host/node102.cc.local
kadmin.local: ktadd host/node102.cc.local
kadmin.local: addprinc -randkey host/node103.cc.local
kadmin.local: ktadd host/node103.cc.local
#klist -ekt /etc/krb5.keytab
Keytab name: FILE:/etc/krb5.keytab
KVNO Timestamp Principal
---- ------------------- ------------------------------------------------------
2 08/01/2023 11:59:57 host/[email protected] (aes256-cts-hmac-sha1-96)
2 08/01/2023 11:59:57 host/[email protected] (aes128-cts-hmac-sha1-96)
2 08/01/2023 11:59:57 host/[email protected] (des3-cbc-sha1)
2 08/01/2023 11:59:57 host/[email protected] (arcfour-hmac)
2 08/01/2023 11:59:57 host/[email protected] (camellia256-cts-cmac)
2 08/01/2023 11:59:57 host/[email protected] (camellia128-cts-cmac)
2 08/01/2023 11:59:57 host/[email protected] (des-hmac-sha1)
2 08/01/2023 11:59:57 host/[email protected] (des-cbc-md5)
2 08/01/2023 12:03:44 host/[email protected] (aes256-cts-hmac-sha1-96)
2 08/01/2023 12:03:44 host/[email protected] (aes128-cts-hmac-sha1-96)
2 08/01/2023 12:03:44 host/[email protected] (des3-cbc-sha1)
2 08/01/2023 12:03:44 host/[email protected] (arcfour-hmac)
2 08/01/2023 12:03:44 host/[email protected] (camellia256-cts-cmac)
2 08/01/2023 12:03:44 host/[email protected] (camellia128-cts-cmac)
2 08/01/2023 12:03:44 host/[email protected] (des-hmac-sha1)
2 08/01/2023 12:03:44 host/[email protected] (des-cbc-md5)
……
scp /etc/krb5.conf node102:/etc/
scp /etc/krb5.keytab node102:/etc/
scp /var/kerberos/krb5kdc/kdc.conf node102:/var/kerberos/krb5kdc/
scp /var/kerberos/krb5kdc/kadm5.acl node102:/var/kerberos/krb5kdc/
scp /var/kerberos/krb5kdc/.k5.CC.LOCAL node102:/var/kerberos/krb5kdc/
scp /etc/krb5.conf node103:/etc/
scp /etc/krb5.keytab node103:/etc/
scp /var/kerberos/krb5kdc/kdc.conf node103:/var/kerberos/krb5kdc/
scp /var/kerberos/krb5kdc/kadm5.acl node103:/var/kerberos/krb5kdc/
scp /var/kerberos/krb5kdc/.k5.CC.LOCAL node103:/var/kerberos/krb5kdc/
说明:
如果备节点使用的不是主节点拷贝过来的.k5.CC.LOCAL会报错:
krb5kdc: Unable to decrypt latest master key with the provided master key
- while fetching master keys list for realm CC.LOCAL
host/[email protected]
host/[email protected]
host/[email protected]
说明:
创建kpropd.acl文件默认放在/var/kerberos/krb5kdc目录下,将导致kadmin认为此节点是备用节点而不能启动,所以如果有备用节点启动kadmin服务的需求,建议kprop配置放在别目录,此次处放置在/var/kerberos/krb5kdc/kprop目录。
-- Unit kadmin.service has begun starting up.
Aug 01 15:57:30 node102.cc.local _kadmind[11403]: Error. This appears to be a slave
Aug 01 15:57:30 node102.cc.local systemd[1]: kadmin.service: control process exited
由于修改了kpropd.acl文件的默认目录,需修改kprop服务启动环境变量文件/etc/sysconfig/kprop
KPROPD_ARGS= -a /var/kerberos/krb5kdc/kprop/kpropd.acl
systemctl daemon-reload
systemctl start kprop
systemctl status kprop
在主节点上导出备份文件
kdb5_util dump /var/kerberos/krb5kdc/kdc.dump
在备份数据同步到备节点上
kprop -f /var/kerberos/krb5kdc/kdc.dump -d node102
kprop -f /var/kerberos/krb5kdc/kdc.dump -d node103
8938 bytes sent.
Database propagation to node102: SUCCEEDED
说明:
kpropd服务默认监听端口为754,kprop命令默认可不加-P参数,其用于指定端口
systemctl start krb5kdc
systemctl start kadmin
systemctl enable krb5kdc
说明:备节点开启管理服务后,如果客户端连接备节点操作,备用节点操作的管理数据因为无法反向同步回主节点,可能造成丢失,所以备用节点启用管理服务要慎重,至少要能做到记录操作的内容,主节点恢复后将操作内容重新执行。不推荐备用节点启用管理服务
#!/bin/bash
DATE=`date +"%Y%m%d%H%M%S"`
DUMP=/var/kerberos/krb5kdc/dump/master.dump_$DATE
PORT=754
SLAVE=$1
TIMESTAMP=`date`
echo "Start at $TIMESTAMP"if [ ! -f $DUMP ];then
kdb5_util dump $DUMP
fikprop -f $DUMP -d -P $PORT $SLAVE
if [ $? -eq 0 ]; then
result='1'
else
result=$?
fiecho "sync_kdc{time=\"$DATE\",slave_host=\"$SLAVE\"} $result" >> /var/kerberos/krb5kdc/dump/sync.pro
chmod +x /var/kerberos/krb5kdc/dump/krb5prop.sh
15 * * * * /var/kerberos/krb5kdc/dump/krb5prop.sh node2
15 * * * * /var/kerberos/krb5kdc/dump/krb5prop.sh node3
kinit kws/[email protected]
Password for kws/[email protected]:
# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: kws/[email protected]
Valid starting Expires Service principal
08/01/2023 17:02:16 08/02/2023 17:02:16 krbtgt/[email protected]
renew until 08/08/2023 17:02:16
增量同步 1.7 及以后的版本支持,由于都是通过kprop同步服务实现,使用增量同步就不能使用全量同步。此外增量同步有一些注意事项:
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88[realms]
CC.LOCAL = {
#master_key_type = aes256-cts
max_renewable_life = 7d
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 camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
iprop_enable = true
iprop_ulogsize = 2000
iprop_replica_poll = 2m
iprop_port = 760
iprop_resync_timeout = 5m
}
说明:
iprop_enable:指定是否启用增量数据库同步。 默认值为false,不开启
iprop_ulogsize:指定增量传播要保留的最大日志条目数。 默认值为 1000。在版本 1.11 之前,最大值为 2500。版本 1.19 中的新增功能
iprop_master_ulogsize:1.19 版本之前的 iprop_ulogsize 的名称。 如果未指定 iprop_ulogsize,则其值将用作后备值。
iprop_replica_poll:指定副本 KDC 轮询主节点新更新的频率。 默认值为“2m”(即两分钟)。 1.17 版本中的新增功能。
iprop_slave_poll:1.17版本之前的iprop_replica_poll的名称。 如果未指定 iprop_replica_poll,则其值将用作后备。
iprop_listen:指定 kadmind 守护进程的 iprop RPC监听地址和/或端口,如IP、PORT、[IP:PORT]。如果地址包含冒号,请将其括在方括号中。 如果未指定地址,则使用通配符地址。 如果 kadmind 无法绑定到任何指定地址,它将无法启动。 默认值是绑定到 iprop_port 中指定的端口处的通配符地址。 1.15 版本中的新增功能。
iprop_port:指定用于增量同步的端口号,没有默认端口号。备节点 KDC 配置文件中需要此配置,主配置文件中需要此配置或“iprop_listen”。 在“iprop_listen”条目中指定的端口号将覆盖“kadmind”守护程序的此端口号。
iprop_resync_timeout:指定等待同步完成的超时时间、,该配置可选,仅由副本 KDC 使用。 默认值为 5 分钟 (5m)。 1.11 版本中的新增功能
iprop_logfile:指定更新日志文件的存储位置。 默认情况下是使用 krb5 配置文件的realms部分中的“database_name”条目,并附加“.ulog”。如果在realms中未指定database_name,可能是正在使用LDAP数据库后端(默认为{LOCALSTATEDIR}/krb5kdc/principal),或者在[dbmodules]部分中指定了文件名,则默认当作database_name使用。iprop_logfile 默认值将不使用 [dbmodules] 部分中的值。
kadmin.local: addprinc -randkey kiprop/[email protected]
kadmin.local: addprinc -randkey kiprop/[email protected]
kadmin.local: ktadd kiprop/node101.cc.local
kadmin.local: ktadd kiprop/node102.cc.local
kadmin.local: ktadd kiprop/node103.cc.local
说明:
如果开启增量同步,主节点数据库中必须要包含备节点的kiprop主体,同时也要生成keytab文件分发给备节点,不然启动kprop服务时会报错: /usr/sbin/kpropd: Key table entry not found while initializing /usr/sbin/kpropd interface, retrying。
scp /etc/krb5.keytab node102:/etc/
scp /etc/krb5.keytab node103:/etc/
kiprop/[email protected] p
kiprop/[email protected] p
说明:
在主节点上需要给备节点的kiprop主体增加允许同步数据库的权限,对应修改kadm5.acl
主节点
systemctl restart kadmin
systemctl restart krb5kdc
备节点
systemctl restart kprop
systemctl restart krb5kdc
说明:
第一次同步会先做一次全量同步
Aug 2 19:54:21 node102 systemd: Starting Kerberos 5 Propagation...
Aug 2 19:54:21 node102 systemd: Started Kerberos 5 Propagation.
Aug 2 19:54:21 node102 kpropd[18121]: kpropd: Full resync needed.
Aug 2 19:54:21 node102 kpropd[18121]: Full resync request granted.
Aug 2 19:54:21 node102 kpropd[18123]: Connection from node101.cc.local
kproplog -h
Kerberos update log (/var/kerberos/krb5kdc/principal.ulog)
Update log dump :
Log version # : 1
Log state : Stable
Entry block size : 2048
Number of entries : 1
First serial # : 4
Last serial # : 4
First time stamp : Wed Aug 2 18:40:46 2023
Last time stamp : Wed Aug 2 18:40:46 2023
KADMIND_ARGS=" -proponly "
说明:
备节点采用增量同步模式启动kadmin,仅用于增量同步
KPROPD_ARGS="-A node102.cc.local"
说明:
备节点2上的kprop同步服务指定访问备份节点1上的kadmin来进行增量同步
KDC(Key Distribution Center):秘钥分发中心,简称KDC,默认安装在域控里,包括AS和TGS。AS(Authentication Service):身份验证服务,简称AS,用于KDC对Client认证。
TGS(Ticket Grantng Service):票据授予服务,简称TGS,用于KDC向Client和Server分发Session Key(临时秘钥)。
TGT(Ticket Granting Ticket):认证票据,用于验证Client的身份
ST(Server Ticket):服务票据
AD(Active Directory):活动目录,简称AD,用于存储用户、用户组、域相关的信息。
Client:用户客户端
Server:提供服务的服务端
krbtgt用户:创建域控时自动生成的用户
Client输入用户和密码,并且向KDC的AS发送一个AS_REQ,这个AS_REQ里包含了使用Client的NTLM-Hash(用户明文密码加密而成)加密的时间戳,以及Client-info、Server-info等数据,以及一些其他信息。
AS接收到Client发送的AS_REQ,通过Client使用的用户名查询AD 数据库是否存在,如果有就用此用户的NTLM-Hash来对AS_REQ进行解密,如果可以成功解密,且解密后得到的时间戳和时差在5分钟内则为认证成功。
AS会生成一个AS_REP,AS_REP包含两个部分:①AS生成的随机数session-key,使用Client的NTLM-Hash加密得到session-key-as,用于Client和KDC进行安全通信;②使用特定用户krbtgt的 NTLM Hash加密 session key、时间戳以及一些用户信息,生成TGT。
当Client收到了AS发回来的AS_REQ时,会使用Client的NTLM-Hash,将被加密过的临时秘钥Session-Key进行解密,得到没有被加密的Session-Key,然后将其保存在本地。
如果Client有需要访问某个Server时就可以构成TGS_REQ提交给TGS。TGS_REQ中包含了使用Session-Key加密的时间戳,以及Client-info、Server-info 等数据,以及使用krbtgt用户NTLM-Hash加密的TGT
当TGS收到TGS_REQ后,首先使用krbtgt用户的NTLM-Hash对TGT解密,得到Session-Key、时间戳以及Client-info、Server-info等数据,TGS会校验时间戳和解密时间的时差是否超时,会检验TGT里的Client信息和当前Client的信息是否一致,判断无误后则会再检查此Client是否有访问此Server的权限,如果有,则返回一个TGS_REP,包含两部分:①TGS生成新的Session-key-tgs,再使用从TGT里解密得到的Session-key加密TGS生成的新的Session-key-tgs,得到Session-key-tgs-encrypt;②使用Client要访问的Server的NTLM-Hash加密TGS生成的Session-key-tgs,得到ST。
Client收到了TGS_REP,获得Session-key-tgs以及ST。使用储存在本地的Session-key对Session-key-tgs-encrypt进行解密,得到未加密的Session-key-tgs,将其和ST一起储存在本地。
当Client需要访问Server时,Client则会发送AP_REQ给Server。AP_REQ包含了使用Session-key-tgs加密的时间戳、Client-info、Server-info等数据,以及ST。
Server收到AP_REQ后会使用自己的NTLM-Hash对ST进行解密,得到Session-key-tgs,在使用Session-key-tgs解密得到时间戳。Server根据时间戳的时差判断是否超时,然后再验证该Client的访问权限,验证成功后返回校验结果。
返回校验结果。
MIT Kerberos Documentation (1.21.1) — MIT Kerberos Documentation