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|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用户可读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/765787.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统之 — 线程

Linux系统之 — 线程 线程介绍线程使用死锁(Deadlock)竞态条件(Race Condition) 线程使用示例服务器端代码示例服务器端示例拆解1. 引入头文件和宏定义2. 定义全局变量3. 定义线程函数4. 主函数5. 错误处理和资源释放 客户端代码示…

Keil5 ST-LINK setting闪退问题解决

1. 官网下载新版驱动文件 MDK uVision crashes when using ST-Link debugger 2. 解压替换 STLinkUSBDriver6.1.2.0Signed 我的库文件目录: D:\Tool\Keil5\ARM\STLink

一文搞懂 java 线程池:ThreadPoolExecutor 和 FixedThreadPool 原理

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

Linux——shell原理和文件权限

1.shell原理 在我们使用云服务器时,需要通过shell进行使用,而shell则是一种外壳程序。 我们提到过,大部分的指令实际上就是文件,当用户需要执行某种功能时,由于用户不擅长和操作系统直接交互(操作复杂&…

k8s部署单机版mysql8

一、创建命名空间 # cat mysql8-namespace.yaml apiVersion: v1 kind: Namespace metadata:name: mysql8labels:name: mysql8# kubectl apply -f mysql8-namespace.yaml namespace/mysql8 created# kubectl get ns|grep mysql8 mysql8 Active 8s二、创建mysql配…

论文学习——使用基于多项式拟合的预测算法求解动态多目标问题

论文题目:Solving dynamic multi-objective problems using polynomial fitting-based prediction algorithm 使用基于多项式拟合的预测算法求解动态多目标问题(Qingyang Zhang , Xiangyu He,Shengxiang Yang , Yongquan Dong , Hui Song , Shouyong Ji…

配置WLAN 示例

规格 仅AR129CVW、AR129CGVW-L、AR109W、AR109GW-L、AR161W、AR161EW、AR161FGW-L、AR161FW、AR169FVW、AR169JFVW-4B4S、AR169JFVW-2S、AR169EGW-L、AR169EW、AR169FGW-L、AR169W-P-M9、AR1220EVW和AR301W支持WLAN-FAT AP功能。 组网需求 如图1所示,企业使用WLAN…

JDeveloper 12C 官网下载教程

首先、我们要登录Oracle官网 Oracle 甲骨文中国 | 云应用和云平台 登录进去如果不是中文可以点击右上角带有国旗的图标就行更改,选择一个你能看懂的文字。 然后,点击“资源”—点击“开发人员下载” 然后,点击“开发工具” 这里有很多工具可…

【设计模式】【行为型模式】【责任链模式】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录…

Python协作运动机器人刚体力学解耦模型

🎯要点 🎯腿式或固定式机器人模型 | 🎯网格、点云和体素网格碰撞检测 | 🎯正反向运动学和动力学 | 🎯机器人刚体力学计算 | 🎯编辑参考系姿势和路径 | 🎯软件接口实体机器人模拟 | &#x1f3a…

奇葩公司又发微博了,网友表示“乐”

多益网络 近日,多益网络官方微博发帖,公然表示对法院仲裁结果不服,认为劳动法有极多问题。 大家不要看微博内容似乎振振有词,极有可能只是多益网络单方面的选择性表达,毕竟多益网络的臭名早就家喻户晓。 况且对前员工直…

车载资料分享中:硬件在环、canoe、UDS诊断、OTA升级、TBOX测试

每日直播时间: 周一到周五:20:00-23:00 周六与周日:9:00-17:00 直播内容:(车厂一比一测试) HIL(硬件在环)测试、UDS功能诊断、UDS自动…

一首歌的时间 写成永远

大家好,我是秋意零。 就在,2024年6月20日。我本科毕业了,之前专科毕业挺有感触,也写了一篇文章进行记录。如今又毕业了,还是写一篇文章记录吧!! 专科毕业总结:大学三年总结&#xf…

使用ElementUI组件库

引入ElementUI组件库 1.安装插件 npm i element-ui -S 2.引入组件库 import ElementUI from element-ui; 3.引入全部样式 import element-ui/lib/theme-chalk/index.css; 4.使用 Vue.use(ElementUI); 5.在官网寻找所需样式 饿了么组件官网 我这里以button为例 6.在组件中使用…

利用深度学习模型进行语音障碍自动评估

语音的产生涉及器官的复杂协调,因此,语音包含了有关身体各个方面的信息,从认知状态和心理状态到呼吸条件。近十年来,研究者致力于发现和利用语音生物标志物——即与特定疾病相关的语音特征,用于诊断。随着人工智能&…

电信NR零流量小区处理

【摘要】随着目前网络建设逐步完善,5G用户的不断发展,针对零流量小区的分析及处理存在着必要性,零流量小区的出现既是用户分布及行为的直观体现,也是发展用户的一个指引,同时也能发现设备的一些故障。一个站点的能够带…

飞书API 2-3:如何使用 API 创建数据表,解放人工?

一、引入 作为飞书多维表的深度使用者,经常需要将一些数据库的数据同步到多维表上,在数据写入之前,一般需要新建数据表和字段。当通过网页端界面新建字段时,如果字段少,还能接受手动一个个创建,不过一旦字…

C++字体库开发

建议根据字体需求,多个组合使用。高度定制可基于freeTypeharfbuzz基础库完成。 GitHub - GNOME/pango: Read-only mirror of https://gitlab.gnome.org/GNOME/pango GitHub - googlefonts/fontview: Demo app that displays fonts with a free/libre/open-source …

更好的方法_交叉观察器API

交叉观察器(Intersection Observer)API 是一个强大的工具,可以用来检测元素是否进入视口或从视口移出。我们可以利用这个 API 来实现粘贴式导航(也称为粘性导航),即在用户滚动页面时,导航栏会在…

方法的用法

一.简介 目前为止我给出的所有的案例都是将代码放在main方法中,就会产生一些问题: 代码冗长,不利于维护变量过多,想不出那么多的变量名没有重用性 那么该如何解决呢? 我们可以编写功能性的代码块,来被ma…