安装配置 Kerberos
Kerberos 简介
Kerberos
是一款用于非安全环境下的身份认证协议,它通过对称密钥加密方式向网络服务证明用户身份。
术语
- AS(Authentication Server)= 认证服务器
- KDC(Key Distribution Center)= 密钥分发中心
- TGT(Ticket Granting Ticket)= 票据授权票据,票据的票据
- TGS(Ticket Granting Server)= 票据授权服务器
- SS(Service Server)= 特定服务提供端
运行环境
三台 CentOS 7.5 虚拟机
- server1 192.168.78.101 ( Master KDC Server )
- server2 192.168.78.102 ( Client )
- server3 192.168.78.103 ( Client )
Java 版本
- JDK 1.8.0_181
安装配置
安装配置 Kerberos Server
- 确保时钟同步和 DNS 解析
留意时钟同步问题,如果 server 与 client 之间时间相差过大(默认是 5 分钟),会导致 client 无法完成认证工作。这可以防止攻击者使用过期的 ticket 伪装成合法用户实施攻击。
开启时钟同步:
[root@server1 ~]# timedatectl set-timezone Asia/Shanghai # 设置时区
[root@server1 ~]# timedatectl set-ntp yes # 开启时钟同步
[root@server1 ~]# timedatectl # 查看时钟同步
- 安装 Kerberos Server
[root@server1 ~]# yum install krb5-server krb5-libs krb5-auth-dialog
出于安全考虑,最好将 KDC Server 安装在专门的机器上,并且这台机器不再运行其他服务。另外,由于 KDC Server 是个单点,当压力较大时也要务必保证这台机器的带宽和性能。(目前用于 DEV 环境,故没那么多讲究)
- 配置 realm name 和 domain-to-realm 映射
编辑 /etc/krb5.conf
,主要是将 EXAMPLE.COM 替换为自定义的 Realm Name,如我们此处将其定义为 DATACENTER.COM,并将 example.com 替换为对应的服务器域名,比如我们此处设置为 server1 。按照约定,Realm Name 均为大写,主机名和域名均为小写。
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
default_realm = DATACENTER.COM
default_ccache_name = KEYRING:persistent:%{uid}
# udp_preference_limit = 1
[realms]
DATACENTER.COM = {
kdc = server1
admin_server = server1
}
[domain_realm]
.datacenter.com = DATACENTER.COM
datacenter.com = DATACENTER.COM
编辑 /var/kerberos/krb5kdc/kdc.conf
,将 EXAMPLE.COM 替换为自定义的 *DATACENTER.COM。此处我们禁用了 AED-256
加密,如果启用的话,需要下载 JCE
(如对应 Java 1.8 版本)文件,并替换 $JAVA_HOME/jre/lib/security
目录下的 JAR 包。
[root@server1 ~]# vi
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
DATACENTER.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
# 移除 aes256-cts:normal
supported_enctypes = 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
}
- 使用
kdb5_util
创建数据库
[root@server1 ~]# /usr/sbin/kdb5_util create -s
create
创建存储 Kerberos
realm 的数据库,-s
参数创建一个 存储主服务器 key 的stash
文件,如果后面没有指定文件,则 Kerberos
会提示输入密码。
- 编辑 Kerberos ACL
编辑 /var/kerberos/krb5kdc/kadm5.acl
,该文件用于 kadmind
确定哪个 principal
具有访问 Kerberos 数据库的权限,以及具有何种访问级别。可设置为如下:
*/[email protected] *
大多数用户在 Kerberos 数据库中都表示为单个的 principal
(不带 instance,如 [email protected]);但像 root/[email protected] 这样,拥有第二个 principal
且为 admin 的 instance 的用户将能对 Kerberos 数据库行使所有管理权操作。
- 在 KDC 终端创建第一个
principal
[root@server1 ~]# /usr/sbin/kadmin.local -q "addprinc root/admin"
- 开启 Kerberos 服务
[root@server1 ~]# systemctl start krb5kdc # 开启服务
[root@server1 ~]# systemctl start kadmin
[root@server1 ~]# systemctl enable krb5kdc # 开机启动
[root@server1 ~]# systemctl enable kadmin
- 命令行方式添加
pincipal
kadmin.local: ank -randkey [email protected]
kadmin.local
和 kamdin
是操作 KDC 的命令行接口,可以用来查看、添加和删除 principal
等。 kadmin.local
只能用于 KDC 本地,无需输入密码; kamdin
可用于客户端,需输入密码。
- 验证
使用 kinit
获取 ticket
并存入证明缓存文件中,然后使用 klist
查看,或使用 kdestroy
销毁缓存和证明。
[root@server1 ~]# kinit root/[email protected]
[root@server1 ~]# klist
安装配置 Kerberos Client
配置 Kerberos Client 仅需要安装 client 包,并为每台 Client 提供 krb5.conf
配置文件。
- 确保时钟同步和域名解析
- 在每台 Client 安装
krb5-libs
和krb5-workstation
[root@server2 ~]# yum install krb5-libs krb5-workstation
[root@server3 ~]# yum install krb5-libs krb5-workstation
- 为每台 client 提供
/etc/krb5.conf
文件与 KDC Server 保持一直就可以了,如果服务期间启用了 SSH 登陆,可以使用 scp
命令传输;不然也可以手动拷贝或其他方式。
[root@server1 ~]# scp /etc/krb5.conf root@server2:/etc/krb5.conf
[root@server1 ~]# scp /etc/krb5.conf root@server3:/etc/krb5.conf
- 为每台 Client 创建自己的
principal
(可选)
如果使用了 Kerberos 提供的 sshd
, kshd
和 klogind
等命令,在使用前需要首先为每台 Client 创建自己的 principal
。其中 instance
是主机 hostname
, -randkey
表示生成随机 key。
kadmin: ank -randkey host/[email protected] # 创建 host/server1 principal,server2/server3 同理
kadmin: xst -k /etc/security/keytabs/host.keytab host/[email protected] # 添加 host/server1 principal 至 host.keytab,server2/server3 同理
- 验证每台 Client 的
principal
可用 (可选)
[root@server2 ~]# klist -kt /etc/security/keytabs/host.keytab
[root@server2 ~]# kinit -kt /etc/security/keytabs/host.keytab root/[email protected]
[root@server2 ~]# kadmin -p root/admin -q "getprincs" # 如果是 admin,且非随机密码,可使用密码验证