文章目录

  • 一、关键字概念
  • 二、服务端搭建
  • 三、客户端搭建


一、关键字概念

  1. Principal:Principal是用来表示参加认证实体,相当于用户名,用来来表示一个clientserver唯一的身份。Principal是由三个部分组成:名字(name),实例(instance,可选,一般是所需密钥的服务器的主机名或ip),REALM(域)。格式是:name/instance@REALM
  2. name:可以是任意的字符串,比如说可能是操作系统下的用户名等。
  3. instance:定义了用户在不同的role下使用的priciple,或者是在host在不同的service上运行时使用的principle
  4. realm:realm从逻辑上定义了一组object。每个realm可以有私有的配置,包括KDC的地址和加密算法等
  5. KDC数据库:存储了所有的用户信息。以一个用户信息为例
Principal: kafka@HADOOP.COM
Expiration date: [never]
Last password change: 六 4月 02 15:58:41 CST 2022
Password expiration date: [never]
Maximum ticket life: 1 day 00:00:00
Maximum renewable life: 7 days 00:00:00
Last modified: 六 4月 02 15:58:41 CST 2022 (admin/admin@HADOOP.COM)
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 8
Key: vno 4, aes256-cts-hmac-sha1-96
Key: vno 4, aes128-cts-hmac-sha1-96
Key: vno 4, des3-cbc-sha1
Key: vno 4, arcfour-hmac
Key: vno 4, camellia256-cts-cmac
Key: vno 4, camellia128-cts-cmac
Key: vno 4, des-hmac-sha1
Key: vno 4, des-cbc-md5
MKey: vno 1
Attributes:
Policy: [none]
1.与entry相关联的principal
2.principlal的master key
3.与这个principal相关联的ticket最长可用时间
4.与这个principal相关联的ticket的最长的renew时间(译注:是指这个ticket通过renew机制累计可55. 用的时间)(只在kerberos 5中可用)
5.决定这个ticket的具体行为的属性和标志位。
6.Master key过期时间
7.这个principal的过期时间,在此之后就不为这个principal分发ticket了。
为了使得窃取数据库中的密钥更加因难,Kerberos的实现们使用master key来对数据库进行加密,master key被关联在K/M@REALM这个principal上。即使是数据库的dump,备份和master KDC到salve KDC的propagation也会被用这个密钥加密,因此,如果想要重新加载它们,就必须知道这个密钥。
  1. Keytab:Keytab是一个存储于clientserver端的文本文件,包含了kerberos principle和该principlemaster key。所以这个文件需要很小心地保存。
  2. AS(Authentication Server): 认证服务器
    KDC(Key Distribution Center): 密钥分发中心
    TGT(Ticket Granting Ticket): 票据授权票据,票据的票据
    TGS(Ticket Granting Server):票据授权服务器
    SS(Service Server): 特定服务提供端
    Principal: 被认证的个体
    Ticket: 票据, 客户端用来证明身份真实性。包含: 用户名,IP,时间戳,有效期,会话秘钥。
  3. 认证过程,以客户端A访问服务器B为例:
    8.1 A将自己和B的Pricipal发给CA, CA就知道A要访问B, 然后, 查询自己的密码数据库,获取A 和 B对应的密码.
          A—[A_Pricipal, B_Pricipal]----->CA
     8.2 CA生成了一个认证因子(类似于证书), 其中包含时间戳,CA的信息,A的信息(A的IP,A的主机名,等等), 然后生成一个随机密码(RandomKey),并使用A的密码,将 [认证因子 + RandomKey] 加密成"Encryption Client".接着使用B的密码, 将[RandomKey] 加密成 “Encryption Server”.
          CA–[EC, ES]--------------------->A
     8.3 A收到了EC 和 ES, A使用自己的密码将EC解密, 获得了认证因子+RandomKey.A使用Randomkey 对 [认证因子] 加密
          A—[ 加密的认证因子 + ES]-------------->B
     8.4 B收到了来自A的访问请求, 然后 使用自己的密码将ES解密, 获取RandomKey.然后使用RandomKey 解密 加密的认证因子, 获取认证信息, B读取认证信息,知道这是我信任的CA,接着比对访问者提供的信息与CA提供的认证信息是否匹配,匹配则认证通过, 允许访问.
          B-----------[A需要的数据]----------->A

二、服务端搭建

  1. 下载插件:yum install -y krb5-server krb5-libs krb5-workstation krb5-devel krb5-auth-dialog openldap-clients
  2. 修改配置:vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88
 
