目录

6.3.1. 关于Kerberos身份验证

6.3.2. Kerberos协议原理

6.3.3. 配置Kerberos身份验证

6.3.4. 通过Kerberos身份验证连接Kingbase


6.3.1. 关于Kerberos身份验证

将Kingbase数据库用户信息集中存储在第三方的Kerberos服务器中,用于用户请求Kingbase服务器时对其身份合法性进行集中管理,如对访问系统的用户权限进行认证、授权、用户信息维护更新等。第三方数据库是一种应用于分布式网络环境, 以加密为基础, 对用户及网络连接进行认证的增强网络安全的服务;

6.3.2. Kerberos协议原理

Kerberos 协议包括两种服务器: 一个认证服务器, 一个或多个门票分配服务器(TGS)。其认证协议基本结构如下图所示。

kingbase schema设置 kingbase 模式_会话密钥

 

  1. 客户请求Kerberos 认证服务器发给接入Kerberos TGS (门票分配服务器) 的门票。请求以报文形式形成。
  2. 认证服务器在其数据库中查找客户实体,产生一个会话密钥, Kerberos 使用客户的秘密密钥对此会话密钥进行加密; 然后生成一TGT (门票分配许可证) , 该许可证包括客户实体名、地址、TGS 名、时间印记、时限、会话密钥等信息; 并用TGS 的秘密密钥(此密钥只有认证服务器和TGS 知道) 对TGT 进行加密; 认证服务器把这两个加密报文发还给客户。
  3. 客户将第一个报文解密得到会话密钥, 然后生成一个认证单, 包括客户实体名、地址及时间印记, 并用会话密钥对认证单进行加密。然后, 向TGS 发出请求,
  4. 申请接入某一目标服务器的门票。此请求包括目标服务名称、收到Kerberos 发来的加过密的TGT 以及加密的认证单。
  5. TGS 用其秘密密钥对TGT 进行解密, 使用TGT 中的会话密钥对认证单进行解密。然后将认证单中的信息与TGT 中的信息进行比较。此时, TGS 产生新的会话密钥供客户实体与目标服务器使用, 利用客户实体和TGS 用的会话密钥将新的会话密钥加密; 还将新的会话密钥加入客户向该服务器提交的有效门票
  6. 之中, 门票中还包括客户实体名、网络地址、服务器名、时间印记、时限等, 并用目标服务器的秘密密钥将此门票加密; 然后将这两个报文发送给客户。
  7. 客户将接收到的报文解密后, 获得与目标服务器共用的会话密钥。这时, 客户制作一个新的认证单, 并用获得的会话密钥对该认证单进行加密。当请求进入访问目标服务器时, 将加密的认证单和从TGS 收到的门票一并发送给目标服务器。由于此认证单有会话密钥加密的明文信息, 从而证明发信人知道该密钥。
  8. 目标服务器对门票和认证单进行解密检查, 包括地址、时间印记、时限等。如果一切都核对无误, 服务器则知道了客户实体的身分, 并与之共享一个可用于他们之间秘密通信的加密密钥。

6.3.3. 配置Kerberos身份验证

6.3.3.1. 配置kerberos服务器

kerberos服务器的配置步骤如下:

  1. 修改/etc/hosts 文件;
  2. 配置/etc/krb5.conf 文件,如果没有该文件,则创建该文件;
  3. 生成kerberos的本地数据库 ;
  4. kdb5_util create -r EXAMPLE.COM;
  5. 启动kdc服务 查看是否成功;
  6. 使用kadmin.local管理程序配置 ;
  7. 为管理员账号admin/admin指定权限;
  8. 启动kadmind服务程序,查看是否成功启动;
  9. 增加测试服务;

下面通过一个示例,来演示配置过程:

  1. 修改/etc/hosts 文件(通过ifconifg命令查询服务器IP,例如:192.168.8.243)增加服务器ip信息:
192.168.8. 243   kerberos.example.com    kerberos
192.168.8. 243   kdc.example.com    kdc
 
修改完成之后,保证下边两条命令能够ping通过:
 
Ping kerberos.example.com
ping kdc.example.com
 
