欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

errorsk-4nQwBFp0LP8NpyK9WwwoT3BlbkFJyH23SKdFWR1P9Sr63sF8

最编程 2024-08-12 17:18:45
...

文章目录

    • 介绍
      • 概述
      • 基本概念
      • 认证原理
      • 优点和缺点
    • 安装和使用
      • 安装Kerberos相关服务
      • 修改配置文件
      • 初始化KDC数据库
      • 修改管理员权限配置文件
      • 启动Kerberos相关服务
      • 创建Kerberos管理员用户
      • 使用概述
        • Kerberos数据库操作
        • Kerberos认证操作
    • 创建Hadoop系统用户
    • Hadoop Kerberos配置(※)
      • 为Hadoop各服务创建Kerberos主体(Principal)
      • 修改Hadoop配置文件
      • 配置HDFS使用HTTPS安全传输协议
      • 配置Yarn使用LinuxContainerExecutor
    • 安全模式下启动Hadoop集群
      • 修改特定本地路径权限
      • 启动HDFS
      • 修改HDFS特定路径访问权限
      • 启动Yarn
      • 启动HistoryServer
    • 安全集群用户使用说明
      • 用户要求
      • 访问HDFS集群文件
      • Shell命令
      • web页面
      • 提交MapReduce任务
    • Hive用户认证配置
      • 前置要求
      • 配置认证
      • 启动hiveserver2
    • Hive Kerberos认证使用
      • beeline客户端
      • DataGrip客户端
        • 新建Driver
        • 新建连接
    • 安全环境实战01-数仓全流程
      • **改动说明**
      • 用户准备
      • 数据采集通道修改
      • 数仓各层脚本修改
      • 修改HDFS特定路径所有者
      • 全流程数据准备
      • 启动Azkaban
      • 全流程调度
    • 安全环境实战02-即席查询之Presto
      • 改动说明
      • 用户准备
      • 创建HTTPS协议所需的密钥对
      • 修改Presto Coordinator配置文件
      • 修改Hive Connector配置文件
      • 配置客户端Kerberos主体到用户名之间的映射规则
      • 配置Presto代理用户
      • 重启Presto集群
      • 客户端认证访问Presto集群
    • 安全环境实战03-即席查询之Kylin
      • 改动说明
      • HBase开启Kerberos认证
      • Kylin进行Kerberos认证

介绍

概述

Kerberos是一种计算机网络认证协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。可以用于防止窃听、防止重放攻击、保护数据完整性等场合,是一种应用对称密钥*进行密钥管理的系统。

基本概念

