目录

什么是Kerberos

概述

Kerberos 是希腊神话的一个多头的地狱犬,守卫地狱之门。Kerberos 另一个解释是麻省理工学院实验室开发的第三方用户认证机制,并逐渐成为计算机系统的安全认证标准。

为什么 Hadoop 集群需要 Kerberos 呢?其原因是 Hadoop 的默认身份验证是信任你给的用户名,并确保整个集群中的每一台机器相信这一点。Hadoop 是为了存储 PB 甚至更多规模的海量数据,简单信任会给企业客户造成安全问题。引入 Kerberos,可以通过有效地验证用户的合法性。

简单而言,Kerberos 完成以下任务:

  1. 认证协议
  2. 使用票证 Ticket 进行身份验证
  3. 避免本地存储密码或网络发送
  4. 引入可信任的第三方

Kerberos 主要术语的意义如下:

  1. Principal:在 Kerberos 的身份。任何参与 Kerberos 身份验证协议的用户和服务都需要唯一标识。Principal 分为两类:用户 Principal 和服务 Principal。User principal name (UPN) 表示用户,Service principal name (SPN) 表示服务。
  2. Realm:认证管理域。Principal 被分配到特定的 Realm。Realm 建立了边界,这使得管理更容易。按照惯例,Realm 名称总是大写。
  3. Ticket 或 Ticket Granting Ticket (TGT):Ticket 票证是客户端呈现给服务器以证明其身份的真实性。Ticket 由认证服务器发行,并使用密钥进行加密,限制有限的使用时间
  4. Key Distribution Center (KDC):储存和分发 Ticket 的 Kerberos 认证服务器。KDC 是由三个部分组成: Kerberos 数据库。Kerberos 数据库中存储所有关于 Principal 和 Realm 的信息。在数据库中的Kerberos主体识别用的命名约定举例如下: alice@EXAMPLE.COM 是 UPN 用户标识,alice 的域是 EXAMPLE.COM。 bob/admin@EXAMPLE.COM 是UPN 用户标识,管理员 bob 的域是 EXAMPLE.COM。斜杠 / 分割开名字和角色。 hdfs/node1.example.com@EXAMPLE.COM 是 SPN 服务标识,hdfs 服务在主机 node1.example.com,域是 EXAMPLE.COM,斜杠 / 分割开名称和主机。 身份验证服务 Authentication Server (AS):负责发放票证授予票证 TGT 到客户端 票证授予服务 Ticket Granting Server (TGS):负责验证 TGT 和授予服务票证。

创建自己的Kerberos服务

首先要搭建 Kerberos 服务器,比如使用 MIT Kerberos Server bundled for Redhat、Heimdal Kerberos Server for SuSE 或者 IBM Tivoli Directory Server。这里使用 Redhat 服务器中带的 MIT Kerberos Server,通常称为 MIT Kerberos V5 或者简称 krb5

可以用一台独立服务器或者选择 Hadoop 集群的一个节点来安装 Kerberos 服务器 KDC,这里选择 IBM BigInsights 的第一个节点来安装Kerberos 服务器和客户端,主机名是 bi01.ibm.com,安装方法是:

1
yum install -y krb5-server krb5-libs krb5-auth-dialog krb5-workstation pam_krb5。

如果出现依赖包版本问题,可以先装 krb5-server,再装其他包。

修改 Kerberos 的配置文件 /etc/krb5.conf,一般只需要修改 [libdefaults].default_realm、[realms] 和 [domain_realm]。

[libdefaults] 包含一般默认的配置信息。default_realm 定义缺省的 Kerberos 认证管理域,在没有指定 Kerberos认证管理域时则使用 default_realm。比如这里把 default_realm 改为 IBM.COM。ticket_lifetime 规定 ticket 多长时间持续,缺省值为 24 小时。renew_lifetime 规定 ticket 可以续签而无需重新认证的时间,缺省是 7 天。ticket_lifetime 和 renew_lifetime 按照缺省值就可以,但由于 Hadoop 集群可能会有长时间的作业运行,在实际生产部署可以根据需要改成比较大的值。

[realms] 列出了 Kerberos 的所有认证管理域,KDC 和 ADMIN_SERVER 的配置告诉哪个服务器分别运行 KDC 和 kadmin 的服务。比如这里改成 KDC 安装节点 bi01.ibm.com。

