ZhangZhihui's Blog  

在网络安全和大数据领域(如 Hadoop、Kafka、HBase),Kerberos 是一种基于对称密钥密码学的网络身份认证协议。

它的核心设计理念是:“在不安全的网络中,通过第三方可信机构,安全地证明‘你是谁’。”


1. Kerberos 的三大核心角色

Kerberos 的名字源于希腊神话中守护地狱之门的“三头犬”,这正对应了它系统中的三个关键组成部分,统称为 KDC (Key Distribution Center)

  1. AS (Authentication Service) - 身份认证服务:接收用户的登录请求,验证用户身份,并发放 TGTTicket Granting Ticket 票据授予票据)。

  2. TGS (Ticket Granting Service) - 票据授予服务:凭借 TGT,为用户发放访问特定服务(如 Hive、HDFS)的 Service Ticket(服务票据)。

  3. Database - 数据库:存储所有用户和服务的账号(Principal)以及对应的密码(Key)。


2. 认证流程:通俗比喻

我们可以把 Kerberos 认证想象成去一个大型游乐园

  • 第一步(找售票处): 你向售票处(AS)证明你的身份(输入密码)。售票处给你一张入场凭证(TGT)

  • 第二步(找项目柜台): 你想玩过山车(访问 HDFS)。你拿着入场凭证去换票柜台(TGS)。柜台确认入场证有效后,给你一张过山车专用票(Service Ticket)

  • 第三步(去玩项目): 你把专用票给过山车管理员(服务器)。管理员确认票据真实且未过期,准许你进入。


3. 为什么大数据领域离不开它?

在没有 Kerberos 的 Hadoop 集群中,任何人都可以伪造一个 hdfs 用户来删除数据。Kerberos 解决了以下痛点:

  • 身份防伪: 仅仅知道用户名没用,必须通过 KDC 的加密验证。

  • 相互认证(Mutual Authentication): 不仅服务器验证客户端,客户端也会验证服务器,防止连接到冒牌的“钓鱼”服务器。

  • 单点登录(SSO): 你只需要在开头输入一次密码(kinit),之后在有效期内访问集群中的各种服务(Yarn, Spark, HBase)都不再需要重复输入密码。


4. 核心术语清单

  • Principal: 认证的实体,格式通常为 用户名/实例名@域名(例如 admin/admin@EXAMPLE.COM)。

  • Keytab: 包含用户密码的一种二进制文件。在自动化脚本中,由于无法手动输入密码,通常使用 Keytab 文件来进行身份校验。

  • Ticket (票据): 具有时效性。一旦过期,用户必须重新认证。


注意事项

Kerberos 虽然安全,但也增加了系统的复杂度。如果 KDC 宕机,整个集群将无法访问;且它对系统时间极其敏感,如果服务器之间的时间偏差超过 5 分钟,认证就会失效。

 

在 Kerberos 环境中,kinit 是最常用的命令,用于向 KDC 证明你的身份并获取 TGT(票据授予票据)

简单来说,它的作用就是“登录”。


1. 最基础用法:手动输入密码

这是最常见的交互式登录方式。

kinit username@REALM.COM
  • 执行后: 系统会提示你输入密码。

  • 注意: Realm(领域名)通常必须大写


2. 自动化运维常用:使用 Keytab 文件

在大数据脚本或后台服务中,无法人工输入密码,这时需要用到 Keytab 文件(包含加密后的身份凭证)。

kinit -kt /path/to/user.keytab username@REALM.COM
  • -k:表示使用 Keytab。

  • -t:指定 Keytab 文件的路径。


3. 指定票据有效期

如果你需要更长(或更短)的票据有效期,可以使用 -l 参数。

kinit -l 24h username@REALM.COM
  • 这将请求一个有效期为 24 小时的 TGT(前提是 KDC 配置允许这么长)。


4. 常用配套命令

执行完 kinit 后,你通常需要以下命令来管理你的身份:

命令 作用
klist 查看当前票据。显示你当前是谁、TGT 什么时候过期。
kdestroy 销毁票据。相当于“注销登录”,清除本地缓存的凭证。
kpasswd 修改密码。修改当前 Kerberos 账号的密码。

5. 常见报错及排查

如果你在使用 kinit 时遇到问题,可以尝试开启调试模式查看详细过程:

# 在命令前加上环境变量
KRB5_TRACE=/dev/stdout kinit username@REALM.COM

常见错误提示:

  • Preauthentication failed:密码错了,或者 Keytab 文件与 Principal 不匹配。

  • Cannot contact any KDC:网络不通,或者 /etc/krb5.conf 配置文件里的 KDC 地址写错了。

  • Clock skew too great:本地系统时间与 KDC 服务器时间相差超过 5 分钟(Kerberos 对时间极其敏感)。


验证步骤示例

一个完整的标准流程通常是这样的:

  1. kinit -kt user.keytab user@EXAMPLE.COM (登录)

  2. klist (确认看到 Expires 时间是未来的某个点)

  3. hadoop fs -ls / (开始操作大数据组件)

 

 

Kerberos认证需要使用单独的数据库吗?

 

简单来说:是的,Kerberos 必须拥有一个数据库来存储数据,但它通常不需要你额外安装像 MySQL 或 Oracle 这样的外部数据库。

Kerberos 的核心组件 KDC(密钥分发中心)内置了专门的存储机制来管理用户信息。以下是详细的拆解:


1. 默认存储:内置数据库 (DB2/LDAP)

当你安装标准的 Kerberos(如 MIT Kerberos)时,它会自带一个基于文件的简单数据库(通常是基于 Berkeley DB 格式)。

  • 存储内容: 它保存了所有的 Principal(主体,即用户或服务的名称)、对应的 Key(加密后的密码)、以及账户策略(如密码过期时间)。

  • 管理方式: 你不能用 SQL 语句去查询它,必须使用 Kerberos 专用的管理工具,例如 kadminkadmin.local

2. 企业级扩展:使用 LDAP/AD

在大型企业或生产环境中,管理员往往不希望维护多套独立的数据库,因此会选择将 Kerberos 数据库“外挂”或集成:

  • LDAP 集成: 可以配置 Kerberos 使用 OpenLDAP 作为后端存储。

  • Active Directory (AD): 这是最常见的场景。微软的 AD 本质上就是一个集成了 Kerberos 服务、LDAP 目录服务和 DNS 的综合体。在这种情况下,AD 的数据库就是 Kerberos 的数据库


3. Kerberos 数据库里的核心表项

如果你能“打开”这个数据库,你会看到每个条目主要包含以下信息:

字段 说明
Principal 身份标识,如 hive/hadoop-node1@EXAMPLE.COM
Key 用户的加密密钥(由密码派生)
KVNO 密钥版本号(Key Version Number),每次改密码都会增加
Attributes 账号属性(是否禁用、是否允许转发票据等)
Policy 密码策略(最小长度、有效期等)

4. 为什么这个数据库极其重要?

由于数据库中存储了所有用户和服务的“主密钥”:

  • 安全性: 这个数据库文件通常存放在物理极其安全的服务器上(KDC 主机)。一旦该数据库泄露,整个集群的安全性就完全崩溃了。

  • 一致性: 在高可用场景下,通常会有一个 Master KDC 和多个 Slave KDC,它们之间会定期同步这个数据库文件。


总结

你不需要为了运行 Kerberos 去单独买一个数据库授权或安装复杂的数据库软件,Kerberos 会在初始化(kdb5_util create)时自动为你创建一个专用的数据库文件。

 

posted on 2026-02-02 20:22  ZhangZhihuiAAA  阅读(0)  评论(0)    收藏  举报