Kerberos中有以下一些概念需要了解:

  • KDC(Key Distribute Center):密钥分发中心,负责存储用户信息,管理发放票据。

  • Realm:Kerberos所管理的一个领域或范围,包含 KDC 和许多客户端的 Kerberos 网络,称之为一个Realm。

  • Rrincipal:Kerberos所管理的一个用户或者一个服务,可以理解为Kerberos中保存的一个账号,其格式通常如下:primary**/**instance@realm(主名称、实例和领域)

    • 主名称可以是此处所示的用户名或namenode等服务。

    • 对于用户主体,实例是可选的;但对于服务主体,实例则是必需的。

      例如,如果用户 joe 有时充当系统管理员,则他可以使用 joe/admin 将其自身与平时的用户身份区分开来。同样,如果 joe 在两台不同的主机上拥有帐户,则他可以使用两个具有不同实例的主体名称,例如 joe/node1.example.comjoe/node2.example.com。请注意,Kerberos 服务会将 joejoe/admin 视为两个完全不同的主体。

      对于服务主体,实例是全限定主机名。例如,node1.example.com就是这种实例。

  • keytab:Kerberos中的用户认证,可通过密码或者密钥文件证明身份,keytab指密钥文件。

  • KDC Admin Account:用于在KDC中创建主体并生成密钥表的管理帐户。

  • ticket:ticket是一种信息包,用于将用户身份安全地传递到服务器或服务。一个票证仅对一台客户机以及某台特定服务器上的一项特殊服务有效。票证包含以下内容:

    • 服务的主体名称
    • 用户的主体名称
    • 用户主机的 IP 地址
    • 时间标记
    • 定义票证生命周期的值
    • 会话密钥的副本

    所有此类数据都使用服务器的服务密钥进行加密。颁发票证之后,可重用票证直到其到期为止。

    生命周期:每当主体获取包括票证授予票证 (Ticket–Granting Ticket, TGT) 在内的票证时,可以通过 kinit 的 -l 选项指定的生命周期值,前提是使用 kinit 获取票证。缺省情况下,kinit 使用最长生命周期值。kdc.conf 文件中指定的最长生命周期值 (max_life)。

    可通过 kinit 的 -r 选项指定的可更新生命周期值,前提是使用 kinit 获取或更新票证。kdc.conf 文件中指定的最长可更新生命周期值 (max_renewable_life)。

  • credential(凭证):是一种信息包,其中包含票证和匹配的会话密钥。凭证使用发出请求的主体的密钥进行加密。通常,KDC 会生成凭证以响应客户机的票证请求。

  • authenticator(验证者):是服务器用于验证客户机用户主体的信息。 验证者包含用户的主体名称、时间标记和其他数据。 与票证不同,验证者只能使用一次,通常在请求访问服务时使用。 验证者使用客户机和服务器共享的会话密钥进行加密。 通常,客户机会创建验证者,并将其与服务器或服务的票证一同发送,以便向服务器或服务进行验证。

认证原理

它有三个部分:

  • Database:存储了用户和服务(称为主体)及其各自的 Kerberos 密码。
  • 认证服务器(Authentication Server,简称 AS):验证Client端的身份(确定你是身份证上的本人),验证通过就会给一张票证授予票证(Ticket Granting Ticket,简称 TGT)给 Client。
  • 票据授权服务器(Ticket Granting Server,简称 TGS):通过 TGT(AS 发送给 Client 的票)获取访问 Server 端的票(Server Ticket,简称 ST)。ST(Service Ticket)也有资料称为 TGS Ticket。

Kerberos 验证分为两个阶段:允许进行后续验证的初始验证以及所有后续验证自身。

(1)客户端与 Authentication Service

  1. 客户端通过kinit USERNAME或其他方式,将客户端ID, 目标HTTP服务ID, 网络地址(可能是多个机器的IP地址列表,如果想在任何机器上使用,则可能为空),以及TGT有效期的寿命等信息发送给 Authentication Service。

  2. Authentication Server 将检查客户端ID是否在KDC数据库中。

  3. 如果 Authentication Server 检查操作没有异常,那么KDC将随机生成一个 key,用于客户端与 Ticket Granting Service(TGS) 通信。这个Key,一般被称为 TGS Session Key。随后 Authentication Server 将发送两条信息给客户端。

    • 其中一条信息被称为TGT,由TGS的密钥加密,客户端无法解密,包含客户端ID, TGS Session Key等信息。
    • 另一条信息由客户端密钥加密,客户端可以正常解密,包含目标 HTTP 服务ID,TGS Session Key等信息。

  1. 客户端利用本地的密钥解密出第二条信息。如果本地密钥无法解密出信息,那么认证失败。

  2. 拥有有效的 TGT,只要该 TGT 未到期,客户机便可以请求所有类型的网络操作(如 rlogin 或 telnet)的票证。此票证的有效期通常为一天。每次客户端执行唯一的网络操作时,都将从 KDC 请求该操作的票证。

(2)客户端与 Ticket Granting Service

这时候,客户端有了 TGT(由于本地没有TGS的密钥,导致无法解密出其数据)与 TGS Session Key。

  • 客户机通过向 TGS 发送其 TGT 作为其身份证明,并将包含自身信息的Authenticator(由TGS Session Key加密)发送给TGS。

  • TGS 将利用 自身的密钥从TGT中解密出TGS Session Key,然后利用TGS Session Key从Authenticator 中解密出客户端的信息。

  • TGS 解密出所有信息后,将进行身份检查,进行认证:

    • 将客户端ID与TGT的客户端ID进行比较
    • 比较来自 Authenticator 的时间戳和TGT的时间戳 (典型的Kerberos系统的容忍度是2分钟,但也可以另行配置)
    • 检查TGT是否过期
    • 检查Authenticator是否已经在TGS的缓存中(为了避免重放攻击)

    当所有检查都通过后, TGS 随机生成一个 Key 用于后续客户端与 HTTP 服务交互时进行通信加密使用,即 HTTP Session Key。同样地,TGS 将发送两条信息给客户端:

    • 其中一条是 HTTP Ticket,由 HTTP 服务的密钥进行加密;
    • 另一条则由TGS Session Key加密,包含了客户端信息与时间戳。

  • 客户端将利用TGS Session Key解密出其中一条信息,另一条信息由于是由目标HTTP服务加密,无法解密。

(3)客户端与 HTTP Service

这时候,客户端有了HTTP Ticket(由于本地没有HTTP服务的密钥,导致无法解密出其数据)与 HTTP Session Key。

  • “无脑”将 AS 发送过来的 HTTP Ticket(由HTTP 密钥加密)转发给目标 http 服务。

  • 将包含自身信息的Authenticator(由HTTP Session Key加密)发送给 http 服务。

  • HTTP服务首先利用自身的密钥解密出 HTTP Ticket 的信息,得到 HTTP Session Key;随后,利用HTTP Session Key解密出用户的Authenticator信息。

  • 信息解密完成后,HTTP 服务同样需要做一些信息检查:

    • 将 Authenticator 中的客户端ID与HTTP Ticket中的客户端ID进行比较
    • 比较来自 Authenticator 的时间戳和 HTTP Ticket 的时间戳 (典型的 Kerberos 系统对差异的容忍度是 2 分钟,但也可以另行配置)
    • 检查Ticket是否过期
    • 检查 Authenticator 是否已经在HTTP服务器的缓存中(为了避免重播攻击)

    至此,所有的认证过程通过,客户端即可与远程HTTP服务完成了身份认证,可以进行后续的信息通信。

优点和缺点

优点:

  1. 密码无需进行网络传输。基于 Ticket 实现身份认证,保障密钥安全性。
  2. 双向认证。整个认证过程中,不仅需要客户端进行认证,待访问的服务也需要进行身份认证。
  3. 高性能。一旦Client获得用过访问某个Server的Ticket,该Server就能根据这个Ticket实现对Client的验证,而无须KDC的再次参与。

缺点:

  • Kerberos身份认证采用的是对称加密机制,加密和解密使用的是相同的密钥,交换密钥时的安全性比较难以保障。
  • Kerberos服务器与用户共享的服务会话密钥是用户的口令字,服务器在响应时不需验证用户的真实性,而是直接假设只有合法用户拥有了该口令字。如果攻击者截获了响应消息,就很容易形成密码攻击。
  • Kerberos中的AS(身份认证服务)和TGS是集中式管理,容易形成瓶颈,系统的性能和安全也严重依赖于AS和TGS的性能和安全。在AS和TGS前应该有访问控制,以增强AS和TGS的安全。
  • 随用户数量增加,密钥管理较复杂。Kerberos拥有每个用户的口令字的散列值,AS与TGS负责户间通信密钥的分配。假设有n个用户想同时通信,则需要维护n×(n-1)/2个密钥。

安装和使用

安装Kerberos相关服务

选择集群中的一台主机(hadoop102)作为Kerberos服务端,安装KDC,所有主机都需要部署Kerberos客户端。

服务端主机执行以下安装命令

[root@hadoop102 ~]# yum install -y krb5-server

客户端主机执行以下安装命令

[root@hadoop102 ~]# yum install -y krb5-workstation krb5-libs
[root@hadoop103 ~]# yum install -y krb5-workstation krb5-libs
[root@hadoop104 ~]# yum install -y krb5-workstation krb5-libs

修改配置文件

(1)服务端主机(hadoop102)

修改/var/kerberos/krb5kdc/kdc.conf文件,内容如下

[root@hadoop102 ~]# vim /var/kerberos/krb5kdc/kdc.conf
修改如下内容

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 EXAMPLE.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
 }

(2)客户端主机(所有主机)

修改/etc/krb5.conf文件

[root@hadoop102 ~]# vim /etc/krb5.conf
[root@hadoop103 ~]# vim /etc/krb5.conf
[root@hadoop104 ~]# vim /etc/krb5.conf

内容如下:

# Configuration snippets may be placed in this directory as well
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
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
 default_realm = EXAMPLE.COM
 #default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 EXAMPLE.COM = {
  kdc = hadoop102
  admin_server = hadoop102  # admin_server是一个服务,往数据库中读写数据。比如注册一个新用户,就必须访问admin_server。
 }
[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM

初始化KDC数据库

在服务端主机(hadoop102)执行以下命令,并根据提示输入密码。

[root@hadoop102 ~]# kdb5_util create -s

修改管理员权限配置文件

在服务端主机(hadoop102)修改/var/kerberos/krb5kdc/kadm5.acl文件,内容如下:

*/admin@EXAMPLE.COM     *

