KDC-Server 的部署指南

Kerberos概述

Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份,协议基于对称密码学,并需要一个值得信赖的第三方(KDC)。它主要包含:认证服务器(AS)和票据授权服务器(TGS)组成的密钥分发中心(KDC),以及提供特定服务的SS。相关概念描述:

  • AS(Authentication Server)= 认证服务器
  • KDC(Key Distribution Center)= 密钥分发中心
  • TGT(Ticket Granting Ticket)= 授权票据
  • TGS(Ticket Granting Server)= 票据授权服务器
  • SS(Service Server)= 特定服务提供端

KDC持有一个密钥数据库;每个网络实体——无论是客户还是服务器——共享一套只有他自己和KDC知道的密钥。密钥的内容用于证明实体的身份。对于两个实体间的通信,KDC产生一个会话密钥,用来加密他们之间的交互信息。

例如 Hadoop使用Kerberos实现认证的流程简要描述如下:

步骤 Kerberos认证与授权阶段 备注说明
1 [Login] 用户输入用户名/密码信息进行登录 Client端完成对密码信息的单向加密
2 [Client/AS] Client到AS进行认证,获取TGT 基于JAAS进行认证
3 [Client/TGS] Client基于TGT以及Client/TGS Session Key去TGS去获取Service Ticket(Client-To-Server Ticket) 基于GSS-API进行交互
4 [Client/Server] Client基于 Client-To-Server Ticket以及Client/Server SessionKey去Server端请求建立连接,该过程Client/Server可相互进行认证 基于GSS-API进行交互
5 [Client/Server] 连接建立之后,Client可正常往Server端发送服务请求 立连接与发送服务请求的过程,则通常基于SASL框架

Kerberos相关术语

  • principal :认证的主体,简单来说就是"用户名"。 格式: 服务/主机@域
  • realm:域,类似于namespace的作用,可以看成是principal的一个"容器"或者"空间"。 在kerberos, 大家都约定成俗用大写来命名realm, 比如"EXAMPLE.COM"
  • keytab文件:存储了多个principal的加密密码文件

Kerberos 工作原理

image

Kerberos的安装部署

KDC-Server 服务端

登陆OPS节点,进入/data/Playbook-Performance-Test工作目录,执行如下命令完成KDC-Server安装部署:

ansible-playbook  todo/init_kdc_master -D

KDC-Server 配置过程参考

登陆kdc-master-1节点,执行操作

  1. /var/kerberos/krb5kdc/kdc.conf 将 [realms] 配置项改为 HADOOP.COM (可以根据需要自定义)
  2. /var/kerberos/krb5kdc/kadm5.acl 修改为 ***/admin@HADOOP.COM**** ***

第一列为用户名,第二列为权限分配, /admin@HADOOP.COM 结尾的用户,UNP可以执行任何操作

  1. /etc/krb5.conf
    1. [libdefaults] 配置项添加如下配置 default_realm = HADOOP.COM
    2. [realms] 配置项,修改如下部分
[realms]
 HADOOP.COM = {
  kdc = kdc-master-1:88          
  admin_server = kdc-master-1:749
  default_domain = HADOOP.COM
 }

 [domain_realm]
 .hadoop.com = HADOOP.COM
 hadoop.com = HADOOP.COM

  • 端口88 KDC使用默认使用
  • 端口749 标识运行管理服务器的主机,在集群模式,通常这是主Kerberos服务器。必须为此标签赋予一个值,以便与该领域的kadmind服务器通信

KDC-Server 的初始化

登陆kdc-master-1节点,执行操作

  1. 启动 KDC 服务,执行命令: systemctl start krb5kdc
  2. 初始化KDC数据库
    1. 执行命令: kdb5_util create -r ****HADOOP.COM**** -s
    2. 输入并确认 KDC database master key 后将在/var/kerberos/krb5kdc/目录下生成多个principal*文件
  3. 在 KDC 服务器上添加超级管理员账户,和对应的keytab,执行命令:
 kadmin.local -q "addprinc admin/admin@HADOOP.COM"
 kadmin.local -q "ktadd -k /var/kerberos/krb5kdc/kadm5.keytabadmin/admin@HADOOP.COM"

KDC-Server 服务验证

登陆kdc-master-1节点,执行命令: kinit admin/admin 输入密码,执行 klist 将返回如下结果:

image

Kerberos客户端

客户端需要安装软件包 krb5-workstation

  1. 客户端配置文件: /etc/krb5.conf
  2. 提供客户端命令: klist kinit

