Kerberos
官网文档‘:Kerberos:网络身份验证协议 (mit.edu)
基本概念:Kerberos基本概念及原理汇总-腾讯云开发者社区-腾讯云 (tencent.com)
kerberos概述
Kerberos是一种计算机网络认证协议,由麻省理工学院(MIT)提出并开发,旨在通过密钥加密技术为客户端和服务器应用程序提供强大的身份验证服务。
Kerberos协议设计思想的核心是引入一个可信任的第三方来实现客户端和服务端的认证。在Kerberos中,这个可信任的第三方被称为密钥分发中心(KDC)。Kerberos软件设计上采用客户端/服务器结构,能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。
Kerberos协议的主要特点是用户只需输入一次身份验证信息,就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即实现单点登录(SSO)。由于Kerberos协议在每个Client和Service之间具有共享密钥,使得该协议具有相当的安全性。
在实际应用中,Kerberos协议可用于防止窃听、防止重放攻击、保护数据完整性等场合,是一种应用对称密钥体制进行密钥管理的系统。在配置Kerberos服务端时,需要安装相关的软件包,并配置krb5.conf和kdc.conf文件,以定义realm和其他相关参数。
总的来说,Kerberos协议是一种强大且灵活的网络安全协议,能够为计算机网络提供高效、安全的身份认证服务。如需更多信息,建议查阅Kerberos协议的相关文档或咨询网络安全专家。
kerberos基本组成
Kerberos协议主要由三个部分组成:
-
密钥分发中心(Key Distribution Center,KDC):KDC是Kerberos的核心组件,负责存储用户信息、管理并发放票据。它通常包含两个主要部分:
-
认证服务器(Authentication Server,AS):专门用来认证客户端的身份,并发放客户端用于访问票据授予服务器(TGS)的票据授予票据(Ticket Granting Ticket,TGT)。
-
票据授予服务器(Ticket Granting Server,TGS):用来发放整个认证过程以及客户端访问服务端时所需的服务授予票据(Service Ticket)。
-
-
客户端(Client):发送请求的一方,需要向KDC请求票据以访问目标服务。
-
服务端(Server):接收请求的一方,需要验证客户端提供的票据是否有效,以决定是否提供服务。
Kerberos的相关术语
-
Realm:Kerberos所管理的一个领域或范围,可以看作是Kerberos中的一个命名空间,不同的Kerberos环境可以通过Realm进行区分。
-
Principal:Kerberos所管理的一个用户或者一个服务,可以理解为Kerberos中保存的一个账号。其格式通常为“primary/instance@realm”,其中primary是主体名称,instance是可选的实例名称,realm则是该主体所属的领域。
-
keytab:Kerberos中的用户认证文件,包含用户的密钥信息,可用于证明身份。与密码相比,keytab文件更加安全,因为它不需要人工输入,且可以妥善保存在服务器上。
-
Ticket:Kerberos中使用的一种记录,客户端用它来向服务器证明自己的身份。Ticket包含服务的主体名称、用户的主体名称、用户主机的IP地址、时间标记、会话密钥以及定义票据生命周期的时间戳等信息。
-
Authenticator:验证者,是服务器用于验证客户端用户主体的信息。验证者包含用户的主体名称、时间标记和其他数据,与票据不同,验证者只能使用一次,通常在请求访问服务时使用。
Kerberos的认证流程
-
客户端向KDC请求获取TGT:
-
客户端首先以明文方式向KDC的AS发起请求,携带自己的用户名、主机IP和当前时间戳。
-
AS在Kerberos数据库中查找该用户名,如果存在,则生成一个用于客户端和TGS间通信的会话密钥(Session Key),并创建一个TGT。TGT使用TGS的密钥加密,同时AS还会生成一个使用客户端密钥加密的响应,其中包含会话密钥、TGS的名称以及TGT的有效时间等信息。
-
客户端收到响应后,使用自己的密钥解密获得会话密钥和TGT。此时,客户端已经获得了访问TGS的权限。
-
-
客户端使用TGT请求服务授予票据并访问服务:
-
客户端使用会话密钥加密自己的信息(包括客户端名、IP和时间戳),并携带明文形式的目标服务名称和之前获得的TGT向TGS发起请求。
-
TGS首先验证TGT的有效性,然后解密TGT获得会话密钥,并使用会话密钥解密客户端的信息进行验证。如果验证通过,TGS会生成一个新的会话密钥(用于客户端和服务端之间的通信),并创建一个服务授予票据(Service Ticket)。服务授予票据使用目标服务的密钥加密,并包含客户端的信息、会话密钥以及票据的有效期等信息。
-
TGS将服务授予票据和新的会话密钥(使用之前与客户端的会话密钥加密)返回给客户端。
-
客户端收到后,使用之前的会话密钥解密获得新的会话密钥和服务授予票据。然后,客户端使用服务授予票据和新的会话密钥向目标服务发起请求。
-
目标服务验证服务授予票据的有效性后,使用新的会话密钥与客户端进行通信。
-
认证流程
TGT交付流程
实验
上手体验kerberos流程,使用kerberos保护NFS导出。
环境准备
IP地址 | 主机名 |
---|---|
192.168.99.129 | nfs.example.com |
192.168.99.133 | kdc.example.com |
192.168.99.134 | client.example.com |
配置防火墙和selinux
$ setenforce 0
$ firewall-cmd --set-default-zone=trusted
配置时间同步
$ cat /etc/chrony.conf | grep ^server
server ntp1.aliyun.com iburst
$ systemctl restart chronyd
$ chronyc sources -v
配置域名解析,在/etc/hosts中配置(可以自己配置dns服务器实现解析)
[root@nfs ~]# tail -3 /etc/hosts
192.168.99.129 nfs.example.com
192.168.99.134 client.example.com
192.168.99.133 kdc.example.com
[root@nfs ~]# scp /etc/hosts client.example.com:/etc/hosts
[root@nfs ~]# scp /etc/hosts kdc.example.com:/etc/hosts
Kerberos服务器配置
安装kerberos
[root@kdc ~]# yum -y install krb5-server krb5-workstation
修改配置文件
[root@kdc ~]# vim /etc/krb5.conf
[root@kdc ~]# cat /etc/krb5.conf | grep -v ^# | grep -v ^$
includedir /etc/krb5.conf.d/
[logging]default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log
[libdefaults]dns_lookup_realm = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = truerdns = falsepkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crtspake_preauth_groups = edwards25519default_realm = EXAMPLE.COMdefault_ccache_name = KEYRING:persistent:%{uid}
[realms]EXAMPLE.COM = {kdc = kdc.example.comadmin_server = kdc.example.com}
[domain_realm].example.com = EXAMPLE.COMexample.com = EXAMPLE.COM
[root@kdc ~]#
# 因为使用的是默认的EXAMPLE.COM,所以以下文件不需要修改
# 若使用其他的realm,则需修改配置中的EXAMPLE.COM部分
[root@kdc ~]# vim /var/kerberos/krb5kdc/kdc.conf
[root@kdc ~]# cat /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]kdc_ports = 88kdc_tcp_ports = 88spake_preauth_kdc_challenge = edwards25519
[realms]
EXAMPLE.COM = {#master_key_type = aes256-ctsacl_file = /var/kerberos/krb5kdc/kadm5.acldict_file = /usr/share/dict/wordsadmin_keytab = /var/kerberos/krb5kdc/kadm5.keytabsupported_enctypes = aes256-cts:normal aes128-cts:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal
}
[root@kdc ~]#
创建数据库,并按照提示设置数据库密码
[root@kdc ~]# kdb5_util create -s
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'EXAMPLE.COM',
master key name 'K/M@EXAMPLE.COM'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key: #此处为redhat
Re-enter KDC database master key to verify: #此处为redhat
[root@kdc ~]#
起服务并设置开机自启
[root@kdc ~]# systemctl enable --now kadmin.service krb5kdc.service
Created symlink /etc/systemd/system/multi-user.target.wants/kadmin.service → /usr/lib/systemd/system/kadmin.service.
Created symlink /etc/systemd/system/multi-user.target.wants/krb5kdc.service → /usr/lib/systemd/system/krb5kdc.service.
[root@kdc ~]#
防火墙放行服务(若不关防火墙,不设置trusted区域,则按如下操作放行服务)
$ firewall-cmd --permanent --add-service=kerberos
$ firewall-cmd –reload
运行kadmin.local 来管理kdc
# 添加nfs server 和 client的 主机信息
[root@kdc ~]# kadmin.local
Authenticating as principal root/admin@EXAMPLE.COM with password.
kadmin.local: addprinc -randkey host/nfs.example.com
kadmin.local: addprinc -randkey host/client.example.com
# 添加nfs server 和 client的 nfs 服务主机和客户端
kadmin.local: addprinc -randkey nfs/nfs.example.com
kadmin.local: addprinc -randkey nfs/client.example.com
# 运行 listprincs 来检查kdc设置
kadmin.local: listprincs
K/M@EXAMPLE.COM
host/client.example.com@EXAMPLE.COM
host/nfs.example.com@EXAMPLE.COM
kadmin/admin@EXAMPLE.COM
kadmin/changepw@EXAMPLE.COM
kadmin/kdc.example.com@EXAMPLE.COM
kiprop/kdc.example.com@EXAMPLE.COM
krbtgt/EXAMPLE.COM@EXAMPLE.COM
nfs/client.example.com@EXAMPLE.COM
nfs/nfs.example.com@EXAMPLE.COM
# 为服务器和客户端生成各自的秘钥文件,并保存在/tmp文件夹下, quit退出 kadmin
kadmin.local: ktadd -k /tmp/nfs.keytab nfs/nfs.example.com
kadmin.local: ktadd -k /tmp/client.keytab nfs/client.example.com
kadmin.local: quit
[root@kdc ~]# ll /tmp/*.keytab
-rw-------. 1 root root 419 Apr 30 09:37 /tmp/client.keytab
-rw-------. 1 root root 404 Apr 30 09:36 /tmp/nfs.keytab
[root@kdc ~]#
NFS 服务器端设置
安装相关软件包
[root@nfs ~]# yum -y install nfs-utils krb5-workstation
从kdc服务器拷贝配置文件和keytab秘钥文件并保存在/etc目录下
[root@nfs ~]# scp kdc.example.com:/etc/krb5.conf /etc/krb5.conf
root@kdc.example.com's password:
krb5.conf 100% 982 10.1KB/s 00:00
[root@nfs ~]#
[root@nfs ~]# scp kdc.example.com:/tmp/nfs.keytab /etc/krb5.keytab
root@kdc.example.com's password:
nfs.keytab 100% 404 250.2KB/s 00:00
[root@nfs ~]#
创建导出目录,并配置导出
[root@nfs ~]# mkdir /testnfs
[root@nfs ~]# chmod o+w /testnfs/
[root@nfs ~]# vim /etc/exports
[root@nfs ~]# cat /etc/exports
#/testnfs 192.168.99.0/24(sec=krb5p,rw)
/testnfs *.example.com(sec=krb5p,rw)
[root@nfs ~]#
配置文件中的版本可自行解开注释
[root@nfs ~]# cat /etc/nfs.conf | grep vers
# reverse-lookup=n
# vers2=n
# vers3=y
# vers4=y
# vers4.0=y
# vers4.1=y
# vers4.2=y
[root@nfs ~]# 此处用默认的配置,无需修改
重启服务测试
[root@nfs ~]# systemctl restart nfs-server.service
[root@nfs ~]# exportfs -rv
exporting *.example.com:/testnfs
[root@nfs ~]#
NFS 客户端设置
安装相应软件包
[root@client ~]# yum -y install nfs-utils krb5-workstation
从kdc服务器拷贝配置文件和keytab秘钥文件并保存在/etc目录下
[root@client ~]# scp kdc.example.com:/etc/krb5.conf /etc/krb5.conf
[root@client ~]# scp kdc.example.com:/tmp/client.keytab /etc/krb5.keytab
测试挂载
[root@client ~]# mkdir /nfsmount
[root@client ~]# showmount -e nfs.example.com
Export list for nfs.example.com:
/testnfs *.example.com
[root@client ~]#
# 注:centos stream 8没有nfs-secure服务,测试挂载前可重启
[root@client ~]# systemctl restart nfs-mountd.service
# 如下报错为不匹配的安全选项导致的报错
[root@client ~]# mount -o sec=none nfs.example.com:/testnfs /nfsmount
mount.nfs: access denied by server while mounting nfs.example.com:/testnfs
[root@client ~]# mount -o sec=sys nfs.example.com:/testnfs /nfsmount
mount.nfs: access denied by server while mounting nfs.example.com:/testnfs
[root@client ~]# mount -o sec=krb5 nfs.example.com:/testnfs /nfsmount
mount.nfs: access denied by server while mounting nfs.example.com:/testnfs
[root@client ~]# mount -o sec=krb5i nfs.example.com:/testnfs /nfsmount
mount.nfs: access denied by server while mounting nfs.example.com:/testnfs
# 挂载
[root@client ~]# mount -o sec=krb5p nfs.example.com:/testnfs /nfsmount
[root@client ~]# umount /nfsmount
[root@client ~]# mount nfs.example.com:/testnfs /nfsmount(可以自动识别挂载选项)
[root@client ~]# df -h /nfsmount/
Filesystem Size Used Avail Use% Mounted on
nfs.example.com:/testnfs 70G 11G 60G 15% /nfsmount
[root@client ~]# mount | grep /nfsmount
nfs.example.com:/testnfs on /nfsmount type nfs4 (rw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=krb5p,clientaddr=192.168.99.134,local_lock=none,addr=192.168.99.129)
[root@client ~]#
注:可以从配置文件中指定默认的安全选项
[root@client ~]# cat /etc/nfsmount.conf | grep -B 2 Sec
# RPCGSS security flavors
# [none, sys, krb5, krb5i, krb5p ]
# Sec=sys (解开注释并修改)
[root@client ~]#
可以指定nfs版本
[root@client ~]# mount -o vers=4.2,sec=krb5p nfs.example.com:/testnfs /nfsmount
[root@client ~]# umount /nfsmount
[root@client ~]# vim /etc/fstab
[root@client ~]# tail -1 /etc/fstab 开机自动挂载配置如下:
nfs.example.com:/testnfs /nfsmount nfs _netdev,defaults,vers=4.2,sec=krb5p 0 0
[root@client ~]# mount -a
[root@client ~]# df -h /nfsmount
Filesystem Size Used Avail Use% Mounted on
nfs.example.com:/testnfs 70G 11G 60G 15% /nfsmount
[root@client ~]# umount /nfsmount
[root@client ~]#
作业
要求:
-
在nfs服务端创建两个共享目录/dir1、/dir2
-
/dir1使用默认的安全选项,sec=sys
-
/dir2使用sec=krb5p
-
服务端、客户端和KDC的域名为kunpeng.com
-
在客户端能手动挂载两个目录
-
在客户端能使用autofs自动挂载两个目录
-
如果可以使用named解析三个主机的域名
-
如果可以使用unbound解析三个主机的域名
-
-
配置kerberos与其他网络服务的集成,如kerberos+ssh