启动Kerberos相关服务

在主节点(hadoop102)启动KDC,并配置开机自启:

[root@hadoop102 ~]# systemctl start krb5kdc
[root@hadoop102 ~]# systemctl enable krb5kdc

在主节点(hadoop102)启动Kadmin,该服务为KDC数据库访问入口:

[root@hadoop102 ~]# systemctl start kadmin
[root@hadoop102 ~]# systemctl enable kadmin

创建Kerberos管理员用户

在KDC所在主机(hadoop102),执行以下命令,并按照提示输入密码

[root@hadoop102 ~]# kadmin.local -q "addprinc admin/admin"

使用概述

Kerberos数据库操作

(1)登录数据库

  • 本地登录(无需认证)

    [root@hadoop102 ~]# kadmin.local 
    Authenticating as principal root/admin@EXAMPLE.COM with password.
    kadmin.local: 
    
  • 远程登录(需进行主体认证,认证操作见下文)

    [root@hadoop102 ~]# kadmin
    Authenticating as principal admin/admin@EXAMPLE.COM with password.
    Password for admin/admin@EXAMPLE.COM: 
    kadmin:
    

    退出输入:exit

(2)创建Kerberos主体

登录数据库,输入以下命令,并按照提示输入密码

kadmin.local: addprinc test

