Kerberos主從配置文檔
1. Kerberos主從同步機制
在Master上通過以下命令同步數據:
kdb5_util dump /var/kerberos/krb5kdc/slave_db
kprop -f /var/kerberos/krb5kdc/slave_db kerberos2.hadoop.com
2. 搭建 Kerberos
2.1 環境
我們在兩個備用NameNode節點上實現Kerberos主從,並在其它需要接入認證的主機上安裝Kerberos客戶端。
- 操作系統:CentOS 6.7/RedHart 6.7
- 運行用戶:root
2.2 安裝包
我們是基於RedHart 6.7/CentOS 6.7操作系統,相關Kerberos安裝包可在系統包中獲取,相關rpm包列表如下:
krb5-app1-clients*.rpm
krb5-libs*.rpm
krb5-app1-servers*.rpm
krb5-pkinit-openssl*.rpm
krb5-auth-dialog*.rpm
krb5-server*.rpm
krb5-dev1*.rpm
krb5-server-ldap*.rpm
krb5-workstation*.rpm
2.2 安裝過程
2.2.1 准備工作
確認添加主機名解析到 /etc/hosts 文件中。
$ cat /etc/hosts
127.0.0.1 localhost
111.111.241.210 kerberos.hadoop.com - master KDC
111.111.241.211 kerberos2.hadoop.com - slave KDC
注意:hostname 請使用小寫,要不然在集成 kerberos 時會出現一些錯誤。
2.2.2 安裝 kdc server
在 KDC (這里是master 和 slave) 上安裝包 krb5、krb5-server 和 krb5-client。
rpm -ivh krb5-server*.rpm
rpm – ivh krb5-libs*.rpm
rpm -ivh krb5-auth-dialog*.rpm
rpm -ivh krb5-workstation*.rpm
在其他節點(kerberos 所有認證客戶端)安裝 krb5-libs、krb5-workstation
rpm – ivh krb5-libs*.rpm
rpm -ivh krb5-workstation*.rpm
2.2.3 修改配置文件
kdc 服務器涉及到三個配置文件:
/etc/krb5.conf
/var/kerberos/krb5kdc/kdc.conf
/var/kerberos/krb5kdc/kadm5.acl
配置 Kerberos 的一種方法是編輯配置文件 /etc/krb5.conf。默認安裝的文件中包含多個示例項。
$ cat /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 = HADOOP.COM
dns_lookup_realm = false
dns_lookup_kdc = false
clockskew = 120
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
renewable = true
udp_preference_limit = 1
default_tgs_enctypes = arcfour-hmac
default_tkt_enctypes = arcfour-hmac
[realms]
HADOOP.COM = {
kdc = kerberos.hadoop.com:88
kdc = kerberos2.hadoop.com:88
admin_server = kerberos.hadoop.com:749
}
[domain_realm]
.hadoop.com = HADOOP.COM
www.hadoop.com = HADOOP.COM
[kdc]
profile=/var/kerberos/krb5kdc/kdc.conf
說明:
- [logging]:表示 server 端的日志的打印位置
- [libdefaults]:每種連接的默認配置,需要注意以下幾個關鍵的小配置
- default_realm = HADOOP.COM:設置 Kerberos 應用程序的默認領域。如果您有多個領域,只需向 [realms] 節添加其他的語句。
- udp_preference_limit= 1:禁止使用 udp 可以防止一個Hadoop中的錯誤
- clockskew:時鍾偏差是不完全符合主機系統時鍾的票據時戳的容差,超過此容差將不接受此票據。通常,將時鍾扭斜設置為 300 秒(5 分鍾)。這意味着從服務器的角度看,票證的時間戳與它的偏差可以是在前后 5 分鍾內。
- ticket_lifetime: 表明憑證生效的時限,一般為24小時。
- renew_lifetime: 表明憑證最長可以被延期的時限,一般為一個禮拜。當憑證過期之后,對安全認證的服務的后續訪問則會失敗。
- [realms]:列舉使用的 realm。
- kdc:代表要 kdc 的位置。格式是 機器:端口
- admin_server:代表 admin 的位置。格式是 機器:端口
- default_domain:代表默認的域名
- [appdefaults]:可以設定一些針對特定應用的配置,覆蓋默認配置。
修改 /var/kerberos/krb5kdc/kdc.conf ,該文件包含 Kerberos 的配置信息。例如,KDC 的位置,Kerbero 的 admin 的realms 等。需要所有使用的 Kerberos 的機器上的配置文件都同步。這里僅列舉需要的基本配置。詳細參考:http://web.mit.edu/~kerberos/krb5-devel/doc/admin/conf_files/krb5_conf.html
$ cat /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
v4_mode = nopreauth
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
HADOOP.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 = des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal des-cbc-crc:v4 des-cbc-crc:afs3
max_life = 24h
max_renewable_life = 10d
default_principal_flags = +renewable, +forwardable
}
說明:
- HADOOP.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
為了能夠不直接訪問 KDC 控制台而從 Kerberos 數據庫添加和刪除主體,請對 Kerberos 管理服務器指示允許哪些主體執行哪些操作。通過編輯文件 /var/lib/kerberos/krb5kdc/kadm5.acl 完成此操作。ACL(訪問控制列表)允許您精確指定特權。
$ cat /var/kerberos/krb5kdc/kadm5.acl
*/admin@HADOOP.COM *
2.2.4 同步配置文件
將 kdc 中的 /etc/krb5.conf 拷貝到集群中其他服務器即可。
$ scp /etc/krb5.conf hods-d01:/etc/krb5.conf
$ scp /etc/krb5.conf hods-d02/etc/krb5.conf
$ scp /etc/krb5.conf hods-d03:/etc/krb5.conf
請確認集群如果關閉了 selinux。
2.2.5 創建數據庫
在 cdh1 上運行初始化數據庫命令。其中 -r 指定對應 realm。
$ kdb5_util create -r HADOOP.COM -s
出現 Loading random data 的時候另開個終端執行點消耗CPU的命令如 cat /dev/sda > /dev/urandom 可以加快隨機數采集。
該命令會在 /var/kerberos/krb5kdc/ 目錄下創建 principal 數據庫。
如果遇到數據庫已經存在的提示,可以把 /var/kerberos/krb5kdc/ 目錄下的 principal 的相關文件都刪除掉。默認的數據庫名字都是 principal。可以使用 -d 指定數據庫名字。
2.2.6 啟動服務
在 master 節點上運行:
$ chkconfig --level 35 krb5kdc on
$ chkconfig --level 35 kadmin on
$ service krb5kdc start
$ service kadmin start
2.2.7 創建 kerberos 管理員
關於 kerberos 的管理,可以使用 kadmin.local 或 kadmin,至於使用哪個,取決於賬戶和訪問權限:
- 如果有訪問 kdc 服務器的 root 權限,但是沒有 kerberos admin 賬戶,使用 kadmin.local
- 如果沒有訪問 kdc 服務器的 root 權限,但是用 kerberos admin 賬戶,使用 kadmin
在 master 上創建遠程管理的管理員:
#手動輸入兩次密碼,這里密碼為root
$ kadmin.local -q "addprinc root/admin"
# 也可以不用手動輸入密碼
$ echo -e "root\nroot" | kadmin.local -q "addprinc root/admin"
系統會提示輸入密碼,密碼不能為空,且需妥善保存
2.2.8 Slave KDC配置
1 創建host keytab 文件
在master服務器上
[root@kerberos ~]# kadmin
kadmin: addprinc -randkey host/kerberos.hadoop.com #添加principal
kadmin:ktadd host/kerberos.hadoop.com #生成keytab文件
在slave服務器上
[root@kerberos2 ~]# kadmin
kadmin: addprinc -randkey host/kerberos2.hadoop.com #添加principal
kadmin: ktadd host/kerberos2.hadoop.com #生成keytab文件
2 將master上的幾個文件拷貝到從服務器
文件: krb5.conf、kdc.conf、kadmin5.acl、master key stash file
[root@kerberos ~]# scp /etc/krb5.conf kerberos2:/etc/.
[root@kerberos ~]# cd /var/kerberos/krb5kdc
[root@kerberos ~]# scp kdc.conf kadmin5.acl .k5.HADOOP.COM
Kerberos2:/var/kerberos/krb5kdc/.
3 在slave服務器上創建kpropd.acl文件
[root@kerberos2 ~]# touch /var/kerberos/krb5kdc/kpropd.acl
添加如下內容:
host/kerberos.hadoop.com@HADOOP .COM
host/kerberos2.hadoop.com@HADOOP .COM
4 在slave上啟動kpropd服務
[root@kerberos2 ~]# kpropd –S
至此,slave上的kdc服務還不能啟動,因為無kdc的database數據
5 在master上將相關數據同步到slave上
[root@kerberos ~]#kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
[root@kerberos ~]#kprop -f /var/kerberos/krb5kdc/slave_db kerberos2.hadoop.com
成功后,會出現以下信息:
Database propagation to kerberos2.hadoop.com: SUCCEEDED
以上命令,可以封裝成一個bash,定時運行,即定時更新slave上的database。
6 slave上/var/kerberos/krb5kdc/會多出一些文件,如:
from_master、principal、pricipal.kadm5、principal.kadmin5.lock、principal.ok
至此,可以啟動slave上的kdc服務
7 測試主從是否生效
1)從第三台服務器,使用kinit 獲取ticket,正常情況下會從master上獲取
2)關閉master上的kdc服務
3)再次從第三台服務器上,使用kinit 獲取ticket,如果成功,說明生效。
也可以觀察kdc的日志,在 /var/log/krb5kdc.log
2.2.9 測試 kerberos
查看當前的認證用戶:
# 查看principals
$ kadmin: list_principals
# 添加一個新的principal
kadmin: addprinc test
WARNING: no policy specified for user1@JAVACHEN.COM; defaulting to no policy
Enter password for principal "test@HADOOP.COM":
Re-enter password for principal "test@JHADOOP.COM":
Principal "test@HADOOP.COM" created.
# 刪除principal
kadmin: delprinc test
Are you sure you want to delete the principal "test@HADOOP.COM"? (yes/no): yes
Principal "test@HADOOP.COM" deleted.
Make sure that you have removed this principal from all ACLs before reusing.
kadmin: exit
也可以直接通過下面的命令來執行:
# 提示需要輸入密碼
$ kadmin -p root/admin -q "list_principals"
$ kadmin -p root/admin -q "addprinc test"
$ kadmin -p root/admin -q "delprinc test"
# 不用輸入密碼
$ kadmin.local -q "list_principals"
$ kadmin.local -q "addprinc test"
$ kadmin.local -q "delprinc test"
創建一個測試用戶 test,密碼設置為 test:
$ echo -e "test\ntest" | kadmin.local -q "addprinc test"
獲取 test 用戶的 ticket:
# 通過用戶名和密碼進行登錄
$ kinit test
Password for test@JAVACHEN.COM:
a$ klist -e
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: test@JAVACHEN.COM
Valid starting Expires Service principal
11/07/14 15:29:02 11/08/14 15:29:02 krbtgt/JAVACHEN.COM@JAVACHEN.COM
renew until 11/17/14 15:29:02, Etype (skey, tkt): AES-128 CTS mode with 96-bit SHA-1 HMAC, AES-128 CTS mode with 96-bit SHA-1 HMAC
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
銷毀該 test 用戶的 ticket:
$ kdestroy
$ klist
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
更新 ticket:
$ kinit root/admin
Password for root/admin@JAVACHEN.COM:
$ klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: root/admin@JAVACHEN.COM
Valid starting Expires Service principal
11/07/14 15:33:57 11/08/14 15:33:57 krbtgt/JAVACHEN.COM@JAVACHEN.COM
renew until 11/17/14 15:33:57
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
$ kinit -R
$ klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: root/admin@JAVACHEN.COM
Valid starting Expires Service principal
11/07/14 15:34:05 11/08/14 15:34:05 krbtgt/JAVACHEN.COM@JAVACHEN.COM
renew until 11/17/14 15:33:57
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
抽取密鑰並將其儲存在本地 keytab 文件 /etc/krb5.keytab 中。這個文件由超級用戶擁有,所以您必須是 root 用戶才能在 kadmin shell 中執行以下命令:
$ kadmin.local -q "ktadd kadmin/admin"
$ klist -k /etc/krb5.keytab
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
3 kadmin/admin@HADOOP.COM
3 kadmin/admin@HADOOP .COM
3 kadmin/admin@HADOOP .COM
3 kadmin/admin@HADOOP .COM
3 kadmin/admin@HADOOP .COM