天天看點

Kerberos學習(四)

Mac下安裝配置Kerberos了解一下。

公司強迫開發人員全部使用mbp,我很不爽,因為mac下面使用mit的kerberos簡直是災難,申請用普通筆記本裝linux也不批。

MacOSX是閉源系統,安裝配置開源的東西都很麻煩。是的,port和brew很友善,但是有些需要的C語言開發頭檔案貌似是不軟鍊的,而且源碼編譯還有一堆的依賴要編譯,比如kerberos源碼依賴openssl頭檔案,而openssl頭檔案也得編譯安裝。當然用sudo硬拷過去也行,但是你知道拷哪些嗎?我是已經煩透了。

這裡面有兩說,如果隻是單純用kadmin, kinit,當然homebrew就夠了,不過我是要用kerberos頭檔案來編譯python的某個kerberos庫,這就讨厭了,brew安裝其實是有頭檔案源碼的,但是沒有做軟鍊到/usr/local/include,是以編譯的時候是找不到頭檔案的。隻能手工軟鍊到/usr/local/include

這是準備開發環境的過程

然後配置,由于沒什麼人在mac上做kerberos相關的開發和使用,是以怎麼在mac上配置kerberos我是直接科學上網,搜到MIT的官方文檔,MIT Kerberos MAC配置,配置檔案與Linux不同,是放置在/User/xianglei/Library/Preferences/edu.mit.Kerberos 裡面,搞這麼複雜,其實就是人家 linux 的 /etc/krb5.conf 。

這段是 /User/xianglei/Library/Preferences/edu.mit.Kerberos 的内容,kdc server和 kadmin server的IP位址是我本機的虛機。

kinit登入驗證沒有出現問題,報了一個廢棄警告,rc4-hmac太弱雞了,将會被廢棄。

然而,mac下的 kadmin 登入出問題了

隻會報這種segment fault,經過科學引擎搜尋(百度就别想了,中文我就沒見過幾篇寫Kerberos的。)最後結論是Mac上實作的Kerberos與MIT的Kerberos中間傳輸資料的協定格式不一緻導緻的。解決方法是這樣。用kinit -S參數直接從kdc擷取ticket,替代使用krbtgt/EXAMPLE.COM的中間方式。

然後直接可以進kadmin了,相當于直接用kadmin.local方式。

然後聊一下在Mac下做Kerberos相關C語言開發。起因是因為甲方爸爸購買的Cloudera 企業版快到期了,爸爸說:兒子你技術實力這麼強,加上中美貿易戰,爸爸兜裡沒錢買不起CDH企業版了,兒子要不你自己先維護吧。我們乙方兒子能說啥,咬咬牙,好吧。

不過爸爸那邊的企業版裡面有Kerberos,到期以後維護Hadoop倒還沒啥,Kerberos keytab管理和分發功能企業版到期就不能用了,是以得盡快開發一套Kerberos的管理替代原來Cloudera Manager的這個功能。是以我打算用Python寫了一個界面來自動化建立管理所有Hadoop相關的Keytab,但是Python雖然有不少kerberos的使用庫,卻沒有admin管理的的庫,最後終于找到了一個 PyPI 上的包,結果bug太多,好幾年前釋出的,也不維護了,編譯各種報錯,7裝不了,ubuntu裝不了。隻好先用調用指令行的方式對付着,昨天有空把admin的C代碼好好閱讀修改了一下,重新釋出了一個包。是以昨天就用到了Kerberos的C開發,是以我才吐槽Mac垃圾,啥源碼都沒有,然後還他媽不相容MIT。gcc還得單裝,預設是clang。

好吧,前面已經把brew安裝的動态庫和include頭檔案做了軟鍊到/usr/local/lib和/usr/local/include了,然後修改過的源碼直接就可以編譯了,但是由于調取Mac本身的動态庫,是以管理者認證協定仍然不一樣,是以在Mac下雖然可以編譯通過,但使用時仍然會報Segment Fault,不過unbuntu,centos7等等其他linux發行版下的編譯算是修好了。

對我這種碼農來說,最好的開發環境不是Mac,也不是Windows,就給一破筆記本,裝個ubuntu或者arch就太好了,軟體開發得保證POSIX可移植性和相容性啊。對于随便更新個什麼系統更新檔都能當機的服務,我表示強烈鄙視。

擴充功能并修複bug後開源的 python-kadmV 代碼放在github上面,相比于幾年前釋出的原版,除了修複了不少編譯error,還增加了 principal 改名的功能和建立 keytab 的功能,完全使用C語言編寫的Python包,使用kerberos原生庫編譯安裝,再也無需subprocess調用指令行了。

我自己覺得改完了,相對原版功能還是比較強大的,可以直接在python裡addprinc, delprinc, listprincs, renprinc, ktadd, 對于principal可以get和set各種屬性,比如重置密碼,設定随機密碼,設定過期時間等等,基本跟直接用kadmin指令行差不多了。我原來封裝的調用指令行的kadmin類已經完全用這個包替代了,毫無壓力。

同時也釋出在了pypi上,需要的小朋友可以直接 

不過這篇部落格裡的經驗可能除了python庫,對于絕大多數人可能沒什麼用。絕大多數人都不會用到kerberos,甚至更不會去基于kerberos做開發,甚至更不會在Mac上做Kerberos開發。

Fuck Apple