也可通过以下shell命令直接创建主体

[root@hadoop102 ~]# kadmin.local -q"addprinc test"

(3)修改主体密码

kadmin.local :cpw test

(4)查看所有主体

kadmin.local: list_principals
K/M@EXAMPLE.COM
admin/admin@EXAMPLE.COM
kadmin/admin@EXAMPLE.COM
kadmin/changepw@EXAMPLE.COM
kadmin/hadoop105@EXAMPLE.COM
kiprop/hadoop105@EXAMPLE.COM
krbtgt/EXAMPLE.COM@EXAMPLE.COM
Kerberos认证操作

(1)密码认证

  • 使用kinit进行主体认证,并按照提示输入密码

    [root@hadoop102 ~]# kinit test
    Password for test@EXAMPLE.COM:
    
  • 查看认证凭证

    [root@hadoop102 ~]# klist 
    Ticket cache: FILE:/tmp/krb5cc_0
    Default principal: test@EXAMPLE.COM
    
    Valid starting       Expires              Service principal
    10/27/2019 18:23:57  10/28/2019 18:23:57  krbtgt/EXAMPLE.COM@EXAMPLE.COM
    	renew until 11/03/2019 18:23:57
    

(2)密钥文件认证

  • 生成主体test的keytab文件到指定目录/root/test.keytab

    [root@hadoop102 ~]# kadmin.local -q "xst -norandkey -k  /root/test.keytab test@EXAMPLE.COM"
    

    注:-norandkey的作用是声明不随机生成密码,若不加该参数,会导致之前的密码失效。

  • 使用keytab进行认证

    [root@hadoop102 ~]# kinit -kt /root/test.keytab test
    
  • 查看认证凭证

    [root@hadoop102 ~]# klist 
    Ticket cache: FILE:/tmp/krb5cc_0
    Default principal: test@EXAMPLE.COM
    
    Valid starting     Expires            Service principal
    08/27/19 15:41:28  08/28/19 15:41:28  krbtgt/EXAMPLE.COM@EXAMPLE.COM
            renew until 08/27/19 15:41:28
    

