Kerberos的安装和常用命令

1. Kerberos 认证协议介绍

Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。使用 Kerberos 时,一个客户端需要经过三个步骤来获取服务:

  • 认证:客户端向认证服务器发送一条报文,并获取一个含时间戳的 Ticket-Granting Ticket(TGT)。
  • 授权:客户端使用 TGT 向 Ticket-Granting Server(TGS)请求一个服务 Ticket。
  • 服务请求:客户端向服务器出示服务 Ticket ,以证实自己的合法性。

       为此,Kerberos 需要 The Key Distribution Centers(KDC)来进行认证。KDC 只有一个 Master,可以带多个 slaves 机器。slaves 机器仅进行普通验证。Mater 上做的修改需要自动同步到 slaves。
        另外,KDC 需要一个 admin,来进行日常的管理操作。这个 admin 可以通过远程或者本地方式登录。

2.搭建 Kerberos

2.1环境

Kerberos打算采用三台机器:host150、host151、host152三台机器,用root用户安装,host150安装kdc主机。

2.2查看主机域名配置

[root@host150 logs]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.206.150 host150
192.168.206.151 host151
192.168.206.152 host152

2.3安装 kdc server

在 KDC (这里是 host150一台安装即可 ) 上安装包 krb5、krb5-server 和 krb5-client

[root@host150 bin]#yum install krb5-server krb5-libs krb5-auth-dialog krb5-workstation  -y

在其他节点(host150、host151、host152)安装 krb5-devel、krb5-workstation 

[root@host150 bin]#ssh host150 "yum install krb5-devel krb5-workstation -y"
[root@host150 bin]#ssh host151 "yum install krb5-devel krb5-workstation -y"
[root@host150 bin]#ssh host152 "yum install krb5-devel krb5-workstation -y"

2.4修改配置文件

kdc 服务器涉及到三个配置文件:
/etc/krb5.conf
/var/kerberos/krb5kdc/kdc.conf
/var/kerberos/krb5kdc/kadm5.acl

配置 Kerberos 的一种方法是编辑配置文件 /etc/krb5.conf。默认安装的文件中包含多个示例项编辑结果如下:

[root@host150 logs]# vim  /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 = NBDP.COM
   dns_lookup_realm = false
   dns_lookup_kdc = false
   clockskew = 120
   ticket_lifetime = 24h
   renew_lifetime = 7d
   forwardable = true
   renewable = true
   udp_preference_limit = 1
   default_tgs_enctypes = rc4-hmac
   default_tkt_enctypes = rc4-hmac
   permitted_enctypes = rc4-hmac

[realms]
  NBDP.COM = {
  kdc = host150
  admin_server = host150
 }

[domain_realm]
 .nbdp.com = NBDP.COM
  nbdp.com = NBDP.COM

[kdc]
  profile=/var/kerberos/krb5kdc/kdc.conf

参数说明:

[logging]:表示 server 端的日志的打印位置
[libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置
default_realm = NBDP.COM:设置 Kerberos 应用程序的默认领域。如果您有多个领域,只需向 [realms] 节添加其他的语句。
udp_preference_limit= 1:禁止使用 udp 可以防止一个Hadoop中的错误
clockskew:时钟偏差是不完全符合主机系统时钟的票据时戳的容差,超过此容差将不接受此票据。通常,将时钟扭斜设置为 300 秒(5 分钟)。这意味着从服务器的角度看,票证的时间戳与它的偏差可以是在前后 5 分钟内。
ticket_lifetime: 表明凭证生效的时限,一般为24小时。
renew_lifetime: 表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,对安全认证的服务的后续访问则会失败。
[realms]:列举使用的 realm。
kdc:代表要 kdc 的位置。格式是 机器:端口
admin_server:代表 admin 的位置。格式是 机器:端口
default_domain:代表默认的域名
[appdefaults]:可以设定一些针对特定应用的配置,覆盖默认配置。

修改 /var/kerberos/krb5kdc/kdc.conf ,该文件包含 Kerberos 的配置信息。例如,KDC 的位置,Kerbero 的 admin 的realms 等。需要所有使用的 Kerberos 的机器上的配置文件都同步。这里仅列举需要的基本配置。详细介绍参考:krb5conf

[root@host150 logs]# vim /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 NBDP.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 = 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
  max_life = 24h
  max_renewable_life = 10d
  default_principal_flags = +renewable, +forwardable
}

NBDP.COM: 是设定的 realms。名字随意。Kerberos 可以支持多个 realms,会增加复杂度。大小写敏感,一般为了识别使用全部大写。这个 realms 跟机器的 host 没有大关系。
master_key_type:和 supported_enctypes 默认使用 aes256-cts。由于,JAVA 使用 aes256-cts 验证方式需要安装额外的 jar 包(后面再做说明)。推荐不使用,并且删除 aes256-cts。
acl_file:标注了 admin 的用户权限,需要用户自己创建。文件格式是:Kerberos_principal permissions [target_principal] [restrictions]
supported_enctypes:支持的校验方式。
admin_keytab:KDC 进行校验的 keytab。


