之前有段時間公司的kerberos認證老是出問題,因而我便不經深入調查,便先入為主地認為這就是MIT用來發paper的東西,毫無實用性,是為技術而技術的典范。為什么一定要它呢?我們搭的小hadoop集群沒有它也能夠運行正常。直到昨天,我需要把一個java程序部署到yarn上,在運行第一個極簡單的示例時便報錯了:```simple authentication is not enabled```。Google一下,發現yarn不支持simple的鑒權模式,必須上kerberos!這樣的設計是基於如下一個場景:一台在信任列表外的機器,向yarn提交一個惡意的程序,便可以在整個集群上以linux-executor的執行用戶做任何事情。這是應當避免的,而我也需要將5台機器上的hadoop的權限認證遷移到kerberos上。
首先應該搭建一個kerberos認證服務器。這個參考文獻比我看到的所有其他的都好:http://web.mit.edu/kerberos/krb5-1.14/doc/admin/install_kdc.html。以下逐步記錄以下,以備將來查詢。
export KRB5_CONFIG=/yourdir/krb5.conf
export KRB5_KDC_PROFILE=/yourdir/kdc.conf
因為這5台機器需要同時訪問公司的大kerberos,所以我們在一台機器上另建一個kerberos服務器,並配置以上環境變量,以便與另一套配置文件區分。
[libdefaults] default_realm = MAOYAN.COM // 默認的domain,這樣在kinit中,便可以省略了
allow_weak_crypto = false // 強加密如弱加密,不明白是什么意思,先禁掉 dns_lookup_realm = false // 不走DNS,這幾台機器的域名解析都已經相互配置到hosts里了 dns_lookup_kdc = false ticket_lifetime = 24h // ticket 過期時間 renew_lifetime = 7d // ticket 可延期的時間,默認是0 forwardable = true // ticket 是否可轉發。注意,最嚴格的限制點在服務器端的配置 udp_preference_limit = 1 // 大小超過這一限制時,先整TCP;尚不清楚單位是字節還是什么 [realms] MAOYAN.COM = { kdc = dx-movie-data-hadoop05:88 // kdc服務器,如果是master/slave模式,就重復地多寫幾行 admin_server = dx-movie-data-hadoop05:749 // kdc主服務器,如果有多台,也多寫幾行 default_domain = MAOYAN.COM // 應該是kerberos 4和5之間兼容用的 } [appdefaults]
以上是krb5.conf文件的內容。注釋是另填上的,真正配置的時候請刪除之。
kdc.conf配置如下:
[kdcdefaults] kdc_ports = 88,750 // kerberos監聽的udp端口;kdc_tcp_ports可以同理配置tcp端口。后者如果不設置,默認監聽88 [realms] MAOYAN.COM = { kadmind_port = 749 // kadmind這個daemon監聽的端口 acl_file = /opt/maoyan-kerberos/var/krb5kdc/kadm5.acl // 訪問控制列表文件 database_name = /opt/maoyan-kerberos/var/krb5kdc/principal // kerberos數據庫文件路徑 dict_file = /usr/share/dict/words // unix系統的字典文件路徑,這里面的字符串是禁止作為密碼的
master_key_type = aes256-cts // 這個是默認 max_renewable_life = 7d 0h 0m 0s supported_enctypes = aes256-cts:normal aes128-cts:normal } [logging] kdc = FILE:/opt/maoyan-kerberos/var/logs/krb5kdc.log admin_server = FILE:/opt/maoyan-kerberos/var/logs/kadmind.log default = FILE:/opt/maoyan-kerberos/var/logs/krb5libs.log
配置完這兩個文件之后,便可以生成kerberos的數據庫了: kdb5_util create -r MAOYAN.COM 。執行時會要求設置密碼,完成后會生成上面設置的```database_name```文件。
接下來,手動創建上面設置的acl_file文件。這個文件控制了持有哪些principal的會話可以修改principal本身的元數據,包括添加、修改、刪除principal等。這個文件中的內容從略,上面給的鏈接中可以找到。
下面,執行 kadmin.local 命令。注意,如果你把database_name設置到了root用戶才能修改的目錄,那么這里將同樣需要root權限。執行完這個命令之后,將進入kerberos的管理界面,你可以在上面執行對principal的DDL操作了。比如:
addprinc sankuai/admin@MAOYAN.COM;
xst -k /home/qupeng/maoyan.keytab sankuai/admin;
接下來,我們就可以使用sankuai/admin這個principal簽入kerberos認證了;並且如果在acl文件中恰當地配置了admin訪問元數據的權限,那么sankuai也將可以執行addprinc等操作了。
最后,執行:
krb5kdc && kadmind
這一bash命令,kerberos服務便搭建成功,可以使用了。
未完待續:kerberos的認證過程。William Stallings的書上有寫,然而上學的時候沒認真看,出來混終於還是要還的。
