前言
本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系
正文
Kerberos 认证
Kerberos 是一种网络认证协议,它使用加密来提供高度安全的认证机制。
这种认证机制由于具备以下功能而大受欢迎。
- 相互认证:在进行会话之前,客户端和服务器可以进行相互认证。
- 单点登录:一旦登录,令牌(token)的有效时间就确定了。令牌有效性的持续时间决定了会话的最长时间。
- 协议消息加密:认证过程中的所有协议消息都会加密,所以它不可能被对手进行中间人式攻击(man-in-the-middle attack)或是重放攻击(replay attack)。
Kerberos 的架构和工作流
Kerberos 的核心是 Kerberos 密钥分发中心(Key Distribution Center, KDC)。
KDC 有以下两个重要的组件:
- 认证服务器(Authentication Server,AS)
- 票据授予服务器(Ticket Granting Server,TGS)
认证服务器负责验证客户端的有效性。
票据授予服务器则负责发放令牌或票据(有时间限制且加密的消息),受让人可以使用这些令牌或票据对其自身进行认证。
下图显示了当客户端使用 Kerberos 进行认证时的协议工作流。
- 首先,客户端向 Kerberos 中的 AS 请求一个票据授予票据(Ticket Granting Ticket, TGT)
- AS 在自己的数据库中检査客户端,然后送回两条消息。第一条消息是会话密钥,第二条则是 TGT。
这两条消息都使用客户端的密码作为密钥进行了加密。只有当自己的密码和 AS 中保存的密码一致时,客户端才可以使用这个会话密钥和 TGT。 - 客户端想要访问服务,首先得提交自己的身份信息到 TGS。
为了证明其真实性,客户端需要通过它从 AS 那取得的会话密钥向 TGS 发送加密过的认证信息。 - TGS 收到请求后,将它解密,然后检査客户端和请求的有效性。成功验证后,TGS 授予一张带有时效的票据,同时也会返回一个服务器会话密钥给客户端。
这个服务器会话密钥会有两个副本一一一个用客户端的机密信息加密,另一个则用服务器机密信息加密。 - 现在,客户端手中握有票据、服务器会话密钥,以及它所需要访问的服务的认证信息。服务所在的服务器验证会话密钥,然后根据验证结果授予访问权限。
如果需要相互认证,则服务器也会送回认证信息,这样客户端就可以对其有效性进行检查。这是可行的,因为会话密钥有两个副本,分别用服务器和客户端的机密信息进行了加密。
Kerberos 认证和 Hadoop
Hadoop 的认证客户端需要一个密码去进行 Kerberos 的认证工作流。
对于一个长时间运行的 MapReduce 作业来说,这可能不太现实,因为作业时间可能会超出票据的有效时间。
在 Hadoop 中,使用 kinit 命令来初始化客户端得到一个密码。
虽然票据的有效时间可能是几个小时,但对于某些长时间运行的作业,最好是将这个密码写入一个叫 keytab 的文件。
使用 ktutil 命令来创建 keytab 文件。然后使用 -t 参数在 kinit 命令中指定这个 keytab 文件。
klist 命令可以显示一个用户拥有的不同票据。 kdestroy 命令可以注销那些不再使用的票据。
HTTP接口的认证
默认情况下,Hadoop 集群所有的 HTTP 网络端口都没有启用认证。这意味着任何人只要知道网页地址就可以在集群中访问这些不同的服务。
不过可以通过配置 HTTP 网络接口,明确要求 Kerberos 认证使用 HTTPSPNEGO 协议。
这种协议可以很好地支持所有主流的浏览器。
也可以启用简单认证。
这需要在网页地址中追加用户名作为查询字符串的参数。参数的值是这个用户的身份名称。也可以使用自定义的认证方案。
Hadoop 的所有网络端口都支持这种扩展,前提是你正确地重写了 AuthenticatorHandler 类。
可以使用 core-site.xml 中的如下属性来配置 HTTP 认证。
- hadoop.htp.filter.initializers
这个属性的值需要配置为 org.apache.hadoop.security.AuthenticationFilterInitializer 类的类名。
- hadoop.http.authentication.type
这个属性决定了认证的类型。值可以是 simple 或 kerberos,或自定义 AuthenticatorHandler 派生类的类名。默认值为 simple
- hadoop.http.authentication.token.validity
这个属性的值是指认证令牌的有效时长。单位是秒,默认值为36000。超过这个时长就必须重新更新令牌。
- hadoop.http.authentication.signature.secret.file
冈络端口的机密信息保存在这个文件中。机密密钥被用于为认证令牌提供一个数字签名。
- hadoop.http, authentication.cookie.domain
这是域名白名单,其认证令牌可以通过 cookies 递送。此属性没有默认值。
- hadoop.http.authentication.simple.anonymous.allowed
当这个属性设为true时,允许匿名用户连接HTTP端口。默认值为true,并且只有当认证类型设为 simple时这个属性才有效。
7 hadoop.http.authentication.kerberos.principal
当认证类型设为kerberos时所使用的 Kerberos实体名称。
- hadoop.http.authentication.kerberos.keytab
这个属性的值是HTTP端口所使用的 Kerberos实体的 keytab文件的路径。