文章目录
- 一、关键字概念
- 二、服务端搭建
- 三、客户端搭建
一、关键字概念
- Principal:
Principal
是用来表示参加认证实体,相当于用户名,用来来表示一个client
或server
唯一的身份。Principal
是由三个部分组成:名字(name
),实例(instance
,可选,一般是所需密钥的服务器的主机名或ip),REALM
(域)。格式是:name/instance@REALM
- name:可以是任意的字符串,比如说可能是操作系统下的用户名等。
- instance:定义了用户在不同的role下使用的
priciple
,或者是在host
在不同的service
上运行时使用的principle - realm:realm从逻辑上定义了一组object。每个realm可以有私有的配置,包括
KDC
的地址和加密算法等 - 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也会被用这个密钥加密,因此,如果想要重新加载它们,就必须知道这个密钥。
- Keytab:Keytab是一个存储于
client
或server
端的文本文件,包含了kerberos principle
和该principle
的master key
。所以这个文件需要很小心地保存。 - AS(Authentication Server): 认证服务器
KDC(Key Distribution Center): 密钥分发中心
TGT(Ticket Granting Ticket): 票据授权票据,票据的票据
TGS(Ticket Granting Server):票据授权服务器
SS(Service Server): 特定服务提供端
Principal: 被认证的个体
Ticket: 票据, 客户端用来证明身份真实性。包含: 用户名,IP,时间戳,有效期,会话秘钥。 - 认证过程,以客户端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
二、服务端搭建
- 下载插件:
yum install -y krb5-server krb5-libs krb5-workstation krb5-devel krb5-auth-dialog openldap-clients
- 修改配置:
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
}
- 修改配置: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
- 初始化数据库:
/usr/sbin/kdb5_util create -s -r HADOOP.COM
。密码设为:ffcsict123
- 查看生成文件:
cd /var/kerberos/krb5kdc
-->ls
- 创建数据库管理员:
/usr/sbin/kadmin.local -q "addprinc admin/admin"
,密码为ffcsict123
- 管理员设置ACL权限:
vi /var/kerberos/krb5kdc/kadm5.acl
,即所有以“/admin
”结尾的用户都是管理员
*/admin@HADOOP.COM *
- 设置启动和开机自启动:
systemctl enable kadmin
-->systemctl start kadmin
-->systemctl status kadmin
- 设置启动和开机自启动:
systemctl enable krb5kdc
-->systemctl start krb5kdc
-->systemctl status krb5kdc
- 登录管理员:
kadmin.local
ps:如果在非服务器上登录管理员(客户端),则需要kinit admin/admin
-->kadmin
- 管理员操作
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 查看所有命令:?
- 管理员创建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
”凭据给客户端,客户端可凭借该凭据登录。 - 管理员创建kafka用户凭据(账号密码登录)
13.1 创建用户:addprinc kafka/192.168.248.100
,然后输入密码即可
13.2 将账号密码给客户端,客户端可以凭借账号密码登录。
13.3 创建凭据:这种方法创建的用户也可以凭借导出凭据登录,但是需要注意的是,在导出凭据的时候需要加上“-norandkey
”关键字,否则每次导出密码会变动。这种情况下,只能在服务端的kadmin.local
登录环境在操作。 如:ktadd -k /root/kerberos/kafka.keytab -norandkey kafka
- 导出联合凭据:
xst -norandkey -k /root/kerberos/kafka.keytab-all kafka kadmin/admin
(仅支持服务端的kadmin.local登录环境) - 将用户信息全部导出:
kdb5_util dump ./slava_data
,将会生成slava_data
、slava_data.dump_ok
两个文件,信息都存在slava_data
里。
三、客户端搭建
- 在服务端提前创建好账户,我这里以第一点创建的
kafka/192.168.248.100
用户为例。 - 下载客户端:
yum install -y krb5-lib krb5-workstation
- 将服务端的
/etc/krb5.conf
替换相同路径下的/krb5.conf
- 将服务端的
kafka.keytab
拉过来放在/root/kerberos/kafka.keytab
下 - 账号密码登录:
kinit kafka/192.168.248.100
-->klist
ps:这里应该是kafka/192.168.248.100@HADOOP.COM
的,图片忘记换过来了 - 删除当前认证用户的缓存:
kdestroy
-->klist
- 凭据登录:
kinit -kt /root/kerberos/kafka.keytab kafka/192.168.248.100
- 说明成功!!!