1. 配置/etc/krb5.conf文件
查找: realms 确认在[realms]内kdc,admin_server,default_domain的值如下所示:
[realms]
EXAMPLE.COM = {
kdc = kdc.example.com:88 admin_server = kerberos.example.com:749 default_domain = example.com
}
以下为文件的样本
 
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log
[libdefaults]
 default_realm = EXAMPLE.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 forwardable = yes
[realms]
 EXAMPLE.COM = {
  kdc = kerberos.example.com:88
  admin_server = kerberos.example.com:749
  default_domain = example.com
 }
[domain_realm]
 .example.com = EXAMPLE.COM
 example.com = EXAMPLE.COM
[kdc]
 profile = /usr/local/var/krb5kdc/kdc.conf
[appdefaults]
 pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
 }
 
1. 生成kerberos的本地数据库
kdb5_util create -r EXAMPLE.COM
(注意:记住KDC master的口令)
 
该命令将创建如下文件(缺省目录是: /var/kerberos/krb5kdc/)。这个命令用来生成kerberos的本地数据库principal,具体介绍如下:
• principal:Kerberos database files 存放principal (数据和索引文件)
• principal.ok:Kerberos database lock files.
• principal.kadm5:the Kerberos administrative database file,
• principal.kadm5.lock:the administrative database lock file;
1. 启动kdc服务,查看是否成功
/usr/kerberos/sbin/krb5kdc
 
查看启动是否成功:
 
ps -ef | grep krb5kdc
 
1. 使用kadmin.local管理程序配置kadmin.local,然后会出现如下提示信息:
Authenticating as principal root/admin@EXAMPLE.COM with password.kadmin.local:
 
然后增加安全策略:
 
add_policy -maxlife 180days -minlife 2days -minlength 8 -minclasses 3 -history 10 default
 
并增加管理员账号:
 
addprinc admin/admin
 
输入管理员口令:
 
[admin12;](中括号内即为密码,包括分号)
 
查看是否存在admin/admin@EXAMPLE.COM账号:
 
listprincs
 
创建一个包含密钥的keytab文件;
 
ktadd -k /usr/local/var/krb5kdc/kadm5.keytab kadmin/changepw
 
退出程序:
 
quit
 
1. 为管理员账号admin/admin指定权限
vim /var/kerberos/krb5kdc/kadm5.acl
 
添加下面这一行:
 
admin/admin@EXAMPLE.COM *
 
1. 启动kadmind服务程序
/usr/kerberos/sbin/kadmind
 
查看启动是否成功:
 
ps -ef | grep kadmind
 
8) 增加测试服务 进入kadmin.local,将会出现如下提示 .. code:
 
kadmin.local
Authenticating as principal root/admin@EXAMPLE.COM with password.kadmin.local:
 
输入测试服务口令:[abcd110;](中括号内即为密码,包括分号)
 
addprinc server_test/kerberos.example.com
 
产生并导出服务server所使用的密钥:
 
ktadd -k /usr/local/var/krb5kdc/kadm5.keytab server_test/kerberos.example.com
 
输入测试服务口令:[abcd110;](中括号内即为密码)
 
addprinc  client_test/kerberos.example.com
 
退出程序
 
quit
 
1. 启动服务端测试程序
sserver -p 8899 -s server_test -S  /usr/local/var/krb5kdc/kadm5.keytab;
 
6.3.3.2. 配置kerberos客户端
kerberos客户端的配置步骤如下:
1. 修改/etc/hosts 文件;
2. 获取client的TGT;
3. 启动客户端测试程序;
4. 获取client/kerberos.example.com的Kerberos TGT;
5. 启动客户端测试程序;
下面通过一个示例,来演示配置过程:
1. 修改/etc/hosts 文件;
2. 获取client的TGT;
3) 启动客户端测试程序; 说明:kerberos客户端即为kingbase服务器。修改/etc/hosts 文件(本机客户端IP为192.168.1.27):
 
192.168.8. 243   kerberos.example.com    kerberos
192.168.8. 243   kdc.example.com    kdc
192.168.1.27      test.example.com  test
 
保证kerberos.example.com,kdc.example.com 是否能够ping通:
 
ping kerberos.example.com
ping kdc.example.com
ping test.example.com
 
1. 获取client/kerberos.example.com的Kerberos TGT。客户端执行:
kinit client_test/kerberos.example.com
密码[test110;]
 
1. 启动客户端测试程序
sclient kerberos.example.com 8899 server_test
 
