目录
1.Kerberos术语
2.Kerberos安装
3.Kerberos使用
3.1 Kadmin 数据库操作
3.1.1 list princs
3.1.2 addprinc
3.1.3 delprinc
3.1.4 change_password
3.1.5 ktadd
3.1.6 ktremove
3.2 Kerberos命令
3.2.1 kinit
3.2.2 klist
3.2.3 kdestroy
技术连载系列,前面内容请参考前面连载1内容:Kerberos安全认证-连载1-Kerberos简介_IT贫道的博客-CSDN博客
通过Kerberos认证原理介绍,我们已经了解到Kerberos的一些术语,还有一些术语可以更好的帮助我们学习Kerberos,如下:
用户principal的命名类似:zhangsan/[email protected],形式是用户名/角色/realm域。
服务principal的命名类似:ftp/[email protected],形式是服务名/地址/realm域。
Kerberos架构是客户端/服务端架构方式,安装kerberos涉及到3个安装包:krb5-server、krb5-workstation、krb5-libs:
这里搭建Kerberos选择一台节点当做Kerberos服务端,其他节点为Kerberos客户端,节点分布如下:
节点IP |
节点名称 |
Kerberos 服务端 |
Kerberos 客户端 |
192.168.179.4 |
node1 |
★ |
★ |
192.168.179.5 |
node2 |
★ |
|
192.168.179.6 |
node3 |
★ |
|
192.168.179.7 |
node4 |
★ |
|
192.168.179.8 |
node5 |
★ |
Kerberos安装步骤如下:
1) 安装Kerberos服务端
在node1节点上安装kerberos服务端:
[root@node1 ~]# yum install -y krb5-server |
以上安装完成后会在KDC主机上生成配置文件:/var/kerberos/krb5kdc/kdc.conf。
2) 安装kerberos客户端
在node1~node5节点安装Kerberos客户端:
[root@node1 ~]# yum install -y krb5-workstation krb5-libs [root@node2 ~]# yum install -y krb5-workstation krb5-libs [root@node3 ~]# yum install -y krb5-workstation krb5-libs [root@node4 ~]# yum install -y krb5-workstation krb5-libs [root@node5 ~]# yum install -y krb5-workstation krb5-libs |
以上安装完成后会在客户端生成配置文件/etc/krb5.conf。
3) 配置服务端kdc.conf文件
kdc.conf文件位于node1服务端/var/kerberos/krb5kdc/路径中,可以通过配置改文件来增加realm域信息。
#vim /var/kerberos/krb5kdc/kdc.conf [kdcdefaults] kdc_ports = 88 kdc_tcp_ports = 88 [realms] EXAMPLE.COM = { #master_key_type = aes256-cts acl_file = /var/kerberos/krb5kdc/kadm5.acl dict_file = /usr/share/dict/words 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:norma l des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal } |
该配置文件中的各个配置项可以参考:https://web.mit.edu/kerberos/krb5-1.20/doc/admin/conf_files/kdc_conf.html#kdc-conf-5,以上针对各个配置说明:
以上该文件暂时不做修改。
4) 所有客户端配置krb5.conf
krb5.conf文件位于客户端/etc/目录下,下面在node1客户端配置/etc/krb5.conf文件,配置完成后分发到node2~node5所有的客户端。
#node1客户端配置 /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] 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] EXAMPLE.COM = { kdc = node1 admin_server = node1 } [domain_realm] # .example.com = EXAMPLE.COM # example.com = EXAMPLE.COM |
关于该文件配置项的详细内容参考:https://web.mit.edu/kerberos/krb5-1.20/doc/admin/conf_files/krb5_conf.html#krb5-conf-5。该配置文件的解释如下:
realms模块按照如下模板进行配置即可:
EXAMPLE.COM = { kdc = kerberos.example.com admin_server = kerberos.example.com } |
关于配置参数解释如下:
此模块配置了domain name 或者hostname同kerberos realm之间的映射关系。将以上配置好的文件,发送到node2~node5节点上:
[root@node1 ~]# scp /etc/krb5.conf node2:/etc/ [root@node1 ~]# scp /etc/krb5.conf node3:/etc/ [root@node1 ~]# scp /etc/krb5.conf node4:/etc/ [root@node1 ~]# scp /etc/krb5.conf node5:/etc/ |
5) 服务端配置kadm5.acl文件
kadm5.acl位于服务端/var/kerberos/krb5kdc/kadm5.acl,该ACL文件用于控制kadmin数据库的访问权限,以及哪些Principal可以操作其他的Principal,配置如下:
以上配置表示名称匹配*/[email protected]的Principal都认为是admin管理员角色,权限是*代表全部权限。可以根据自己配置情况修改对应的域,这里暂不做修改。
6) 服务初始化Kadmin数据库
初始化Kadmin数据库的命令格式为:
kdb5_util create -s -r [realm] |
以上-s表示生成存储文件,-r指定realm name ,以上命令需要在服务端执行,执行后默认创建的数据库路径为:/var/kerberos/krb5kdc,如果需要重建数据库,将该目录下的principal相关的文件删除即可,请牢记数据库密码。
这里在node1节点上初始化Kadmin数据库,操作如下:
[root@node1 ~]# kdb5_util create -s -r EXAMPLE.COM Loading random data Initializing database '/var/kerberos/krb5kdc/principal' for realm 'EXAMPLE.COM', master key name 'K/[email protected]' You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: 123456 Re-enter KDC database master key to verify:123456 |
当Kerberos database创建好了之后,在/var/kerberos/krb5kdc路径中可以看到生成的principal相关文件。
7) 启动Kerberos服务并设置开机自启动
在服务端启动Kerberos服务。
#启动Kerberos服务命令,两个服务也可分开启动 [root@node1 ~]# systemctl start krb5kdc [root@node1 ~]# systemctl start kadmin #设置开机自启动 [root@node1 ~]# systemctl enable krb5kdc [root@node1 ~]# systemctl enable kadmin #查看两个服务启动状态 [root@node1 ~]# systemctl status krb5kdc kadmin |
可以在客户端和服务端对Kadmin数据库进行操作,由于Kadmin数据库本身就在服务端,所以如果在服务端操作Kadmin数据库只需要通过输入“kadmin.local”命令即可,如果在客户端操作Kadmin数据库,可以直接输入“kadmin”命令,但需要先在客户端进行主体认证,才可以在客户端对数据库进行操作。
下面在服务端操作Kadmin数据库进行命令演示。在node1输入“kadmin.local”命令:
[root@node1 ~]# kadmin.local Authenticating as principal root/[email protected] with password. kadmin.local: |
以上进入交互窗口,输入“?”可以获取所有命令和解释:
kadmin.local: ? Available kadmin.local requests: add_principal, addprinc, ank Add principal delete_principal, delprinc Delete principal modify_principal, modprinc Modify principal rename_principal, renprinc Rename principal change_password, cpw Change password get_principal, getprinc Get principal list_principals, listprincs, get_principals, getprincs List principals add_policy, addpol Add policy modify_policy, modpol Modify policy delete_policy, delpol Delete policy get_policy, getpol Get policy list_policies, listpols, get_policies, getpols List policies get_privs, getprivs Get privileges ktadd, xst Add entry(s) to a keytab ktremove, ktrem Remove entry(s) from a keytab lock Lock database exclusively (use with extreme caution!) unlock Release exclusive database lock purgekeys Purge previously retained old keys from a principal get_strings, getstrs Show string attributes on a principal set_string, setstr Set a string attribute on a principal del_string, delstr Delete a string attribute on a principal list_requests, lr, ? List available requests. quit, exit, q Exit program. kadmin.local: |
我们也可以直接在服务端执行:kadmin.local -q “命令”,不进入交互窗口直接操作Kadmin数据库,下面介绍常见的操作命令。
listprincs命令是列出所有的Principal主体
kadmin.local: listprincs kadmin/[email protected] kadmin/[email protected] kadmin/[email protected] kiprop/[email protected] krbtgt/[email protected] |
addprinc命令是添加一个principal。
kadmin.local: addprinc test/admin WARNING: no policy specified for test/[email protected]; defaulting to no policy Enter password for principal "test/[email protected]": 123456 Re-enter password for principal "test/[email protected]": 123456 Principal "test/[email protected]" created. #再次查看principal kadmin.local: listprincs kadmin/[email protected] kadmin/[email protected] kadmin/[email protected] kiprop/[email protected] krbtgt/[email protected] test/[email protected] #再次添加principal,该principal没有指定对应的角色权限,也是可以的。 kadmin.local: addprinc test2 WARNING: no policy specified for [email protected]; defaulting to no policy Enter password for principal "[email protected]": 123456 Re-enter password for principal "[email protected]": 123456 Principal "[email protected]" created. #查看principal kadmin.local: listprincs kadmin/[email protected] kadmin/[email protected] kadmin/[email protected] kiprop/[email protected] krbtgt/[email protected] test/[email protected] |
注意:
delprinc可以删除principal
kadmin.local: delprinc test2 Are you sure you want to delete the principal "[email protected]"? (yes/no): yes Principal "[email protected]" deleted. Make sure that you have removed this principal from all ACLs before reusing. kadmin.local: delprinc test/admin Are you sure you want to delete the principal "test/[email protected]"? (yes/no): yes Principal "test/[email protected]" deleted. Make sure that you have removed this principal from all ACLs before reusing. #再次查看principal,之前创建的principal已经被删除 kadmin.local: listprincs kadmin/[email protected] kadmin/[email protected] kadmin/[email protected] kiprop/[email protected] krbtgt/[email protected] |
change_password命令可以修改principal密码。
#创建test/admin principal主体,指定密码为123123 kadmin.local: addprinc test/admin WARNING: no policy specified for test/[email protected]; defaulting to no policy Enter password for principal "test/[email protected]": 123123 Re-enter password for principal "test/[email protected]": 123123 Principal "test/[email protected]" created. #修改test/admin principal主体密码为123456 kadmin.local: change_password test/admin Enter password for principal "test/[email protected]": 123456 Re-enter password for principal "test/[email protected]": 123456 Password for "test/[email protected]" changed. |
注意:对Principal主体修改密码后,需要使用kinit命令认证时需要使用新密码。
ktadd命令key生成一个keytab文件,或者将一个principal加入到keytab。Kerberos客户端的认证支持两种方式,一种是用户名和密码认证方式,适合交互式应用。另一种是可以使用keytab密钥文件认证,可以通过ktadd命令将对应的principal主体添加到keytab文件,这样客户端就可以拿着keytab文件进行认证。关于参看后文kinit命令。
#在node1上创建目录,用于存储keytab文件 [root@node1 ~]# mkdir /root/kerberos_keytab #将test/[email protected]主体加入到keytab文件 kadmin.local: ktadd -norandkey -kt /root/kerberos_keytab/test.keytab test/[email protected] Entry for principal test/[email protected] with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/root/kerberos_keytab/test .keytab.Entry for principal test/[email protected] with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/root/kerberos_keytab/test .keytab.Entry for principal test/[email protected] with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/root/kerberos_keytab/test.keytab. Entry for principal test/[email protected] with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/root/kerberos_keytab/test.keytab. Entry for principal test/[email protected] with kvno 2, encryption type camellia256-cts-cmac added to keytab WRFILE:/root/kerberos_keytab/test.ke ytab.Entry for principal test/[email protected] with kvno 2, encryption type camellia128-cts-cmac added to keytab WRFILE:/root/kerberos_keytab/test.ke ytab.Entry for principal test/[email protected] with kvno 2, encryption type des-hmac-sha1 added to keytab WRFILE:/root/kerberos_keytab/test.keytab. Entry for principal test/[email protected] with kvno 2, encryption type des-cbc-md5 added to keytab WRFILE:/root/kerberos_keytab/test.keytab. |
针对以上"ktadd -norandkey -kt /root/kerberos_keytab/test.keytab test/[email protected]"命令解释如下:
我们也可以使用ktadd命令将多个principal加入到同一个keytab文件中,这样该keytab就可以用于认证多个用户,操作如下:
#创建新的principal主体demo/admin kadmin.local: addprinc demo/admin WARNING: no policy specified for demo/[email protected]; defaulting to no policy Enter password for principal "demo/[email protected]": 123456 Re-enter password for principal "demo/[email protected]": 123456 Principal "demo/[email protected]" created. #将demo/admin加入到/root/kerberos_keytab/test.keytab密钥中 kadmin.local: ktadd -norandkey -kt /root/kerberos_keytab/test.keytab demo/[email protected] #可以退出kadmin.local数据库操作窗口,执行如下命令查看keytab 文件关联的principal [root@node1 ~]# klist -kt /root/kerberos_keytab/test.keytab Keytab name: FILE:/root/kerberos_keytab/test.keytab KVNO Principal ---- -------------------------------------------------------------------------- 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] 1 demo/[email protected] 1 demo/[email protected] 1 demo/[email protected] 1 demo/[email protected] 1 demo/[email protected] 1 demo/[email protected] 1 demo/[email protected] 1 demo/[email protected] |
keremove命令可以从keytab文件中删除关联的pricipal
针对keytab文件中关联的多个pricipal可以通过ktremove命令来删除pricipal主体与keytab密钥文件的关联。
[root@node1 ~]# kadmin.local kadmin.local: ktremove -kt /root/kerberos_keytab/test.keytab demo/[email protected] |
以上命令将demo/[email protected]主体与keytab文件删除了关联。再次查看keytab 文件关联的principal。
[root@node1 ~]# klist -kt /root/kerberos_keytab/test.keytab Keytab name: FILE:/root/kerberos_keytab/test.keytab KVNO Principal ---- -------------------------------------------------------------------------- 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] 2 test/[email protected] |
kinit命令可以对Principal主体进行认证,获取principal授予的票据并缓存。Kerberos客户端支持两种认证方式,一是使用Principal + Password,二是使用Principal + keytab,前者适合用户进行交互式应用,例如hadoop fs -ls 这种,后者适合服务,例如yarn的rm、nm等。principal + keytab就类似于ssh免密码登录,登录时不需要密码。
无论使用以上哪种认证方式需要在Kerberos数据库中创建对应Principal主体,下面在服务端创建主体test/test ,也可以不指定对应的角色,并且生成keytab文件。
#node1服务端创建test/test主体 [root@node1 ~]# kadmin.local -q "addprinc test/test" Authenticating as principal root/[email protected] with password. WARNING: no policy specified for test/[email protected]; defaulting to no policy Enter password for principal "test/[email protected]": 123456 Re-enter password for principal "test/[email protected]": 123456 Principal "test/[email protected]" created. #将主体添加到keytab文件中 [root@node1 ~]# kadmin.local -q "ktadd -norandkey -kt /root/kerberos_keytab/my.keytab test/[email protected]" |
在node1~node5任意客户端上使用kinit命令进行认证。
[root@node2 ~]# kinit test/[email protected] Password for test/[email protected]: 123456 |
注意:可以使用kinit -h 查看kinit的使用参数。
在node1~node5任意客户端上准备keytab文件,然后通过kinit 命令指定keytab文件进行认证。
#将node1节点上生成的my.keytab文件分发到node2节点/root目录下 [root@node1 ~]# scp /root/kerberos_keytab/my.keytab node2:/root/ #在node2节点进行客户端认证 [root@node2 ~]# kinit test/[email protected] -kt /root/my.keytab |
注意:指定keytab文件时必须写成 -kt。
也可以在客户端节点上执行kadmin命令,需要使用具有admin权限的Principal主体,命令如下:
[root@node5 ~]# kadmin -p test/[email protected] -w 123456 Authenticating as principal test/[email protected] with password. kadmin: listprincs demo/[email protected] kadmin/[email protected] kadmin/[email protected] kadmin/[email protected] kiprop/[email protected] krbtgt/[email protected] test/[email protected] test/[email protected] |
通过 klist命令可以查看当前凭据缓存内的票据Ticket。
[root@node2 ~]# klist Ticket cache: KEYRING:persistent:0:0 Default principal: test/[email protected] Valid starting Expires Service principal 2023-05-10T15:03:37 2023-05-11T15:03:37 krbtgt/[email protected] #如果在没有认证的客户端节点执行klist命令,查询不到缓存的Ticket [root@node3 kerberos]# klist klist: Credentials cache keyring 'persistent:0:0' not found |
除此之外,klist还可以列出keytab文件关联的Pricipal主体:
[root@node2 ~]# klist -kt /root/my.keytab Keytab name: FILE:/root/my.keytab KVNO Timestamp Principal ---- ------------------- ------------------------------------------------------ 1 2023-05-10T14:58:23 test/[email protected] 1 2023-05-10T14:58:23 test/[email protected] 1 2023-05-10T14:58:23 test/[email protected] 1 2023-05-10T14:58:23 test/[email protected] 1 2023-05-10T14:58:23 test/[email protected] 1 2023-05-10T14:58:23 test/[email protected] 1 2023-05-10T14:58:23 test/[email protected] 1 2023-05-10T14:58:23 test/[email protected] |
kdestroy命令用来销毁当前认证缓存的票据,该命令不需要任何参数,可以指定kdestroy -A 删除所有用户的票据缓存,不指定-A 仅删除当前用户的票据缓存。
[root@node2 ~]# kdestroy Other credential caches present, use -A to destroy all |
欢迎点赞、评论、收藏,关注IT贫道,获取IT技术知识!