Kerberos支持两种认证模式,

  1. 一种是使用principal + Password: 适合用户进行交互式应用,例如hadoop fs -ls 这种
  2. 一种使用principal + keytab : 适合服务,例如yarn的rm、nm等。principal + keytab就类似于ssh免密码登录,登录时不需要密码了。

用于 HDFS服务 客户端组件 /etc/krb5.conf 参考(默认禁用了aes256-cts,JAVA应用支持不好,需要引入第三方jar包)

includedir /etc/krb5.conf.d/

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
 default_realm = HADOOP.COM
 default_ccache_name = KEYRING:persistent:%{uid}
 default_tkt_enctypes = aes128-cts-hmac-sha1-96 des3-cbc-sha1 arcfour-hmac-md5 camellia256-cts-cmac camellia128-cts-cmac des-cbc-crc des-cbc-md5 des-cbc-md4
 default_tgs_enctypes = aes128-cts-hmac-sha1-96 des3-cbc-sha1 arcfour-hmac-md5 camellia256-cts-cmac camellia128-cts-cmac des-cbc-crc des-cbc-md5 des-cbc-md4
 permitted_enctypes = aes128-cts-hmac-sha1-96 des3-cbc-sha1 arcfour-hmac-md5 camellia256-cts-cmac camellia128-cts-cmac des-cbc-crc des-cbc-md5 des-cbc-md4

[realms]
 HADOOP.COM = {
  kdc = kdc-master-1.hadoop.com:88
  admin_server = kdc-master-1.hadoop.com:749
  default_domain = HADOOP.COM
 }

 [domain_realm]
 .hadoop.com = HADOOP.COM
 hadoop.com = HADOOP.COM

Kerberos的运维管理

管理 principal

登陆kdc-master-1节点,执行命令:


kadmin.local -q "addprinc -randkey hdfs/hdfs-namenode-1.hadoop.com@HADOOP.COM"
kadmin.local -q "addprinc -randkey http/hdfs-namenode-1.hadoop.com@HADOOP.COM"
kadmin.local -q "addprinc -randkey hdfs/hdfs-datanode-1.hadoop.com@HADOOP.COM"
kadmin.local -q "addprinc -randkey hdfs/hdfs-datanode-2.hadoop.com@HADOOP.COM"
kadmin.local -q "addprinc -randkey hdfs/hdfs-datanode-3.hadoop.com@HADOOP.COM"

kadmin.local -q "ktadd -norandkey -kt hdfs-namenode.keytab  hdfs/hdfs-namenode-1.hadoop.com@HADOOP.COM"
kadmin.local -q "ktadd -norandkey -kt http-namenode.keytab  http/hdfs-namenode-1.hadoop.com@HADOOP.COM"
kadmin.local -q "ktadd -norandkey -kt hdfs-datanode.keytab  hdfs/hdfs-datanode-1.hadoop.com@HADOOP.COM hdfs/hdfs-datanode-2.hadoop.com@HADOOP.COM hdfs/hdfs-datanode-3.hadoop.com@HADOOP.COM"

客户端验证

klist -k -e -t xxx. keytab

通过提供keytab获取ticket: kinit -kt xxx. keytab

http://www.microhowto.info/howto/create_a_host_principal_using_mit_kerberos.html

最后将生成的 hdfs-namenode.keytab http-namenode.keytab文件,分发到运行 HDFS NameNode 的服务器

最后将生成的 hdfs-datanode.keytab 文件,分发到运行 客户端

Troubleshooting

Kerberos is hard to set up —and harder to debug. Common problems are

  1. Network and DNS configuration.
  2. Kerberos configuration on hosts (/etc/krb5.conf).
  3. Keytab creation and maintenance.
  4. Environment setup: JVM, user login, system clocks, etc.

参考 http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SecureMode.html#Troubleshooting

可以在JVM启动参数中添加了如下3个参数:

-Djava.security.krb5.kdc=node1:8080 \

-Djava.security.krb5.realm=KFC.com \

https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/tutorials/KerberosReq.html

JDK-8237647 : LoginException: Message stream modified (41) for uppercase username with krb5

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8237647

Further response from the submitter:

It's not a bug, it is related to <u>https://bugs.openjdk.java.net/browse/JDK-8215032</u>

OpenJDK Implementation:

https://github.com/AdoptOpenJDK/openjdk-jdk11u/commit/37ad8d8b82b6199fa254e941243cc722cc2a35fb

Got it fixed by adding -Dsun.security.krb5.disableReferrals=true

https://www.linuxidc.com/Linux/2016-09/134948.htm

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容