[domain_realm] 映射 DNS 名称和 Kerberos认证管理域。第一个条目修改为把 ibm.com 的所有主机映射到 IBM.COM 认证管理域。第二项个条目修改为 ibm.com 本身映射到 IBM.COM 认证管理域。如果未找到匹配的条目,客户端将尝试使用 DNS 名称的域部分(全部转换为大写)作为Kerberos认证管理域名。

清单1-Kerberos配置文件krb5.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log
 
[libdefaults]
 default_realm = IBM.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 
[realms]
 IBM.COM = {
  kdc = bi01.ibm.com
  admin_server = bi01.ibm.com
 }
 
[domain_realm]
 .ibm.com = IBM.COM
 ibm.com = IBM.COM

创建 Kerberos 数据库的命令是 kdb5_util create -s,需要指定 KDC database master key。

修改 /var/kerberos/krb5kdc/kadm5.acl,这是用于控制哪些用户有特权访问管理 Kerberos 数据库。这里修改为 IBM.COM 认证管理域 admin/admin 的身份可执行任何管理操作。

清单2-Kerberos配置文件kadm5.acl

1
admin/admin@IBM.COM     *

接下来可以使用 kadmin 工具来添加管理员 admin/admin,这里使用在当前服务器 bi01.ibm.com 运行 kadmin.local。

添加的命令是 addprinc,查看的命令是 getprinc,常用的还有删除 delprinc,列出所有 listprincs。

清单3-用kadmin工具添加管理员

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@bi01 ~]#kadmin.local
Authenticating as principal root/admin@IBM.COM with password.
kadmin.local: addprinc admin/admin@IBM.COM
WARNING: no policy specified for admin/admin@IBM.COM; defaulting to no policy
Enter password for principal "admin/admin@IBM.COM":
Re-enter password for principal "admin/admin@IBM.COM":
Principal "admin/admin@IBM.COM" created.
kadmin.local: getprinc admin/admin@IBM.COM
Principal: admin/admin@IBM.COM
Expiration date: [never]
Last password change: Thu Jun 30 16:50:00 CST 2016
Password expiration date: [none]
Maximum ticket life: 1 day 00:00:00
Maximum renewable life: 0 days 00:00:00
Last modified: Thu Jun 30 16:50:00 CST 2016 (root/admin@IBM.COM)
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 4
admin/admin@IBM.COM     *
Key: vno 1, aes256-cts-hmac-sha1-96, no salt
Key: vno 1, aes128-cts-hmac-sha1-96, no salt
Key: vno 1, des3-cbc-sha1, no salt
Key: vno 1, arcfour-hmac, no salt
MKey: vno 1
Attributes:
Policy: [none]

准备工作完成后就可以启动 Kerberos 服务 krb5kdc 和 kadmin,同时通过 chkconfig 命令设置 Kerberos 服务开机自动启动。

清单4-启动Kerberos服务

1
2
3
4
5
6
[root@bi01 ~]# /etc/rc.d/init.d/krb5kdc start
正在启动 Kerberos 5 KDC:                                  [确定]
[root@bi01 ~]# /etc/rc.d/init.d/kadmin start
正在启动 Kerberos 5 Admin Server:                         [确定]
[root@bi01 ~]# chkconfig krb5kdc on
[root@bi01 ~]# chkconfig kadmin on

kinit 工具允许用户显式地标识 Principal 进行验证,这里使用管理员 admin/admin 进行身份验证。klist 工具可以查看验证后的 Kerberos 认证信息。

清单5-验证Kerberos服务

1
2
3
4
5
6
7
8
[root@bi01 ~]# kinit admin/admin@IBM.COM
Password for admin/admin@IBM.COM:
[root@bi01 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/admin@IBM.COM
Valid starting     Expires            Service principal
06/30/16 17:29:15  07/01/16 17:29:15  krbtgt/IBM.COM@IBM.COM
    renew until 06/30/16 17:29:15

Hadoop 集群的其他节点需要安装 Kerberos 客户端,假设是 IBM BigInsights 的六个节点集群,bi01.ibm.com 已经安装了 Kerberos 服务器和客户端,则 bi02.ibm.com 到 bi06.ibm.com 的其他五个节点都还需要安装 Kerberos 客户端,安装方法是:

1
yum install -y krb5-workstation krb5-libs pam_krb5

如果出现依赖包版本问题,可以先装 krb5-workstation,再装其他包。

警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。