0


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 [ ! " 
   
  
logf​ileif[!"(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="slaved​atatrans.(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用户可读。

标签: hadoop

本文转载自: https://blog.csdn.net/sunxunyong/article/details/140098645
版权归原作者 sunxunyong 所有, 如有侵权,请联系我们删除。

“kerberos HA高可用部署方案详解”的评论:

还没有评论