Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。使用 Kerberos 时,一个客户端需要经过三个步骤来获取服务:
为此,Kerberos 需要 The Key Distribution Centers(KDC)来进行认证。KDC 只有一个 Master,可以带多个 slaves 机器。slaves 机器仅进行普通验证。Mater 上做的修改需要自动同步到 slaves。
另外,KDC 需要一个 admin,来进行日常的管理操作。这个 admin 可以通过远程或者本地方式登录。
Kerberos打算采用三台机器:host150、host151、host152三台机器,用root用户安装,host150安装kdc主机。
[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
在 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"
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]
同步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/
在 host150 上运行初始化数据库命令。其中 -r 指定对应 realm。
[root@host150 etc]# kdb5_util create -r NBDP.COM -s
注意:如果遇到数据库已经存在的提示,可以把 /var/kerberos/krb5kdc/ 目录下的 principal 的相关文件都删除掉。默认的数据库名字都是 principal。可以使用 -d 指定数据库名字。
[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
[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]:
[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"
创建一个名为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
抽取密钥并将其储存在本地 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]
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
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
[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