(3)销毁凭证

[root@hadoop102 ~]# kdestroy
[root@hadoop102 ~]# klist   
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)

创建Hadoop系统用户

为Hadoop开启Kerberos,需为不同服务准备不同的用户,启动服务时需要使用相应的用户。须在所有节点创建以下用户和用户组。

User:Group Daemons
hdfs:hadoop NameNode, Secondary NameNode, JournalNode, DataNode
yarn:hadoop ResourceManager, NodeManager
mapred:hadoop MapReduce JobHistory Server

创建hadoop组

[root@hadoop102 ~]# groupadd hadoop
[root@hadoop103 ~]# groupadd hadoop
[root@hadoop104 ~]# groupadd hadoop

创建各用户并设置密码

[root@hadoop102 ~]# useradd hdfs -g hadoop
[root@hadoop102 ~]# echo hdfs | passwd --stdin  hdfs

[root@hadoop102 ~]# useradd yarn -g hadoop
[root@hadoop102 ~]# echo yarn | passwd --stdin yarn

[root@hadoop102 ~]# useradd mapred -g hadoop
[root@hadoop102 ~]# echo mapred | passwd --stdin mapred

[root@hadoop103 ~]# useradd hdfs -g hadoop
[root@hadoop103 ~]# echo hdfs | passwd --stdin  hdfs

[root@hadoop103 ~]# useradd yarn -g hadoop
[root@hadoop103 ~]# echo yarn | passwd --stdin yarn

[root@hadoop103 ~]# useradd mapred -g hadoop
[root@hadoop103 ~]# echo mapred | passwd --stdin mapred

[root@hadoop104 ~]# useradd hdfs -g hadoop
[root@hadoop104 ~]# echo hdfs | passwd --stdin  hdfs

[root@hadoop104 ~]# useradd yarn -g hadoop
[root@hadoop104 ~]# echo yarn | passwd --stdin yarn

[root@hadoop104 ~]# useradd mapred -g hadoop
[root@hadoop104 ~]# echo mapred | passwd --stdin mapred

Hadoop Kerberos配置(※)

为Hadoop各服务创建Kerberos主体(Principal)

主体格式如下:ServiceName/HostName@REALM,例如 dn/hadoop102@EXAMPLE.COM

(1)各服务所需主体如下

环境:3台节点,主机名分别为hadoop102,hadoop103,hadoop104

服务 所在主机 主体(Principal)
NameNode hadoop102 nn/hadoop102
DataNode hadoop102 dn/hadoop102
DataNode hadoop103 dn/hadoop103
DataNode hadoop104 dn/hadoop104
Secondary NameNode hadoop104 sn/hadoop104
ResourceManager hadoop103 rm/hadoop103
NodeManager hadoop102 nm/hadoop102
NodeManager hadoop103 nm/hadoop103
NodeManager hadoop104 nm/hadoop104
JobHistory Server hadoop102 jhs/hadoop102
Web UI hadoop102 HTTP/hadoop102
Web UI hadoop103 HTTP/hadoop103
Web UI hadoop104 HTTP/hadoop104

(2)创建主体说明

1)路径准备

为服务创建的主体,需要通过密钥文件keytab文件进行认证,故需为各服务准备一个安全的路径用来存储keytab文件。

[root@hadoop102 ~]# mkdir /etc/security/keytab/
[root@hadoop102 ~]# chown -R root:hadoop /etc/security/keytab/
[root@hadoop102 ~]# chmod 770 /etc/security/keytab/

2)管理员主体认证

为执行创建主体的语句,需登录Kerberos 数据库客户端,登录之前需先使用Kerberos的管理员用户进行认证,执行以下命令并根据提示输入密码。

[root@hadoop102 ~]# kinit admin/admin

3)登录数据库客户端

[root@hadoop102 ~]# kadmin

4)执行创建主体的语句