若测试成功,将会返回如下信息:
 
connected
sendauth succeeded, reply is:
reply len 53, contents:
You are client_test/kerberos.example.com@EXAMPLE.COM
 
6.3.3.3. 配置KingbaseES服务器配置
KingbaseES服务器配置步骤如下:
1. 启动服务器(kingbase已经加入krb5编译选项kerberos)创建jack用户,密码1234
2. 修改sys_hba.conf,修改认证方式
3. 修改kingbase配置文件kingbase.conf,确保能够连接到kerberos服务器。
4. 确保能够ping同kerberos服务器
5. 远程登录kerberos服务器,创建kingbase用户
下面通过一个示例,来演示配置过程:
1. 启动服务器(kingbase已经加入krb5编译选项kerberos)创建jack用户,密码1234:
CREATE USER jack WITH PASSWORD '1234';
 
1. 修改sys_hba.conf
修改认证方式trust为krb5:
 host    all         all         0.0.0.0/0             trust
修改后如下:
 host    all         all         192.168.0.0/16         krb5
 
1. 修改kingbase.conf
krb_server_hostname = 'test.example.com'
 
打开krb_server_keyfile,并赋值如下:
 
krb_server_keyfile = '/home2/bliu/p_install/etc/kadm5.keytab'
(注意:kadm5.keytab的默认位置是--prefix所指定目录下的etc目录,etc需要收手动创建)
 
1. 确保能够ping同kerberos服务器
如果不能ping通服务器的话,则需要配置/etc/hosts。同kerberos客户端。
1. 远程登录kerberos服务器,创建kingbase用户
切换到普通用户执行如下:
1. 获取admin/admin的TGT,并根据提示输入密码[admin12;]
kinit admin/amdin
1. 连接到Kerberos数据库管理服务进程kadmind:
/usr/kerberos/sbin/kadmin
 
进入kadmin后会显示如下信息:
 
Couldn't open log file /var/log/kadmind.log: Permission denied
Couldn't open log file /var/log/kadmind.log: Permission denied
Authenticating as principal admin/admin@EXAMPLE.COM with password.
Password for admin/admin@EXAMPLE.COM:<输入admin/admin的密码[admin12;]>

注意:由于kerberos认证需要三台机器时间同步,相差不能超过五分钟,如果出现如下错误,请查看所用三台机器,确认时间是否同步。
       (kadmin: GSS-API (or Kerberos) error while initializing kadmin interface)
 
1. 在Kerberos数据库中增加与数据用户同名的jack kadmin: ank jack,根据提示输入密码【admin12;】
2. 在kerberos数据库中增加kingbase的服务主记录
kadmin: ank -randkey kingbase/test.example.com
 
1. 将kingbase得服务主记录导出到密钥表,确保导出的密钥表文件kadm5.keytab,kingbase拥有读权限
kadmin: ktadd -k /home2/bliu/p_install/etc/kadm5.keytab kingbase/test.example.com kadmin: quit
 
1. 重新启动kingbase服务器
./kingbase -D /data -h 192.168.1.27
 
6.3.4. 通过Kerberos身份验证连接Kingbase
完成Kerberos身份验证的配置后,就可以连接到KingbaseES数据库。步骤如下:
1. 配置kingbase客户端/etc/hosts
2. 获取用户TGT
3. 判断是否登录成功。
下面通过一个示例,来演示配置过程:
1. 配置kingbase客户端/etc/hosts,在(127.0.0.1 localhost.localdomain localhost)下面增加:
192.168.8. 243   kerberos.example.com    kerberos
192.168.8. 243   kdc.example.com    kdc
192.168.1.27      test.example.com  test
 
1. 获取用户TGT
kinit jack
根据提示输入密码:[admin12;]
 
检查是否获取TGT成功:
 
klist
则会出现如下信息:
03/23/11 09:50:38  03/23/11 19:50:37  krbtgt/EXAMPLE.COM@EXAMPLE.COM
 
1. 判断是否登录成功,用数据库用户jack登录数据库:
./isql -U jack test -h 192.168.1.27
 
如果登录成功,则说明kerberos认证配置成功可用klist,检查获取服务主的ticket是否成功,如下:
 
klist

03/23/11 09:54:37  03/23/11 19:50:37  kingbase/test.example.com@EXAMPLE.COM