kerberos认证服务搭建
之前有段时间公司的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的书上有写,然而上学的时候没认真看,出来混终于还是要还的。