当前位置: 首页 > news >正文

kerberos HA高可用部署方案详解

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­ download­2133166.html
For Oracle JDK 1.7:http://www.oracle.com/technetwork/java/javase/downloads/jce­7­ download­432124.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
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|BACKUPinterface bond1 #VRRP实例绑定的网卡接口,用户发送VRRP包virtual_router_id 50 #虚拟路由的ID,同一集群要一致。priority 100 #定义优先级,按优先级来决定主备角色,优先级越大越优先.为保证不会vip频发切换,两边设置一样的值。nopreempt #设置不抢占,保证不会vip频发切换设置。advert_int 1 #主备通讯时间间隔,默认1sauthentication { #配置认证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秒内被分配到同一个后端realserverprotocol TCP #4层协议real_server @@@1.4 88 { #定义真实处理请求的服务器notify_down /usr/sbin/stop_keepalived.sh #检查服务器失败(down)后,要执行的脚本weight 1  #给每台的权重,0表示失效(不知给他转发请求知道他恢复正常),默认是1TCP_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 bond1virtual_router_id 50priority 100nopreemptadvert_int 1authentication {auth_type PASSauth_pass password123}virtual_ipaddress {@@@29.10}
}virtual_server @@@29.10 88 {delay_loop 3persistence_timeout 9600protocol TCPreal_server @@@1.5 88 {notify_down /usr/sbin/stop_keepalived.shweight 1TCP_CHECK {connect_timeout 10connect_port    88nb_get_retry    3delay_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用户可读。

相关文章:

  • 【鸿蒙学习笔记】页面和自定义组件生命周期
  • 使用Swoole开发高性能的Web爬虫
  • docker-compose搭建prometheus、grafana
  • React@16.x(43)路由v5.x(8)常见应用场景(5)- 滚动条复位
  • 0702_ARM6
  • 中国民间网络外交组织(CCND)
  • 【C++进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫
  • (PADS学习)第二章:原理图绘制 第一部分
  • [开源软件] 支持链接汇总
  • VS2019中解决方案里的所有项目都是 <不同选项> 的解决方案
  • 重温react-06(初识函数组件和快速生成格式的插件使用方式)
  • AcWing 1256:扩展二叉树
  • C++ ariac2 Windows库编译
  • 【Node-RED 4.0.2】4.0版本新增特性(官方版)
  • 智能洗车管理系统设计
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 5、React组件事件详解
  • JavaScript 基础知识 - 入门篇(一)
  • JS 面试题总结
  • Markdown 语法简单说明
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Redis中的lru算法实现
  • Vue组件定义
  • Vultr 教程目录
  • 工作中总结前端开发流程--vue项目
  • 记一次用 NodeJs 实现模拟登录的思路
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 十年未变!安全,谁之责?(下)
  • 微信支付JSAPI,实测!终极方案
  • Prometheus VS InfluxDB
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # include “ “ 和 # include < >两者的区别
  • (3) cmake编译多个cpp文件
  • (arch)linux 转换文件编码格式
  • (HAL库版)freeRTOS移植STMF103
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)VC++中ondraw在什么时候调用的
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .gitignore文件_Git:.gitignore
  • .NET Core中Emit的使用
  • .Net Winform开发笔记(一)
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 直连SAP HANA数据库
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .Net面试题4
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)