Kerberos安全认证-连载2-Kerberos安装及使用

目录

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博客

1.Kerberos术语

通过Kerberos认证原理介绍,我们已经了解到Kerberos的一些术语,还有一些术语可以更好的帮助我们学习Kerberos,如下:

  • realm:领域,身份验证管理域,领域确定了管理边界,所有主体均属于特定的Kerberos域
  • principal:主体,Principal主体用于标识身份,每个参与Kerberos认证协议的用户和服务都需要一个主体来唯一标识自己。Principal由三部分组成:名字(name)、实例(instance)、域(realm),例如一个标准的Kerberos用户/服务表示为:name/instance@REALM。
    • name:表示用户名。
    • instance:对name的进一步描述,例如name所在的主机名或name的类型等。可以省略,与第一部分使用“/”分割
    • realm:就是前面说的领域,表示Kerberos在管理上的划分,在 KDC 中所负责的一个域数据库称作为 Realm。这个数据库中存放有该网络范围内的所有 Principal 和它们的密钥,Realm一般都是大写。

用户principal的命名类似:zhangsan/[email protected],形式是用户名/角色/realm域。
服务principal的命名类似:ftp/[email protected],形式是服务名/地址/realm域。

  • keytab:Kerberos认证有两种方式——通过密码或者密钥文件进行认证。这里说的keytab就是密钥文件,该文件包含Principal主体的用户名及密码,客户端可以通过Keytab密钥文件进行身份验证。
  • kadmin:即Kerberos administration server,运行在主kerberos节点。负责存储KDC数据库,管理principal信息。

2.Kerberos安装

Kerberos架构是客户端/服务端架构方式,安装kerberos涉及到3个安装包:krb5-server、krb5-workstation、krb5-libs:

  • krb5-server:Kerberos服务端程序,KDC所在节点。
  • krb5-workstation:包含基本的Kerberos程序,如:kinit、klist、kdestroy、kpasswd,所有kerberos节点需要部署。
  • krb5-libs:包含Kerberos程序的各种支持类库,所有节点部署。

这里搭建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,以上针对各个配置说明:

  • kdc_ports:KDC服务监听的端口。
  • EXAMPLE.COM:设定的realms,名字随意。Kerberos可以支持多个realms,一般为大写。
  • master_key_type:指定Kerberos主密钥加密算法类型,默认使用aes256-cts。
  • acl_file:ACL文件路径,Kerberos通过该文件来确定哪些Principal具有哪些权限。
  • dict_file:存放一个由多行字符串构成的文本文件,该文件中的字符串禁止作为密码使用。
  • admin_keytab:KDC进行校验的keytab,该keytab用于认证管理员的密钥。
  • supported_enctypes:支持的加密算法类型。

以上该文件暂时不做修改。

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。该配置文件的解释如下:

  • logging模块:配置默认即可,KDC和Kadmin服务的log文件路径。
  • libdefaults模块:
    • dns_lookup_realm:使用主机域名到kerberos domain的映射定位KDC。
    • ticket_lifetime:ticket过期时间,超过这个时间ticket需要重新申请或renew。
    • renew_lifetime:ticket可进行renew的时间限制。
    • forwardable:如果配置为true,在KDC允许的情况下,初始ticket可以被转发。
    • rdns:是否可使用逆向DNS。
    • pkinit_anchors:签署KDC证书的根证书。
    • default_realm:指定默认的realm,需要设置,否则后续Kerberos服务不能正常启动。
    • default_ccache_name:默认凭据缓存的命名规则,这里注释掉,否则后续HDFS客户端不能认证操作HDFS。
  • realms模块:

realms模块按照如下模板进行配置即可:

EXAMPLE.COM = {

 kdc = kerberos.example.com

 admin_server = kerberos.example.com

}

关于配置参数解释如下:

  1. kdc:KDC服务所在节点。
  2. admin_server:kadmin服务所在节点,即Kerberos administration server。
  • domain_realm模块:

此模块配置了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]     *

以上配置表示名称匹配*/[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

3.Kerberos使用

3.1 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数据库,下面介绍常见的操作命令。

3.1.1 list princs

listprincs命令是列出所有的Principal主体

kadmin.local:  listprincs

K/[email protected]

kadmin/[email protected]

kadmin/[email protected]

kadmin/[email protected]

kiprop/[email protected]

krbtgt/[email protected]

3.1.2 addprinc

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

K/[email protected]

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

K/[email protected]

kadmin/[email protected]

kadmin/[email protected]

kadmin/[email protected]

kiprop/[email protected]

krbtgt/[email protected]

test/[email protected]

[email protected]

注意:

  1. 以上创建的test/admin principal第二部分是admin,根据之前在kadm5.acl文件中指定的匹配规则,该principal就相当于是admin管理员用户。在创建Principal是也可以不指定第二部分,这种用户就是普通用户。
  2. 关于创建好的用户如何去认证,参考后续kinit命令。

3.1.3 delprinc

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

K/[email protected]

kadmin/[email protected]

kadmin/[email protected]

kadmin/[email protected]

kiprop/[email protected]

krbtgt/[email protected]

3.1.4 change_password

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命令认证时需要使用新密码。

3.1.5 ktadd

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]"命令解释如下:

  • 命令中"-norandkey"表示不使用随机密码,如果不指定那么会对该主体随机生成密码,源密码不可用,建议指定,这样客户端使用该主体即可使用密码验证也可以使用keytab密钥文件验证。
  • 命令执行后产生了8个entry,原因是在kdc.conf的supported_enctypes配置项指定了8种加密算法,因此这里会打印出8个entry。
  • 关于生成keytab文件,如果指定路径下没有该文件,会生成一个新的keytbl文件,然后将指定principal添加到该keytab;如果有该keytab文件会直接追加写入。
  • 关于如何使用keytab方式认证命令参考下文kinit命令。

我们也可以使用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]

​​​​​​​3.1.6 ktremove

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]

3.2 Kerberos命令

3.2.1 kinit

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]"

  • 使用password进行认证

在node1~node5任意客户端上使用kinit命令进行认证。

[root@node2 ~]# kinit test/[email protected]

Password for test/[email protected]: 123456

注意:可以使用kinit -h 查看kinit的使用参数。

  • 使用keytab进行认证

在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

K/[email protected]

demo/[email protected]

kadmin/[email protected]

kadmin/[email protected]

kadmin/[email protected]

kiprop/[email protected]

krbtgt/[email protected]

test/[email protected]

test/[email protected]

​​​​​​​3.2.2 klist

通过 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]

​​​​​​​3.2.3 kdestroy

kdestroy命令用来销毁当前认证缓存的票据,该命令不需要任何参数,可以指定kdestroy -A 删除所有用户的票据缓存,不指定-A 仅删除当前用户的票据缓存。

[root@node2 ~]# kdestroy

Other credential caches present, use -A to destroy all


欢迎点赞、评论、收藏,关注IT贫道,获取IT技术知识!

你可能感兴趣的:(Kerberos安全认证,安全,数据库,服务器)