在网络安全和大数据领域(如 Hadoop、Kafka、HBase),Kerberos 是一种基于对称密钥密码学的网络身份认证协议。
它的核心设计理念是:“在不安全的网络中,通过第三方可信机构,安全地证明‘你是谁’。”
1. Kerberos 的三大核心角色
Kerberos 的名字源于希腊神话中守护地狱之门的“三头犬”,这正对应了它系统中的三个关键组成部分,统称为 KDC (Key Distribution Center):
-
AS (Authentication Service) - 身份认证服务:接收用户的登录请求,验证用户身份,并发放 TGT(Ticket Granting Ticket 票据授予票据)。
-
TGS (Ticket Granting Service) - 票据授予服务:凭借 TGT,为用户发放访问特定服务(如 Hive、HDFS)的 Service Ticket(服务票据)。
-
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 对时间极其敏感)。
验证步骤示例
一个完整的标准流程通常是这样的:
-
kinit -kt user.keytab user@EXAMPLE.COM(登录) -
klist(确认看到 Expires 时间是未来的某个点) -
hadoop fs -ls /(开始操作大数据组件)
Kerberos认证需要使用单独的数据库吗?
简单来说:是的,Kerberos 必须拥有一个数据库来存储数据,但它通常不需要你额外安装像 MySQL 或 Oracle 这样的外部数据库。
Kerberos 的核心组件 KDC(密钥分发中心)内置了专门的存储机制来管理用户信息。以下是详细的拆解:
1. 默认存储:内置数据库 (DB2/LDAP)
当你安装标准的 Kerberos(如 MIT Kerberos)时,它会自带一个基于文件的简单数据库(通常是基于 Berkeley DB 格式)。
-
存储内容: 它保存了所有的 Principal(主体,即用户或服务的名称)、对应的 Key(加密后的密码)、以及账户策略(如密码过期时间)。
-
管理方式: 你不能用 SQL 语句去查询它,必须使用 Kerberos 专用的管理工具,例如
kadmin或kadmin.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)时自动为你创建一个专用的数据库文件。

浙公网安备 33010602011771号