关于AES-256加密:
      对于使用 centos5. 6及以上的系统,默认使用 AES-256 来加密的。这就需要集群中的所有节点上安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File。下载的文件是一个 zip 包,解开后,将里面的两个文件放到下面的目录中:$JAVA_HOME/jre/lib/security
下载地址:https://www.oracle.com/java/technologies/jce-6-download.html

        为了能够不直接访问 KDC 控制台而从 Kerberos 数据库添加和删除主体,请对 Kerberos 管理服务器指示允许哪些主体执行哪些操作。通过编辑文件 /var/lib/kerberos/krb5kdc/kadm5.acl 完成此操作。ACL(访问控制列表)允许您精确指定特权。

[root@host150 logs]# vim  /var/kerberos/krb5kdc/kadm5.acl
*/[email protected]  

2.5同步配置文件

同步krb5.conf文件

[root@host150 etc]# scp /etc/krb5.conf root@host151:/etc/
[root@host150 etc]# scp /etc/krb5.conf root@host152:/etc/

同步kadm5.acl文件

[root@host150 etc]# scp  /var/kerberos/krb5kdc/kadm5.acl root@host151: /var/kerberos/krb5kdc/
[root@host150 etc]# scp  /var/kerberos/krb5kdc/kadm5.acl root@host152: /var/kerberos/krb5kdc/

2.6创建数据库

在 host150 上运行初始化数据库命令。其中 -r 指定对应 realm。
[root@host150 etc]# kdb5_util create -r NBDP.COM -s
注意:如果遇到数据库已经存在的提示,可以把 /var/kerberos/krb5kdc/ 目录下的 principal 的相关文件都删除掉。默认的数据库名字都是 principal。可以使用 -d 指定数据库名字。

2.7启动服务

[root@host150 etc]# chkconfig --level 35 krb5kdc on
[root@host150 etc]# chkconfig --level 35 kadmin on
[root@host150 etc]# service krb5kdc start
[root@host150 etc]# service kadmin start

2.8创建 kerberos 管理员

[root@host150 ~]# kadmin.local -q "addprinc root/admin"
注意:统会提示输入密码,密码不能为空,且需妥善保存。


关于 kerberos 的管理,可以使用 kadmin.local 或 kadmin,至于使用哪个,取决于账户和访问权限:
  1.如果有访问 kdc 服务器的 root 权限,但是没有 kerberos admin 账户,使用 kadmin.local
  2.如果没有访问 kdc 服务器的 root 权限,但是用 kerberos admin 账户,使用 kadmin

示例1:
[root@host150 logs]# kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local:

示例2
[xiaodu@host150 xiaodu]$ kadmin
Authenticating as principal xiaodu/[email protected] with password.
Password for xiaodu/[email protected]

3.kerberos 常用命令

3.1增删改查

[root@host150 logs]#kadmin.local
[root@host150 logs]#kadmin.local:  list_principals
[root@host150 logs]#kadmin.local:  addprinc user1
[root@host150 logs]#kadmin.local:  delprinc user1

也可以直接通过下面的命令来执行上面的操作:

#需要输入密码
[root@host150 logs]#kadmin -p root/admin -q "list_principals"
[root@host150 logs]#kadmin -p root/admin -q "addprinc user1"
[root@host150 logs]#kadmin -p root/admin -q "delprinc user1"
#不用输入密码
[root@host150 logs]#kadmin.local -q "list_principals"
[root@host150 logs]#kadmin.local -q "addprinc user1"
[root@host150 logs]#kadmin.local -q "delprinc user1"

3.2获取ticket

创建一个名为xiaodu的用户,密码是admin,"admin\nadmin"是输入密码和确认的密码要一致。
 [root@host150 logs]# echo -e "admin\nadmin" | kadmin.local -q "addprinc xiaodu"
查看票据
[xiaodu@host150 ~]$ klist
klist: No credentials cache found (filename: /tmp/krb5cc_1000)
获取票据,需要输入密码
[xiaodu@host150 ~]$ kinit xiaodu
Password for [email protected]
如果有相同的要指定他域获取票据
[root@host150 xiaodu]kinit xiaodu/[email protected]
初始化再查看票据
[xiaodu@host150 ~]$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: [email protected]

Valid starting       Expires              Service principal
01/26/2020 14:24:44  01/27/2020 14:24:43  krbtgt/[email protected]
        renew until 02/02/2020 14:24:43
查看加密方式
[xiaodu@host150 ~]$klist  -e
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: [email protected]

