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

相关推荐
天才的白鸟9 分钟前
hive内置函数
数据仓库·hive·hadoop
天才的白鸟12 分钟前
hive的表操作
数据仓库·hive·hadoop
NingKangMing14 小时前
Apache Hadoop文件上传、下载、分布式计算案例初体验
大数据·hadoop·apache
球场程序员15 小时前
多租户hive数仓
数据仓库·hive·hadoop
我非夏日15 小时前
基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建Flume大数据开发环境---任务14:Flume安装部署
大数据·hadoop·flume·大数据技术开发
我非夏日16 小时前
基于Hadoop平台的电信客服数据的处理与分析④项目实现:任务17:数据分析
大数据·hadoop·数据挖掘·数据分析·大数据技术开发
小伍_Five18 小时前
构建大数据生态:Sqoop、Hadoop、IDEA和Maven的完整安装与数据预处理指南【实训Day03】
大数据·服务器·hadoop·maven·intellij-idea·预处理·sqoop
sodaloveer20 小时前
【Linux】—Hadoop运行环境搭建(完全分布式)
linux·hadoop·分布式
atwdy1 天前
【hive】数据采样
数据仓库·hive·hadoop·数据采样
我非夏日1 天前
基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务8:测试Hadoop集群的可用性
大数据·hadoop·分布式