1 Kerberos 介绍
Kerberos 这一名词来源于希腊神话 “三个头的狗——地狱之门守护者”。
系统设计上采用客户端/服务器结构与DES 加密技术,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。可以用于防止窃听、防止 replay 攻击、保护数据完整性等场合,是一种应用对称密钥体制进行密钥管理的系统。
支持 SSO(Single Sign On),用户只需输入一次身份验证信息就可以凭借此验证获得的票据 (ticket-granting ticket) 访问多个服务。
由于在每个 Client 和 Service 之间建立了共享密钥,使得该协议具有相当的安全性。
2 认证原理解析
2.1 准备阶段
先看下图:
这里出现的角色有三个分别是:
KDC(Key Distribution Center)
Client
Service
其中 KDC 有两个服务:
AS (Authentication Server): 认证服务,用于签发 “Ticket-Granting Tickets” (TGT)
TGS(Ticket Granting Server): 许可证服务,用于签发 service tickets(各种服务的 tickets)
密钥两个:
KDC 与 Client 之间的共享密钥(密钥 A,其实就是用户密码)
KDC 与 Service 之间的共享密钥 (密钥 B)
2.2 认证过程
第一步:
用户发送自己的用户信息给 KDC,KDC 访问 AS 服务,获得 TGT,并用密钥 A 加密 TGT 以及一个 Session Key 给用户。用户得到加密数据后,使用密钥 A 解密得到 TGT 和 Session Key(这里简称为 SK)。
其中,TGT 用于第二步请求各种服务的 tickets;SK 主要用于 Service 对 Client 的身份鉴别,在步骤二中会体现。
第二步:
如图:
Client 将之前获得 TGT 和要请求的服务信息 (服务名等) 发送给 KDC,认证用户合法后,KDC 中的 TGS 将 SK(第一步中产生) 和用户名,用户地址(IP),服务名,有效期, 时间戳一起包装成一个 Ticket,并用密钥 B 加密,发送给 Client;
此时 Client 没有密钥 B 所以他无法查看 Ticket 中的内容,于是 Client 将 Ticket 直接转发给 Service。
同时 Client 将自己的用户名,用户地址(IP)打包成 Authenticator,用之前获得的 SK 加密也发送给 Service。
Service 收到 Ticket 后利用它与 KDC 之间的密钥 B 将 Ticket 中的信息解密出来,从而获得 SK 和用户名,用户地址(IP),服务名,有效期。然后再用 SK 将 Authenticator 解密从而获得用户名,用户地址(IP)将其与之前 Ticket 中解密出来的用户名,用户地址(IP)做比较,从而验证 Client 的身份。
如果 Service 有返回结果,将其返回给 Client。
2 KDC 安装
本文档中将 KDC 服务安装在 Cloudera Manager Server 所在服务器上(KDC 服务可根据自己需要安装在其他服务器)
测试环境测试时,kdc 安装在 dp199 机器上,cdh 在 dp197 上。
2.1 在 Cloudera Manager 服务器上安装 KDC 服务(可以在别的机器上装 kdc)
2.1.1 直接安装
[root@ip-172-31-6-148~]# yum -y --installroot=/usr/local install krb5-server krb5-libs krb5-auth-dialog krb5-workstation
2.1.2 源码安装
目前依赖的包都在 10.57.30.218 下。
cd /root/kdc/src
wget http://10.57.30.218:1080/downloads/gcc/gcc-c++.tar.gz
wget http://10.57.30.218:1080/downloads/krb5/byacc.tar.gz
wget http://10.57.30.218:1080/downloads/krb5/krb5-1.17.tar.gz
cd gcc
tar zxvf gcc-c++.tar.gz
cd gcc-c++
yum -y install *
tar zxf perl-5.30.0.tar.gz
cd perl-5.30.0
./Configure
#一路回车
make && make install
cd byacc-20190617
./configure --prefix=/usr/local/byacc
make && make install
cd krb5-1.17/src
./configure --prefix=/usr/local/krb5
make && make install
2.2 环境变量添加
ln -s /usr/local/byacc/bin/yacc /usr/local/bin/yacc
cat >> /etc/profile << EOF
KDC_HOME=/usr/local/krb5
PATH=$PATH:$KDC_HOME/bin:$KDC_HOME/sbin
EOF
source /etc/profile
3 KDC 配置
3.1 /etc/krb5.conf 配置
cat > /etc/krb5.conf << EOF
# Configuration snippets may be placed in this directory as well
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]
default_realm = TONGDUN.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
# pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
# default_realm = EXAMPLE.COM
# default_ccache_name = KEYRING:persistent:%{uid}
[realms]
TONGDUN.COM = {
kdc = k8s-01
admin_server = k8s-01
}
[domain_realm]
.k8s-01 = TONGDUN.COM
k8s-01= TONGDUN.COM
EOF
k8s-01 为主机别名,根据情况修改
TONGDUN.COM 为域名,统一
default_ccache_name 一定要屏蔽掉,否则会报错。
3.2 修改/usr/local/krb5/var/krb5kdc/kadm5.acl 配置
cat > /usr/local/krb5/var/krb5kdc/kadm5.acl <
*/admin@TONGDUN.COM *
EOF
其中 TONGDUN.COM 为之前配置的域名
3.3 /usr/local/krb5/var/krb5kdc/kdc.conf 配置
cat > /usr/local/krb5/var/krb5kdc/kdc.conf <
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
TONGDUN.COM= {
#master_key_type = aes256-cts
master_key_type = aes256-cts
max_life = 1d 0h 0m 0s
max_renewable_life= 900d 0h 0m 0s
acl_file = /usr/local/krb5/var/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /usr/local/krb5/var/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
EOF
3.4 krb5kdc 启动
[root@k8s-01 krb5kdc]# krb5kdc
3.5 kadmind 启动
[root@k8s-01 krb5kdc]# kadmind
4 创建 Kerberos 数据库
kdb5_util create –r TONGDUN.COM -s
此处需要输入 Kerberos 数据库的密码,测试中密码输入为 admin
5 创建 Kerberos 的管理账号
[root@k8s-01 src]# kadmin.local
Authenticating as principal root/admin@TONGDUN.COM with password.
kadmin.local: addprinc admin/admin@TONGDUN.COM
WARNING: no policy specified for admin/admin@TONGDUN.COM; defaulting to no policy
Enter password for principal "admin/admin@TONGDUN.COM":
Re-enter password for principal "admin/admin@TONGDUN.COM":
Principal "admin/admin@TONGDUN.COM" created.
kadmin.local: exit
[root@k8s-01 src]#
此处 admin/admin@TONGDUN.COM 为管理员账号,需要输入密码,测试中使用 admin 作为密码。
6 测试 Kerberos 的管理员账号
[root@k8s-01 krb5kdc]# kinit admin/admin@TONGDUN.COM
Password for admin/admin@TONGDUN.COM:
[root@k8s-01 krb5kdc]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/admin@TONGDUN.COM
Valid starting Expires Service principal
2019-07-25T14:34:33 2019-07-26T14:34:33 krbtgt/TONGDUN.COM@TONGDUN.COM
renew until 2019-07-25T14:34:33
7 kdc 日志查看
kdc 的日志有如下两个:
/var/log/kadmind.log
/var/log/krb5kdc.log
8 创建 princ 和 keytab 文件
创建自己输入密码的 princ:
addprinc admin/test@CY.TONGDUN.COM
创建随机密码的 princ:
addprinc -randkey admin/test@CY.TONGDUN.COM
创建 keytab(指定加密算法为 aes256):
ktadd -e aes256-cts:normal -k admintest1.keytab admin/test@CY.TONGDUN.COM