Kerberos学习(四)

2023-10-24,,

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

brew install krb5
cd /usr/local/include
ln -sf ../Cellar/krb5/1.16.1/include/* ./
cd /usr/local/lib
ln -sf ../Cellar/krb5/1.16.1/lib/* ./

这是准备开发环境的过程

然后配置,由于没什么人在mac上做kerberos相关的开发和使用,所以怎么在mac上配置kerberos我是直接科学上网,搜到MIT的官方文档,MIT Kerberos MAC配置,配置文件与Linux不同,是放置在/User/xianglei/Library/Preferences/edu.mit.Kerberos 里面,搞这么复杂,其实就是人家 linux 的 /etc/krb5.conf 。

[libdefaults]
default_realm = EXAMPLE.COM
dns_lookup_kdc = false
dns_lookup_realm = false
ticket_lifetime = 1296000
renew_lifetime =  2592000
forwardable = true
default_tgs_enctypes = rc4-hmac
default_tkt_enctypes = rc4-hmac
permitted_enctypes = rc4-hmac
udp_preference_limit = 1
kdc_timeout = 3000
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88

[realms]
 EXAMPLE.COM = {
  kdc = 192.168.130.128
  admin_server = 192.168.130.128
  #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
  max_renewable_life = 30d
 }

这段是 /User/xianglei/Library/Preferences/edu.mit.Kerberos 的内容,kdc server和 kadmin server的IP地址是我本机的虚机。

kinit
xianglei/admin@EXAMPLE.COM's password: 
Encryption type arcfour-hmac-md5(23) used for authentication is weak and will be deprecated

kinit登录验证没有出现问题,报了一个废弃警告,rc4-hmac太弱鸡了,将会被废弃。

然而,mac下的 kadmin 登录出问题了

kadmin
kadmin: kadm5_init_with_password: init_sec_context failed with 851968/-1765328377

只会报这种segment fault,经过科学引擎搜索(百度就别想了,中文我就没见过几篇写Kerberos的。)最后结论是Mac上实现的Kerberos与MIT的Kerberos中间传输数据的协议格式不一致导致的。解决方法是这样。用kinit -S参数直接从kdc获取ticket,替代使用krbtgt/EXAMPLE.COM的中间方式。

kinit -S kadmin/admin xianglei/admin@EXAMPLE.COM
xianglei/admin@EXAMPLE.COM's password: 
Encryption type arcfour-hmac-md5(23) used for authentication is weak and will be deprecated
kadmin
kadmin> ?
stash, kstash
	stash
dump
	dump [dump-file]
od-dump
	od-dump [dump-file]
init
	init realm...
load
	load file
merge
	merge file
add, ank, add_new_key
	add principal...
passwd, cpw, change_password
	passwd principal...
delete, del, del_entry
	delete principal...
del_enctype
	del_enctype principal enctype...
add_enctype
	add_enctype principal enctype...
ext_keytab
	ext_keytab principal...
get, get_entry
	get principal...
rename
	rename from to
modify
	modify principal
privileges, privs
	privileges
list
	list principal...
verify-password-quality, pwq
	verify-password-quality principal password
check
	check [realm]
lock
	lock 
unlock
	unlock 
help, ?
	help [command]
exit, quit
	exit

然后直接可以进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上,需要的小朋友可以直接 

pip install python-kadmv

不过这篇博客里的经验可能除了python库,对于绝大多数人可能没什么用。绝大多数人都不会用到kerberos,甚至更不会去基于kerberos做开发,甚至更不会在Mac上做Kerberos开发。

Fuck Apple

《Kerberos学习(四).doc》

下载本文的Word格式文档,以方便收藏与打印。