1. Kerberos 术语
通过 Kerberos 认证原理介绍,我们已经了解到 Kerberos 的一些术语,还有一些术语可以更好的帮助我们学习 Kerberos,如下:
-
realm:领域,身份验证管理域,领域确定了管理边界,所有主体均属于特定的 Kerberos 域;
-
principal:主体,Principal 主体用于标识身份,每个参与 Kerberos 认证协议的用户和服务都需要一个主体来唯一标识自己。Principal 由三部分组成:名字(name)、实例(instance)、域(realm),一个标准的 Kerberos 用户/服务表示为:
name/instance@realm
;- name:表示用户名;
- instance:对 name 的进一步描述,例如 name 所在的主机名或 name 的类型等。可以省略,与第一部分使用/分割;
- realm:就是前面说的领域,表示 Kerberos 在管理上的划分,在 KDC 中所负责的一个域数据库称作为 realm。这个数据库中存放有该网络范围内的所有 Principal 和它们的密钥,realm 一般都是大写。
用户 principal 的命名类似:
zhangsan/admin@EXAMPLE.COM
,形式是用户名/角色@realm域
;
服务 principal 的命名类似:ftp/site.example.com@EXAMPLE.COM
,形式是服务名/地址@realm域
; -
keytab:Kerberos 认证有两种方式,通过密码或者密钥文件进行认证。这里说的 keytab 就是密钥文件,该文件包含 Principal 主体的用户名及密码,客户端可以通过 Keytab 密钥文件进行身份验证;
-
kadmin:即 Kerberos administration server,运行在主 Kerberos 节点。负责存储 KDC 数据库,管理 principal 信息。
2. Kerberos 安装
Kerberos 架构是客户端/服务端架构方式,安装 kerberos 涉及到 3 个安装包:krb5-server、krb5-workstation 和 krb5-libs。
- krb5-server:Kerberos 服务端程序,KDC 所在节点;
- krb5-workstation:包含基本的 Kerberos 程序,如:kinit、klist、kdestroy、kpasswd,所有 kerberos 节点需要部署;
- krb5-libs:包含 Kerberos 程序的各种支持类库,所有节点部署。
2.1 主机列表和服务规划
IP | 主机名 | 内存(GB) | CPU核数 | 磁盘 | 操作系统 | CPU 架构 | 部署服务 |
---|---|---|---|---|---|---|---|
10.0.0.13 | arc-pro-dc01 | 16 | 1 | 500GB | CentOS 7.9.2009 | x86_64 | Kerberos 客户端 |
10.0.0.14 | arc-pro-dc02 | 16 | 1 | 500GB | CentOS 7.9.2009 | x86_64 | Kerberos 服务端 Kerberos 客户端 |
10.0.0.15 | arc-pro-dc03 | 16 | 1 | 500GB | CentOS 7.9.2009 | x86_64 | Kerberos 客户端 |
10.0.0.16 | arc-pro-dc04 | 8 | 2 | 500GB | CentOS 7.9.2009 | x86_64 | Kerberos 客户端 |
10.0.0.17 | arc-pro-dc05 | 8 | 2 | 500GB | CentOS 7.9.2009 | x86_64 | Kerberos 客户端 |
10.0.0.18 | arc-pro-dc06 | 8 | 2 | 500GB | CentOS 7.9.2009 | x86_64 | Kerberos 客户端 |
10.0.0.19 | arc-pro-dc07 | 8 | 2 | 500GB | CentOS 7.9.2009 | x86_64 | Kerberos 客户端 |
10.0.0.20 | arc-pro-dc08 | 8 | 2 | 500GB | CentOS 7.9.2009 | x86_64 | Kerberos 客户端 |
10.0.0.21 | arc-pro-dc09 | 8 | 2 | 500GB | CentOS 7.9.2009 | x86_64 | Kerberos 客户端 |
说明:
- 每个服务器均存在一个管理员用户 admin,该用户可以免密码执行 sudo 命令;
- 在 arc-pro-dc01 机器上,可以使用 admin 用户免密码 ssh 到其他机器;
- 所有机器的 /etc/hosts 文件内容如下:
10.0.0.13 arc-pro-dc01
10.0.0.14 arc-pro-dc02
10.0.0.15 arc-pro-dc03
10.0.0.16 arc-pro-dc04
10.0.0.17 arc-pro-dc05
10.0.0.18 arc-pro-dc06
10.0.0.19 arc-pro-dc07
10.0.0.20 arc-pro-dc08
10.0.0.21 arc-pro-dc09
2.2 服务端安装
sudo yum install -y krb5-server
安装完成后生成配置文件:/var/kerberos/krb5kdc/kdc.conf
2.3 客户端安装
sudo yum install -y krb5-workstation krb5-libs
安装完成后生成配置文件:/etc/krb5.conf
2.4 服务端配置文件 kdc.conf 说明
服务端 /var/kerberos/krb5kdc/kdc.conf 文件,默认内容如下:
[kdcdefaults]kdc_ports = 88kdc_tcp_ports = 88[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 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}
该配置文件中的各个配置项可以参考:https://web.mit.edu/kerberos/krb5-1.20/doc/admin/conf_files/kdc_conf.html#kdc-conf-5
针对各个配置说明:
- kdc_ports:KDC 服务监听的端口;
- EXAMPLE.COM:设定的 realms,名字随意。Kerberos 可以支持多个 realms,一般为大写;
- master_key_type:指定 Kerberos 主密钥加密算法类型,默认使用 aes256-cts;
- acl_file:ACL 文件路径,Kerberos 通过该文件来确定哪些 Principal 具有哪些权限;
- dict_file:存放一个由多行字符串构成的文本文件,该文件中的字符串禁止作为密码使用;
- admin_keytab:KDC 进行校验的 keytab,该 keytab 用于认证管理员的密钥;
- supported_enctypes:支持的加密算法类型。
2.5 客户端配置文件 krb5.conf 说明和修改
客户端配置文件 /etc/krb5.conf 文件,默认内容如下:
# Configuration snippets may be placed in this directory as well
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.crt
# default_realm = EXAMPLE.COMdefault_ccache_name = KEYRING:persistent:%{uid}[realms]
# EXAMPLE.COM = {
# kdc = kerberos.example.com
# admin_server = kerberos.example.com
# }[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM
关于该文件配置项的详细内容参考:https://web.mit.edu/kerberos/krb5-1.20/doc/admin/conf_files/krb5_conf.html#krb5-conf-5
该配置文件的解释如下:
- logging 模块:配置默认即可,KDC和 kadmin 服务的 log 文件路径;
- libdefaults 模块
- dns_lookup_realm:使用主机域名到 kerberos domain 的映射定位 KDC;
- ticket_lifetime:ticket 过期时间,超过这个时间 ticket 需要重新申请或 renew;
- renew_lifetime:ticket 可进行 renew 的时间限制;
- forwardable:如果配置为 true,在 KDC 允许的情况下,初始 ticket 可以被转发;
- rdns:是否可使用逆向 DNS;
- pkinit_anchors:签署 KDC 证书的根证书;
- default_realm:指定默认的 realm,需要设置,否则后续 Kerberos 服务不能正常启动;
- default_ccache_name:默认凭据缓存的命名规则,这里注释掉,否则后续 HDFS 客户端不能认证操作 HDFS。
- realms 模块:按照如下模板进行配置即可。
- kdc:KDC 服务所在节点;
- admin_server:kadmin 服务所在节点,即 Kerberos administration server。
EXAMPLE.COM = {kdc = kerberos.example.comadmin_server = kerberos.example.com
}
- domain_realm 模块:此模块配置了domain_name 或者 hostname 同 kerberos realm 之间的映射关系,保持默认即可。
修改后的 /etc/krb5.conf 如下:(注意,此文件的修改要在所有客户端节点同步)
# Configuration snippets may be placed in this directory as well
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.crtdefault_realm = EXAMPLE.COM
# default_ccache_name = KEYRING:persistent:%{uid}[realms]
EXAMPLE.COM = {kdc = arc-pro-dc02 # 服务端主机名admin_server = arc-pro-dc02 # 服务端主机名
}[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM
2.6 服务端配置文件 kadm5.acl 说明
客户端配置文件 /var/kerberos/krb5kdc/kadm5.acl 文件,默认内容如下:
*/admin@EXAMPLE.COM *
该 ACL 文件用于控制 kadmin 数据库的访问权限,以及哪些 Principal 可以操作其他的 Principal。
以上配置表示名称匹配 */admin@EXAMPLE.COM
的 Principal 都认为是 admin 管理员角色,权限是*
代表全部权限。
可以根据自己配置情况修改对应的域,这里暂不做修改。
2.7 服务端初始化 kadmin 数据库
初始化 kadmin 数据库的命令格式为:
kdb5_util create -s -r [realm]
-s 表示生成存储文件,-r 指定 realm name,以上命令需要在服务端执行,执行后默认创建的数据库路径为:/var/kerberos/krb5kdc,如果需要重建数据库,将该目录下的 principal 相关的文件删除即可,请牢记数据库密码。
这里在 arc-pro-dc02 节点上初始化 kadmin 数据库,操作如下:
$ sudo kdb5_util create -s -r EXAMPLE.COM
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: `输入密码`
Re-enter KDC database master key to verify: `输入密码`$ ll /var/kerberos/krb5kdc/
total 24
-rw------- 1 root root 22 Jan 8 2022 kadm5.acl
-rw------- 1 root root 451 Jan 14 2022 kdc.conf
-rw------- 1 root root 8192 Sep 23 16:13 principal
-rw------- 1 root root 8192 Sep 23 16:13 principal.kadm5
-rw------- 1 root root 0 Sep 23 16:13 principal.kadm5.lock
-rw------- 1 root root 0 Sep 23 16:13 principal.ok
2.8 启动 Kerberos 服务并设置开机自启动
$ sudo systemctl enable krb5kdc --now
$ sudo systemctl enable kadmin --now# 查看状态
$ sudo systemctl status krb5kdc kadmin
3. Kerberos 使用
3.1 kadmin 数据库操作
3.1.1 进入命令行
可以在客户端和服务端对 kadmin 数据库进行操作,由于 kadmin 数据库本身就在服务端,所以如果在服务端操作 kadmin 数据库只需要通过输入kadmin.local
命令即可,如果在客户端操作 kadmin 数据库,可以直接输入 kadmin
命令,但需要先在客户端进行主体认证,才可以在客户端对数据库进行操作。
下面在服务端操作 kadmin 数据库进行命令演示。在 arc-pro-dc02 输入 kadmin.local
命令。
# 进入 kadmin 命令行
$ sudo kadmin.local
Authenticating as principal root/admin@EXAMPLE.COM with password.
3.1.2 帮助手册
# 输入 ? 查看帮助,获取所有命令和解释
kadmin.local: ?# 输入命令之后直接回车可以打印该命令的用法
kadmin.local: ktadd
Usage: ktadd [-k[eytab] keytab] [-q] [-e keysaltlist] [-norandkey] [principal | -glob princ-exp] [...]# 退出 kadmin 命令行
kadmin.local: q
下面列出支持的命令:
命令全称 | 命令简称 | 作用 |
---|---|---|
add_principal | addprinc、ank | Add principal |
delete_principal | delprinc | Delete principal |
modify_principal | modprinc | Modify principal |
rename_principal | renprinc | Rename principal |
change_password | cpw | Change password |
get_principal | getprinc | Get principal |
list_principals、get_principals | listprincs、getprincs | List principals |
add_policy | addpol | Add policy |
modify_policy | modpol | Modify policy |
delete_policy | delpol | Delete policy |
get_policy | getpol | Get policy |
list_policies、get_policies | listpols、getpols | List policies |
get_privs | getprivs | Get privileges |
ktadd | xst | Add entry(s) to a keytab |
ktremove | ktrem | Remove entry(s) from a keytab |
lock | Lock database exclusively (use with extreme caution!) | |
unlock | Release exclusive database lock | |
purgekeys | Purge previously retained old keys from a principal | |
get_strings | getstrs | Show string attributes on a principal |
set_string | setstr | Set a string attribute on a principal |
del_string | delstr | Delete a string attribute on a principal |
list_requests | lr、? | List available requests. |
quit、exit | q | Exit program. |
3.1.3 list_principals
listprincs:列出所有的 Principal 主体
# 列出所有主体
kadmin.local: listprincs
K/M@EXAMPLE.COM
kadmin/admin@EXAMPLE.COM
kadmin/arc-pro-dc02@EXAMPLE.COM
kadmin/changepw@EXAMPLE.COM
kiprop/arc-pro-dc02@EXAMPLE.COM
krbtgt/EXAMPLE.COM@EXAMPLE.COM
我们也可以直接在服务端执行 kadmin.local -q "命令"
,不进入交互窗口直接操作 kadmin数据库。
$ sudo kadmin.local -q "listprincs"
Authenticating as principal root/admin@EXAMPLE.COM with password.
K/M@EXAMPLE.COM
kadmin/admin@EXAMPLE.COM
kadmin/arc-pro-dc02@EXAMPLE.COM
kadmin/changepw@EXAMPLE.COM
kiprop/arc-pro-dc02@EXAMPLE.COM
krbtgt/EXAMPLE.COM@EXAMPLE.COM
test/admin@EXAMPLE.COM
test3@EXAMPLE.COM
3.1.4 add_principal
addprinc:添加一个 Principal 主体
# 添加主体
kadmin.local: addprinc test/admin@EXAMPLE.COM
WARNING: no policy specified for test/admin@EXAMPLE.COM; defaulting to no policy
Enter password for principal "test/admin@EXAMPLE.COM": `输入主体的密码`
Re-enter password for principal "test/admin@EXAMPLE.COM": `输入主体的密码`
Principal "test/admin@EXAMPLE.COM" created.# 添加时可以不写域,会使用默认的域
kadmin.local: addprinc test2/admin
WARNING: no policy specified for test2/admin@EXAMPLE.COM; defaulting to no policy
Enter password for principal "test2/admin@EXAMPLE.COM": `输入主体的密码`
Re-enter password for principal "test2/admin@EXAMPLE.COM": `输入主体的密码`
Principal "test2/admin@EXAMPLE.COM" created.# 一个标准的 Kerberos 用户/服务表示为:name/instance@realm
# 用户 principal 的命名类似:zhangsan/admin@EXAMPLE.COM,形式是用户名/角色@realm域
# 添加时可以不指定实例(角色),但默认为普通角色
kadmin.local: addprinc test3
WARNING: no policy specified for test3@EXAMPLE.COM; defaulting to no policy
Enter password for principal "test3@EXAMPLE.COM": `输入主体的密码`
Re-enter password for principal "test3@EXAMPLE.COM": `输入主体的密码`
Principal "test3@EXAMPLE.COM" created.kadmin.local: listprincs
K/M@EXAMPLE.COM
kadmin/admin@EXAMPLE.COM
kadmin/arc-pro-dc02@EXAMPLE.COM
kadmin/changepw@EXAMPLE.COM
kiprop/arc-pro-dc02@EXAMPLE.COM
krbtgt/EXAMPLE.COM@EXAMPLE.COM
test/admin@EXAMPLE.COM
test2/admin@EXAMPLE.COM
test3@EXAMPLE.COM
注意:
- 以上创建的 test/admin principal 第二部分是admin,根据之前在 kadm5.acl 文件中指定的匹配规则,该 principal 就相当于是 admin 管理员用户。在创建 Principal 时也可以不指定第二部分,这种用户就是普通用户;
- 关于创建好的用户如何去认证,参考后续 kinit 命令。
非交互式执行并在命令行直接设置密码:
$ sudo kadmin.local -q "addprinc -pw 123456 test4/admin@EXAMPLE.COM"
Authenticating as principal root/admin@EXAMPLE.COM with password.
WARNING: no policy specified for test4/admin@EXAMPLE.COM; defaulting to no policy
Principal "test4/admin@EXAMPLE.COM" created.
3.1.5 delete_principal
delete_principal:Principal 主体
# 删除主体
kadmin.local: delprinc test2/admin@EXAMPLE.COM
Are you sure you want to delete the principal "test2/admin@EXAMPLE.COM"? (yes/no): yes
Principal "test2/admin@EXAMPLE.COM" deleted.
Make sure that you have removed this principal from all ACLs before reusing.
3.1.6 change_password
change_password:修改 Principal 主体的密码
# 修改密码
kadmin.local: cpw test3@EXAMPLE.COM
Enter password for principal "test3@EXAMPLE.COM": `输入主体的新密码`
Re-enter password for principal "test3@EXAMPLE.COM": `输入主体的新密码`
Password for "test3@EXAMPLE.COM" changed.
注意:对 Principal 主体修改密码后,需要使用 kinit 命令认证时需要使用新密码。
3.1.7 ktadd
ktadd 命令生成一个 keytab 文件,或者将一个 principal 加入到 keytab。Kerberos 客户端的认证支持两种方式,一种是用户名和密码认证方式,适合交互式应用。另一种是可以使用 keytab 密钥文件认证,可以通过 ktadd 命令将对应的 principal 主体添加到 keytab 文件,这样客户端就可以拿着 keytab 文件进行认证。参看后文 kinit 命令。
# -k 指定 keytab 文件的路径,文件所在的目录需要提前创建好
kadmin.local: ktadd -norandkey -k /etc/keytab/test.admin@EXAMPLE.COM.keytab test/admin@EXAMPLE.COM
Entry for principal test/admin@EXAMPLE.COM with kvno 1, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test/admin@EXAMPLE.COM with kvno 1, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test/admin@EXAMPLE.COM with kvno 1, encryption type des3-cbc-sha1 added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test/admin@EXAMPLE.COM with kvno 1, encryption type arcfour-hmac added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test/admin@EXAMPLE.COM with kvno 1, encryption type camellia256-cts-cmac added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test/admin@EXAMPLE.COM with kvno 1, encryption type camellia128-cts-cmac added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test/admin@EXAMPLE.COM with kvno 1, encryption type des-hmac-sha1 added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test/admin@EXAMPLE.COM with kvno 1, encryption type des-cbc-md5 added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.kadmin.local: ktadd -norandkey -k /etc/keytab/test.admin@EXAMPLE.COM.keytab test3@EXAMPLE.COM
Entry for principal test3@EXAMPLE.COM with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2, encryption type camellia256-cts-cmac added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2, encryption type camellia128-cts-cmac added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2, encryption type des-hmac-sha1 added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2, encryption type des-cbc-md5 added to keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
针对以上ktadd -norandkey -k /etc/keytab/test.admin@EXAMPLE.COM.keytab test/admin@EXAMPLE.COM
命令解释如下:
- 命令中
-norandkey
表示不使用随机密码,如果不指定那么会对该主体随机生成密码,原密码将不可用,建议指定,这样客户端使用该主体既可使用密码验证也可以使用 keytab 密钥文件验证; - 命令执行后产生了 8 个 entry,原因是在 kdc.conf 的 supported_enctypes 配置项指定了 8 种加密算法,因此这里会打印出 8 个 entry;
- 关于生成 keytab 文件,如果指定路径下没有该文件,会生成一个新的 keytab 文件,然后将指定 principal 添加到该 keytab;如果有该 keytab 文件会直接追加写入。
关于如何使用 keytab 方式认证命令参考下文 kinit 命令。
复制一个 shell 窗口,查看 keytab 的信息:
$ sudo klist -k /etc/keytab/test.admin@EXAMPLE.COM.keytab
Keytab name: FILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab
KVNO Principal
---- --------------------------------------------------------------------------1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM2 test3@EXAMPLE.COM2 test3@EXAMPLE.COM2 test3@EXAMPLE.COM2 test3@EXAMPLE.COM2 test3@EXAMPLE.COM2 test3@EXAMPLE.COM2 test3@EXAMPLE.COM2 test3@EXAMPLE.COM
3.1.8 ktremove
ktremove 命令可以从 keytab 文件中删除关联的 pricipal。
针对 keytab 文件中关联的多个 pricipal 可以通过 ktremove 命令来删除 pricipal 主体与 keytab 密钥文件的关联。
kadmin.local: ktrem -k /etc/keytab/test.admin@EXAMPLE.COM.keytab test3@EXAMPLE.COM
Entry for principal test3@EXAMPLE.COM with kvno 2 removed from keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2 removed from keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2 removed from keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2 removed from keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2 removed from keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2 removed from keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2 removed from keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
Entry for principal test3@EXAMPLE.COM with kvno 2 removed from keytab WRFILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab.
$ sudo klist -k /etc/keytab/test.admin@EXAMPLE.COM.keytab
Keytab name: FILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab
KVNO Principal
---- --------------------------------------------------------------------------1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM
3.2 Kerberos 命令
3.2.1 kinit
kinit 命令可以对 Principal 主体进行认证,获取 principal 授予的票据并缓存。Kerberos 客户端支持两种认证方式一是使用 Principal + Password,二是使用Principal +keytab,前者适合用户进行交互式应用,例如 hadoop fs -ls 这种,后者适合服务,例如 yarn 的 rm、nm 等。principal+ keytab 就类似于 ssh 免密码登录,登录时不需要密码。
无论使用以上哪种认证方式需要在 Kerberos 数据库中创建对应 Principal 主体。
以下操作在客户端节点演示。
- 认证方式一是使用 Principal + Password
# 认证方式一是使用 Principal + Password
[admin@arc-pro-dc03 ~]$ kinit test/admin@EXAMPLE.COM
Password for test/admin@EXAMPLE.COM: `输入主体密码`# 认证完成后就在执行命令的客户端缓存了该主体的票据
# klist 列出缓存的票据
[admin@arc-pro-dc03 ~]$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: test/admin@EXAMPLE.COMValid starting Expires Service principal
09/23/2025 18:03:51 09/24/2025 18:03:51 krbtgt/EXAMPLE.COM@EXAMPLE.COM# kdestroy 销毁缓存的票据
[admin@arc-pro-dc03 ~]$ kdestroy[admin@arc-pro-dc03 ~]$ klist
klist: No credentials cache found (filename: /tmp/krb5cc_1000)
- 认证方式二使用 Principal +keytab
# 认证方式二使用 Principal +keytab
# 首先把服务端创建的 keytab 文件拷贝到客户端
[admin@arc-pro-dc03 ~]$ sudo mkdir -p /etc/keytab
[admin@arc-pro-dc02 ~]$ sudo scp /etc/keytab/test.admin@EXAMPLE.COM.keytab arc-pro-dc03:/etc/keytab/# 认证
# 注意:指定 keytab 文件时必须写成 -kt
[admin@arc-pro-dc03 ~]$ sudo kinit -kt /etc/keytab/test.admin@EXAMPLE.COM.keytab test/admin@EXAMPLE.COM
# 注意:执行 kinit 时使用 sudo 提权操作,则执行 klist 时也要进行 sudo 提权
[admin@arc-pro-dc03 ~]$ sudo klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: test/admin@EXAMPLE.COMValid starting Expires Service principal
09/23/2025 18:17:06 09/24/2025 18:17:06 krbtgt/EXAMPLE.COM@EXAMPLE.COM# 经过认证后,客户端就可以执行 kadmin 数据库操作了(前提是认证的主体的角色是 admin)
# 不需要指定 Principal 主体了,因为客户端已经认证自己就是该 Principal 主体了
# 当然还需要该主体的密码
[admin@arc-pro-dc03 ~]$ sudo kadmin
Authenticating as principal test/admin@EXAMPLE.COM with password.
Password for test/admin@EXAMPLE.COM:
kadmin:
注意:可以使用 kinit -h 查看 kinit 的使用参数。
- 也可以在客户端节点上执行 kadmin 命令,需要使用具有 admin 权限的 Principal 主体
# 这是另外一台客户端,没有认证主体,则需要手动指定主体名
# 也需要输入密码
[admin@arc-pro-dc04 ~]$ sudo kadmin -p test/admin@EXAMPLE.COM
Authenticating as principal test/admin@EXAMPLE.COM with password.
Password for test/admin@EXAMPLE.COM:
kadmin: # 可以在命令行直接指定主体和其密码
[admin@arc-pro-dc04 ~]$ sudo kadmin -p test/admin@EXAMPLE.COM -w123456
Authenticating as principal test/admin@EXAMPLE.COM with password.
kadmin: # 同时设置主体名、主体密码和要执行的 kadmin 命令
[admin@arc-pro-dc04 ~]$ sudo kadmin -p test/admin@EXAMPLE.COM -w123456 -q "delprinc test4/admin@EXAMPLE.COM"
Authenticating as principal test/admin@EXAMPLE.COM with password.
Are you sure you want to delete the principal "test4/admin@EXAMPLE.COM"? (yes/no): yes
Principal "test4/admin@EXAMPLE.COM" deleted.
Make sure that you have removed this principal from all ACLs before reusing.
3.2.2 klist
通过 klist 命令可以查看当前凭据缓存内的票据 Ticket。
还可以列出 keytab 文件关联的 Pricipal 主体。
[admin@arc-pro-dc03 ~]$ sudo klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: test/admin@EXAMPLE.COMValid starting Expires Service principal
09/23/2025 18:03:51 09/24/2025 18:03:51 krbtgt/EXAMPLE.COM@EXAMPLE.COM[admin@arc-pro-dc03 ~]$ sudo klist
klist: No credentials cache found (filename: /tmp/krb5cc_1000)[admin@arc-pro-dc03 ~]$ sudo klist -k /etc/keytab/test.admin@EXAMPLE.COM.keytab
Keytab name: FILE:/etc/keytab/test.admin@EXAMPLE.COM.keytab
KVNO Principal
---- --------------------------------------------------------------------------1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM1 test/admin@EXAMPLE.COM
3.2.3 kdestroy
kdestroy 命令用来销毁当前认证缓存的票据,该命令不需要任何参数,可以指定 kdestroy -A 删除所有用户的票据缓存,不指定 -A 仅删除当前用户的票据缓存。