HBase + Kerberos 配置示例(一)


用過hbase的朋友可能都有過這樣的疑問,我寫一個java client,好像就提供了zookeeper quorum地址就連上hbase了,那么是不是存在安全問題?的確是,如何解決?hbase中引入了kerberos認證。我准備用兩篇博文介紹hbase + kerberos的相關內容,本篇主要介紹kerberos的配置。

環境准備

這里我准備了三台server,各自安裝上centos 6.5 64bit

  • kb1: kerberos server
  • kbhbase1: kerberos client, 后續也用於安裝運行HBase
  • kbjavatest1: kerberos client, 后續將在其上部署java程序訪問kbhbase1上的hbase數據庫

kerberos簡介

kerberos簡單來說就是一套完全控制機制,它有一個中心服務器(KDC),KDC中有數據庫,你可以往里添加各種“人”以及各種“服務”的“身份證”,當某個人要訪問某個服務時,他拿着自己的“身份證”聯系KDC並告訴KDC他想要訪問的服務,KDC經過一系列驗證步驟,最終依據驗證結果允許/拒絕這個人訪問此服務。關於kerberos具體的工作流程,參見文章《Explain like I’m 5: Kerberos》

kerberos server配置

安裝

#yum install krb5-libs krb5-server krb5-workstation

配置

1)#vim /etc/krb5.conf

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log
 
[libdefaults]
 default_realm = MH.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true 

[realms]
 MH.COM = {
  kdc = kb1.mh.com:88
  admin_server = kb1.mh.com:749
 } 

[domain_realm]
 .mh.com = MH.COM
 mh.com = MH.COM
View Code

2)#vim /var/kerberos/krb5kdc/kdc.conf

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 MH.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 des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }
View Code

kerberos中的realm,即kerberos的域,類似於計算機網絡中"domain"的概念。

3)#vim /var/kerberos/krb5kdc/kadm5.acl

這個文件是用來控制哪些人可以使用kadmin工具來管理kerberos數據庫,我這里就配了一行:

*/admin@MH.COM *

其中前一個*號是通配符,表示像名為“abc/admin”或“xxx/admin”的人都可以使用此工具(遠程或本地)管理kerberos數據庫,后一個*跟權限有關,*表示所有權限,還可以進行更細的控制,參見ACL

4)#kdb5_util create -s
初始化一個kerberos數據庫。

5)現在數據庫是空的,想要使用kadmin添加一個人到數據庫中,這是需要權限的,那么最開始的那一個人是怎么加到數據庫中的?這就需要kadmin.local這個工具,這個工具只能在kerberos server上執行(類似於oracle中的sys用戶無密碼登錄)。
#kadmin.local -q "addprinc admin/admin"
我這里把管理員叫“admin/admin”,你可以叫任何名字,但是因為此前我們在kadm5.acl中的配置,名字必須以/admin結尾。過程中會提示你輸入兩次密碼,記住這個密碼,當你在別的機器連接kadmin時,需要這個密碼。

啟動

  • #service krb5kdc start
  • #service kadmin start
  • #chkconfig krb5kdc on
  • #chkconfig kadmin on

驗證

  • #kinit admin/admin

如果kinit不帶參數,則會默認以當前操作系統用戶名,比如root,作為名稱。因為root在kerberos的數據庫中並沒有,所以會提示失敗

  • #klist

正常應該顯示:

Ticket cache: FILE:/tmp/krb5cc_0

Default principal: admin/admin@MH.COM

Valid starting     Expires            Service principal

04/10/15 13:03:36  04/11/15 13:03:36  krbtgt/MH.COM@MH.COM

        renew until 04/10/15 13:03:36

以下這兩個應該不是必須的,與兼容性有關,ktadd命令會把“身份證”寫入到文件(.keytab后綴),可以指定keytab文件,如不指定,默認寫入/etc/krb5.keytab

  • kadmin.local: ktadd kadmin/admin
  • kadmin.local: ktadd kadmin/changepw

其它一些命令

  • #kdestroy,退出當前kerberos用戶,即你最后使用kinit過的那個用戶
  • kadmin.local>listprincs 列出所有存在數據庫中的人或服務
  • kadmin.local>delprinc zookeeper/kbhbase1.mh.com@MH.COM 刪除人或服務
  • kadmin.local>addprinc admin/admin 添加人或服務
  • kadmin.local>q 退出kadmin
  • kadmin:  addprinc -randkey root/kbhbase1.mh@MH.COM
  • kadmin:  xst -k root.keytab root/kbhbase1.mh.com
  • # klist -kt root.keytab 列出這個keytab中保存的所有人或服務

一般在實例使用中通過kinit的方式較少,因為每次都要輸入密碼,所以更經常使用的是keytab文件,相當於為某個人或服務生成一個密碼,並放在文件中,程序中則指向這個keytab,不用每次都輸入密碼。

kerberos client配置

現在,我們到kbhbase1這台機器上,即我們的kerberos 客戶端上。kerberos對服務器跟客戶端之間的時間有要求,所以一般需要安裝ntp來作時間同步,我這里直接手工同步了一下,就不再介紹ntp了。 #yum install krb5-libs krb5-workstation 注意與kerberos server上的yum命令對比。安裝完成后把server上的krb5.conf文件拷貝過來覆蓋一下即可。注意:

  • kb1和kbhbase1的/etc/hosts文件都要把各自以及對方添加上去
  • 關閉這兩個server上的防火牆
    • #service iptables stop
    • #chkconfig iptables off

與在server上類似,使用kinit和klist查看一下。也可以嘗試執行kadmin,按提示使用admin/admin並輸入密碼(你之前創建管理員時輸入的密碼),正常應該能夠連接上服務器,並對數據庫進行操作(比如添加或刪除人、服務)。


送書了,送書了,關注公眾號“程序員雜書館”,送出O'Reilly《Spark快速大數據分析》紙質書(亦有一批PDF分享)! —— 2018年12月


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM