文章目錄
- 1、什么是 Kerberos
- 2、Kerberos 術語和原理
- 2.1、Kerberos 術語
- 2.1、Kerberos 原理
- 3、Kerberos 服務部署
- 3.1、前置條件
- 3.2、安裝依賴
- 3.3、配置 krb5.conf
- 3.4、配置 kdc.conf
- 3.5、配置 kadm5.acl
- 3.6、安裝 KDC 數據庫
- 3.7、啟動服務
- 3.8、創建 Kerberos 管理員
- 3.9、創建普通租戶
- 3.10、Kerberos 客戶端安裝
- 4、Kerberos 用戶管理
- 4.1、KDC 支持兩種方式管理
- 4.2、查詢所有用戶(list_principals)
- 4.3、查詢用戶詳情(get_principal)
- 4.4、新增用戶(add_principal USER)
- 4.5、修改用戶(modify_principal)
- 4.6、生成 keytab(ktadd)
- 4.7、刪除用戶(delete_principal)
- 5、Kerberos 有效期管理
- 5.1、票據(登錄)有效期
- 5.2、用戶有效期
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.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 = HADOOP.COM#default_ccache_name = KEYRING:persistent:%{uid}[realms]HADOOP.COM = {kdc = bigdata3admin_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 = 88kdc_tcp_ports = 88[realms]HADOOP.COM = {#master_key_type = aes256-ctsmax_renewable_life = 7d 0h 0m 0sacl_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}
說明:
- [
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.COMValid starting Expires Service principal
2024-03-01T18:40:47 2024-03-02T18:40:47 krbtgt/HADOOP.COM@HADOOP.COMrenew 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.COMValid starting Expires Service principal
2024-03-01T18:41:16 2024-03-02T18:41:16 krbtgt/HADOOP.COM@HADOOP.COMrenew 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.COMValid starting Expires Service principal
2024-03-01T19:05:24 2024-03-02T19:05:24 krbtgt/HADOOP.COM@HADOOP.COMrenew until 2024-03-08T19:05:24
2、指定有效期
kadmin.local: addprinc
usage: add_principal [options] principaloptions 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] principaloptions 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_renewableallow_proxiable allow_dup_skey allow_tix requires_preauthrequires_hwauth needchange allow_svr password_changing_serviceok_as_delegate ok_to_auth_as_delegate no_auth_data_requiredlockdown_keyswhere,[-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.COMValid starting Expires Service principal
2024-03-01T19:22:49 2024-03-02T19:22:49 krbtgt/HADOOP.COM@HADOOP.COMrenew 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 = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = truerdns = falsepkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crtdefault_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
:用戶密碼有效期