1、什么是 Kerberos
Kerberos 是一种网络身份验证协议,旨在支持使用密钥加密的客户端/服务器应用程序的强大身份验证。 Kerberos 为网络资源提供最高级别的安全性。
Kerberos 应用客户端/服务器体系结构并支持用户到服务器的身份验证,而不是主机到主机的身份验证。在此模型中,安全性和身份验证将取决于密钥技术,其中网络上的每个主机都有自己的密钥。
2、Kerberos 术语和原理
2.1、Kerberos 术语
- KDC(Key Distribute Center): 密钥分发中心,负责存储用户信息,管理发放票据。
- Realm: Kerberos 所管理的一个领域或范围,称之为一个 Realm。例如:HADOOP.COM。
- Principal: Kerberos 所管理的一个用户或者一个服务(又称为主体),可以理解为 Kerberos 中保存的一个账号,其格式通常如下:primary/instance@realm ,即账号/实例名@域名,其中 instance可以省略。例如:nn/bigdata2@HADOOP.COM、test@HADOOP.COM。
- Keytab:Kerberos 中的用户认证,可通过密码或者密钥文件证明身份,keytab指密钥文件,使用 keytab 可以不用输入密码即可登录。例如:kinit test@HADOOP.COM -kt /root/test.keytab。
2.1、Kerberos 原理
Kerberos 模型基于 Needham-Schroeder 的可信第三方协议,采用DES 加密(也可用其他算法替代),它与网络上的每个实体分别共享一个不同的秘密密钥,知道该秘密密钥就是身份的证明。这里以吃饭为例,简单阐述 Client 与 Kerberos 、TGS 及 Server 之间的关系如下:
Kerberos 有一个所有客户和秘密密钥的数据库,由于 Kerberos 知道每个人的秘密密钥,所以它能产生一个实体证实另一个实体身份的消息。Kerberos 还能产生会话密钥,只供一个客户机和一个服务器(或两个客户机)使用。会话密钥用来加密双方间的通信消息,通信完毕,即销毁会话密钥。
Kerberos 协议如下:
- 客户从Kerberos 请求一张票据许可票据(TGT,Ticket Granting Ticket)作为票据许可服务(TGS,Ticket-Granting Service),该票据用用户的秘密密钥加密后发送给用户;
- 为了使用特定的服务器,客户需要从 TGS 中请求一张票据,TGS 将票据发回给客户;
- 客户将此票据提交给服务器和鉴别器,如果客户的身份没有问题,服务器就会让客户访问该服务。
详细过程参考:《一文搞懂Kerberos》
3、Kerberos 服务部署
3.1、前置条件
- 准备好域名,本文使用的域名是
HADOOP.COM
; - 确保 Kerberos 认证的机器时间同步。
机器角色规划如下:
3.2、安装依赖
sudo yum install -y krb5-server krb5-libs krb5-auth-dialog krb5-workstation
3.3、配置 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.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 = HADOOP.COM
#default_ccache_name = KEYRING:persistent:%{uid}
[realms]
HADOOP.COM = {
kdc = bigdata3
admin_server = bigdata3
}
[domain_realm]
# .example.com = HADOOP.COM
# example.com = HADOOP.COM
说明:
- [
logging
]:服务端 志打印位置。 - [
libdefaults
]:连接的默认配置 。default_realm
:设置默认领域。多个领域是配置在 [realms] 章节。udp_preference_limit
=1:禁止使用udp(可以防止一个 Hadoop 中的错误)ticket_lifetime
: 凭证生效的时限,一般为 24 小时。renew_lifetime
: 凭证最长可以被延期的时限,一般为 7 天。- 去掉
des256
加密支持,因为该加密算法需要 JCE 的额外支持,增加了对环境的依赖。
- [
realms
]:配置所有需要访问的 Kerberos 域。kdc
:kdc 服务器地址(机器:端口),默认端口 88。admin_server
: admin 服务地址(机器:端口),默认端口 749。default_domain
: 指定默认的域名。
3.4、配置 kdc.conf
默认位置:/var/kerberos/krb5kdc/kdc.conf
,这是 KDC 服务端配置文件,需要开通 88 端口。
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
HADOOP.COM = {
#master_key_type = aes256-cts
max_renewable_life = 7d 0h 0m 0s
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
}
说明:
- [
kdcdefaults
] :KDC 默认行为配置,全局生效。 - [
realms
]:配置每个域的信息。MYREALM
: 域名,建议统一使用大写。acl_file
: admin 的用户权限,需要用户自己创建。supported_enctypes
:支持的校验方式。admin_keytab
:KDC 进行校验的管理员 keytab。
3.5、配置 kadm5.acl
文件位置: /var/kerberos/krb5kdc/kadm5.acl
,用于 ACL(访问控制列表),此处提前配置管理员。
[root@bigdata3 etc]# sudo cat /var/kerberos/krb5kdc/kadm5.acl
*/admin@HADOOP.COM *
3.6、安装 KDC 数据库
安装命令:
kdb5_util create -r HADOOP.COM -s
注意:我使用的 realname 就是 HADOOP.COM,可以根据需要改成自己的。
-r
:指定域名,注意和配置文件域名保持一致。-s
:指定将数据库的主节点密钥存储在文件中,从而可以在每次启动 KDC 时自动重新生成主节点密钥。-d
: 指定数据库名,默认名为 principal。
[root@bigdata3 etc]# sudo kdb5_util create -r MYREALM -s
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'HADOOP.COM',
master key name 'K/M@HADOOP.COM'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key: # 输入 KDC 数据库密码,重要,admin
Re-enter KDC database master key to verify: #admin
说明:
- 该命令会在
/var/kerberos/krb5kdc/
目录下创建principal
数据库文件。在重装时,可能需要需要删除数据库文件。 - 对于 KDC 数据库密码,非常重要,请妥善保存。
3.7、启动服务
sudo chkconfig --level 35 krb5kdc on
sudo chkconfig --level 35 kadmin on
sudo service krb5kdc start
sudo service kadmin start
3.8、创建 Kerberos 管理员
可使用 kadmin.local
(只允许在本机执行)或 kadmin
工具,管理 KDC 服务。
创建超级管理员的 Principle:root/admin
。
[root@bigdata3 etc]# sudo kadmin.local -q "addprinc root/admin"
Authenticating as principal root/admin@HADOOP.COM with password.
WARNING: no policy specified for root/admin@HADOOP.COM; defaulting to no policy
Enter password for principal "root/admin@HADOOP.COM": # root
Re-enter password for principal "root/admin@HADOOP.COM": # root
Principal "root/admin@HADOOP.COM" created.
一条命令创建:
sudo echo -e "root\nroot" | kadmin.local -q "addprinc root/admin"
3.9、创建普通租户
1、创建测试用户 test,此时用户只能通过密码方式访问(在生成 keytab 文件后,可通过 keytab 访问,一说生成 keytab 之后密码登录不可用)。
[root@bigdata3 etc]# echo -e "test\ntest" | sudo kadmin.local -q "addprinc test"
# 注意上面创建了用户 test,密码也是 test
Authenticating as principal root/admin@HADOOP.COM with password.
WARNING: no policy specified for test@HADOOP.COM; defaulting to no policy
Enter password for principal "test@HADOOP.COM":
Re-enter password for principal "test@HADOOP.COM":
Principal "test@HADOOP.COM" created.
2、用户基本操作示例
# 1. 登录
[root@bigdata3 etc]# kinit test
Password for test@HADOOP.COM: # test
# 2. 查看登录缓存
[root@bigdata3 etc]# klist -e
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: test@HADOOP.COM
Valid starting Expires Service principal
2024-03-01T18:40:47 2024-03-02T18:40:47 krbtgt/HADOOP.COM@HADOOP.COM
renew until 2024-03-08T18:40:47, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96
# 3. 更新票据缓存有效期
[root@bigdata3 etc]# kinit -R
[root@bigdata3 etc]# klist -e
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: test@HADOOP.COM
Valid starting Expires Service principal
2024-03-01T18:41:16 2024-03-02T18:41:16 krbtgt/HADOOP.COM@HADOOP.COM
renew until 2024-03-08T18:40:47, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96
### 可以看到 Expires 时间已经更新,注意 renew until 是相对不变的
# 4. 销毁登录缓存
[root@bigdata3 etc]# kdestroy
[root@bigdata3 etc]# klist
klist: No credentials cache found (filename: /tmp/krb5cc_0)
3、查看安装版本
[root@bigdata3 etc]# klist -V
Kerberos 5 version 1.15.1
3.10、Kerberos 客户端安装
1、依赖安装:
$ sudo yum install krb5-devel krb5-workstation -y
2、配置 krb5.conf
可从 KDC 机器获取 krb5.conf 文件
4、Kerberos 用户管理
4.1、KDC 支持两种方式管理
- 在
KDC 本机使用 kadmin.local 管理
,需要登录 KDC,无需输入 Kerberos 管理员密码; - 远程或在 KDC本机使用 kadmin管理,需要 Kerberos 管理员密码。
方式1:在 KDC 主机登录:
[root@bigdata3 etc]# kadmin.local
Authenticating as principal root/admin@HADOOP.COM with password.
kadmin.local: # 可执行命令
方式 2:使用 kadmin 管理用户
[root@bigdata2 yum.repos.d]# kadmin -p root/admin
Authenticating as principal root/admin with password.
Password for root/admin@HADOOP.COM: # root
如果没有 root 用户可以在 KDC 主机增加一个:
sudo echo -e "root\nroot" | kadmin.local -q "addprinc root/admin" # 用户名密码为 root/root
4.2、查询所有用户(list_principals)
kadmin.local: list_principals
HTTP/bigdata1@HADOOP.COM
HTTP/bigdata2@HADOOP.COM
K/M@HADOOP.COM
admin/admin@HADOOP.COM
dn/bigdata1@HADOOP.COM
dn/bigdata2@HADOOP.COM
dn/bigdata3@HADOOP.COM
jn/bigdata1@HADOOP.COM
jn/bigdata2@HADOOP.COM
jn/bigdata3@HADOOP.COM
kadmin/admin@HADOOP.COM
kadmin/bigdata3@HADOOP.COM
kadmin/changepw@HADOOP.COM
kiprop/bigdata3@HADOOP.COM
krbtgt/HADOOP.COM@HADOOP.COM
nn/bigdata1@HADOOP.COM
nn/bigdata2@HADOOP.COM
root/admin@HADOOP.COM
test@HADOOP.COM
4.3、查询用户详情(get_principal)
kadmin.local: get_principal test
Principal: test@HADOOP.COM
Expiration date: [never]
Last password change: 五 3月 01 15:12:13 CST 2024
Password expiration date: [never]
Maximum ticket life: 1 day 00:00:00
Maximum renewable life: 7 days 00:00:00
Last modified: 五 3月 01 15:12:13 CST 2024 (root/admin@HADOOP.COM)
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 8
Key: vno 1, aes256-cts-hmac-sha1-96
Key: vno 1, aes128-cts-hmac-sha1-96
Key: vno 1, des3-cbc-sha1
Key: vno 1, arcfour-hmac
Key: vno 1, camellia256-cts-cmac
Key: vno 1, camellia128-cts-cmac
Key: vno 1, des-hmac-sha1
Key: vno 1, des-cbc-md5
MKey: vno 1
Attributes:
Policy: [none]
4.4、新增用户(add_principal USER)
1、使用默认配置
kadmin.local: add_principal Leo825 # 新增 Leo825 租户
WARNING: no policy specified for Leo825@HADOOP.COM; defaulting to no policy
Enter password for principal "Leo825@HADOOP.COM": # 输入密码 Leo825
Re-enter password for principal "Leo825@HADOOP.COM": # 再次输入密码 Leo825
Principal "Leo825@HADOOP.COM" created.
kadmin.local: quit # 退出
# 测试
[root@bigdata3 etc]# kinit Leo825
Password for Leo825@HADOOP.COM: # 输入密码 Leo825
[root@bigdata3 etc]# klist
Ticket cache: FILE:/tmp/krb5cc_0 # 登录成功
Default principal: Leo825@HADOOP.COM
Valid starting Expires Service principal
2024-03-01T19:05:24 2024-03-02T19:05:24 krbtgt/HADOOP.COM@HADOOP.COM
renew until 2024-03-08T19:05:24
2、指定有效期
kadmin.local: addprinc
usage: add_principal [options] principal
options are:
[-randkey|-nokey] [-x db_princ_args]* [-expire expdate] [-pwexpire pwexpdate] [-maxlife maxtixlife]
[-kvno kvno] [-policy policy] [-clearpolicy]
[-pw password] [-maxrenewlife maxrenewlife]
[-e keysaltlist]
[{+|-}attribute]
# 用户有效期 -expire
addprinc -expire "2020-9-9 20:00" test5
# 用户有效期 + 用户密码有效期 -pwexpire
addprinc -expire "2020-9-9 20:00" -pwexpire "2020-9-10 20:00" test6
# 用户有效期 + 用户密码有效期 + 票据生命有效期
modify_principal -expire "6/6/2009 12:01am EST"
-pwexpire "6/7/2009 12:01am EST" -maxlife "12:00" user1
4.5、修改用户(modify_principal)
usage: modify_principal [options] principal
options are:
[-x db_princ_args]* [-expire expdate] [-pwexpire pwexpdate] [-maxlife maxtixlife]
[-kvno kvno] [-policy policy] [-clearpolicy]
[-maxrenewlife maxrenewlife] [-unlock] [{+|-}attribute]
attributes are:
allow_postdated allow_forwardable allow_tgs_req allow_renewable
allow_proxiable allow_dup_skey allow_tix requires_preauth
requires_hwauth needchange allow_svr password_changing_service
ok_as_delegate ok_to_auth_as_delegate no_auth_data_required
lockdown_keys
where,
[-x db_princ_args]* - any number of database specific arguments.
Look at each database documentation for supported arguments
4.6、生成 keytab(ktadd)
[root@bigdata3 etc]# kadmin.local
Authenticating as principal Leo825/admin@HADOOP.COM with password.
kadmin.local: ktadd -k /tmp/Leo825.keytab Leo825
Entry for principal Leo825 with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/Leo825.keytab.
Entry for principal Leo825 with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/Leo825.keytab.
Entry for principal Leo825 with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/tmp/Leo825.keytab.
Entry for principal Leo825 with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/tmp/Leo825.keytab.
Entry for principal Leo825 with kvno 2, encryption type camellia256-cts-cmac added to keytab WRFILE:/tmp/Leo825.keytab.
Entry for principal Leo825 with kvno 2, encryption type camellia128-cts-cmac added to keytab WRFILE:/tmp/Leo825.keytab.
Entry for principal Leo825 with kvno 2, encryption type des-hmac-sha1 added to keytab WRFILE:/tmp/Leo825.keytab.
Entry for principal Leo825 with kvno 2, encryption type des-cbc-md5 added to keytab WRFILE:/tmp/Leo825.keytab.
通过 keytab 方式认证:
kinit Leo825@HADOOP.COM -kt /tmp/Leo825.keytab
4.7、删除用户(delete_principal)
kadmin.local: delete_principal Leo825
Are you sure you want to delete the principal "Leo825@HADOOP.COM"? (yes/no): yes
Principal "Leo825@HADOOP.COM" deleted.
Make sure that you have removed this principal from all ACLs before reusing.
5、Kerberos 有效期管理
Kerberos 可以支持两个层面的有效期管理,包括:登录(票据)有效期(ticket lifetime
)和 用户有效期(user lifetime)
。
5.1、票据(登录)有效期
登录有效期用于控制用户在客户端登录前后的生命周期管理,包括登录、销毁和刷新等操作(可类比 web 系统登录,可以登入、登出和刷新 session)。登录有效期受客户端配置、KDC 端配置和 Principal 属性控制。
使用 klist
可以看到当前登录有效期信息:
[root@bigdata3 etc]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: test@HADOOP.COM
Valid starting Expires Service principal
2024-03-01T19:22:49 2024-03-02T19:22:49 krbtgt/HADOOP.COM@HADOOP.COM
renew until 2024-03-08T19:22:49
重点参数:
Valid starting
:Ticket 认证开始时间Expires
:Ticket 认证过期时间renew until
:Ticket 认证的刷新截止时间
当然Ticket 认证过期时间不是随机的,而是有客户端和 kdc 端重点参数 Ticket 生命有效期(ticket_lifetime)
规定的。同样的,最大刷新时间也不是无限制可刷新,而是有参数 Ticket 最大可刷新有效期(renew_lifetime) 控制的:
ticket lifetime
:Ticket 生命有效期renew_lifetime
:Ticket 最大可刷新有效期
例如,客户端配置:
[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 = HADOOP.COM
#default_ccache_name = KEYRING:persistent:%{uid}
5.2、用户有效期
用户有效期用于控制 Kerberos 用户可登录系统的生命周期。用户有效期只有使用 kadmin
管理员工具配置。可配置对Kerberos 用户的用户有效期和用户密码有效期。
# 72小时后
kadmin.local: modify_principal
-expire "72 hours" # 用户有效期
-pwexpire "6/7/2020 12:01am EST" principal_name # 用户密码有效期
#以上为行为方便,实际需要保持在同一行执行
参数:
expire
:用户有效期pwexpire
:用户密码有效期