鉴权,分别由鉴和权组成
- 鉴: 表示身份认证,认证相关用户是否存在以及相关的用户名和密码是否一致
- 权: 完成身份的鉴后,还需要判断用户是否有相关操作的权限。
因此对于某一个用户来说,通常情况下,需要完成鉴和权才能够满足一个完整的业务场景,因此通常将鉴权放在一起考量。本文探讨yarn的鉴权常用的鉴权方式以及kerberos鉴权方式的相关方法。
1. Yarn鉴权方式整理
yarn本身在最开始进行设计时,并没有考虑鉴权相关设计,而是以满足大数据的业务场景作为优先要务,因此最开始时只有简单认证模式。等后续经过一定程度的发展,发现鉴权越来越成为业务的需要,因此才将鉴权作为一个功能进行设计。在设计上也是充分利用现有的框架或者外部的认证系统,yarn对接相关的认证系统接口,从而完成高效(偷懒)的实现鉴权功能。
目前YARN有支持两种用户身份认证:简单认证和kerberos认证。
简单认证: 基于客户端进程所在的Linux/Unix系统的当前用户名来进行认证。只要用户能正常登录操作系统就认证成功。这样客户端与NameNode交互时,会将用户的登录账号(与whoami命令输出一致)作为合法用户名传给Namenode。 这样的认证机制存在恶意用户可以伪造其他人的用户名的风险,对数据安全造成极大的隐患,线上生产环境一般不会使用。简单认证模式下,采集的鉴权模式跟linux系统一致,使用UGO(user、group、other)模式,相关的acl跟linux系统类似,本文不在追述。
drwxrwxrwt - yarn hadoop 0 2020-01-20 15:42 /app-logs
drwxr-xr-x - yarn hadoop 0 2020-01-20 15:40 /ats
drwxr-xr-x - yarn yarn 0 2020-01-20 15:40 /hdp
drwxr-xr-x - mapred yarn 0 2020-01-20 15:40 /mapred
drwxrwxrwx - mapred hadoop 0 2020-01-20 15:40 /mr-history
drwxrwxrwx - yarn yarn 0 2020-01-20 15:41 /tmp
drwxr-xr-x - yarn yarn 0 2020-01-20 15:40 /user
drwxr-xr-x - yarn yarn 0 2020-01-20 15:40 /warehouse
kerberos认证: kerberos是一个网络认证协议,其使用密钥加密技术为客户端和服务端应用提供强认证功能。它有一个管理端(AdminServer)用于管理所有需要认证的账号信息,另外还有若干的密钥分发服务器(KDC)用于提供认证和分发密钥服务。 用户从 Kerberos 管理员处获取对应的 Kerberos 账号名或者密钥文件,然后通过 kinit 等方式认证Kerberos,拿到TGT(ticket-granting-ticket)票据。客户端会将TGT信息传输到NN端,NN在获取到认证信息后,将principle首部截取出来作为客户端的用户名。例如使用 todd/foobar@CORP.COMPANY.COM认证成功后, da作为principle的首部会作为该客户端的用户名使用。 使用Kerberos可以极大增强YARN的安全性,特别是在多租户的生产环境下。
2. Kerboers鉴权模式
kerberos鉴权模式,主要是基于yarn内部集群以及相关的客户端的提交限制,是常规使用的鉴权模式。参考文档HDFS鉴权设计以及Kerberos鉴权方法
3. 疑问和思考
3.1 如果希望基于yarn进行多租户的权限管理该如何设计?
一种能够实现的方式是, 在外层封装相关接口,租户层面申请一个用户,然后底层调用接口进行
1, kerberos认证依赖principal和需要签发相关的keytab
或者
2, 在所有部署yarn、hdfs的linux服务器上创建相关的账户
将申请的账号提供给相关租户,相关租户使用对应的账号、密码进行任务的提交。
流程图如下
如上的设计方式,在功能开发上也会面临问题,没有相关的统一接口,由于涉及ssh类型操作,难以形成事务型操作,整体流程上容易出现失败从而导致创建失败。