Valid starting       Expires              Service principal
01/26/2020 14:29:56  01/27/2020 14:29:55  krbtgt/[email protected]
        renew until 02/02/2020 14:24:43, Etype (skey, tkt): arcfour-hmac, arcfour-hmac 
销毁当前用户票据
[xiaodu@host150 ~]$ kdestroy
[xiaodu@host150 ~]$ klist
klist: No credentials cache found (filename: /tmp/krb5cc_1000)
强制刷新票据
[xiaodu@host150 ~]$ kinit -R

3.3超级用户密钥抽取

     抽取密钥并将其储存在本地 keytab 文件 /etc/krb5.keytab 中。这个文件由超级用户拥有,所以您必须是 root 用户才能在 kadmin shell 中执行以下命令:
[root@host150 logs]# kadmin.local -q "ktadd kadmin/admin"
[root@host150 logs]# klist -k /etc/krb5.keytab
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   2 kadmin/[email protected]
   2 kadmin/[email protected]
   2 kadmin/[email protected]
   2 kadmin/[email protected]
   2 kadmin/[email protected]
   2 kadmin/[email protected]
   2 kadmin/[email protected]
   2 kadmin/[email protected]

4.创建keytab文件

        keytab 是包含 principals 和加密 principal key 的文件。
        keytab 文件对于每个 host 是唯一的,因为 key 中包含 hostname。keytab 文件用于不需要人工交互和保存纯文本密码,实现到 kerberos 上验证一个主机上的 principal。
       因为服务器上可以访问 keytab 文件即可以以 principal 的身份通过 kerberos 的认证,所以,keytab 文件应该被妥善保存,应该只有少数的用户可以访问。
       keytab必须用kadmin.local的方式生成,生成的keytab文件在/var/kerberos/krb5kdc/路径下面。

增加创建user1用户
kadmin.local:  addprinc user1
WARNING: no policy specified for [email protected]; defaulting to no policy
Enter password for principal "[email protected]":
抽取user1的keytab
kadmin.local:  xst -k xiaodu.keytab  [email protected]
kadmin.local:  exit
切换到对应目录,查看生成的xiaodu.keytab
[root@host150 krb5kdc]# cd /var/kerberos/krb5kdc
[root@host150 krb5kdc]# ll
-rw-------. 1 root root   474 Jan 26 15:04 xiaodu.keytab
复制生成的keytab到host150,用xiaodu用户登陆host150服务器,根据生成的keytab获取票据,缓存到/tmp/krb5cc_前缀文件[root@host150 krb5kdc]# scp xiaodu.keytab xiaodu@host150:/home/keydir/xiaodu
[xiaodu@host150 xiaodu]$kinit -k -t /home/keydir/xiaodu/xiaodu.keytab xiaodu/[email protected]

kinit常用参数详解

kinit [-V][-l lifetime] [-s start_time][-r renewable_life][-p | -P][-f | -F][-a][-A][-C][-E][-v][-R][-k [-t keytab_file]][-c cache_name][-n][-S service_name][-I input_ccache][-T armor_ccache][-X attribute[=value]][principal]

[xiaodu@host150 xiaodu]$ kinit --help
kinit: unrecognized option '--help'
Usage: kinit [-V] [-l lifetime] [-s start_time] 
        [-r renewable_life] [-f | -F | --forwardable | --noforwardable] 
        [-p | -P | --proxiable | --noproxiable] 
        -n [-a | -A | --addresses | --noaddresses] 
        [--request-pac | --no-request-pac] 
        [-C | --canonicalize] 
        [-E | --enterprise] 
        [-v] [-R] [-k [-i|-t keytab_file]] [-c cachename] 
        [-S service_name] [-T ticket_armor_cache]
        [-X [=]] [principal]

    options:
        -V verbose
        -l lifetime
        -s start time
        -r renewable lifetime
        -f forwardable
        -F not forwardable
        -p proxiable
        -P not proxiable
        -n anonymous
        -a include addresses
        -A do not include addresses
        -v validate
        -R renew
        -C canonicalize
        -E client is enterprise principal name
        -k use keytab
        -i use default client keytab (with -k)
        -t filename of keytab to use
        -c Kerberos 5 cache name
        -S service
        -T armor credential cache
        -X [=]

5.ktutil整合生成的keytab文件

[root@host150 ~]# cd /var/kerberos/krb5kdc
[root@host150 krb5kdc]ktutil
ktutil: rkt a.keytab
ktutil: rkt b.keytab
ktutil: wkt merged.keytab
ktutil: exit
[root@host150 krb5kdc]klist -ket  merged.keytab

附:
kerberos官网地址:https://web.mit.edu/kerberos/krb5-1.12/doc/user/user_commands/kinit.html
 

 

你可能感兴趣的:(BigData大数据相关)