KDC服务安装及配置

1 Kerberos介绍

Kerberos这一名词来源于希腊神话“三个头的狗——地狱之门守护者”。

系统设计上采用客户端/服务器结构与DES加密技术,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。可以用于防止窃听、防止replay攻击、保护数据完整性等场合,是一种应用对称密钥体制进行密钥管理的系统。

支持SSO(Single Sign On),用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务。

由于在每个Client和Service之间建立了共享密钥,使得该协议具有相当的安全性。

2 认证原理解析

2.1 准备阶段

先看下图:

这里出现的角色有三个分别是:

其中KDC有两个服务:

密钥两个:

2.2 认证过程

第一步: 用户发送自己的用户信息给KDC,KDC访问AS服务,获得TGT,并用密钥A加密TGT以及一个Session Key给用户。用户得到加密数据后,使用密钥A解密得到TGT和Session Key(这里简称为SK)。

其中,TGT用于第二步请求各种服务的tickets;SK主要用于Service对Client的身份鉴别,在步骤二中会体现。

第二步: 如图:

  1. Client将之前获得TGT和要请求的服务信息(服务名等)发送给KDC,认证用户合法后,KDC中的TGS将SK(第一步中产生)和用户名,用户地址(IP),服务名,有效期, 时间戳一起包装成一个Ticket,并用密钥B加密,发送给Client;
  2. 此时Client没有密钥B所以他无法查看Ticket中的内容,于是Client将Ticket直接转发给Service。
  3. 同时Client将自己的用户名,用户地址(IP)打包成Authenticator,用之前获得的SK加密也发送给Service。
  4. Service 收到Ticket后利用它与KDC之间的密钥B将Ticket中的信息解密出来,从而获得SK和用户名,用户地址(IP),服务名,有效期。然后再用SK将Authenticator解密从而获得用户名,用户地址(IP)将其与之前Ticket中解密出来的用户名,用户地址(IP)做比较,从而验证Client的身份。
  5. 如果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 <<EOF
*/admin@TONGDUN.COM    *
EOF

其中TONGDUN.COM为之前配置的域名

3.3 /usr/local/krb5/var/krb5kdc/kdc.conf配置

cat > /usr/local/krb5/var/krb5kdc/kdc.conf <<EOF
[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