Kerberos认证原理与环境部署
文章目錄
- 一、概述
- 1)應(yīng)用場景
- 2)功能特性
- 二、Kerberos中的核心概念
- 1)用戶principal
- 2)服務(wù)principal
- 3)Ticket
- 三、Kerberos架構(gòu)與工作原理
- 四、Kerberos安裝
- 1)Kerberos Server 安裝
- 1、yum安裝
- 2、配置 krb5.conf
- 3、配置 kdc.conf
- 4、配置 kadm5.acl
- 5、初始化KDC數(shù)據(jù)庫
- 6、啟停 Kerberos 服務(wù)
- 7、kadmin.local
- 2)Kerberos Client 安裝
- 3)基本命令操作
- 1、kadmin(數(shù)據(jù)庫管理)
- 2、kinit(在客戶端認證用戶)
- 3、導(dǎo)出keytab認證文件
- 4、kdestroy(刪除當前的認證緩存)
- 5、用戶認證(登錄)
一、概述
Kerberos是為TCP/IP網(wǎng)絡(luò)系統(tǒng)設(shè)計的可信的第三方認證協(xié)議,用于身份認證。網(wǎng)絡(luò)上的Keberos服務(wù)基于DES對稱加密算法,但也可以用其他算法替代。因此,Keberos是一個在許多系統(tǒng)中獲得廣泛應(yīng)用的認證協(xié)議。Keberos最初是美國麻省理工學(xué)院(MIT)為Athena項目開發(fā)的。
官網(wǎng):https://www.kerberos.org/
官方文檔:http://web.mit.edu/kerberos/krb5-current/doc/
1)應(yīng)用場景
Kerberos采用客戶端/服務(wù)器(CS)結(jié)構(gòu)與DES加密技術(shù),并且能夠進行相互認證,即客戶端和服務(wù)器端均可對對方進行身份認證,是一種應(yīng)用對稱密鑰體制進行密鑰管理的系統(tǒng)。可以用于防止竊聽、防止replay攻擊、保護數(shù)據(jù)完整性等場合。
2)功能特性
Kerberos提供雙向認證,不僅Server可以對Client 進行認證,Client也能對Server進行認證。Server對Client認證成功之后,通過返回Client發(fā)送的時間戳,向Client提供驗證自己身份的手段。
認證服務(wù)是其他服務(wù)的基礎(chǔ),服務(wù)認證過程有助于提升整個系統(tǒng)的可用性和高可靠性。
KDC(秘鑰分配中心)是秘鑰體系的重要部分,旨在減少密鑰體制所固有的交換密鑰時所面臨的風(fēng)險。用戶可以根據(jù)需要擴展多個KDC。
Kerberos已經(jīng)成為計算機領(lǐng)域一個被廣泛接受的標準,所以使用Kerberos可以輕松實現(xiàn)不同平臺之間的互操作。
二、Kerberos中的核心概念
Kerberos中有以下一些概念需要了解:
- KDC:密鑰分發(fā)巾心,負責管理發(fā)放票據(jù),記錄授權(quán)。
- Realm: Kerberos管理領(lǐng)域的標識。
- principal:Kerberos 下的用戶可以稱為 Principal,當每添加一個用戶或服務(wù)的時候都需要向kdc添加一條principal, principal的形式為:主名稱/實例名@領(lǐng)域名。
- 主名稱:主名稱可以是用戶名或服務(wù)名,表示是用于提供各種網(wǎng)絡(luò)服務(wù)(如hdfs、yam,、hive) 的主體。
- 實例名:實例名簡單理解為主機名。
- keytab文件:存儲了用戶的加密密碼。常用這種方式認證。
1)用戶principal
用戶principal的形式:
Name[/Instance]@REALM
其中Instance是可選 的,通常用于更好地限定用戶的類型。比如,一個管理員用戶通常會有admin instance,即Name/admin@REALM。
下面是指代用戶的 一些principal的例子:
pippo@EXAMPLE.COM admin/admin@EXAMPLE.COM cnicetoupp/admin@EXAMPLE.COM2)服務(wù)principal
用戶principal的形式:
Service/Hostname@REALM
- 第一部分是service的名字,比如imap, AFS, ftp. 通常’host’這個名字被用于指明對一臺機器的通用的訪問(telnent, rsh, ssh)。
- 第二個component是提供這個服務(wù)的機器的全限定域名(FQDN)。這個component跟DNS對應(yīng)用服務(wù)器的IP地址進行逆向解析后得到的主機名。
下面是指代服務(wù)principal的例子:
imap/hadoop-node1@EXAMPLE.COMhost/hadoop-node1@EXAMPLE.COMafs/hadoop-node1@EXAMPLE.COM3)Ticket
Ticket分兩種:
- Ticket Granting Ticket,TGT:這是KDC中的Authentication Server(簡稱AS)產(chǎn)生的,TGT是向Ticket Granting Server(TGS)用于表明自己真實身份的東西。
- Service Ticket:這是KDC中的Ticket Granting Server(簡稱TGS)產(chǎn)生的,Service Ticket 是用于向應(yīng)用服務(wù)器表明自己身份的東西
三、Kerberos架構(gòu)與工作原理
-
AS_REQ 是在初始化一個用戶(kinit)的時候發(fā)出的用戶認證請求,這個請求是發(fā)給KDC中的Authentication Server (AS);
-
AS_REP 是 AS回復(fù)給client的信息,其中包括TGT (用TGS secret key加密過的) and the session key (用發(fā)請求的用戶的secret key加密過的);
-
TGS_REQ 是client為了一個service ticket向Ticket Granting Server (TGS)的信息. 其中包括上一條信息中獲得的TGT (用TGS secret key加密過的) ,一個客戶端產(chǎn)生的一個authenticator(用session key加密過的).
-
TGS_REP 是TGS回復(fù)給TGS_REQ的信息. 其中包括service ticket(用appservice的secret key加密過),和 一個TGS產(chǎn)生的service sessinon key(之前AS產(chǎn)生的一條session key給加密過的)
-
AP_REQ 是一條客戶端發(fā)給appserver的訪問服務(wù)的請求,其中包括service ticket和一個authenticator(使用TGS產(chǎn)生的service session key 加密過的)
-
AP_REP 是appserver回復(fù)給client的一條信息,證明這個appserver確實是客戶端希望訪問的server。不過這條信息也不一定總是要回復(fù)的。比如當客戶端和appserver需要相互認證的時候,客戶端向appserver發(fā)出請求,這個時候就不需要回復(fù)信息。
Kerberos認證時序圖:
四、Kerberos安裝
官方文檔:https://kerberos.org/dist/index.html
【溫馨提示】這里主機名和域名都在配置/etc/hosts
192.168.0.113 hadoop-node1 server.kerberos.com 192.168.0.114 hadoop-node2 client1.kerberos.com 192.168.0.115 hadoop-node3 client2.kerberos.com| hadoop-node1 | server.kerberos.com | 192.168.0.113 | KDC(Kerberos Server、kadmin) |
| hadoop-node2 | client1.kerberos.com | 192.168.0.114 | Kerberos Client |
| hadoop-node3 | client1.kerberos.com | 192.168.0.115 | Kerberos Client |
1)Kerberos Server 安裝
在hadoop-node1節(jié)點上執(zhí)行如下命令安裝Kerberos Server
1、yum安裝
- krb5-server:Kerberos服務(wù)端程序,KDC所在節(jié)點。
- krb5-workstation: 包含一些基本Kerberos程序,比如(kinit, klist, kdestroy,kpasswd),使用Kerberos的所有節(jié)點都應(yīng)該部署。
- krb5-libs:包含Kerberos程序的各種支持類庫等。
2、配置 krb5.conf
【溫馨提示】/etc/krb5.conf : 客戶端根據(jù)該文件中的信息取訪問KDC
# To opt out of the system crypto-policies configuration of krb5, remove the # symlink at /etc/krb5.conf.d/crypto-policies which will not be recreated. includedir /etc/krb5.conf.d/#Kerberos守護進程的日志記錄方式。換句話說,表示 server 端的日志的打印位置。 [logging]#默認的krb5libs.log日志文件存放路徑default = FILE:/var/log/krb5libs.log#默認的krb5kdc.log日志文件存放路徑kdc = FILE:/var/log/krb5kdc.log#默認的kadmind.log日志文件存放路徑admin_server = FILE:/var/log/kadmind.log#Kerberos使用的默認值,當進行身份驗證而未指定Kerberos域時,則使用default_realm參數(shù)指定的Kerberos域。即每種連接的默認配置,需要注意以下幾個關(guān)鍵的配置: [libdefaults]#DNS查找域名,我們可以理解為DNS的正向解析,該功能我沒有去驗證過,默認禁用。(我猜測該功能和domain_realm配置有關(guān))dns_lookup_realm = false# 憑證生效的時限,設(shè)置為24h。ticket_lifetime = 24h# 憑證最長可以被延期的時限,一般為7天。當憑證過期之后,對安全認證的服務(wù)的后續(xù)訪問則會失敗。renew_lifetime = 7d# 如果此參數(shù)被設(shè)置為true,則可以轉(zhuǎn)發(fā)票據(jù),這意味著如果具有TGT的用戶登陸到遠程系統(tǒng),則KDC可以頒發(fā)新的TGT,而不需要用戶再次進行身份驗證。forwardable = true# 我理解是和dns_lookup_realm相反,即反向解析技術(shù),該功能我也沒有去驗證過,默認禁用即可。rdns = false# 在KDC中配置pkinit的位置,該參數(shù)的具體功能我沒有做進一步驗證。pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt#設(shè)置 Kerberos 應(yīng)用程序的默認領(lǐng)域。如果您有多個領(lǐng)域,只需向 [realms] 節(jié)添加其他的語句。其中默認EXAMPLE.COM可以為任意名字,推薦為大寫,這里我改成了HADOOP.COM。必須跟要配置的realm的名稱一致。default_realm = HADOOP.COM# 顧名思義,默認的緩存名稱,不推薦使用該參數(shù)。# default_ccache_name = KEYRING:persistent:%{uid}[realms]HADOOP.COM = {# kdc服務(wù)器地址。格式 [主機名或域名]:端口, 默認端口是88,默認端口可不寫kdc = server.kerberos.com:88# # admin服務(wù)地址 格式 [主機名或域名]:端口, 默認端口749,默認端口可不寫admin_server = server.kerberos.com:749# 代表默認的域名,設(shè)置Server主機所對應(yīng)的域名default_domain = kerberos.com}#指定DNS域名和Kerberos域名之間映射關(guān)系。指定服務(wù)器的FQDN,對應(yīng)的domain_realm值決定了主機所屬的域。 [domain_realm].kerberos.com = HADOOP.COMkerberos.com = HADOOP.COM#kdc的配置信息。即指定kdc.conf的位置。 [kdc]# kdc的配置文件路徑,默認沒有配置,如果是默認路徑,可以不寫profile = /var/kerberos/krb5kdc/kdc.conf3、配置 kdc.conf
【溫馨提示】/var/kerberos/krb5kdc/kdc.conf:kdc的專屬配置,可以根據(jù)自己的需求修改下kdc數(shù)據(jù)庫的存放目錄。
[kdcdefaults]#指定KDC的默認端口kdc_ports = 88# 指定KDC的TCP協(xié)議默認端口。kdc_tcp_ports = 88[realms]#該部分列出每個領(lǐng)域的配置。HADOOP.COM = {#和 supported_enctypes 默認使用 aes256-cts。由于,JAVA 使用 aes256-cts 驗證方式需要安裝額外的 jar 包(后面再做說明)。推薦不使用,并且刪除 aes256-cts。(建議注釋掉,默認也是注釋掉的)#master_key_type = aes256-cts#標注了 admin 的用戶權(quán)限的文件,若文件不存在,需要用戶自己創(chuàng)建。即該參數(shù)允許為具有對Kerberos數(shù)據(jù)庫的管理訪問權(quán)限的UPN指定ACL。acl_file = /var/kerberos/krb5kdc/kadm5.acl#該參數(shù)指向包含潛在可猜測或可破解密碼的文件。dict_file = /usr/share/dict/words#KDC 進行校驗的 keytab。admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab# ticket 的默認生命周期為24hmax_file = 24h# #該參數(shù)指定在多長時間內(nèi)可重獲取票據(jù),默認為0max_renewable_life = 7d#指定此KDC支持的各種加密類型。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}4、配置 kadm5.acl
【溫馨提示】/var/kerberos/krb5kdc/kadm5.acl:權(quán)限相關(guān)配置
其中前一個號是通配符,表示像名為“abc/admin”或“xxx/admin”的人都可以使用此工具(遠程或本地)管理kerberos數(shù)據(jù)庫,后一個跟權(quán)限有關(guān),*表示所有權(quán)限。HADOOP.COM是上面配置的realm。
*/admin@HADOOP.COM *Kerberos kadmind 使用該文件來管理對 Kerberos 數(shù)據(jù)庫的訪問權(quán)限。對于影響 principa 的操作,ACL 文件還控制哪些 principa 可以對哪些其他 principa 進行操作。文件格式如下:
principal permissions [target_principal [restrictions] ]相關(guān)參數(shù)說明:
- principal:設(shè)置該 principal 的權(quán)限;principal 的每個部分都可以使用 *。
- permissions: 權(quán)限,指定匹配特定條目的主體可以執(zhí)行或不可以執(zhí)行的操作 。如果字符是大寫,則不允許該操作。如果字符是小寫,則允許該操作。有如下一些權(quán)限:
- a:[不]允許添加主體或策略。
- d:[不]允許刪除主體或策略。
- m:[不]允許修改主體或策略。
- c:[不]允許更改主體的口令。
- i:[不]允許查詢 Kerberos 數(shù)據(jù)庫。
- l:[不]允許列出 Kerberos 數(shù)據(jù)庫中的主體或策略。
- x 或 *:允許所有權(quán)限。
- target_principal:目標 principal,目標 principal 的每個部分都可以使用 *。【可選】
- restrictions:針對權(quán)限的一些補充限制,如:限制創(chuàng)建的 principal 的票據(jù)最長時效。【可選】
【示例】
kadm5.acl 文件中的以下項授予 HADOOP.COM 領(lǐng)域中包含 admin 實例的任何主體對 Kerberos 數(shù)據(jù)庫的所有權(quán)限:
kadm5.acl 文件中的以下項授予 test@EXAMPLE.COM 主體添加、列出和查詢包含 root 實例的任何主體的權(quán)限。
test@EXAMPLE.COM ali */root@EXAMPLE.COMkadm5.acl 文件中的以下項不授予 test@EXAMPLE.COM 主體添加、列出和查詢包含 root 實例的任何主體的權(quán)限。
test@EXAMPLE.COM ALI */root@EXAMPLE.COM詳細說明可參考官網(wǎng)文檔:https://web.mit.edu/kerberos/krb5-latest/doc/admin/conf_files/kadm5_acl.html
5、初始化KDC數(shù)據(jù)庫
$ kdb5_util create -r HADOOP.COM -s $ ll -a /var/kerberos/krb5kdc/- -s:表示生成 stash file,并在其中存儲 master server key(krb5kdc)
- -r:指定 realm name
kerberos數(shù)據(jù)庫創(chuàng)建完之后,默認會創(chuàng)建以下5個文件(kdc.conf、kadm5.acl除外的其他幾個),Kerberos 數(shù)據(jù)庫的目錄為:/var/kerberos/krb5kdc,如果需要重建數(shù)據(jù)庫,可刪除這五個文件重新執(zhí)行上面的命令創(chuàng)建。
6、啟停 Kerberos 服務(wù)
啟動:
$ systemctl start krb5kdc kadmin # 查看服務(wù)狀態(tài) $ systemctl status krb5kdc kadmin停止:
$ systemctl stop krb5kdc kadmin7、kadmin.local
Kerberos 服務(wù)機器上可以使用 kadmin.local 來執(zhí)行各種管理的操作。進入 kadmin.local,不需要輸入密碼:
$ kadmin.local常用操作:
| add_principal, addprinc, ank | 增加 principal | add_principal -randkey test@HADOOP.COM |
| cpw | 修改密碼 | cpw test@HADOOP.COM |
| delete_principal, delprinc | 刪除 principal | delete_principal test@HADOOP.COM |
| modify_principal, modprinc | 修改 principal | modify_principal test@HADOOP.COM |
| rename_principal, renprinc | 重命名 principal | rename_principal test@HADOOP.COM test2@ABC.COM |
| get_principal, getprinc | 獲取 principal | get_principal test@HADOOP.COM |
| list_principals, listprincs, get_principals, getprincs | 顯示所有 principal | listprincs |
| ktadd, xst | 導(dǎo)出條目到 keytab | xst -k /root/test.keytab test@HADOOP.COM |
| ? | 查看幫助 | ? |
【溫馨提示】-randkey是密碼是隨機的,-nokey密碼不隨機【默認】,得手動輸入密碼。
【示例】
addprinc -randkey hdfs/adminaddprinc -pw 123456 hdfs/admin addprinc hdfs/admin 輸入密碼:1234562)Kerberos Client 安裝
在hadoop-node2和hadoop-node3節(jié)點上安裝client
- krb5-workstation: 包含一些基本Kerberos程序,比如(kinit, klist, kdestroy,kpasswd),使用Kerberos的所有節(jié)點都應(yīng)該部署。
- krb5-devel:包含編譯Kerberos程序的頭文件和一些類庫。
配置 krb5.conf
【溫馨提示】/etc/krb5.conf : 客戶端根據(jù)該文件中的信息取訪問KDC
# To opt out of the system crypto-policies configuration of krb5, remove the # symlink at /etc/krb5.conf.d/crypto-policies which will not be recreated. includedir /etc/krb5.conf.d/#Kerberos守護進程的日志記錄方式。換句話說,表示 server 端的日志的打印位置。 [logging]#默認的krb5libs.log日志文件存放路徑default = FILE:/var/log/krb5libs.log#默認的krb5kdc.log日志文件存放路徑kdc = FILE:/var/log/krb5kdc.log#默認的kadmind.log日志文件存放路徑admin_server = FILE:/var/log/kadmind.log#Kerberos使用的默認值,當進行身份驗證而未指定Kerberos域時,則使用default_realm參數(shù)指定的Kerberos域。即每種連接的默認配置,需要注意以下幾個關(guān)鍵的配置: [libdefaults]#DNS查找域名,我們可以理解為DNS的正向解析,該功能我沒有去驗證過,默認禁用。(我猜測該功能和domain_realm配置有關(guān))dns_lookup_realm = false# 憑證生效的時限,設(shè)置為24h。ticket_lifetime = 24h# 憑證最長可以被延期的時限,一般為7天。當憑證過期之后,對安全認證的服務(wù)的后續(xù)訪問則會失敗。renew_lifetime = 7d# 如果此參數(shù)被設(shè)置為true,則可以轉(zhuǎn)發(fā)票據(jù),這意味著如果具有TGT的用戶登陸到遠程系統(tǒng),則KDC可以頒發(fā)新的TGT,而不需要用戶再次進行身份驗證。forwardable = true# 我理解是和dns_lookup_realm相反,即反向解析技術(shù),該功能我也沒有去驗證過,默認禁用即可。rdns = false# 在KDC中配置pkinit的位置,該參數(shù)的具體功能我沒有做進一步驗證。pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt#設(shè)置 Kerberos 應(yīng)用程序的默認領(lǐng)域。如果您有多個領(lǐng)域,只需向 [realms] 節(jié)添加其他的語句。其中默認EXAMPLE.COM可以為任意名字,推薦為大寫,這里我改成了HADOOP.COM。必須跟要配置的realm的名稱一致。default_realm = HADOOP.COM# 顧名思義,默認的緩存名稱,不推薦使用該參數(shù)。default_ccache_name = KEYRING:persistent:%{uid}[realms]HADOOP.COM = {# kdc服務(wù)器地址。格式 [主機名或域名]:端口, 默認端口是88,默認端口可不寫kdc = server.kerberos.com:88# # admin服務(wù)地址 格式 [主機名或域名]:端口, 默認端口749,默認端口可不寫admin_server = server.kerberos.com:749# 代表默認的域名,設(shè)置Server主機所對應(yīng)的域名default_domain = kerberos.com}#指定DNS域名和Kerberos域名之間映射關(guān)系。指定服務(wù)器的FQDN,對應(yīng)的domain_realm值決定了主機所屬的域。 [domain_realm].kerberos.com = HADOOP.COMkerberos.com = HADOOP.COM測試驗證連接server
# 默認用戶是root/admin@HADOOP.COM,發(fā)現(xiàn)在數(shù)據(jù)庫里沒有這個用戶,可以先在server端創(chuàng)建該用戶:add_principal root/admin@HADOOP.COM$ kadmin 輸入密碼:123456
指定用戶
3)基本命令操作
1、kadmin(數(shù)據(jù)庫管理)
Kerberos 客戶端機器上可以使用 kadmin 來執(zhí)行各種管理的操作,服務(wù)端可以使用kadmin和kadmin.local命令。需先在 Kerbers Server 上創(chuàng)建登錄的 principal,默認為 {當前用戶}/admin@realm。
管理KDC數(shù)據(jù)庫有兩種方式:
- 一種直接在KDC(server端)直接執(zhí)行,可以不需要輸入密碼就可以登錄【命令:kadmin.local】
- 一種則是客戶端命令,需要輸入密碼【命令:kadmin】,在server端和client端都可以使用。
創(chuàng)建用戶,注意自己設(shè)置的密碼
# 交互式 $ kadmin.localadd_principal root/admin# 非交互式 $ kadmin.local -q "add_principal root/admin"2、kinit(在客戶端認證用戶)
$ kinit root/admin@HADOOP.COM # 查看當前的認證用戶 $ klist3、導(dǎo)出keytab認證文件
使用xst命令或者ktadd命令:
# 非交互式 $ kadmin.local -q "ktadd -norandkey -k /root/root.keytab root/admin"# 交互式 $ kadmin.localktadd -norandkey -k /root/root.keytab root/admin 或xst -k /root/v.keytab root/admin 或xst -norandkey -k /root/root.keytab root/admin其中 /root/root.keytab為自己指定的路徑與文件名,以.keytab結(jié)尾;root/admin為之前創(chuàng)建的憑證用戶
查看密鑰文件
4、kdestroy(刪除當前的認證緩存)
$ kdestroy5、用戶認證(登錄)
基于密碼認證
$ klist $ kinit root/admin 輸入密碼:123456$ klist基于密鑰認證(keytab)
# 刪除當前用戶認證 $ kdestroy# 拿到上面生成的keytab文件 $ klist $ kinit -kt /root/root.keytab root/admin $ klist
常見的基礎(chǔ)操作就到這里了,更多操作命令,可以查看官方文檔和查看幫助。后續(xù)會分享kerberos認證實戰(zhàn)文章,請小伙伴耐心等待~
總結(jié)
以上是生活随笔為你收集整理的Kerberos认证原理与环境部署的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搜搜更懂你
- 下一篇: 数字工厂生产监控可视化决策平台,打造智能