Linux 7.9 部署 KDC 1.15.1
文档目录
- Linux 官方文档: RedHat Linux 7 - 使用 Kerberos
- Cloudera 公众号: Hadoop 实操 - 如何在 Redhat 7.4 的 CDH5.15 中启用 Kerberos
节点分配
主机名 | IP 地址 | 端口 | 系统版本 | KDC 版本 | KDC 角色 |
---|---|---|---|---|---|
cdh6-01 | 10.10.10.137 | 88 | CentOS 7.9 | 1.15.1 | Server/Client |
cdh6-02 | 10.10.10.138 | CentOS 7.9 | 1.15.1 | Client | |
cdh6-03 | 10.10.10.139 | CentOS 7.9 | 1.15.1 | Client |
Kerberos 概述
Kerberos 是一种身份验证协议,明显比基于密码的普通身份验证更加安全。借助 Kerberos,密码绝不会通过网络发送,即使在其它计算机上访问服务也是如此。同时,它也提供了一种机制,允许用户和计算机向网络表明自己身份并接收对管理员配置的区域和服务进行定义的有限访问权限。Kerberos 通过验证其身份来验证实体,Kerberos 还可保护此数据的身份验证,使其不能被外部人员访问和使用
Kerberos 使用对称密钥加密要验证用户到网络服务的身份验证,这意味着密码实际上不会通过网络发送。因此,当用户使用 Kerberos 向网络服务进行身份验证时,试图通过监控网络流量来收集密码的未授权用户实际上会被阻止。最终,消除了网络上未加密密码的传输,并消除了攻击者窃听网络的潜在威胁
Kerberos 工作流程
- 用户在终端上使用 kinit 命令请求认证:
kinit -kt admin.keytab admin@EXAMPLE.COM
- 用户使用
admin.keytab
文件中的密钥进行身份验证,并指定要认证的主体为admin@EXAMPLE.COM
- KDC(Key Distribution Center) 验证请求:KDC 收到用户的认证请求后,首先验证用户的身份和密钥。它检查
admin@EXAMPLE.COM
是否存在,并且检查用户提供的密钥是否与admin.keytab
中的密钥匹配 - 发放 TGT(Ticket Granting Ticket):如果身份验证成功,KDC 为用户生成一个 TGT。TGT 包含用户的身份信息和一个用于进一步认证的密钥(若 keytab 中包含多个主体,则密钥对应所有已包含主体),称为 TGT Key(Ticket Granting Ticket Key)
- 返回 TGT:KDC 返回 TGT 给用户
- 用户获取服务票据:用户拥有了 TGT 后,可以使用它来请求特定服务的服务票据。用户希望访问的每个服务都需要一个服务票据
- 用户请求服务票据:用户向 KDC 发送服务票据请求,请求包括用户的 TGT 和要访问的服务的标识
- KDC 发放服务票据:KDC 收到服务票据请求后,验证用户的 TGT 和请求的服务标识。如果验证通过,KDC 将为用户生成一个服务票据。服务票据包含用户的身份信息和用于与服务进行通信的密钥
- 返回服务票据:KDC 返回服务票据给用户
- 用户访问服务:用户拥有了服务票据后,就可以向服务发出请求,并附上服务票据。服务收到请求后,使用服务票据中的密钥来验证用户的身份和票据的有效性。如果验证通过,服务就会提供所请求的服务
- 用户注销:当用户不再需要服务时,可以通过
kdestroy
命令销毁 TGT,并在不再需要服务票据时使用 kdestroy 销毁它们
主体概述
在 Kerberos 中,主体(Principal)是用于标识特定实体的名称,可以是用户、服务、主机等。主体的格式通常遵循一定的命名约定,包含了实体的身份信息以及所属的域(Realm)。主体的格式如下:
</identity/>/</instance/>@</REALM/>
<identity>
:标识实体的身份信息,可以是用户名、服务名、主机名等<instance>
(可选):实体的实例信息,通常用于区分同一身份下的不同实例,例如用户的角色、服务的名称等。如果不需要实例信息,可以省略该部分<REALM>
:Kerberos 域名,表示主体所属的安全域
主要功能
- 身份标识: 主体用于唯一标识特定的实体,例如用户、服务或主机等
- 身份验证: 主体用于进行 Kerberos 身份验证,用户或服务可以通过其主体进行身份验证,获取相应的票据(Ticket)来访问受保护的资源
- 授权: 主体可以与特定的权限或策略相关联,用于控制对资源的访问权限。Kerberos 根据主体的身份和权限颁发相应的票据,以授权用户或服务对受保护资源的访问
- 服务标识: 对于服务主体,主体用于唯一标识特定的服务或资源,用户可以通过服务主体来请求服务票据,从而访问相应的服务
- 管理和控制: 主体可以由管理员进行管理和控制,包括创建、删除、修改密钥等操作,以维护系统的安全性和完整性
常见主体
- 用户主体(User Principal):
- 用途:代表系统中的用户身份
- 样例:
alice@EXAMPLE.COM
、bob@EXAMPLE.COM
、test@EXAMPLE.COM
- 服务主体(Service Principal):
- 用途:代表系统中的服务或资源
- 样例:
- HTTP 服务:
HTTP/server.example.com@EXAMPLE.COM
- FTP 服务:
FTP/server.example.com@EXAMPLE.COM
- SSH 服务:
host/server.example.com@EXAMPLE.COM
- Hadoop 服务:
hive/node1@EXAMPLE.COM
、hdfs/node2@EXAMPLE.COM
- 数据库服务:
mysql/db.example.com@EXAMPLE.COM
、postgres/db.example.com@EXAMPLE.COM
- HTTP 服务:
- 主机主体(Host Principal):
- 用途:代表系统中的主机或服务器
- 样例:
host/server.example.com@EXAMPLE.COM
、host/client.example.com@EXAMPLE.COM
- 管理员主体(Admin Principal):
- 用途:代表系统管理员身份,用于管理 Kerberos 服务器
- 样例:
admin/administrator@EXAMPLE.COM
- 托管服务主体(Managed Service Principal):
- 用途:由 Kerberos 系统管理的服务主体,通常是为特定服务生成的主体
- 样例:
krbtgt/EXAMPLE.COM@EXAMPLE.COM
(用于 TGT 的服务主体)
- 委派主体(Proxy Principal):
- 用途:代表需要进行委派身份验证的服务。
- 样例:
HTTP/server.example.com@EXAMPLE.COM/proxy
、hdfs/node1@EXAMPLE.COM/proxy
用户主体访问服务主体
- 用户在终端上使用 kinit 命令进行认证:
kinit -kt admin.keytab admin@EXAMPLE.COM
- 用户使用 admin.keytab 文件中的密钥进行身份验证,并指定要认证的主体为
admin@EXAMPLE.COM
- 用户通过 Kerberos KDC 进行身份验证,获取了用户主体
test@EXAMPLE.COM
的 TGT - 请求服务票据: 用户想要访问
hive/node1@EXAMPLE.COM
主体,需要向 KDC 请求相应的服务票据 - 发送服务票据请求: 用户向 KDC 发送服务票据请求,请求包括用户的 TGT 和要访问的服务主体的名称
- KDC 验证请求: KDC 收到用户的服务票据请求后,首先验证用户的 TGT 和请求的服务主体的名称
- 服务主体验证: KDC 确认用户已通过认证,且请求的服务主体
hive/node1@EXAMPLE.COM
是存在的 - 发放服务票据: 验证通过后,KDC 生成一个服务票据,包含了用户主体
test@EXAMPLE.COM
的身份信息和用于与服务hive/node1@EXAMPLE.COM
进行通信的密钥 - 返回服务票据: KDC 返回服务票据给用户
- 访问服务: 用户收到服务票据后,可以使用它来访问服务主体
hive/node1@EXAMPLE.COM
。用户将服务票据发送给服务主体hive/node1@EXAMPLE.COM
,服务主体使用票据中的密钥来验证用户的身份和票据的有效性。如果验证通过,服务就会提供所请求的服务,例如允许用户访问 Hive 服务节点 node1 - 完成访问: 用户成功访问了 Hive 服务节点 node1,可以执行相应的操作,例如查询数据库
安装 KDC Server 和 Client
由于本文档所安装的 KDC 为 Linux 所提供,所以在安装之前,请确保系统 yum 源能够正常访问
- 按节点分配,请在 cdh6-01 节点上完成如下操作:
yum install krb5-server krb5-libs krb5-workstation -y
- 按节点分配,请在 cdh6-02 和 cdh6-03 节点上完成如下操作:
yum install krb5-libs krb5-workstation -y
配置 KDC Server
- 按节点分配,请在 cdh6-01 节点上完成如下操作:
1. 备份配置文件
cp /etc/krb5.conf /etc/krb5.conf.orig
cp /var/kerberos/krb5kdc/kadm5.acl /var/kerberos/krb5kdc/kadm5.acl.orig
cp /var/kerberos/krb5kdc/kdc.conf /var/kerberos/krb5kdc/kdc.conf.orig
2. 修改配置文件
- /etc/krb5.conf
cat > /etc/krb5.conf << EOF
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
default_realm = CDHKRB.COM
[realms]
# 此域名需与上述 default_realm 保持一致
CDHKRB.COM = {
kdc = 10.10.10.137
admin_server = 10.10.10.137
}
[domain_realm]
.cdhkrb.com = CDHKRB.COM
cdhkrb.com = CDHKRB.COM
EOF
- /var/kerberos/krb5kdc/kadm5.acl
cat > /var/kerberos/krb5kdc/kadm5.acl << EOF
# 此域名需与 /etc/krb5.conf 中 default_realm 保持一致
*/admin@CDHKRB.COM *
EOF
- /var/kerberos/krb5kdc/kdc.conf
cat > /var/kerberos/krb5kdc/kdc.conf << EOF
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
# 此域名需与 /etc/krb5.conf 中 default_realm 保持一致
CDHKRB.COM = {
max_renewable_life= 7d 0h 0m 0s
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
EOF
3. 创建 Kerberos 数据库
在创建数据库的过程中,需要输入数据库的管理员账户密码
此文档中的密码都设置为:Passw0rd!
kdb5_util create –r CDHKRB.COM -s
启动 KDC Server
- 按节点分配,请在 cdh6-01 节点上完成如下操作:
systemctl enable krb5kdc --now
systemctl enable kadmin --now
配置 KDC Client
1. 备份配置文件
- 按节点分配,请在 cdh6-02 和 cdh6-03 节点上完成如下操作:
cp /etc/krb5.conf /etc/krb5.conf.orig
2. 分发配置至 KDC Client
- 按节点分配,请在 cdh6-01 节点上完成如下操作:
scp /etc/krb5.conf root@cdh6-02:/etc/krb5.conf
scp /etc/krb5.conf root@cdh6-03:/etc/krb5.conf
测试 KDC Server
1. 创建管理员用户主体
- 如下操作在 KDC Server 节点进行,所以可直接登录 KDC Server
# 登录 KDC Server
kadmin.local
# 创建管理员用户主体
# 需输入密码
addprinc admin/admin@CDHKRB.COM
2. 验证新建用户
- 在 cdh6-02 节点上进行如下操作:
# 需输入密码
kinit admin/admin@CDHKRB.COM
# 查看当前认证状态
klist
# 输出结果
# 默认主体为指定 admin/admin@CDHKRB.COM
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/admin@CDHKRB.COM
Valid starting Expires Service principal
03/08/2024 10:09:28 03/09/2024 10:09:28 krbtgt/CDHKRB.COM@CDHKRB.COM
renew until 03/15/2024 10:09:28