KDC高可用方案
1、安装JCE
集群在开启Kerberos服务之前,必须在Ambari Server主机和其他所有主机上安装JCE
注意:
如果集群正在使用Oracle JDK,必须在集群所有主机上分发并安装JCE,在JCE安装完成后,切记要重启Ambari Server。
如果集群正在使用Open JDK,就可以不用安装JCE了。
在Ambari Server主机上,根据相应的JDK版本获取相应的JCE policy文件
For Oracle JDK 1.8:http://www.oracle.com/technetwork/java/javase/downloads/jce8 download2133166.html
For Oracle JDK 1.7:http://www.oracle.com/technetwork/java/javase/downloads/jce7 download432124.html
在Ambari Server和集群其它所有主机上,拷贝下载的unlimited security policy JCE jars到 $JAVA_HOME/jre/lib/security/目录下
重启Ambari Server。
2、配置hosts文件
注意:主机名建议全部小写,否则有可能导致后面做KDC主从出现问题。
在/etc/hosts中增加:两个kdc和vip 的ip主机名映射。
3、时钟同步
可以通过ntp实现。
yum install ntp
systemctl enable ntpd
开启时间同步(配置时钟源)
systemctl start ntpd
4、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
5、主备两节点安装KDC
注意: 此文档中使用的是root用户安装,生产环境需要创建kerberos用户,可以使用kerberos用户sudo安装。
yum -y install krb5-libs krb5-server krb5-workstation krb5-auth-dialog
6、配置主备krb5.conf
cat /etc/krb5.conf
[libdefaults]
票据失效后,"kinit ‐R"重新生效的有效期
renew_lifetime = 7d
forwardable = true
设置默认域
default_realm = HADOOP.COM
票据有效期,默认24小时
ticket_lifetime = 24h
dns_lookup_realm = false
dns_lookup_kdc = false
Ambari不支持此种缓存方式:default_ccache_name = KEYRING:persistent:%{uid}
但是这里不需要修改,和Ambari集成时会自动修改为"default_ccach e_name=/tmp/krb5cc_%{uid}"
default_ccache_name = /tmp/krb5cc_%{uid}
指定加密算法,系统版本或jdk版本不同时需要指定
#default_tgs_enctypes = aes des3-cbc-sha1 rc4 des-cbc-md5
#default_tkt_enctypes = aes des3-cbc-sha1 rc4 des-cbc-md5
[logging]
default = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
kdc = FILE:/var/log/krb5kdc.log
[realms]
HADOOP.COM = {
kdc = viphostname
admin_server = viphostname
kdc = host1
admin_server = host1
kdc = host2
admin_server = host2
default_domain = .HADOOP.COM
}
[domain_realm]
改成如下设置,和Ambari集成时,如果在页面不设置domain_realm,此处会被清空
.hadoop.com = HADOOP.COM
主备配置kdc.conf
cat /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
修改域名称为HADOOP.COM
HADOOP.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:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
7、主备配置kadm5.acl 保证admin权限
cat /var/kerberos/krb5kdc/kadm5.acl
修改域名称为HADOOP.COM
*/admin@HADOOP.COM *
注意修改kadm5.acl 需要重启kadmin
8、创建KDC数据库
注意:两边的master key要一致!!!
kdb5_util create ‐r HADOOP.COM ‐s
输出kdc database master key (例如:admin123)
9、启动主节点Kerberos服务
启动krb5kdc服务
systemctl start krb5kdc
启动kadmin服务
systemctl start kadmin
systemctl status krb5kdc
systemctl status kadmin
systemctl enable krb5kdc
systemctl enable kadmin
10、创建Kerberos数据库的管理员账户
注意两边密码一致(例如:admin@123)
kadmin.local ‐q "addprinc admin/admin"
关于kerberos的管理,可以使用kadmin.local或kadmin,至于使用哪个,取决于账户和访问权限:
1.如果有访问kdc服务器的root权限,但是没有kerberosadmin账户,使用kadmin.local
2.如果没有访问kdc服务器的root权限,但是用kerberosadmin账户,使用kadmina
11、在主KDC节点创建host keytab
kadmin.local
创建principal
kadmin: addprinc ‐randkey host/viphostname@HADOOP.COM
把principal添加到/etc/krb5.keytab文件
kadmin: ktadd host/viphostname@HADOOP.COM
创建principal
kadmin: addprinc ‐randkey host/host1@HADOOP.COM
把principal添加到/etc/krb5.keytab文件
kadmin: ktadd host/host1@HADOOP.COM
创建principal
kadmin: addprinc ‐randkey host/host2@HADOOP.COM
把principal添加到/etc/krb5.keytab文件
kadmin: ktadd host/host2@HADOOP.COM
创建principal
kadmin: addprinc ‐randkey kadmin/viphostname@HADOOP.COM
把principal添加到/etc/krb5.keytab文件
kadmin: ktadd kadmin/viphostname@HADOOP.COM
kadmin.local -q "listprincs" | grep kadmin
12、复制主KDC节点stash file和host principal keytab的文件到从节点
stash file文件以".k5"开头,是个隐藏文件 /var/kerberos/krb5kdc/.k5.HADOOP.COM
包含host principal的keytab文件是 /etc/krb5.keytab
13、从KDC节点启动kpropd(Kerberos Propagation daemon)服务(互为从节点都要配置)
在从KDC节点创建/var/kerberos/krb5kdc/kpropdd.acl配置
cat /var/kerberos/krb5kdc/kpropdd.acl
host/viphostname@HADOOP.COM
host/host1@HADOOP.COM
host/host2@HADOOP.COM
注意: 默认情况下,kpropd进程读取的是/var/kerberos/krb5kdc/kpropd.acl配置文件,
但是如果存在这个配置文件,kadmin服务就不允许被启动,所以这里修改文件名为kpropdd.acl,并在启动kpropd时指定配置文件.
kpropd ‐S ‐a /var/kerberos/krb5kdc/kpropdd.acl
ps ‐ef | grep kpropd
14、启动备节点Kerberos服务
启动krb5kdc服务
systemctl start krb5kdc
启动kadmin服务
systemctl start kadmin
systemctl status krb5kdc
systemctl status kadmin
systemctl enable krb5kdc
systemctl enable kadmin
15、部署监控定时任务
crontab -l
-
-
-
-
- /usr/sbin/kdcsync.sh &>/dev/null
-
-
-
监控脚本:/usr/sbin/kdcsync.sh
#!/bin/sh
#日志函数
log_file='/var/log/kdcsync_'$(date +"%Y-%m-%d")'.log'
function write_log()
{
now_time='['$(date +"%Y-%m-%d %H:%M:%S")']'
echo ${now_time} $1 | tee -a ${log_file}
}
write_log '####################################################'
write_log 'kdc sync started' 'The log is writed to ' l o g f i l e i f [ ! " {log_file} if [ ! " logfileif[!"(ip a |grep vip)" ]; then
write_log "NOT VIP NODE,EXIT!!!"
write_log '####################################################'
exit -1
else
write_log "VIP NODE,SYNC!!!"
#vip所在节点认为时主节点,执行全量dump,并推送给备节点。
#自定义变量初始化,主备两个节点配置不同。
export slave="10.174.29.54"
export timeline= ( d a t e + e x p o r t w o r k d i r = " / t m p / k e r b e r o s / k r b 5 k d c " e x p o r t d u m p f i l e = " s l a v e d a t a t r a n s . (date +%Y%m%d_%H%M_%s) export workdir="/tmp/kerberos/krb5kdc" export dumpfile="slave_datatrans. (date+exportworkdir="/tmp/kerberos/krb5kdc"exportdumpfile="slavedatatrans.(date +%Y%m%d_%H%M_%s).out"
#进入工作临时目录
mkdir -p ${workdir}
cd ${workdir} || exit -3
#如果发现存在dump文件未完成同步推送,则退出需要手动干预
if ls ${workdir}/*.out 2>/dev/null ;
then
write_log 'error :do nothing'
write_log '####################################################'
exit -1
fi
#导出数据dump文件,并判断.dump_ok是否存在以确定是否dump数据成功
/usr/sbin/kdb5_util dump ${dumpfile}
if [ ! -f ${dumpfile}.dump_ok ] ;
then
write_log 'error : fail to dump'
exit -2
fi
#对比最后一次成功同步的dump文件,若数据一致,则不执行导出操作,并删除本次dump的相关文件
lastdumpfile=KaTeX parse error: Expected '}', got 'EOF' at end of input: ... '{printf "%s",NF}')
if [ "X" != "X l a s t d u m p f i l e " ] ; t h e n i f [ " X {lastdumpfile}"] ; then if [ "X lastdumpfile"];thenif["X(sha256sum ${lastdumpfile} | awk '{printf "%s",KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲')" = "X(sha256sum ${dumpfile} | awk '{printf "%s",KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲')" ] ; ...{log_file}
rm -f ${dumpfile} ${dumpfile}.dump_ok
exit 0
fi
fi
#将dump数据文件,推送load至从服务器,成功后将文件重命名为.done后缀文件
for kdc in ${kdclist}
do
/usr/sbin/kprop -f ${dumpfile} ${kdc} && mv ${dumpfile} ${dumpfile}.done
write_log "kprop sync completed."
done
write_log '####################################################'
fi
16、Keepalived配置
设计原理:
kdc die --> keepalived 一定要die,这保证了kdc挂掉后vip一定会发生切换。
kdc启动 --> keepalived 启动,这保证kdc恢复后vip可以切到这台机器。
但是不能立即切换,需保证数据同步后才具备切换条件切换。
所以priority两台主机设置同一值,并且使用nopreempt设置不抢占。
切换场景:
kdc服务挂掉由keepalived check server实现vip切换。
网络断掉由keepalived超时实现vip切换
####################################
A主机keepalived 配置:
#vi /etc/keepalived/keepalived.conf
global_defs {
notification_email {
}
}
vrrp_instance PX_KDC {
state BACKUP #指定keepalived节点的初始状态,可选值为MASTER|BACKUP
interface bond1 #VRRP实例绑定的网卡接口,用户发送VRRP包
virtual_router_id 50 #虚拟路由的ID,同一集群要一致。
priority 100 #定义优先级,按优先级来决定主备角色,优先级越大越优先.为保证不会vip频发切换,两边设置一样的值。
nopreempt #设置不抢占,保证不会vip频发切换设置。
advert_int 1 #主备通讯时间间隔,默认1s
authentication { #配置认证
auth_type PASS #认证方式,此处为密码
auth_pass password123 #同一集群中的keepalived配置里的此处必须一致,推荐使用8位随机数
}
virtual_ipaddress { #配置要使用的VIP地址
@@@29.10
}
}
virtual_server @@@29.10 88 { #配置虚拟服务器
delay_loop 3 #健康检查的时间间隔
#lb_algo rr #LVS调度算法rr|wrr|lc|wlc|lblc|sh|dh,用不到,我们就关闭了
#lb_kind DR #就是这项导致上述的现象,LVS模式模式NAT|DR|TUN,如果不关闭,备用服务器不能通过VIP连接主MySQL,建议mysql节点与ambarisever节点分开。
persistence_timeout 9600 #会话保持时间(秒为单位),即以用户在120秒内被分配到同一个后端realserver
protocol TCP #4层协议
real_server @@@1.4 88 { #定义真实处理请求的服务器
notify_down /usr/sbin/stop_keepalived.sh #检查服务器失败(down)后,要执行的脚本
weight 1 #给每台的权重,0表示失效(不知给他转发请求知道他恢复正常),默认是1
TCP_CHECK { #健康检查方式
connect_timeout 10 #连接超时时间
connect_port 88 #监控检查的端口
nb_get_retry 3 #重连次数
delay_before_retry 2 #重连间隔
}
}
}
B主机keepalived 配置:
#vi /etc/keepalived/keepalived.conf
global_defs {
notification_email {
}
}
vrrp_instance PX_KDC {
state BACKUP
interface bond1
virtual_router_id 50
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass password123
}
virtual_ipaddress {
@@@29.10
}
}
virtual_server @@@29.10 88 {
delay_loop 3
persistence_timeout 9600
protocol TCP
real_server @@@1.5 88 {
notify_down /usr/sbin/stop_keepalived.sh
weight 1
TCP_CHECK {
connect_timeout 10
connect_port 88
nb_get_retry 3
delay_before_retry 2
}
}
}
####################################
cat /usr/sbin/stop_keepalived.sh
#!/bin/sh
sleep 3 #等3秒后执行下一条
systemctl stop keepalived
####################################
keepalived自监控:
crontab -l
##start keepalived if KDC started.
-
-
-
-
- /usr/sbin/start_keepalived.sh &>/dev/null
-
-
-
cat /usr/sbin/start_keepalived.sh
#!/bin/sh
#start keepalived if KDC started.
if [ $(systemctl status krb5kdc|grep -c "active (running)") -eq 1 ];
then
if [ $(systemctl status keepalived.service|grep -c "active (running)") -eq 0 ];
then
systemctl start keepalived
fi
fi
17、AmbariUI开启Kerberos
1、/etc/hosts增加vip并配置主机名,分发所有节点
2、kdc hosts 配置为vip主机名
3、kadmin.local(原kadmin hosts)不能填写IP,必须为主机名!!!
kinit -R
报错: "KDC can't fulfill requested option while renewing credentials"
KDC 服务端日志/var/log/krb5kdc.log。
Sep 26 16:14:24 host******-16 krb5kdc15615: TGS_REQ (8 etypes {18 17 20 19 16 23 25 26}) 10.19.28.16: TICKET NOT RENEWABLE: authtime 0, ocdp/host-10-19-28-16@HADOOP.COM for krbtgt/HADOOP.COM@HADOOP.COM, KDC can't fulfill requested option
服务端配置文件 /var/kerberos/krb5kdc/kdc.conf
[realms]
HADOOP.COM = {
max_life = 25h
max_renewable_life = 7d
服务端配置文件 /etc/krb5.conf
[libdefaults]
renew_lifetime = 7d
ticket_lifetime = 24h
服务端更过或确认上述两个 principal 的参数 maxrenewlife
kadmin.local -q "getprinc test2/host-*********-16@HADOOP.COM" | grep -i life
kadmin.local -q "modprinc -maxrenewlife 7d +allow_renewable test2/host-10-19-28-16@HADOOP.COM"
kadmin.local -q "getprinc krbtgt/HADOOP.COM@HADOOP.COM" | grep -i life
kadmin.local -q "modprinc -maxrenewlife 7d +allow_renewable krbtgt/HADOOP.COM@HADOOP.COM"
上述配置修改或确认完毕后,还需要重新登录以生成新的 ticket,后续的 kinit -R 命令才能成功执行;
新建principal:
add_principal -pw "1qaz" test/test@HADOOP.COM
xst -k test.keytab -norandkey test/test@HADOOP.COM
注意:renew修改成功的在klist会提示renew until ...(即在次日期之前可以使用 kinit -R 刷新ticket)
tgt生命周期:
1、当 ticket lifetime 结束时,该 ticket 将不再可用。
2、如果 renewable lifetime > ticket lifetime ,那么在票据生命周期内都可以其进行续期,直到达到可再生周期的上限。
3、当时间达到 renewable lifetime 后,ticket lifetime结束后将不能继续续期,续期时将会报错 KDC can't fulfill requested option while renewing credentials,之后需要重新申请新的 ticket。
kdb5_util dump
kdb5_util load
kprop -f
kprop: Decrypt integrity check failed while getting initial credentials
追踪kerberos命令执行:
env KRB5_TRACE=/dev/stdout kprop -f ${dumpfile} ${kdc}
kprop 同步需要验证slave的host/replica.name。
需要保证主备节点的host/replica.name密码一致,
并且通过ktadd把principal添加到/etc/krb5.keytab文件中,主备节点同步。
手动更新数据库要注意避免更新krb5.keytab中涉及的principal和admin的principal。
kprop执行逻辑:
kprop begins by getting Kerberos
credentials for the host principal of the replica KDC, and this step is
failing. You can simulate this step with "kinit -k host/replica.name"
to try to isolate the problem.
env KRB5_CONFIG=/path/to/custom/krb5.conf kinit
/etc/krb5.conf
/var/kerberos/krb5kdc/kdc.conf
/var/kerberos/krb5kdc/kadm5.acl
/var/kerberos/krb5kdc/.k5.EXAMPLE.COM # master key stash fil
/etc/krb5.keytab
krb5 client默认使用的密钥表文件为/etc/krb5.keytab(可以通过配置文件/etc/krb5.conf中 [libdefaults] 的 default_keytab_name配置项修改),
kerberos认证的服务程序默认都会到/etc/下找krb5.keytab。域内的所有主机都需要 krb5.keytab 文件。它是KDC身份验证过程的一部分。
默认情况下,它允许对其主机的无限制访问,并且只有root用户可读。