1、服務器基本信息
操作系統:centos7
數量:2
主機名映射關系
IP | hostname | server |
192.168.4.50 | manager1 | Kerberos server(kdc) |
192.168.0.230 | yjt | Kerberos client |
2、安裝ntp服務
3、安裝kerber
3.1、安裝
server端:
# yum -y install krb5-libs krb5-workstation krb5-server
client端
# yum -y install krb5-devel krb5-workstation
如果想源碼編譯安裝,可下載:https://kerberos.org/dist/index.html
配置kerberos server 主要修改三個配置文件,如下:
(1) /etc/krb5.conf
(2) /var/kerberos/krb5kdc/kdc.conf
(3) /var/kerberos/krb5kdc/kadm5.acl
3.2、配置krb5.conf文件
修改server端上面的krb5.conf文件
# cat /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
default_realm = EXAMPLE.COM
default_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
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
#以上是默認的文件信息。
配置解釋:
[logging] 這個組里面配置的是一些與日志存放路徑相關的信息。
default: 用於配置krb5libs日志存放路徑
kdc: 用於配置krb5kdc日志存放路徑
admin_server: 用於配置kadmin服務日志存放路徑
[libdefaults] 在使用Kerberos時使用的默認值。
dns_lookup_realm : 與dns參數有關,猜測用於域名解析,默認是false,當設置為true時,dns參數才起作用,有關dns參數獲取其他參數可以查看官方文檔。
ticket_lifetime: 獲取到的票據存活時間,也就是該票據可以用多久,默認是1天
renew_lifetime:票據可更新的時間,也就是說該票據可以延遲到期的天數。默認是7天
forwardable:票據是否可以被kdc轉發, 默認是true。
rdns :在進行dns解析的時候,正反向都可以,默認是true,如果dns_canonicalize_hostname參數被設置為false,那么rdns這個參數將無效。
default_realm:默認的領域,當客戶端在連接或者獲取主體的時候,當沒有輸入領域的時候,該值為默認值(列如:使用kinit admin/admin 獲取主體的憑證時,沒有輸入領域,而傳到kdc服務器的時候,會變成 admin/admin@EXAMPLE.COM ),這個值需要在[realms]中定義,如果有多個領域,都需要在realms中定義。默認以大寫書寫。
default_ccache_name:默認緩存的憑據名稱,不推薦使用,當在客戶端配置該參數的時候,會提示緩存錯誤信息。
[realms] 該組主要是配置領域相關的信息,默認只有一個,可以配置多個,如果配置多個(比如:HADOOP.COM, HBASE.COM),但是default_realm值定義為HADOOP.COM,那么客戶端在獲取與HBASE.COM相關的憑據時,需要指定具體的域名(比如客戶端初始化憑據: kinit admin/admin@HBASE.COM).
EXAMPLE.COM: 簡單說就是域名,對應用kerberos來說就是領域,相當於編程里面的namespace。
kdc : kdc服務器地址。格式 機器:端口, 默認端口是88
admin_server: admin服務地址 格式 機器:端口, 默認端口749
default_domain: 指定默認的域名
[domain_realm] 指定DNS域名和Kerberos域名之間映射關系。指定服務器的FQDN,對應的domain_realm值決定了主機所屬的域。
[kdc]:
kdc的配置信息。即指定kdc.conf的位置。 profile :kdc的配置文件路徑,默認值下若無文件則需要創建。
3.3、配置kdc.conf
#cat /var/kerberos/krb5kdc/kdc.conf [kdcdefaults] kdc_ports = 88 kdc_tcp_ports = 88 [realms] EXAMPLE.COM = { #master_key_type = aes256-cts 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的默認值。
kdc_ports: kdc默認端口
kdc_tcp_ports: kdc默認的tcp端口
[realms] 該配置項主要是用於配置每個域的具體信息。
- EXAMPLE.COM: 是設定的 realms。名字隨意。Kerberos 可以支持多個 realms,會增加復雜度。大小寫敏感,一般為了識別使用全部大寫。這個 realms 跟機器的 host 沒有大關系。
- master_key_type:和 supported_enctypes 默認使用 aes256-cts。由於,JAVA 使用 aes256-cts 驗證方式需要安裝額外的 jar 包(后面再做說明)。推薦不使用,並且刪除 aes256-cts。
- acl_file:標注了 admin 的用戶權限,需要用戶自己創建。文件格式是:Kerberos_principal permissions [target_principal] [restrictions]
- supported_enctypes:支持的校驗方式。
- admin_keytab:KDC 進行校驗的 keytab。
關於AES-256加密:
對於使用 centos5. 6及以上的系統,默認使用 AES-256 來加密的。這就需要集群中的所有節點上安裝 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File。
下載的文件是一個 zip 包,解開后,將里面的兩個文件放到下面的目錄中:$JAVA_HOME/jre/lib/security (如果已經存在,可以考慮先刪除)
3.4、配置kadm5.acl
#cat /var/kerberos/krb5kdc/kadm5.acl */admin@EXAMPLE.COM *
解析:
該配置文件主要是用於管理員登陸的acl
配置格式:
Kerberos_principal permissions [target_principal] [restrictions]
第一列: */admin@HADOOP.COM 對應 Kerberos_principal 表示主體(principal)名稱
第二列:* 對應 permissions 表示權限
上述的配置表示以/admin@WXAMPLE.COM結尾的用戶擁有*(all 也就是所有)權限,具體配置可根據項目來是否縮小權限。
4、Kerberos操作
4.1、創建數據庫
初始化數據庫 -r 指定域名(也就是在krb5.conf文件[realms]組里面定義的域名) -s選項指定將數據庫的主節點密鑰存儲在文件中,從而可以在每次啟動KDC時自動重新生成主節點密鑰
#kdb5_util -s create HADOOP.COM
出現 Loading random data 的時候另開個終端執行點消耗CPU的命令如 cat /dev/sda > /dev/urandom 可以加快隨機數采集。
該命令會在 /var/kerberos/krb5kdc/ 目錄下創建 principal 數據庫。
如果遇到數據庫已經存在的提示,可以把 /var/kerberos/krb5kdc/ 目錄下的 principal 的相關文件都刪除掉。默認的數據庫名字都是 principal。可以使用 -d 指定數據庫名字。
#ll /var/kerberos/krb5kdc/ 數據庫創建完成以后,會在該目錄下生成以principal開頭的四個文件 total 48 -rw------- 1 root root 21 Oct 18 14:28 kadm5.acl #kerberos管理員的訪問權限控制文件 -rw------- 1 root root 451 Oct 18 15:01 kdc.conf #kdc 主配置文件 -rw------- 1 root root 32768 Oct 24 14:41 principal # kerberos數據庫文件 -rw------- 1 root root 8192 Oct 23 16:31 principal.kadm5 #Kerberos數據庫管理文件 -rw------- 1 root root 0 Oct 23 16:31 principal.kadm5.lock #kerberos 數據庫管理的鎖文件 -rw------- 1 root root 0 Oct 24 14:41 principal.ok # kerberos數據庫文件
4.2、啟動服務
啟動kdc服務
# systemctl start krb5kdc
# systemctl enable krb5kdc #開啟自啟
啟動kadmin服務
# systemctl start kadmin
# systemctl enable kadmin #開啟自啟
4.3、創建管理員
關於 kerberos 的管理,可以使用 kadmin.local 或 kadmin,至於使用哪個,取決於賬戶和訪問權限: 如果有訪問 kdc 服務器的 root 權限,但是沒有 kerberos admin 賬戶,使用 kadmin.local 如果沒有訪問 kdc 服務器的 root 權限,但是用 kerberos admin 賬戶,使用 kadmin
說白了一點,在server上使用kadmin.local,在client使用kadmin 在 server 上創建遠程管理的管理員: 第一種方法: # kadmin.local #進入控制台
addprinc admin/admin #創建管理員
手動輸入兩次密碼,這里密碼為123456
第二種方法: # kadmin.local -q "addprinc addmin/admin"
第三種方法: 不用手動輸入密碼 # echo -e "123456\n123456" | kadmin.local -q "addprinc admin/admin" 系統會提示輸入密碼,密碼不能為空,且需妥善保存
4.4、客戶端測試kadmin
[hduser@yjt ~]$ kinit admin/admin #獲取管理員憑證(TGT) Password for admin/admin@HADOOP.COM: #輸入密碼,也就是123456 [hduser@yjt ~]$ kadmin Couldn't open log file /var/log/kadmind.log: 權限不夠 Authenticating as principal admin/admin@HADOOP.COM with password. Password for admin/admin@HADOOP.COM: #輸入密碼 123456 kadmin: #控制台
5、kerberos常用命令
服務端操作:
在控制台輸入 ? 可以查看相關命令
kadmin: ? Available kadmin requests: 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, listprincs, get_principals, 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, listpols, get_policies, 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.
查看具體的命令用法,直接輸入命令按回車,如下:
kadmin: 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]
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
5.1、添加主體(principal)
add_principal, addprinc, ank 這幾個命令都可以創建主體(相當於用戶)
服務器操作測試:
# kadmin.local 進入到控制台
控制台是以kadmin開頭的,如下:
kadmin: addprinc yjt/yjt #創建主體(用戶)yjt/yjt 需要輸入密碼
kadmin: addprinc -pw 123456 yjt/yjt # 創建yjt/yjt主體,密碼使用-pw指定
kadmin: addprinc -randkey yjt/yjt #生成隨機密碼
5.2、刪除主體
delete_principal, delprinc # 刪除主體,刪除的時候會詢問是否刪除
kadmin: delprinc yjt/yjt
Are you sure you want to delete the principal "yjt/yjt@HADOOP.COM"? (yes/no): yes
Principal "yjt/yjt@HADOOP.COM" deleted.
Make sure that you have removed this principal from all ACLs before reusing.
5.3、修改憑證
modify_principal, modprinc #修改用戶
比如修改延遲到期時間:
kadmin: modprinc -maxrenewlife 8days yjt/yjt
Principal "yjt/yjt@HADOOP.COM" modified.
5.4、列出當前憑證
list_principals, listprincs, get_principals, getprincs #列出當前憑證
kadmin: listprincs
HTTP/yjt@HADOOP.COM
K/M@HADOOP.COM
admin/admin@HADOOP.COM
dn/yjt@HADOOP.COM
hbase/yjt@HADOOP.COM
hdfs/yjt@HADOOP.COM
hive/yjt@HADOOP.COM
host/yjt@HADOOP.COM
jn/yjt@HADOOP.COM
kadmin/admin@HADOOP.COM
kadmin/changepw@HADOOP.COM
kadmin/manager1@HADOOP.COM
kiprop/manager1@HADOOP.COM
krbtgt/HADOOP.COM@HADOOP.COM
nm/yjt@HADOOP.COM
nn/yjt@HADOOP.COM
rm/yjt@HADOOP.COM
test@HADOOP.COM
yarn/yjt@HADOOP.COM
yjt/yjt@HADOOP.COM
zkcli/yjt@HADOOP.COM
zkcli@HADOOP.COM
zkserver/yjt@HADOOP.COM
zookeeper/yjt@HADOOP.COM
5.5、生成密鑰文件
ktadd, xst
kadmin: xst -norandky -k hadoop.keytab jn/yjt nn/yjt # -k指定密鑰文件的位置,如果是相對路徑,文件生成在當前路徑下,可以指定多個認證主體
如何合並多個密鑰文件的信息到一個文件?例如,在當前路徑下,存在nn.keytab, dn.keytab ,現在我想把這兩個文件里面的密鑰合並到hadoop.keytab,操作如下:
在命令行輸入ktutil
#ktutil #進入到控制台
read_kt, rkt #這兩個命令可以從keytab里面讀取出密鑰信息
ktutil: rkt nn.keytab
ktutil: rkt dn.keytab
write_kt, wkt # 這兩個命令可以把當前的keylist寫入到一個keytab文件,這個keylist信息就是上面使用rkt從keytab讀取的信息
ktutil: wkt hadoop.keytab
5.6、獲取憑據信息
get_principal, getprinc # 獲取憑據信息的兩個命令
kadmin.local: getprinc yjt/yjt
Principal: yjt/yjt@HADOOP.COM
Expiration date: [never]
Last password change: Thu Oct 24 18:01:22 CST 2019
Password expiration date: [never]
Maximum ticket life: 1 day 00:00:00
Maximum renewable life: 8 days 00:00:00 注意這里:剛才被我們該過
Last modified: Thu Oct 24 18:07:28 CST 2019 (admin/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]
5.7、生成dump文件
[root@manager1 yjt-test 18:25:39]#kdb5_util dump kerberos_data [root@manager1 yjt-test 18:26:48]#ll total 36-rw------- 1 root root 24867 Oct 24 18:26 kerberos_data -rw------- 1 root root 1 Oct 24 18:26 kerberos_data.dump_ok
5.8、修改認證主體的密碼
#kpasswd yjt/yjt Password for yjt/yjt@HADOOP.COM: Enter new password: Enter it again: Password changed.
客戶端操作:
5.9、獲取憑證
[root@manager1 yjt-test 18:28:06]#kinit yjt/yjt #基於密碼,需要輸入密碼
[root@manager1 yjt-test 18:28:06]#kinit -kt app.keytab yjt/yjt #基於密鑰的方式驗證
5.9、查看當前的憑證
[root@manager1 yjt-test 18:31:53]#klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: nm/yjt@HADOOP.COM Valid starting Expires Service principal 10/23/2019 19:49:29 10/24/2019 19:49:29 krbtgt/HADOOP.COM@HADOOP.COM
5.10、刪除當前認證的緩存
[root@manager1 yjt-test 18:31:55]#kdestroy
5.11、查看密鑰文件的認證主體列表
[root@manager1 kerveros_security 18:34:25]#klist -ket hadoop.keytab Keytab name: FILE:hadoop.keytab KVNO Timestamp Principal ---- ------------------- ------------------------------------------------------ 1 10/24/2019 14:41:57 hdfs/yjt@HADOOP.COM (aes256-cts-hmac-sha1-96) 1 10/24/2019 14:41:57 hdfs/yjt@HADOOP.COM (aes128-cts-hmac-sha1-96) 1 10/24/2019 14:41:57 hdfs/yjt@HADOOP.COM (des3-cbc-sha1) 1 10/24/2019 14:41:57 hdfs/yjt@HADOOP.COM (arcfour-hmac) 1 10/24/2019 14:41:57 hdfs/yjt@HADOOP.COM (camellia256-cts-cmac) 1 10/24/2019 14:41:57 hdfs/yjt@HADOOP.COM (camellia128-cts-cmac) 1 10/24/2019 14:41:57 hdfs/yjt@HADOOP.COM (des-hmac-sha1) 1 10/24/2019 14:41:57 hdfs/yjt@HADOOP.COM (des-cbc-md5) 1 10/24/2019 14:41:57 yarn/yjt@HADOOP.COM (aes256-cts-hmac-sha1-96) 1 10/24/2019 14:41:57 yarn/yjt@HADOOP.COM (aes128-cts-hmac-sha1-96) 1 10/24/2019 14:41:57 yarn/yjt@HADOOP.COM (des3-cbc-sha1) 1 10/24/2019 14:41:57 yarn/yjt@HADOOP.COM (arcfour-hmac) 1 10/24/2019 14:41:57 yarn/yjt@HADOOP.COM (camellia256-cts-cmac) 1 10/24/2019 14:41:57 yarn/yjt@HADOOP.COM (camellia128-cts-cmac) 1 10/24/2019 14:41:57 yarn/yjt@HADOOP.COM (des-hmac-sha1) 1 10/24/2019 14:41:57 yarn/yjt@HADOOP.COM (des-cbc-md5) 1 10/24/2019 14:41:57 HTTP/yjt@HADOOP.COM (aes256-cts-hmac-sha1-96) 1 10/24/2019 14:41:57 HTTP/yjt@HADOOP.COM (aes128-cts-hmac-sha1-96) 1 10/24/2019 14:41:57 HTTP/yjt@HADOOP.COM (des3-cbc-sha1) 1 10/24/2019 14:41:57 HTTP/yjt@HADOOP.COM (arcfour-hmac) 1 10/24/2019 14:41:57 HTTP/yjt@HADOOP.COM (camellia256-cts-cmac) 1 10/24/2019 14:41:57 HTTP/yjt@HADOOP.COM (camellia128-cts-cmac) 1 10/24/2019 14:41:57 HTTP/yjt@HADOOP.COM (des-hmac-sha1) 1 10/24/2019 14:41:57 HTTP/yjt@HADOOP.COM (des-cbc-md5) 1 10/24/2019 14:41:57 host/yjt@HADOOP.COM (aes256-cts-hmac-sha1-96) 1 10/24/2019 14:41:57 host/yjt@HADOOP.COM (aes128-cts-hmac-sha1-96) 1 10/24/2019 14:41:57 host/yjt@HADOOP.COM (des3-cbc-sha1) 1 10/24/2019 14:41:57 host/yjt@HADOOP.COM (arcfour-hmac) 1 10/24/2019 14:41:57 host/yjt@HADOOP.COM (camellia256-cts-cmac) 1 10/24/2019 14:41:57 host/yjt@HADOOP.COM (camellia128-cts-cmac) 1 10/24/2019 14:41:57 host/yjt@HADOOP.COM (des-hmac-sha1) 1 10/24/2019 14:41:57 host/yjt@HADOOP.COM (des-cbc-md5)
參考: