离线数仓-08-基于Kerberos进行用户认证

文章探讨了Kerberos作为安全网络认证协议在非安全网络环境中确保通信安全的身份验证机制,重点介绍了其在Hadoop生态系统中的集成,包括Hive、Presto和Kylin等组件的Kerberos认证配置与实战应用。详细说明了从Kerberos基础概念、认证原理到在大数据平台上的实施步骤,如创建Kerberos主体、配置服务与用户认证,以及如何通过Kerberos提升数据仓库和即席查询的安全性。
摘要由CSDN通过智能技术生成

介绍

概述

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等信息。

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

  5. 拥有有效的 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:GroupDaemons
hdfs:hadoopNameNode, Secondary NameNode, JournalNode, DataNode
yarn:hadoopResourceManager, NodeManager
mapred:hadoopMapReduce 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)
NameNodehadoop102nn/hadoop102
DataNodehadoop102dn/hadoop102
DataNodehadoop103dn/hadoop103
DataNodehadoop104dn/hadoop104
Secondary NameNodehadoop104sn/hadoop104
ResourceManagerhadoop103rm/hadoop103
NodeManagerhadoop102nm/hadoop102
NodeManagerhadoop103nm/hadoop103
NodeManagerhadoop104nm/hadoop104
JobHistory Serverhadoop102jhs/hadoop102
Web UIhadoop102HTTP/hadoop102
Web UIhadoop103HTTP/hadoop103
Web UIhadoop104HTTP/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>
</property>

<!-- 配置NameNode Web UI 使用HTTPS协议 -->
<property>
    <name>dfs.http.policy</name>
    <value>HTTPS_ONLY</value>
</property>

<!-- 配置DataNode数据传输保护策略为仅认证模式 -->
<property>
    <name>dfs.data.transfer.protection</name>
    <value>authentication</value>
</property>

(3)yarn-site.xml

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

<!-- Resource Manager 服务的Kerberos主体 -->
<property>
    <name>yarn.resourcemanager.principal</name>
    <value>rm/_HOST@EXAMPLE.COM</value>
</property>

<!-- Resource Manager 服务的Kerberos密钥文件 -->
<property>
    <name>yarn.resourcemanager.keytab</name>
    <value>/etc/security/keytab/rm.service.keytab</value>
</property>

<!-- Node Manager 服务的Kerberos主体 -->
<property>
    <name>yarn.nodemanager.principal</name>
    <value>nm/_HOST@EXAMPLE.COM</value>
</property>

<!-- Node Manager 服务的Kerberos密钥文件 -->
<property>
    <name>yarn.nodemanager.keytab</name>
    <value>/etc/security/keytab/nm.service.keytab</value>
</property>

(4)mapred-site.xml

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

<!-- 历史服务器的Kerberos主体 -->
<property>
    <name>mapreduce.jobhistory.keytab</name>
    <value>/etc/security/keytab/jhs.service.keytab</value>
</property>

<!-- 历史服务器的Kerberos密钥文件 -->
<property>
    <name>mapreduce.jobhistory.principal</name>
    <value>jhs/_HOST@EXAMPLE.COM</value>
</property>

(5)分发以上修改的配置文件

[root@hadoop102 ~]# xsync /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
[root@hadoop102 ~]# xsync /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml
[root@hadoop102 ~]# xsync /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml
[root@hadoop102 ~]# xsync /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml

配置HDFS使用HTTPS安全传输协议

生成密钥对:

Keytool是java数据证书的管理工具,使用户能够管理自己的公/私钥对及相关证书。

-keystore 指定密钥库的名称及位置(产生的各类信息将存在.keystore文件中)

-genkey(或者-genkeypair) 生成密钥对

-alias 为生成的密钥对指定别名,如果没有默认是mykey

-keyalg 指定密钥的算法 RSA/DSA 默认是DSA

(1)生成 keystore的密码及相应信息的密钥库

[root@hadoop102 ~]# keytool -keystore /etc/security/keytab/keystore -alias jetty -genkey -keyalg RSA

输入密钥库口令:  
再次输入新口令: 
您的名字与姓氏是什么?
  [Unknown]:  
您的组织单位名称是什么?
  [Unknown]:  
您的组织名称是什么?
  [Unknown]:  
您所在的城市或区域名称是什么?
  [Unknown]:  
您所在的省/市/自治区名称是什么?
  [Unknown]:  
该单位的双字母国家/地区代码是什么?
  [Unknown]:  
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正确?
  []:  y

输入 <jetty> 的密钥口令
        (如果和密钥库口令相同, 按回车):  
再次输入新口令:

(2)修改keystore文件的所有者和访问权限

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

注意:

(1)密钥库的密码至少6个字符,可以是纯数字或者字母或者数字和字母的组合等等

(2)确保hdfs用户(HDFS的启动用户)具有对所生成keystore文件的读权限

(3)将该证书分发到集群中的每台节点的相同路径

[root@hadoop102 ~]# xsync /etc/security/keytab/keystore

(4)修改hadoop配置文件ssl-server.xml.example,

该文件位于$HADOOP_HOME/etc/hadoop目录

修改文件名为ssl-server.xml

[root@hadoop102 ~]# mv $HADOOP_HOME/etc/hadoop/ssl-server.xml.example $HADOOP_HOME/etc/hadoop/ssl-server.xml

修改以下内容

[root@hadoop102 ~]# vim $HADOOP_HOME/etc/hadoop/ssl-server.xml
修改以下参数

<!-- SSL密钥库路径 -->
<property>
    <name>ssl.server.keystore.location</name>
    <value>/etc/security/keytab/keystore</value>
</property>

<!-- SSL密钥库密码 -->
<property>
    <name>ssl.server.keystore.password</name>
    <value>123456</value>
</property>

<!-- SSL可信任密钥库路径 -->
<property>
    <name>ssl.server.truststore.location</name>
    <value>/etc/security/keytab/keystore</value>
</property>

<!-- SSL密钥库中密钥的密码 -->
<property>
    <name>ssl.server.keystore.keypassword</name>
    <value>123456</value>
</property>

<!-- SSL可信任密钥库密码 -->
<property>
    <name>ssl.server.truststore.password</name>
    <value>123456</value>
</property>

(5)分发ssl-server.xml文件

[root@hadoop102 ~]# xsync $HADOOP_HOME/etc/hadoop/ssl-server.xml

配置Yarn使用LinuxContainerExecutor

(1)修改所有节点的container-executor所有者和权限,要求其所有者为root,所有组为hadoop(启动NodeManger的yarn用户的所属组),权限为6050。其默认路径为$HADOOP_HOME/bin

[root@hadoop102 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/bin/container-executor
[root@hadoop102 ~]# chmod 6050 /opt/module/hadoop-3.1.3/bin/container-executor

[root@hadoop103 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/bin/container-executor
[root@hadoop103 ~]# chmod 6050 /opt/module/hadoop-3.1.3/bin/container-executor

[root@hadoop104 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/bin/container-executor
[root@hadoop104 ~]# chmod 6050 /opt/module/hadoop-3.1.3/bin/container-executor

(2)修改所有节点的container-executor.cfg文件的所有者和权限,要求该文件及其所有的上级目录的所有者均为root,所有组为hadoop(启动NodeManger的yarn用户的所属组),权限为400。其默认路径为$HADOOP_HOME/etc/hadoop

[root@hadoop102 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
[root@hadoop102 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop
[root@hadoop102 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc
[root@hadoop102 ~]# chown root:hadoop /opt/module/hadoop-3.1.3
[root@hadoop102 ~]# chown root:hadoop /opt/module
[root@hadoop102 ~]# chmod 400 /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg

[root@hadoop103 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
[root@hadoop103 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop
[root@hadoop103 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc
[root@hadoop103 ~]# chown root:hadoop /opt/module/hadoop-3.1.3
[root@hadoop103 ~]# chown root:hadoop /opt/module
[root@hadoop103 ~]# chmod 400 /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg

[root@hadoop104 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
[root@hadoop104 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop
[root@hadoop104 ~]# chown root:hadoop /opt/module/hadoop-3.1.3/etc
[root@hadoop104 ~]# chown root:hadoop /opt/module/hadoop-3.1.3
[root@hadoop104 ~]# chown root:hadoop /opt/module
[root@hadoop104 ~]# chmod 400 /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg

(3)修改$HADOOP_HOME/etc/hadoop/container-executor.cfg

[root@hadoop102 ~]# vim $HADOOP_HOME/etc/hadoop/container-executor.cfg

内容如下:

yarn.nodemanager.linux-container-executor.group=hadoop
banned.users=hdfs,yarn,mapred
min.user.id=1000
allowed.system.users=
feature.tc.enabled=false

(4)修改$HADOOP_HOME/etc/hadoop/yarn-site.xml文件

[root@hadoop102 ~]# vim $HADOOP_HOME/etc/hadoop/yarn-site.xml

增加以下内容:

<!-- 配置Node Manager使用LinuxContainerExecutor管理Container -->
<property>
  <name>yarn.nodemanager.container-executor.class</name>
  <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>

<!-- 配置Node Manager的启动用户的所属组 -->
<property>
  <name>yarn.nodemanager.linux-container-executor.group</name>
  <value>hadoop</value>
</property>

<!-- LinuxContainerExecutor脚本路径 -->
<property>
  <name>yarn.nodemanager.linux-container-executor.path</name>
  <value>/opt/module/hadoop-3.1.3/bin/container-executor</value>
</property>

(5)分发container-executor.cfg和yarn-site.xml文件

[root@hadoop102 ~]# xsync $HADOOP_HOME/etc/hadoop/container-executor.cfg
[root@hadoop102 ~]# xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml

安全模式下启动Hadoop集群

修改特定本地路径权限

local$HADOOP_LOG_DIRhdfs:hadoopdrwxrwxr-x
localdfs.namenode.name.dirhdfs:hadoopdrwx------
localdfs.datanode.data.dirhdfs:hadoopdrwx------
localdfs.namenode.checkpoint.dirhdfs:hadoopdrwx------
localyarn.nodemanager.local-dirsyarn:hadoopdrwxrwxr-x
localyarn.nodemanager.log-dirsyarn:hadoopdrwxrwxr-x

(1)$HADOOP_LOG_DIR(所有节点)

该变量位于hadoop-env.sh文件,默认值为 ${HADOOP_HOME}/logs

[root@hadoop102 ~]# chown hdfs:hadoop /opt/module/hadoop-3.1.3/logs/
[root@hadoop102 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/

[root@hadoop103 ~]# chown hdfs:hadoop /opt/module/hadoop-3.1.3/logs/
[root@hadoop103 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/

[root@hadoop104 ~]# chown hdfs:hadoop /opt/module/hadoop-3.1.3/logs/
[root@hadoop104 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/

(2)dfs.namenode.name.dir(NameNode节点)

该参数位于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/name

[root@hadoop102 ~]# chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/name/
[root@hadoop102 ~]# chmod 700 /opt/module/hadoop-3.1.3/data/dfs/name/

(3)dfs.datanode.data.dir(DataNode节点)

该参数为于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/data

[root@hadoop102 ~]# chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/data/
[root@hadoop102 ~]# chmod 700 /opt/module/hadoop-3.1.3/data/dfs/data/

[root@hadoop103 ~]# chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/data/
[root@hadoop103 ~]# chmod 700 /opt/module/hadoop-3.1.3/data/dfs/data/

[root@hadoop104 ~]# chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/data/
[root@hadoop104 ~]# chmod 700 /opt/module/hadoop-3.1.3/data/dfs/data/

(4)dfs.namenode.checkpoint.dir(SecondaryNameNode节点)

该参数位于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/namesecondary

[root@hadoop104 ~]# chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/namesecondary/
[root@hadoop104 ~]# chmod 700 /opt/module/hadoop-3.1.3/data/dfs/namesecondary/

(5)yarn.nodemanager.local-dirs(NodeManager节点)

该参数位于yarn-site.xml文件,默认值为file://${hadoop.tmp.dir}/nm-local-dir

[root@hadoop102 ~]# chown -R yarn:hadoop /opt/module/hadoop-3.1.3/data/nm-local-dir/
[root@hadoop102 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/data/nm-local-dir/

[root@hadoop103 ~]# chown -R yarn:hadoop /opt/module/hadoop-3.1.3/data/nm-local-dir/
[root@hadoop103 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/data/nm-local-dir/

[root@hadoop104 ~]# chown -R yarn:hadoop /opt/module/hadoop-3.1.3/data/nm-local-dir/
[root@hadoop104 ~]# chmod -R 775 /opt/module/hadoop-3.1.3/data/nm-local-dir/

(6)yarn.nodemanager.log-dirs(NodeManager节点)

该参数位于yarn-site.xml文件,默认值为$HADOOP_LOG_DIR/userlogs

[root@hadoop102 ~]# chown yarn:hadoop /opt/module/hadoop-3.1.3/logs/userlogs/
[root@hadoop102 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/userlogs/

[root@hadoop103 ~]# chown yarn:hadoop /opt/module/hadoop-3.1.3/logs/userlogs/
[root@hadoop103 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/userlogs/

[root@hadoop104 ~]# chown yarn:hadoop /opt/module/hadoop-3.1.3/logs/userlogs/
[root@hadoop104 ~]# chmod 775 /opt/module/hadoop-3.1.3/logs/userlogs/

启动HDFS

需要注意的是,启动不同服务时需要使用对应的用户

(1)单点启动

  • 启动NameNode

    [root@hadoop102 ~]# sudo -i -u hdfs hdfs --daemon start namenode
    
  • 启动DataNode

    [root@hadoop102 ~]# sudo -i -u hdfs hdfs --daemon start datanode
    [root@hadoop103 ~]# sudo -i -u hdfs hdfs --daemon start datanode
    [root@hadoop104 ~]# sudo -i -u hdfs hdfs --daemon start datanode
    
  • 启动SecondaryNameNode

    [root@hadoop104 ~]# sudo -i -u hdfs hdfs --daemon start secondarynamenode
    

说明:

  • -i:重新加载环境变量

  • -u:以特定用户的身份执行后续命令

(2)群起

  • 在主节点(hadoop102)配置hdfs用户到所有节点的免密登录。

  • 修改主节点(hadoop102)节点的$HADOOP_HOME/sbin/start-dfs.sh脚本,在顶部增加以下环境变量。

    [root@hadoop102 ~]# vim $HADOOP_HOME/sbin/start-dfs.sh
    

    在顶部增加如下内容:

    HDFS_DATANODE_USER=hdfs
    HDFS_NAMENODE_USER=hdfs
    HDFS_SECONDARYNAMENODE_USER=hdfs
    

    注:$HADOOP_HOME/sbin/stop-dfs.sh也需在顶部增加上述环境变量才可使用。

  • 以root用户执行群起脚本,即可启动HDFS集群。

    [root@hadoop102 ~]# start-dfs.sh
    

(3)查看HFDS web页面

访问地址为https://hadoop102:9871

修改HDFS特定路径访问权限

hdfs/hdfs:hadoopdrwxr-xr-x
hdfs/tmphdfs:hadoopdrwxrwxrwxt
hdfs/userhdfs:hadoopdrwxrwxr-x
hdfsyarn.nodemanager.remote-app-log-diryarn:hadoopdrwxrwxrwxt
hdfsmapreduce.jobhistory.intermediate-done-dirmapred:hadoopdrwxrwxrwxt
hdfsmapreduce.jobhistory.done-dirmapred:hadoopdrwxrwx—

说明:若上述路径不存在,需手动创建。

(1)创建hdfs/hadoop主体,执行以下命令并按照提示输入密码

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

(2)认证hdfs/hadoop主体,执行以下命令并按照提示输入密码

[root@hadoop102 ~]# kinit hdfs/hadoop

(3)按照上述要求修改指定路径的所有者和权限

  • 修改/、/tmp、/user路径

    [root@hadoop102 ~]# hadoop fs -chown hdfs:hadoop / /tmp /user
    [root@hadoop102 ~]# hadoop fs -chmod 755 /
    [root@hadoop102 ~]# hadoop fs -chmod 1777 /tmp
    [root@hadoop102 ~]# hadoop fs -chmod 775 /users
    
  • 参数yarn.nodemanager.remote-app-log-dir位于yarn-site.xml文件,默认值/tmp/logs

    [root@hadoop102 ~]# hadoop fs -chown yarn:hadoop /tmp/logs
    [root@hadoop102 ~]# hadoop fs -chmod 1777 /tmp/logs
    
  • 参数mapreduce.jobhistory.intermediate-done-dir位于mapred-site.xml文件,默认值为/tmp/hadoop-yarn/staging/history/done_intermediate,需保证该路径的所有上级目录(除/tmp)的所有者均为mapred,所属组为hadoop,权限为770

    [root@hadoop102 ~]# hadoop fs -chown -R mapred:hadoop /tmp/hadoop-yarn/staging/history/done_intermediate
    [root@hadoop102 ~]# hadoop fs -chmod -R 1777 /tmp/hadoop-yarn/staging/history/done_intermediate
    
    [root@hadoop102 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/
    [root@hadoop102 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/
    [root@hadoop102 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/
    
    [root@hadoop102 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/history/
    [root@hadoop102 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/
    [root@hadoop102 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/
    
  • 参数mapreduce.jobhistory.done-dir位于mapred-site.xml文件,默认值为/tmp/hadoop-yarn/staging/history/done,需保证该路径的所有上级目录(除/tmp)的所有者均为mapred,所属组为hadoop,权限为770

    [root@hadoop102 ~]# hadoop fs -chown -R mapred:hadoop /tmp/hadoop-yarn/staging/history/done
    [root@hadoop102 ~]# hadoop fs -chmod -R 750 /tmp/hadoop-yarn/staging/history/done
    
    [root@hadoop102 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/
    [root@hadoop102 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/
    [root@hadoop102 ~]# hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/
    
    [root@hadoop102 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/history/
    [root@hadoop102 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/
    [root@hadoop102 ~]# hadoop fs -chmod 770 /tmp/hadoop-yarn/
    

启动Yarn

(1)单点启动

  • 启动ResourceManager

    [root@hadoop103 ~]# sudo -i -u yarn yarn --daemon start resourcemanager
    
  • 启动NodeManager

    [root@hadoop102 ~]# sudo -i -u yarn yarn --daemon start nodemanager
    [root@hadoop103 ~]# sudo -i -u yarn yarn --daemon start nodemanager
    [root@hadoop104 ~]# sudo -i -u yarn yarn --daemon start nodemanager
    

(2)群起

  • 在Yarn主节点(hadoop103)配置yarn用户到所有节点的免密登录。

  • 修改主节点(hadoop103)的$HADOOP_HOME/sbin/start-yarn.sh,在顶部增加以下环境变量。

    [root@hadoop103 ~]# vim $HADOOP_HOME/sbin/start-yarn.sh
    在顶部增加如下内容
    
    YARN_RESOURCEMANAGER_USER=yarn
    YARN_NODEMANAGER_USER=yarn
    

    注:stop-yarn.sh也需在顶部增加上述环境变量才可使用。

  • 以root用户执行$HADOOP_HOME/sbin/start-yarn.sh脚本即可启动yarn集群。

    [root@hadoop103 ~]# start-yarn.sh
    

(3)访问Yarn web页面

访问地址为http://hadoop103:8088

启动HistoryServer

(1)启动历史服务器

[root@hadoop102 ~]# sudo -i -u mapred mapred --daemon start historyserver

(2)查看历史服务器web页面

访问地址为http://hadoop102:19888

安全集群用户使用说明

用户要求

(1)具体要求

以下使用说明均基于普通用户,安全集群对用户有以下要求:

  • 集群中的每个节点都需要创建该用户
  • 该用户需要属于hadoop用户组
  • 需要创建该用户对应的Kerberos主体

(2)实操

此处以atguigu用户为例,具体操作如下:

  • 创建用户(存在可跳过),须在所有节点执行

    [root@hadoop102 ~]# useradd atguigu
    [root@hadoop102 ~]# echo atguigu | passwd --stdin atguigu
    
    [root@hadoop103 ~]# useradd atguigu
    [root@hadoop103 ~]# echo atguigu | passwd --stdin atguigu
    
    [root@hadoop104 ~]# useradd atguigu
    [root@hadoop104 ~]# echo atguigu | passwd --stdin atguigu
    
  • 加入hadoop组,须在所有节点执行

    [root@hadoop102 ~]# usermod -a -G hadoop atguigu
    [root@hadoop103 ~]# usermod -a -G hadoop atguigu
    [root@hadoop104 ~]# usermod -a -G hadoop atguigu
    
  • 创建主体

    [root@hadoop102 ~]# kadmin -p admin/admin -wadmin -q"addprinc -pw atguigu atguigu"
    

访问HDFS集群文件

Shell命令

(1)认证

[atguigu@hadoop102 ~]$ kinit atguigu

(2)查看当前认证用户

[atguigu@hadoop102 ~]$ kinit atguigu

(3)执行命令

[atguigu@hadoop102 ~]$ hadoop fs -ls /

(4)注销认证

[atguigu@hadoop102 ~]$ kdestroy

(5)再次执行查看命令

[atguigu@hadoop102 ~]$ hadoop fs -ls /

web页面

(1)安装Kerberos客户端

下载地址:http://web.mit.edu/kerberos/dist/kfw/4.1/kfw-4.1-amd64.msi

  • 下载之后按照提示安装

  • 编辑C:\ProgramData\MIT\Kerberos5\krb5.ini文件,内容如下

    [libdefaults]
     dns_lookup_realm = false
     ticket_lifetime = 24h
     forwardable = true
     rdns = false
     default_realm = EXAMPLE.COM
    
    [realms]
     EXAMPLE.COM = {
      kdc = hadoop102
      admin_server = hadoop102
     }
    
    [domain_realm]
    

(2)配置火狐浏览器

(1)打开浏览器,在地址栏输入“about:config”,点击回车

(2)搜索“network.negotiate-auth.trusted-uris”,修改值为要访问的主机名(hadoop102)

(3)搜索“network.auth.use-sspi”,双击将值变为false

(3)认证

  • 启动Kerberos客户端,点击Get Ticket

  • 输入主体名和密码,点击OK

  • 认证成功

(4)访问HDFS

(5)注销认证

(6)重启浏览器,再次访问HDFS

提交MapReduce任务

(1)认证

[atguigu@hadoop102 ~]$ kinit atguigu

(2)提交任务

[atguigu@hadoop102 ~]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1

Hive用户认证配置

前置要求

(1)Hadoop集群启动Kerberos认证

按照上述步骤为Hadoop集群开启Kerberos安全认证。

(2)创建Hive系统用户和Kerberos主体

  • 创建系统用户

    [root@hadoop102 ~]# useradd hive -g hadoop
    [root@hadoop102 ~]# echo hive | passwd --stdin hive
    
    [root@hadoop103 ~]# useradd hive -g hadoop
    [root@hadoop103 ~]# echo hive | passwd --stdin hive
    
    [root@hadoop104 ~]# useradd hive -g hadoop
    [root@hadoop104 ~]# echo hive | passwd --stdin hive
    
  • 创建Kerberos主体并生成keytab文件

    创建hive用户的Kerberos主体:

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey hive/hadoop102"
    

    在Hive所部署的节点生成keytab文件:

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

    修改keytab文件所有者和访问权限:

    [root@hadoop102 ~]# chown -R root:hadoop /etc/security/keytab/
    [root@hadoop102 ~]# chmod 660 /etc/security/keytab/hive.service.keytab
    

配置认证

(1)修改$HIVE_HOME/conf/hive-site.xml文件,增加如下属性:

[root@hadoop102 ~]# vim $HIVE_HOME/conf/hive-site.xml

<!-- HiveServer2启用Kerberos认证 -->
<property>
    <name>hive.server2.authentication</name>
    <value>kerberos</value>
</property>

<!-- HiveServer2服务的Kerberos主体 -->
<property>
    <name>hive.server2.authentication.kerberos.principal</name>
    <value>hive/hadoop102@EXAMPLE.COM</value>
</property>

<!-- HiveServer2服务的Kerberos密钥文件 -->
<property>
    <name>hive.server2.authentication.kerberos.keytab</name>
    <value>/etc/security/keytab/hive.service.keytab</value>
</property>

<!-- Metastore启动认证 -->
<property>
    <name>hive.metastore.sasl.enabled</name>
    <value>true</value>
</property>
<!-- Metastore Kerberos密钥文件 -->
<property>
    <name>hive.metastore.kerberos.keytab.file</name>
    <value>/etc/security/keytab/hive.service.keytab</value>
</property>
<!-- Metastore Kerberos主体 -->
<property>
    <name>hive.metastore.kerberos.principal</name>
    <value>hive/hadoop102@EXAMPLE.COM</value>
</property>

(2)修改$HADOOP_HOME/etc/hadoop/core-site.xml文件,具体修改如下:

[root@hadoop102 ~]# vim $HADOOP_HOME/etc/hadoop/core-site.xml
  • 删除以下参数

    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>atguigu</value>
    </property>
    
    <property>
        <name>hadoop.proxyuser.atguigu.hosts</name>
        <value>*</value>
    </property>
    
    <property>
        <name>hadoop.proxyuser.atguigu.groups</name>
        <value>*</value>
    </property>
    
    <property>
        <name>hadoop.proxyuser.atguigu.users</name>
        <value>*</value>
    </property>
    
  • 增加以下参数

    <property>
        <name>hadoop.proxyuser.hive.hosts</name>
        <value>*</value>
    </property>
    
    <property>
        <name>hadoop.proxyuser.hive.groups</name>
        <value>*</value>
    </property>
    
    <property>
        <name>hadoop.proxyuser.hive.users</name>
        <value>*</value>
    </property>
    

代理相关:https://blog.csdn.net/u012948976/article/details/49904675

(3)分发配置core-site.xml文件

[root@hadoop102 ~]# xsync $HADOOP_HOME/etc/hadoop/core-site.xml

(4)重启Hadoop集群

[root@hadoop102 ~]# stop-dfs.sh
[root@hadoop103 ~]# stop-yarn.sh

[root@hadoop102 ~]# start-dfs.sh
[root@hadoop103 ~]# start-yarn.sh

启动hiveserver2

注:需使用hive用户启动

[root@hadoop102 ~]# sudo -i -u hive hiveserver2

Hive Kerberos认证使用

以下说明均基于普通用户

beeline客户端

(1)认证,执行以下命令,并按照提示输入密码

[atguigu@hadoop102 ~]$ kinit atguigu

(2)使用beeline客户端连接hiveserver2

[atguigu@hadoop102 ~]$ beeline

使用如下url进行连接

> !connect jdbc:hive2://hadoop102:10000/;principal=hive/hadoop102@EXAMPLE.COM

(3)测试查询

DataGrip客户端

新建Driver

(1)创建Driver

(2)配置Driver

注:

url模板:jdbc:hive2://{host}:{port}/{database}[;<;,{:identifier}={:param}>]
新建连接

(1)创建连接

(2)配置连接

  • 基础配置

    url:jdbc:hive2://hadoop102:10000/;principal=hive/hadoop102@EXAMPLE.COM
    
  • 高级配置

    配置参数:
    -Djava.security.krb5.conf="C:\\ProgramData\\MIT\\Kerberos5\\krb5.ini"
    -Djava.security.auth.login.config="C:\\ProgramData\\MIT\\Kerberos5\\atguigu.conf"
    -Djavax.security.auth.useSubjectCredsOnly=false
    

(3)编写JAAS(Java认证授权服务)配置文件,内容如下,文件名和路径须和上图中java.security.auth.login.config参数的值保持一致。

com.sun.security.jgss.initiate{
      com.sun.security.auth.module.Krb5LoginModule required
      useKeyTab=true
      useTicketCache=false
      keyTab="C:\\ProgramData\\MIT\\Kerberos5\\atguigu.keytab"
      principal="atguigu@EXAMPLE.COM";
};

(4)为用户生成keytab文件,在krb5kdc所在节点(hadoop102)执行以下命令

[root@hadooop102]# kadmin.local -q"xst -norandkey -k /home/atguigu/atguigu.keytab atguigu"

(5)将上一步生成的atguigu.keytab文件,置于Windows中的特定路径,该路径须与**(3)**中的keyTab属性的值保持一致。

(6)测试连接

安全环境实战01-数仓全流程

Hadoop启用Kerberos安全认证之后,之前的非安全环境下的全流程调度脚本和即席查询引擎均会遇到认证问题,故需要对其进行改进。

改动说明

此处统一将数仓的全部数据资源的所有者设为hive用户,全流程的每步操作均认证为hive用户。

用户准备

(1)在各节点创建hive用户,如已存在则跳过

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

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

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

(2)为hive用户创建Keberos主体

  • 创建主体

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey hive"
    
  • 生成keytab文件

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hive.keytab hive"
    
  • 修改keytab文件所有者和访问权限

    [root@hadoop102 ~]# chown hive:hadoop /etc/security/keytab/hive.keytab
    [root@hadoop102 ~]# chmod 440 /etc/security/keytab/hive.keytab
    
  • 分发keytab文件

    [root@hadoop102 ~]# xsync /etc/security/keytab/hive.keytab
    

数据采集通道修改

(1)用户行为日志

修改/opt/module/flume/conf/kafka-flume-hdfs.conf配置文件,增加以下参数:

[root@hadoop104 ~]# vim /opt/module/flume/conf/kafka-flume-hdfs.conf

a1.sinks.k1.hdfs.kerberosPrincipal=hive@EXAMPLE.COM
a1.sinks.k1.hdfs.kerberosKeytab=/etc/security/keytab/hive.keytab

(2)业务数据

修改sqoop每日同步脚本/home/atguigu/bin/mysql_to_hdfs.sh,

[root@hadoop102 ~]# vim /home/atguigu/bin/mysql_to_hdfs.sh

在顶部增加如下认证语句

kinit -kt /etc/security/keytab/hive.keytab hive

数仓各层脚本修改

数仓各层脚本均需在顶部加入如下认证语句:

kinit -kt /etc/security/keytab/hive.keytab hive

修改语句如下

[root@hadoop102 ~]# sed -i '1 a kinit -kt /etc/security/keytab/hive.keytab hive' hdfs_to_ods_log.sh
[root@hadoop102 ~]# sed -i '1 a kinit -kt /etc/security/keytab/hive.keytab hive' hdfs_to_ods_db.sh
[root@hadoop102 ~]# sed -i '1 a kinit -kt /etc/security/keytab/hive.keytab hive' ods_to_dwd_log.sh
[root@hadoop102 ~]# sed -i '1 a kinit -kt /etc/security/keytab/hive.keytab hive' ods_to_dim_db.sh
[root@hadoop102 ~]# sed -i '1 a kinit -kt /etc/security/keytab/hive.keytab hive' ods_to_dwd_db.sh
[root@hadoop102 ~]# sed -i '1 a kinit -kt /etc/security/keytab/hive.keytab hive' dwd_to_dws.sh
[root@hadoop102 ~]# sed -i '1 a kinit -kt /etc/security/keytab/hive.keytab hive' dws_to_dwt.sh
[root@hadoop102 ~]# sed -i '1 a kinit -kt /etc/security/keytab/hive.keytab hive' dwt_to_ads.sh
[root@hadoop102 ~]# sed -i '1 a kinit -kt /etc/security/keytab/hive.keytab hive' hdfs_to_mysql.sh

注:

sed -i '1 a text' file

表示将text内容加入到file文件的第1行之后

修改HDFS特定路径所有者

(1)认证为hdfs用户,执行以下命令并按提示输入密码

[root@hadoop102 ~]#  kinit hdfs/hadoop

(2)修改数据采集目标路径

[root@hadoop102 ~]# hadoop fs -chown -R hive:hadoop /origin_data

(3)修改数仓表所在路径

[root@hadoop102 ~]# hadoop fs -chown -R hive:hadoop /warehouse

(4)修改hive家目录/user/hive

[root@hadoop102 ~]# hadoop fs -chown -R hive:hadoop /user/hive

(5)修改spark.eventLog.dir路径

[root@hadoop102 ~]# hadoop fs -chown -R hive:hadoop /spark-history

全流程数据准备

(1)用户行为日志

  • 启动日志采集通道,包括Zookeeper,Kafka,Flume等

  • 修改hadoop102,hadoop103两台节点的/opt/module/applog/application.yml文件,将模拟日期改为2020-06-16如下

    #业务日期
    mock.date: "2020-06-16"
    
  • 执行生成日志的脚本

    [root@hadoop102 ~]# lg.sh
    
  • 等待片刻,观察HDFS是否出现2020-06-16的日志文件

(2)业务数据

  • 修改/opt/module/db_log/application.properties,将模拟日期修改为2020-06-16,如下:

    #业务日期
    mock.date=2020-06-16
    
  • 进入到/opt/module/db_log路径,执行模拟生成业务数据的命令,如下:

    [root@hadoop102 ~]# java -jar gmall2020-mock-db-2021-01-22.jar
    
  • 观察mysql的gmall数据中是否出现2020-06-16的数据:

启动Azkaban

(1)在各节点创建azkaban用户

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

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

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

(2)将各节点Azkaban安装路径所有者改为azkaban用户

[root@hadoop102 ~]# chown -R azkaban:hadoop /opt/module/azkaban
[root@hadoop103 ~]# chown -R azkaban:hadoop /opt/module/azkaban
[root@hadoop104 ~]# chown -R azkaban:hadoop /opt/module/azkaban

(3)使用azkaban用户启动Azkaban

  • 启动Executor Server

    在各节点执行以下命令,启动Executor

    [root@hadoop102 ~]# sudo -i -u azkaban bash -c "cd /opt/module/azkaban/azkaban-exec;bin/start-exec.sh"
    [root@hadoop103 ~]# sudo -i -u azkaban bash -c "cd /opt/module/azkaban/azkaban-exec;bin/start-exec.sh"
    [root@hadoop104 ~]# sudo -i -u azkaban bash -c "cd /opt/module/azkaban/azkaban-exec;bin/start-exec.sh"
    
  • 激活Executor Server,任选一台节点执行以下激活命令即可

    [root@hadoop102 ~]# curl http://hadoop102:12321/executor?action=activate
    [root@hadoop102 ~]# curl http://hadoop103:12321/executor?action=activate
    [root@hadoop102 ~]# curl http://hadoop104:12321/executor?action=activate
    
  • 启动Web Server

    [root@hadoop102 ~]# sudo -i -u azkaban bash -c "cd /opt/module/azkaban/azkaban-web;bin/start-web.sh"
    
  • 修改数仓各层脚本访问权限,确保azkaban用户能够访问到

    [root@hadoop102 ~]# chown -R atguigu:hadoop /home/atguigu
    [root@hadoop102 ~]# chmod 770 /home/atguigu
    
    [root@hadoop103 ~]# chown -R atguigu:hadoop /home/atguigu
    [root@hadoop103 ~]# chmod 770 /home/atguigu
    
    [root@hadoop104 ~]# chown -R atguigu:hadoop /home/atguigu
    [root@hadoop104 ~]# chmod 770 /home/atguigu
    

全流程调度

(1)工作流参数

(2)运行结果

安全环境实战02-即席查询之Presto

改动说明

Presto集群开启Kerberos认证可只配置Presto Coordinator和Presto Cli之间进行认证,集群内部通讯可不进行认证。Presto Coordinator和Presto Cli之间的认证要求两者采用更为安全的HTTPS协议进行通讯。

若Presto对接的是Hive数据源,由于其需要访问Hive的元数据和HDFS上的数据文件,故也需要对Hive Connector进行Kerberos认证。

用户准备

(1)在所有节点创建presto系统用户

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

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

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

(2)为Hive Connector创建Kerberos主体

  • 创建presto用户的Kerberos主体

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey presto"
    
  • 生成keytab文件

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/presto.keytab presto"
    
  • 修改keytab文件的访问权限

    [root@hadoop102 ~]# chown presto:hadoop /etc/security/keytab/presto.keytab
    
  • 分发keytab文件

    [root@hadoop102 ~]# xsync /etc/security/keytab/presto.keytab
    

(3)为Presto Coordinator创建Kerberos主体

  • 创建presto用户的Kerberos主体

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey presto/hadoop102"
    
  • 生成keytab文件

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/presto.service.keytab presto/hadoop102"
    
  • 修改keytab文件的访问权限

    [root@hadoop102 ~]# chown presto:hadoop /etc/security/keytab/presto.service.keytab
    

创建HTTPS协议所需的密钥对

注意

  • alias(别名)需要和Presto Coordinator的Kerberos主体名保持一致
  • 名字与姓氏 需要填写Coordinator所在的主机名

(1)使用Java提供的keytool工具生成密钥对

[root@hadoop102 ~]# keytool -genkeypair -alias presto -keyalg RSA -keystore /etc/security/keytab/keystore.jks
输入密钥库口令:  
再次输入新口令: 
您的名字与姓氏是什么?
  [Unknown]:  hadoop102
您的组织单位名称是什么?
  [Unknown]:  
您的组织名称是什么?
  [Unknown]:  
您所在的城市或区域名称是什么?
  [Unknown]:  
您所在的省/市/自治区名称是什么?
  [Unknown]:  
该单位的双字母国家/地区代码是什么?
  [Unknown]:  
CN=hadoop102, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正确?
  []:  y

输入 <presto> 的密钥口令
    (如果和密钥库口令相同, 按回车):

(2)修改keystore文件的所有者和访问权限

[root@hadoop102 ~]# chown presto:hadoop /etc/security/keytab/keystore.jks
[root@hadoop102 ~]# chmod 660 /etc/security/keytab/keystore.jks

修改Presto Coordinator配置文件

在/opt/module/presto/etc/config.properties文件中增加以下参数:

[root@hadoop102 ~]# vim /opt/module/presto/etc/config.properties
http-server.authentication.type=KERBEROS

http.server.authentication.krb5.service-name=presto
http.server.authentication.krb5.keytab=/etc/security/keytab/presto.service.keytab
http.authentication.krb5.config=/etc/krb5.conf

http-server.https.enabled=true
http-server.https.port=7778
http-server.https.keystore.path=/etc/security/keytab/keystore.jks
http-server.https.keystore.key=123456

修改Hive Connector配置文件

(1)在/opt/module/presto/etc/catalog/hive.properties中增加以下参数

[root@hadoop102 ~]# vim /opt/module/presto/etc/catalog/hive.properties
hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=hive/hadoop102@EXAMPLE.COM
hive.metastore.client.principal=presto@EXAMPLE.COM
hive.metastore.client.keytab=/etc/security/keytab/presto.keytab

hive.hdfs.authentication.type=KERBEROS
hive.hdfs.impersonation.enabled=true
hive.hdfs.presto.principal=presto@EXAMPLE.COM
hive.hdfs.presto.keytab=/etc/security/keytab/presto.keytab
hive.config.resources=/opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml,/opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml

(2)分发/opt/module/presto/etc/catalog/hive.properties文件

[root@hadoop102 ~]# xsync /opt/module/presto/etc/catalog/hive.properties

配置客户端Kerberos主体到用户名之间的映射规则

(1)新建/opt/module/presto/etc/access-control.properties配置文件,内容如下

[root@hadoop102 ~]# vim /opt/module/presto/etc/access-control.properties

access-control.name=file
security.config-file=etc/rules.json

(2)新建/opt/module/presto/etc/rules.json文件,内容如下

[root@hadoop102 ~]# vim /opt/module/presto/etc/rules.json

{
  "catalogs": [
    {
      "allow": true  # 允许所有用户拥有所有catelog的所有权限
    }
  ],
  "user_patterns": [
    "(.*)",   # ldap协议的映射规则
    "([a-zA-Z]+)/?.*@.*"  #kerberos协议的映射规则,()部分为抽取出的用户名
  ]
}

https://blog.51cto.com/u_13639264/4535031

配置Presto代理用户

(1)修改Hadoop配置文件

修改$HADOOP_HOME/etc/hadoop/core-site.xml配置文件,增加如下内容:

[root@hadoop102 ~]# vim $HADOOP_HOME/etc/hadoop/core-site.xml
<property>
    <name>hadoop.proxyuser.presto.hosts</name>
    <value>*</value>
</property>

<property>
    <name>hadoop.proxyuser.presto.groups</name>
    <value>*</value>
</property>

<property>
    <name>hadoop.proxyuser.presto.users</name>
    <value>*</value>
</property>

(2)分发修改的文件

[root@hadoop102 ~]# xsync $HADOOP_HOME/etc/hadoop/core-site.xml

(3)重启Hadoop集群

[root@hadoop102 ~]# stop-dfs.sh
[root@hadoop103 ~]# stop-yarn.sh

[root@hadoop102 ~]# start-dfs.sh
[root@hadoop103 ~]# start-yarn.sh

重启Presto集群

(1)关闭集群

[root@hadoop102 ~]# /opt/module/presto/bin/launcher stop
[root@hadoop103 ~]# /opt/module/presto/bin/launcher stop
[root@hadoop104 ~]# /opt/module/presto/bin/launcher stop

(2)修改Presto安装路径所有者为presto

[root@hadoop102 ~]# chown -R presto:hadoop /opt/module/presto
[root@hadoop103 ~]# chown -R presto:hadoop /opt/module/presto
[root@hadoop104 ~]# chown -R presto:hadoop /opt/module/presto

(3)使用hive用户启动MetaStore服务

[root@hadoop102 ~]# sudo -i -u hive hive --service metastore

(4)使用presto用户启动Presto集群

[root@hadoop102 ~]# sudo -i -u presto /opt/module/presto/bin/launcher start
[root@hadoop103 ~]# sudo -i -u presto /opt/module/presto/bin/launcher start
[root@hadoop104 ~]# sudo -i -u presto /opt/module/presto/bin/launcher start

客户端认证访问Presto集群

[root@hadoop102 presto]# ./prestocli \
--server https://hadoop102:7778 \
--catalog hive \
--schema default \
--enable-authentication \
--krb5-remote-service-name presto \
--krb5-config-path /etc/krb5.conf \
--krb5-principal atguigu@EXAMPLE.COM \
--krb5-keytab-path /home/atguigu/atguigu.keytab \
--keystore-path /etc/security/keytab/keystore.jks \
--keystore-password 123456 \
--user atguigu

安全环境实战03-即席查询之Kylin

改动说明

从Kylin的架构,可以看出Kylin充当只是一个Hadoop客户端,读取Hive数据,利用MR或Spark进行计算,将Cube存储至HBase中。所以在安全的Hadoop环境下,Kylin不需要做额外的配置,只需要具备一个Kerberos主体,进行常规的认证即可。

但是Kylin所依赖的HBase需要进行额外的配置,才能在安全的Hadoop环境下正常工作。

HBase开启Kerberos认证

(1)用户准备

在各节点创建hbase系统用户:

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

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

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

创建hbase Kerberos主体:

  • 在hadoop102节点创建主体,生成密钥文件,并修改所有者

    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey hbase/hadoop102"
    [root@hadoop102 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hbase.service.keytab hbase/hadoop102"
    [root@hadoop102 ~]# chown hbase:hadoop /etc/security/keytab/hbase.service.keytab
    
  • 在hadoop103节点创建主体,生成密钥文件,并修改所有者

    [root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"addprinc -randkey hbase/hadoop103"
    [root@hadoop103 ~]# kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hbase.service.keytab hbase/hadoop103"
    [root@hadoop103 ~]# chown hbase:hadoop /etc/security/keytab/hbase.service.keytab
    
  • 在hadoop104节点创建主体,生成密钥文件,并修改所有者

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

(2)修改HBase配置文件

修改$HBASE_HOME/conf/hbase-site.xml配置文件,增加以下参数:

[root@hadoop102 ~]# vim $HBASE_HOME/conf/hbase-site.xml

<property>
    <name>hbase.security.authentication</name>
    <value>kerberos</value>
</property>

<property> 
    <name>hbase.master.kerberos.principal</name> 
    <value>hbase/_HOST@EXAMPLE.COM</value> 
</property> 

<property> 
    <name>hbase.master.keytab.file</name> 
    <value>/etc/security/keytab/hbase.service.keytab</value> 
</property>

<property>
    <name>hbase.regionserver.kerberos.principal</name> 
    <value>hbase/_HOST@EXAMPLE.COM</value> 
</property> 

<property> 
    <name>hbase.regionserver.keytab.file</name> 
    <value>/etc/security/keytab/hbase.service.keytab</value> 
</property>

<property> 
    <name>hbase.coprocessor.region.classes</name>
    <value>org.apache.hadoop.hbase.security.token.TokenProvider</value>
</property>

(3)分发配置文件

[root@hadoop102 ~]# xsync $HBASE_HOME/conf/hbase-site.xml

(4)修改hbase.rootdir路径所有者

  • 使用hdfs/hadoop用户进行认证

    [root@hadoop102 ~]# kinit hdfs/hadoop
    
  • 修改所有者

    [root@hadoop102 ~]# hadoop fs -chown -R hbase:hadoop /hbase
    

(5)启动HBase

  • 修改各节点HBase安装目录所有者

    [root@hadoop102 ~]# chown -R hbase:hadoop /opt/module/hbase
    [root@hadoop103 ~]# chown -R hbase:hadoop /opt/module/hbase
    [root@hadoop104 ~]# chown -R hbase:hadoop /opt/module/hbase
    
  • 配置hbase用户从主节点(hadoop102)到所有节点的ssh免密

  • 使用hbase用户启动HBase

    [root@hadoop102 ~]# sudo -i -u hbase start-hbase.sh
    

(6)停止HBase

启用Kerberos认证之后,关闭HBase时,需先进行Kerberos用户认证,认证的主体为hbase。

  • 认证为hbase主体

    [root@hadoop102 ~]# sudo -i -u hbase kinit -kt /etc/security/keytab/hbase.service.keytab hbase/hadoop102
    
  • 停止hbase

    [root@hadoop102 ~]# sudo -i -u hbase stop-hbase.sh
    

Kylin进行Kerberos认证

(1)用户准备

创建kylin系统用户:

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

(2)修改kylin.env.hdfs-working-dir路径所有者为kylin

  • 使用hdfs/hadoop用户进行认证

    [root@hadoop102 ~]# kinit hdfs/hadoop
    
  • 修改所有者

    [root@hadoop102 ~]# hadoop fs -chown -R hive:hadoop /kylin
    

(3)修改/opt/module/kylin所有者为kylin

[root@hadoop102 ~]# chown -R kylin:hadoop /opt/module/kylin

(4)启动kylin

  • 在kylin用户下认证为hive主体

    [root@hadoop102 ~]# sudo -i -u kylin kinit -kt /etc/security/keytab/hive.keytab hive
    
  • 以kylin用户的身份启动kylin

    [root@hadoop102 ~]# sudo -i -u kylin /opt/module/kylin/bin/kylin.sh start
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值