目录
什么是 Kerberos
Kerberos 是一种广泛应用于计算机网络中的身份认证协议,它基于对称密钥加密思想,核心目标是在不安全的网络中实现安全的身份验证。
Kerberos 由麻省理工学院(MIT)发明,广泛用于企业局域网、云服务、大数据平台等多种场合。
Kerberos 原理解析
Kerberos 通过 可信第三方(KDC) 实现身份认证,全程不会在网络上传输明文密码。其核心优势体现在:
- 基于对称密钥加密(如 AES,DES)
- 身份认证 & 授权票据分离
- 引入时间戳防止重放攻击
- 支持单点登录(SSO)
主要组件说明
角色 | 说明 |
---|---|
用户/客户端 | 需要登录和访问服务的用户/主机 |
服务端 | 提供资源的服务器,如 HTTP、HDFS、邮箱等 |
认证服务器(AS) | 验证用户身份,分发初始票据 TGT(Ticket Granting Ticket) |
票据授权服务器(TGS) | 分发服务访问票据(Service Ticket) |
KDC | 密钥发布中心,包括 AS 和 TGS |
Kerberos 认证完整流程
1. 用户认证(AS 阶段)
- 客户端向 AS 发送用户名
- AS 查询数据库,返回:
- 票据授权票(TGT,KDC 私钥加密,只有 TGS 能解)
- 会话密钥(用用户密码加密,只有用户能解开)
2. 获取服务票据(TGS 阶段)
- 客户端用解开的 Session Key 生成Authenticator(含时间戳)
- 用 TGT + Authenticator 申请服务票据
- TGS 校验,返回:
- 服务票据(Service Ticket,服务端密钥加密,只能服务端解开)
- 新会话密钥(用户和服务端通信用)
3. 服务访问(服务端阶段)
- 客户端向服务端提交 Service Ticket + Authenticator
- 服务端用自己的密钥解开 Service Ticket,校验 Authenticator
- 双向认证可选:服务端用新的 Session Key 返回带时间戳的数据,证明身份
时序交互图
安全机制说明:
密码只在本地使用,从未通过网络传输;会话密钥和票据时效性控制,结合时间戳阻止重放攻击。
Kerberos 应用场景
场景 | 说明 |
---|---|
企业统一认证 | Window 域登录、Linux 集成认证 |
大数据平台安全 | Hadoop、Hive、Spark 集群 |
邮件/文件/数据库服务 | MS Exchange、FTP、PostgreSQL等服务认证 |
单点登录(SSO) | Web站点、OA等内部资源 |
校园/科研集群 | 多终端共享账户,实现安全统一登录 |
Kerberos 案例详解:在 Hadoop/HDFS 中实现 Kerberos 认证
案例背景
某企业拥有一套 Hadoop 集群,为提升数据安全性,决定集成 Kerberos 实现集群级的统一认证和权限控制。
目标:
- 所有客户端与 HDFS 通信时,必须经过 Kerberos 认证。
- 无 Kerberos 票据则无法访问集群数据。
1. 各组件角色与分布
KDC(Key Distribution Center)
- 认证服务器/票据服务器。所有集群主机都“信任”KDC
- 包含 AS(Authentication Service)和 TGS(Ticket Granting Service)
客户端(Client)用户主机
- 运行 Hadoop 命令的终端,比如你自己的笔记本、堡垒机或业务应用服务器
Hadoop 集群中的主机节点
- NameNode:管理 HDFS 元数据
- DataNode:存储具体文件块
- 每台节点都需配置属于自己的服务 Principal 和 keytab
2. Hadoop Kerberos 认证分层系统架构
流程解读
- [1] 客户端用
kinit
先向 KDC-认证服务(AS)请求 TGT(认证票据)。 - [2] AS 返回加密的 TGT 和用于本次会话的密钥。
- [3] 客户端用 TGT 向 KDC-票据授权服务(TGS)请求目标服务(如 HDFS)的服务票据。
- [4] TGS 返回目标服务(如 NameNode/DataNode)的服务票据。
- [5] 客户端带着服务票据去访问 NameNode。
- [6] NameNode 验证服务票据,授权并返回数据。
- [7】【8] 访问 DataNode 时,流程类似(用服务票据请求,DataNode 验证,返回数据块)。
注
- 所有票据都必须向 KDC 申请,任何服务端只认可 KDC 票据。
- 带序号顺序后,整个系统认证-授权的“闭环”流程清晰可见。
3. 架构分层与关系解释
认证信任链条:
- KDC 是唯一分发有效认证票据的“根信任”,所有 Hadoop 服务节点(NameNode/DataNode)都以 keytab 文件方式完成与 KDC 的私钥验证。
- 用户要访问 HDFS 资源,必须先向 KDC 认证拿到“TGT”和“服务票据”,服务端凭票据判断请求者身份。
数据访问路径:
- 用户(Client)本地执行
kinit
身份认证,拿 TGT(临时凭证)。 - 再用 TGT 向 KDC 申请“目标服务(如 hdfs/hadoop01.example.com)”的访问票据。
- 拿到服务票据后,访问 NameNode 或 DataNode;每次访问时都携带服务票据及认证信息在网络上传递。
- NameNode/DataNode 用自有 keytab 解密服务票据,成功即认可客户端“身份”,授权 HDFS 操作。
- 用户(Client)本地执行
高可用与安全性说明:
- 每个服务节点均需自己独立的 principal(如 hdfs/hadoop01.example.com)、专用 keytab。
- KDC 推荐主备容灾,防单点故障。
- 所有 ticket/keytab 不能暴露在不安全环境,否则会被伪造身份。
4. 结构图小结一览
模块 | 主要作用 | 持有密钥/票据 | 备注 |
---|---|---|---|
KDC(AS/TGS) | 身份认证&签发票据 | 用户密码、服务密钥 | 单点容灾建议、重点保护 |
NameNode | HDFS元数据管控服务 | 服务 keytab、服务票据 | |
DataNode | 负责数据块存储 | 服务 keytab、服务票据 | |
客户端 | 数据访问发起方 | 用户票据TGT、服务票据 | 在有效期内免密通行 |
5. 业务流程口语化图例
- 用户终端向 KDC 认证,获得通行证(TGT)
- 用户向 KDC 请求具体目标服务的访问门票(Service Ticket)
- 拿着门票找 NameNode/DataNode,换来访问数据的许可
- NameNode/DataNode 校验门票和持有人身份,同意/拒绝请求
这个架构分类清楚展示:Kerberos 只是安全认证的“守门人”和“裁判”,所有 Hadoop 节点及用户都要统一接受它的“监督”,最后凭“票据”通行。
安装部署
步骤一:Kerberos 环境准备
- 部署 Kerberos 服务
- 通常使用 MIT Kerberos,部署 KDC(含 AS 和 TGS)。
- 添加 Hadoop 服务主体
sudo kadmin.local -q "addprinc -randkey hdfs/hadoop01.example.com@EXAMPLE.COM"
- 生成服务 Keytab 文件,分发给 NameNode 和 DataNode
sudo kadmin.local -q "xst -k /etc/security/keytabs/hdfs.keytab hdfs/hadoop01.example.com@EXAMPLE.COM" # 拷贝 hdfs.keytab 到 HDFS 各主机相应目录
步骤二:客户端配置
Hadoop core-site.xml 配置 Kerberos 认证
<property> <name>hadoop.security.authentication</name> <value>kerberos</value> </property> <property> <name>hadoop.security.authorization</name> <value>true</value> </property>
HDFS-site.xml 配置 NameNode/DataNode 服务 principal
<property> <name>dfs.namenode.kerberos.principal</name> <value>hdfs/_HOST@EXAMPLE.COM</value> </property> <property> <name>dfs.namenode.keytab.file</name> <value>/etc/security/keytabs/hdfs.keytab</value> </property> <property> <name>dfs.datanode.kerberos.principal</name> <value>hdfs/_HOST@EXAMPLE.COM</value> </property> <property> <name>dfs.datanode.keytab.file</name> <value>/etc/security/keytabs/hdfs.keytab</value> </property>
用户获取认证票据
kinit hadoopuser@EXAMPLE.COM # 会提示输入密码,成功后获得 Kerberos 票据
查看已获取票据
klist
步骤三:Kerberos 认证流程场景操作
1. 客户端登录
- 用户在客户端执行
kinit
,输入密码,获取 TGT 票据。
2. 客户端访问 HDFS
- 用户执行
hdfs dfs -ls /
- Hadoop 客户端自动拿 TGT 向 KDC/TGS 请求 NameNode 服务票据;
- 获得服务票据后,发给 NameNode 完成认证。
3. NameNode 服务端认证
- NameNode 使用自己的 keytab 解密服务票据
- 验证 Authenticator,产生一次性 session key
4. 权限校验和文件列表展示
- 校验通过后,HDFS 返回 / 目录内容;
- 票据时效内,多次操作无需重复输入密码。
过程可视化时序图
常见问题与解决
- kinit 验证失败
- 检查时间同步(确保 NTP),密码正确,KDC 主机可达。
- 未配置 keytab 或 principal 错误
- 核对 hdfs.keytab 文件及 principal 设置一致。
- HDFS 访问提示没有票据
- 重新运行
kinit
获取新票据,或确认票据未超时。
- 重新运行
- 服务端报错无法认证
- 确认服务端 keytab 权限和路径、Kerberos 域名解析一致。
全流程小结
- 仅认证通过的用户和服务允许操作 Hadoop 文件系统;
- 网络不传递明文密码,极大提升数据安全;
- 多服务/多用户统一权限认证,实现真正的企业级安全管控。
最佳实践
- 部署 NTP 实现时间自动同步
- KDC 配置主从容灾/冗余
- 设定票据较短有效期,定期轮换密钥
- 服务权限配置最小化
- keytab 文件妥善保管、定期刷新
- 重要服务建议启用双向认证