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

相关推荐
万能小锦鲤15 小时前
《大数据技术原理与应用》实验报告三 熟悉HBase常用操作
java·hadoop·eclipse·hbase·shell·vmware·实验报告
王小王-1231 天前
基于Hadoop与LightFM的美妆推荐系统设计与实现
大数据·hive·hadoop·大数据美妆推荐系统·美妆商品用户行为·美妆电商
一切顺势而行1 天前
hadoop 集群问题处理
大数据·hadoop·分布式
万能小锦鲤2 天前
《大数据技术原理与应用》实验报告七 熟悉 Spark 初级编程实践
hive·hadoop·ubuntu·flink·spark·vmware·实验报告
项目題供诗2 天前
Hadoop(二)
大数据·hadoop·分布式
万能小锦鲤2 天前
《大数据技术原理与应用》实验报告五 熟悉 Hive 的基本操作
hive·hadoop·ubuntu·eclipse·vmware·实验报告·hiveql
随心............3 天前
hive的相关的优化
数据仓库·hive·hadoop
万能小锦鲤3 天前
《大数据技术原理与应用》实验报告一 熟悉常用的Linux操作和Hadoop操作
大数据·linux·hadoop·ubuntu·vmware·实验报告·大数据技术原理与应用
码字的字节3 天前
深入解析Hadoop中的HDFS架构设计
大数据·hadoop·hdfs
码字的字节3 天前
深入探讨Hadoop YARN Federation:架构设计与实践应用
hadoop·yarn·federation