kadmin:  addprinc -randkey test/test
kadmin:  xst -k /etc/security/keytab/test.keytab test/test

说明:

  • addprinc test/test:作用是新建主体

    addprinc:增加主体

    -randkey:密码随机,因hadoop各服务均通过keytab文件认证,故密码可随机生成

    test/test:新增的主体

  • xst -k /etc/security/keytab/test.keytab test/test:作用是将主体的密钥写入keytab文件

    xst:将主体的密钥写入keytab文件

    -k /etc/security/keytab/test.keytab:指明keytab文件路径和文件名

    test/test:主体

  • 为方便创建主体,可使用如下命令

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey test/test"
    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/test.keytab test/test"
    

    -p:主体

    -w:密码

    -q:执行语句

  • 操作主体的其他命令,可参考官方文档,地址如下:

    http://web.mit.edu/kerberos/krb5-current/doc/admin/admin_commands/kadmin_local.html#commands

(3)创建主体

  • 在所有节点创建keytab文件目录

    [root@hadoop102 ~]# mkdir /etc/security/keytab/
    [root@hadoop102 ~]# chown -R root:hadoop /etc/security/keytab/
    [root@hadoop102 ~]# chmod 770 /etc/security/keytab/
    
    [root@hadoop103 ~]# mkdir /etc/security/keytab/
    [root@hadoop103 ~]# chown -R root:hadoop /etc/security/keytab/
    [root@hadoop103 ~]# chmod 770 /etc/security/keytab/
    
    [root@hadoop104 ~]# mkdir /etc/security/keytab/
    [root@hadoop104 ~]# chown -R root:hadoop /etc/security/keytab/
    [root@hadoop104 ~]# chmod 770 /etc/security/keytab/
    
  • 以下命令在hadoop102节点执行

    NameNode(hadoop102)

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey nn/hadoop102"
    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nn.service.keytab nn/hadoop102"
    

    DataNode(hadoop102)

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/hadoop102"
    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/hadoop102"
    

    NodeManager(hadoop102)

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/hadoop102"
    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/hadoop102"
    

    JobHistory Server(hadoop102)

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey jhs/hadoop102"
    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/jhs.service.keytab jhs/hadoop102"
    

    Web UI(hadoop102)

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/hadoop102"
    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/hadoop102"
    
  • 以下命令在hadoop103执行:

    ResourceManager(hadoop103)

    [root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey rm/hadoop103"
    [root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/rm.service.keytab rm/hadoop103"
    

    DataNode(hadoop103)

    [root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/hadoop103"
    [root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/hadoop103"
    

    NodeManager(hadoop103)

    [root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/hadoop103"
    [root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/hadoop103"
    

    Web UI(hadoop103)

    [root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/hadoop103"
    [root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/hadoop103"
    
  • 以下命令在hadoop104执行

    DataNode(hadoop104)

    [root@hadoop104 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/hadoop104"
    [root@hadoop104 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/hadoop104"
    

    Secondary NameNode(hadoop104)

    [root@hadoop104 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey sn/hadoop104"
    [root@hadoop104 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/sn.service.keytab sn/hadoop104"
    

    NodeManager(hadoop104)

    [root@hadoop104 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/hadoop104"
    [root@hadoop104 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/hadoop104"
    

    Web UI(hadoop104)

    [root@hadoop104 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/hadoop104"
    [root@hadoop104 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/hadoop104"
    
  • 修改所有节点keytab文件的所有者和访问权限

    [root@hadoop102 ~]# chown -R root:hadoop /etc/security/keytab/
    [root@hadoop102 ~]# chmod 660 /etc/security/keytab/*
    [root@hadoop103 ~]# chown -R root:hadoop /etc/security/keytab/
    [root@hadoop103 ~]# chmod 660 /etc/security/keytab/*
    [root@hadoop104 ~]# chown -R root:hadoop /etc/security/keytab/
    [root@hadoop104 ~]# chmod 660 /etc/security/keytab/*
    

修改Hadoop配置文件

需要修改的内容如下,修改完毕需要分发所改文件。

(1)core-site.xml

[root@hadoop102 ~]# vim /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
增加以下内容

<!-- Kerberos主体到系统用户的映射机制 -->
<property>
    <name>hadoop.security.auth_to_local.mechanism</name>
    <value>MIT</value>
</property>

<!-- Kerberos主体到系统用户的具体映射规则 -->
<property>
    <name>hadoop.security.auth_to_local</name>
    <value>
        RULE:[2:$1/$2@$0]([ndj]n\/.*@EXAMPLE\.COM)s/.*/hdfs/
        RULE:[2:$1/$2@$0]([rn]m\/.*@EXAMPLE\.COM)s/.*/yarn/
        RULE:[2:$1/$2@$0](jhs\/.*@EXAMPLE\.COM)s/.*/mapred/
        DEFAULT  
    </value>
</property>

<!-- 启用Hadoop集群Kerberos安全认证 -->
<property>
    <name>hadoop.security.authentication</name>
    <value>kerberos</value>
</property>

<!-- 启用Hadoop集群授权管理 -->
<property>
    <name>hadoop.security.authorization</name>
    <value>true</value>
</property>

<!-- Hadoop集群间RPC通讯设为仅认证模式 -->
<property>
    <name>hadoop.rpc.protection</name>
    <value>authentication</value>
</property>

注意:

RULE:[2:$1/$2@$0]([ndj]n\/.*@EXAMPLE\.COM)s/.*/hdfs/
2表示@前包含两个部分
DEFAULT 是默认规则,默认将principal的第一个component作为短名称输出

(2)hdfs-site.xml

[root@hadoop102 ~]# vim /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml
增加以下内容

<!-- 访问DataNode数据块时需通过Kerberos认证 -->
<property>
    <name>dfs.block.access.token.enable</name>
    <value>true</value>
</property>

<!-- NameNode服务的Kerberos主体,_HOST会自动解析为服务所在的主机名 -->
<property>
    <name>dfs.namenode.kerberos.principal</name>
    <value>nn/_HOST@EXAMPLE.COM</value>
</property>

<!-- NameNode服务的Kerberos密钥文件路径 -->
<property>
    <name>dfs.namenode.keytab.file</name>
    <value>/etc/security/keytab/nn.service.keytab</value>
</property>

<!-- Secondary NameNode服务的Kerberos主体 -->
<property>
    <name>dfs.secondary.namenode.keytab.file</name>
    <value>/etc/security/keytab/sn.service.keytab</value>
</property>

<!-- Secondary NameNode服务的Kerberos密钥文件路径 -->
<property>
    <name>dfs.secondary.namenode.kerberos.principal</name>
    <value>sn/_HOST@EXAMPLE.COM</value>
</property>

<!-- NameNode Web服务的Kerberos主体 -->
<property>
    <name>dfs.namenode.kerberos.internal.spnego.principal</name>
    <value>HTTP/_HOST@EXAMPLE.COM</value>
</property>

<!-- WebHDFS REST服务的Kerberos主体 -->
<property>
    <name>dfs.web.authentication.kerberos.principal</name>
    <value>HTTP/_HOST@EXAMPLE.COM</value>
</property>

<!-- Secondary NameNode Web UI服务的Kerberos主体 -->
<property>
    <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
    <value>HTTP/_HOST@EXAMPLE.COM</value>
</property>

<!-- Hadoop Web UI的Kerberos密钥文件路径 -->
<property>
    <name>dfs.web.authentication.kerberos.keytab</name>
    <value>/etc/security/keytab/spnego.service.keytab</value>
</property>

<!-- DataNode服务的Kerberos主体 -->
<property>
    <name>dfs.datanode.kerberos.principal</name>
    <value>dn/_HOST@EXAMPLE.COM</value>
</property>

<!-- DataNode服务的Kerberos密钥文件路径 -->
<property>
    <name>dfs.datanode.keytab.file</name>
    <value>/etc/security/keytab/dn.service.keytab</value
						

上一篇: 解决TCP程序客户端无法连接服务器的方法

下一篇: errorsk-4nQwBFp0LP8NpyK9WwwoT3BlbkFJyH23SKdFWR1P9Sr63sF8