[realms]
 HADOOP.COM = {  
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  max_life = 24h 0m 0s
  max_renewable_life = 7d
  max_life = 1d
  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
 }
  1. 修改配置:vi /etc/krb5.conf
# 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 = HADOOP.COM
 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 = EXAMPLE.COM
 default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 HADOOP.COM = {
  kdc = 192.168.248.10
  admin_server = 192.168.248.10
 }

[domain_realm]
 .hadoop.com = HADOOP.COM
 hadoop.com = HADOOP.COM
  1. 初始化数据库:/usr/sbin/kdb5_util create -s -r HADOOP.COM。密码设为:ffcsict123
  2. 查看生成文件:cd /var/kerberos/krb5kdc --> ls
  3. java kerberos的登录模块连接kafka_客户端

  4. 创建数据库管理员:/usr/sbin/kadmin.local -q "addprinc admin/admin",密码为ffcsict123
  5. 管理员设置ACL权限:vi /var/kerberos/krb5kdc/kadm5.acl,即所有以“/admin”结尾的用户都是管理员
*/admin@HADOOP.COM      *
  1. 设置启动和开机自启动:systemctl enable kadmin -->systemctl start kadmin --> systemctl status kadmin
  2. 设置启动和开机自启动:systemctl enable krb5kdc -->systemctl start krb5kdc --> systemctl status krb5kdc
  3. 登录管理员:kadmin.local ps:如果在非服务器上登录管理员(客户端),则需要kinit admin/admin -->kadmin
  4. 管理员操作
    11.1 登录:kinit admin/admin --> kadmin。注:服务端登录可直接输入 kadmin.local进入。
    11.2 查看用户:listprincs 11.3 创建用户:addprinc 用户名。注:管理员帐户配置用户名以“/admin”结尾即可,如第7点。
    11.4 修改密码:kpasswd 用户名,先输入旧密码,在输入新密码。注:忘记密码,可用kadmin.local登录,change_password 用户名,直接输入新密码。
    11.5 删除用户:delprinc 用户名 11.6 查看用户信息:getprinc 用户名 11.7 查看所有命令:?
  5. 管理员创建kafka用户凭据(凭证登录)
    12.1 创建用户:addprinc -randkey kafka/192.168.248.100 12.2 创建导出凭据:ktadd -k /root/kerberos/kafka.keytab kafka/192.168.248.100或者 xst -k /root/kerberos/kafka.keytab kafka/192.168.248.100 12.3 查看凭据信息:klist -ket /root/kerberos/kafka.keytab 12.4 将生成的“kafka.keytab”凭据给客户端,客户端可凭借该凭据登录。
  6. 管理员创建kafka用户凭据(账号密码登录)
    13.1 创建用户:addprinc kafka/192.168.248.100 ,然后输入密码即可
    13.2 将账号密码给客户端,客户端可以凭借账号密码登录。
    13.3 创建凭据:这种方法创建的用户也可以凭借导出凭据登录,但是需要注意的是,在导出凭据的时候需要加上“-norandkey ”关键字,否则每次导出密码会变动。这种情况下,只能在服务端的kadmin.local登录环境在操作。 如:ktadd -k /root/kerberos/kafka.keytab -norandkey kafka
  7. 导出联合凭据:xst -norandkey -k /root/kerberos/kafka.keytab-all kafka kadmin/admin (仅支持服务端的kadmin.local登录环境)
  8. 将用户信息全部导出: kdb5_util dump ./slava_data,将会生成slava_dataslava_data.dump_ok两个文件,信息都存在slava_data 里。

三、客户端搭建

  1. 在服务端提前创建好账户,我这里以第一点创建的kafka/192.168.248.100用户为例。
  2. 下载客户端:yum install -y krb5-lib krb5-workstation
  3. 将服务端的/etc/krb5.conf替换相同路径下的/krb5.conf
  4. 将服务端的kafka.keytab拉过来放在/root/kerberos/kafka.keytab
  5. 账号密码登录:kinit kafka/192.168.248.100 -->klist ps:这里应该是kafka/192.168.248.100@HADOOP.COM的,图片忘记换过来了
  6. 删除当前认证用户的缓存:kdestroy --> klist
  7. 凭据登录:kinit -kt /root/kerberos/kafka.keytab kafka/192.168.248.100
  8. 说明成功!!!