因为,最近要做大数据组件的安全认证,需要涉及到kerberos这个组件,记录相关资料,后续查看。
Kerberos 是一种网络认证协议,它采用了传统的共享密钥的方式,实现了在网络环境不一定保证安全的环境下,client和server之间的通信,适用于client/server模型。用户只需输入一次身份验证信息,就可凭借此验证获得的票据授予票据(ticket-granting ticket)访问多个接入Kerberos的服务。
图 1.1 Kerberos认证
开启安全认证后的认证方式有两种:
使用用户密码通过kinit认证, 获取到的TGT存在本地凭证缓存当中, 供后续访问服务认证使用。一般在交互式访问中使用。
用户通过导出的keytab 可以免密码进行用户认证, 后续步骤一致。一般在应用程序中配置使用。
Kerberos的认证过程可细分为三个阶段:初始验证、获取服务票据和服务验证:
第一阶段主要是客户端向KDC中的AS发送用户信息,以及请求TGT。
TGT大体又包含以下的内容:
1.2初始验证流程图
第二阶段客户端拿到之前获得的TGT(一个TGT可以从KDC获得基于不同Server的Ticket)向KDC中的TGS请求访问某个服务的票据。
注意:这里KDC不直接发送给服务的主要原因是:怕网络延迟的场景下,KDC同时将消息发送给客户端和服务端,无法确保同时到达服务端,在极端情况下KDC与服务端网络临时不通,导致客户端访问客户端验证失败,而实际上客户端是具有访问服务端权限的。
第三阶段拿到票据(Ticket)后再到该服务的提供端验证身份,然后使用建立的加密通过和服务通信。
图1.3 获取服务票据和服务验证流程图
对于TGT和Ticket给出了巧妙的比喻:TGT类似于护照,Ticket则是签证,而访问特定的服务则好比出游某个国家。与护照一样,TGT可标识你的身份并允许你获得多个Ticket(签证),每个Ticket对应一个特定的服务,TGT和Ticket同样具有有效期,过期后就需要重新认证。
其中,TGT具有有效期,如果过期就会失效,此后Client不得不重新向KDC申请新的TGT,KDC将会生成一个不同Session Key和与之关联的TGT。整个认证流程图如下图所示:
图1.4 Kerberos认证流程
Hadoop在1.0.0版本之后引入Kerberos认证机制,即用户跟服务通信以及各个服务之间通信均用Kerberos认证,在用户认证后任务执行、访问服务、读写数据等均采用特定服务发起访问token,让需求方凭借token访问相应服务和数据:
这里,Delegation Token是Hadoop自身实现的一种轻量级认证机制(Kerberos是三方认证协议,而Delegation Tokens只涉及到两方。)为了避免所有任务都要需要使用TGT通过Kerberos来进行认证,对KDC造成网络拥塞,系统瓶颈。当然,Delegation Token也具有有效期,需要周期性的更新以保证其有效性。考虑到高可用性,Delegation Tokens会被server进行持久化。HDFS NameNode将Delegation Tokens持久化到元数据中。
server端的Delegation Tokens
Hadoop中Delegation Tokens的生成和验证主要依赖于HMAC机制。Delegation Token主要由两部分组成:public部分和private部分,并以
server端可以配置更新周期(renew-interval,默认24小时),以及Delegation Token的过期时间。过期的Delegation Tokens不能用于认证,且server端专门有一个后台线程用于将过期token移除。
server token的public部分和private部分主要包含如下表所示:
Kind |
The kind of token (HDFS_DELEGATION_TOKEN, or kms-dt). The token also contains the kind, matching the identifier’s kind. |
Owner |
The user who owns the token. |
Renewer |
The user who can renew the token |
Real User |
Only relevant if the owner is impersonated. If the token is created by an impersonating user, this will identify the impersonating user. |
Issue Date |
Epoch time when the token was issued |
Max Date |
Epoch time when the token can be renewed until |
Sequence Number |
UUID to identify the token |
Master Key ID |
ID of the master key used to create and verify the token |
表1 server token public部分组成内容
renewDate |
Epoch time when the token is expected to be renewed. |
password |
The password calculated as HMAC of Token Identifier using master key as the HMAC key. |
trackingId |
A tracking identifier that can be used to associate usages of a token across multiple client sessions. |
表2 server token private部分组成内容
client端的Delegation tokens
client token包含以下内容:
identifier |
The token identifier matching the public information part at the server side. |
password |
The password matching the password at the server side. |
kind |
The kind of token (e.g. HDFS_DELEGATION_TOKEN, or kms-dt), it matches the identifier’s kind. |
service |
The name of the service (e.g. ha-hdfs: |
renewer |
The user who can renew the token (e.g. yarn). |
Kerberos ticket 有两种生命周期,ticket lifetime (票据生命周期) 和 renewable lifetime (可再生周期)。
客户端配置项:krb5.conf
1. 在登录后的一天后可以对ticket进行续期,直到第一次登录的7天后将不再允许续约;
2. 在一天内没有进行续期,将无法进行续期;
3. 对ticket进行一次续期后,ticket_lifetime恢复到24h
服务端配置项:kdc.conf
kdc.conf配置的更改对新建的principal会立即生效,旧的不会生效,如果需要对旧的principal生效,需要modprinc指令修改:
modprinc -maxlife 670s -maxrenewlife 700s admin/[email protected]
Hadoop token生命周期配置在hdfs-site.xml文件中:
配置项 |
默认值 |
|
dfs.namenode.delegation.key.update-interval |
86400000 |
The update interval for master key for delegation tokens in the namenode in milliseconds. |
dfs.namenode.delegation.token.max-lifetime |
604800000 |
The maximum lifetime in milliseconds for which a delegation token is valid |
dfs.namenode.delegation.token.renew-interval |
86400000 |
The renewal interval for delegation token in milliseconds |
当凭证过期之后,对安全认证的服务的后续访问则会失败。有两种方式可以解决凭证过期的问题:
Hadoop 将 Kerberos 认证部分进行了一定的封装到 UserGroupInformation 这个类。
UserGroupInformation 在 JAAS 框架上封装了 Hadoop 的用户信息, 更确切地说是对 Subject 做了一层封装。JAAS 是 Java 认证和授权服务(Java Authentication and Authorization Service)的缩写, 主要包含以下几个实体:
Subject 是一个不可继承的实体类,它标志一个请求的来源, 包含相关的凭证标识(Principal) 和 公开和私有的凭据(Credential)。
凭证标识,认证成功后,一个 Subject 可以被关联多个Principal。
凭据,有公有凭据以及私有凭据
JAAS认证依赖LoginContext,客户端通过一个LoginContext对象与JAAS相互作用,这个LoginContext对象提供了一种开发应用程序的方式,它不依赖于底层的认证技术,主要描述了用于验证对象(subjects)的方法。
在安全模式下,UGI 支持不同LoginContext 配置,均是通过 HadoopConfiguration 类动态产生:
1)hadoop-user-kerberos
使用kerberos缓存凭证登陆的配置, useTicketCache 置为 true
2)hadoop-keytab-kerberos
使用keytab登陆的配置, useKeyTab 置为 true
免于每次输入密码,采用基于keytab 的Kerberos认证方式,调用 loginUserFromKeytab方法 完成登录,后续可以定时执行:
UserGroupInformation.getLoginUser().reloginFromKeytab()
尝试重新登录。
参考链接:
https://blog.csdn.net/wenwen360360/article/details/78913347
https://ieevee.com/tech/2016/06/07/kerberos-1.html
https://www.cnblogs.com/wuyuxiang/p/5166677.html
https://blog.csdn.net/lovebomei/article/details/79807484
https://blog.csdn.net/co_zjw/article/details/81974845
https://blog.cloudera.com/blog/2017/12/hadoop-delegation-tokens-explained/#4
https://www.cnblogs.com/zhzhang/p/5692249.html