Kerberos 深入详解:原理、认证流程与应用场景

发布于:2025-06-29 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录


什么是 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 返回带时间戳的数据,证明身份

时序交互图

用户/客户端 认证服务器(AS) 授权票据服务器(TGS) 服务端 1. 提交用户名,请求TGT 2. 返回加密TGT和session key 3. 用TGT和Authenticator请求服务票据 4. 返回服务票据和服务Session Key 5. 用服务票据和Authenticator访问服务 6. 可选:认证通过(双向认证) 用户/客户端 认证服务器(AS) 授权票据服务器(TGS) 服务端

安全机制说明:
密码只在本地使用,从未通过网络传输;会话密钥和票据时效性控制,结合时间戳阻止重放攻击。


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 认证分层系统架构

Hadoop 集群
Kerberos 认证中心(KDC服务器)
[1] 用户kinit:请求TGT
[2] 返回TGT和会话密钥
[3] 用户用TGT请求服务票据
[4] 返回HDFS服务票据
[5] 携服务票据请求NameNode
[6] 校验通过,授权/返回数据
[7] 携服务票据请求DataNode
[8] 校验、返回数据块
数据同步/心跳
数据同步/心跳
配置hadoop conf
配置hadoop conf
配置hadoop conf
NameNode
(元数据服务)
DataNode1
DataNode2
AS
认证服务
TGS
票据授权服务
客户端(用户终端)

流程解读

  1. [1] 客户端用 kinit 先向 KDC-认证服务(AS)请求 TGT(认证票据)。
  2. [2] AS 返回加密的 TGT 和用于本次会话的密钥。
  3. [3] 客户端用 TGT 向 KDC-票据授权服务(TGS)请求目标服务(如 HDFS)的服务票据。
  4. [4] TGS 返回目标服务(如 NameNode/DataNode)的服务票据。
  5. [5] 客户端带着服务票据去访问 NameNode。
  6. [6] NameNode 验证服务票据,授权并返回数据。
  7. [7】【8] 访问 DataNode 时,流程类似(用服务票据请求,DataNode 验证,返回数据块)。
  • 所有票据都必须向 KDC 申请,任何服务端只认可 KDC 票据。
  • 带序号顺序后,整个系统认证-授权的“闭环”流程清晰可见。

3. 架构分层与关系解释

  • 认证信任链条:

    • KDC 是唯一分发有效认证票据的“根信任”,所有 Hadoop 服务节点(NameNode/DataNode)都以 keytab 文件方式完成与 KDC 的私钥验证。
    • 用户要访问 HDFS 资源,必须先向 KDC 认证拿到“TGT”和“服务票据”,服务端凭票据判断请求者身份。
  • 数据访问路径:

    1. 用户(Client)本地执行 kinit 身份认证,拿 TGT(临时凭证)。
    2. 再用 TGT 向 KDC 申请“目标服务(如 hdfs/hadoop01.example.com)”的访问票据。
    3. 拿到服务票据后,访问 NameNode 或 DataNode;每次访问时都携带服务票据及认证信息在网络上传递。
    4. NameNode/DataNode 用自有 keytab 解密服务票据,成功即认可客户端“身份”,授权 HDFS 操作。
  • 高可用与安全性说明:

    • 每个服务节点均需自己独立的 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 环境准备

  1. 部署 Kerberos 服务
    • 通常使用 MIT Kerberos,部署 KDC(含 AS 和 TGS)。
  2. 添加 Hadoop 服务主体
    sudo kadmin.local -q "addprinc -randkey hdfs/hadoop01.example.com@EXAMPLE.COM"
    
  3. 生成服务 Keytab 文件,分发给 NameNode 和 DataNode
    sudo kadmin.local -q "xst -k /etc/security/keytabs/hdfs.keytab hdfs/hadoop01.example.com@EXAMPLE.COM"
    # 拷贝 hdfs.keytab 到 HDFS 各主机相应目录
    

步骤二:客户端配置

  1. 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>
    
  2. 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>
    
  3. 用户获取认证票据

    kinit hadoopuser@EXAMPLE.COM
    # 会提示输入密码,成功后获得 Kerberos 票据
    
  4. 查看已获取票据

    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 返回 / 目录内容;
  • 票据时效内,多次操作无需重复输入密码。

过程可视化时序图
客户端(用户) KDC (AS/TGS) NameNode kinit (用户名/密码) 请求 TGT 返回 TGT 和 Session Key TGT + Authenticator,申请 NameNode 服务票据 返回 NameNode 服务票据 提交服务票据和 Authenticator 验证成功,返回文件列表内容 客户端(用户) KDC (AS/TGS) NameNode

常见问题与解决
  1. kinit 验证失败
    • 检查时间同步(确保 NTP),密码正确,KDC 主机可达。
  2. 未配置 keytab 或 principal 错误
    • 核对 hdfs.keytab 文件及 principal 设置一致。
  3. HDFS 访问提示没有票据
    • 重新运行 kinit 获取新票据,或确认票据未超时。
  4. 服务端报错无法认证
    • 确认服务端 keytab 权限和路径、Kerberos 域名解析一致。

全流程小结
  • 认证通过的用户和服务允许操作 Hadoop 文件系统;
  • 网络不传递明文密码,极大提升数据安全;
  • 多服务/多用户统一权限认证,实现真正的企业级安全管控。

最佳实践
  • 部署 NTP 实现时间自动同步
  • KDC 配置主从容灾/冗余
  • 设定票据较短有效期,定期轮换密钥
  • 服务权限配置最小化
  • keytab 文件妥善保管、定期刷新
  • 重要服务建议启用双向认证

参考资料

网站公告

今日签到

点亮在社区的每一天
去签到