• 金仓数据库KingbaseES安全指南--6.3. Kerberos身份验证


    目录

    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)。其认证协议基本结构如下图所示。

     

    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

    2. 连接到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
  • 相关阅读:
    解决:PicGo插件安装失败,失败码为1(404)
    西门子S7协议及报文格式详解
    杰理AD14N/AD15N---Timer定时器问题
    React@16.x(29)useRef
    欧姆龙PLC出现故障怎么进行远程维护?怎么进行保养?
    Flink Yarn Per Job - CliFrontend
    【 InnoDB Cluster 】安装部署 MySQL Router
    【开发教程10】疯壳·开源蓝牙智能健康手表-OTA镜像制作及下载技术文档
    keep-alive缓存,三级路由不生效
    【Leetcode】1196. How Many Apples Can You Put into the Basket
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/126096274