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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。