安全认证Kerberos详解

文章目录

  • 一、Kerberos入门与使用
    • 1、Kerberos概述
      • 1.1 什么是Kerberos
      • 1.2 Kerberos术语
      • 1.3 Kerberos认证原理
    • 2、Kerberos安装
      • 2.1 安装Kerberos相关服务
      • 2.2 修改配置文件
      • 2.3 其他配置与启动
    • 3、Kerberos使用概述
      • 3.1 Kerberos数据库操作
      • 3.2 Kerberos认证操作
  • 二、Hadoop Kerberos配置
    • 1、创建Hadoop系统用户
    • 2、Hadoop Kerberos配置
      • 2.1 为Hadoop各服务创建Kerberos主体(Principal)
      • 2.2 修改Hadoop配置文件
      • 2.3 配置HDFS使用HTTPS安全传输协议
      • 2.4 配置Yarn使用LinuxContainerExecutor
    • 3、安全模式下启动Hadoop集群
      • 3.1 修改特定本地路径权限
      • 3.2 启动HDFS
      • 3.3 改HDFS特定路径访问权限
      • 3.4 启动Yarn
      • 3.5 启动HistoryServer
    • 4、启动遇坑详解
      • 4.1 DataNode无法连接上NameNode 提示 : GSS initiate failed
      • 4.2 Hadoop集成kerberos后,报错:AccessControlException
    • 5、安全集群使用说明
      • 5.1 用户要求
      • 5.2 访问HDFS集群文件
      • 5.3 提交MapReduce任务
  • 三、Hive安全认证
    • 1、Hive用户认证配置
      • 1.1 创建Hive系统用户和Kerberos主体
      • 1.2 配置认证
      • 1.3 启动hiveserver2
    • 2、Hive Kerberos认证使用说明
      • 2.1 beeline客户端
      • 2.2 DataGrip客户端
  • 四、安全环境实战
    • 1、数仓全流程改造
      • 1.1 用户准备
      • 1.2 数据采集通道修改
      • 1.3 修改HDFS特定路径所有者
      • 1.4 Azkaban举例
    • 2、即席查询之Presto
      • 2.1 改动说明
      • 2.2 用户准备
      • 2.3 创建HTTPS协议所需的密钥对
      • 2.4 修改Presto Coordinator配置文件
      • 2.5 修改Hive Connector配置文件
      • 2.6 配置客户端Kerberos主体到用户名之间的映射规则
      • 2.7 配置Presto代理用户
      • 2.8 重启Presto集群
      • 2.9 客户端认证访问Presto集群
    • 3、即席查询之Kylin
      • 3.1 改动说明
      • 3.2 HBase开启Kerberos认证
      • 3.3 Kylin进行Kerberos认证

一、Kerberos入门与使用

hadoop官网:https://hadoop.apache.org/docs/r3.1.3/hadoop-project-dist/hadoop-common/SecureMode.html

1、Kerberos概述

1.1 什么是Kerberos

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

1.2 Kerberos术语

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

  • KDC(Key Distribute Center):密钥分发中心,负责存储用户信息,管理发放票据
  • Realm:Kerberos所管理的一个领域或范围,称之为一个Realm
  • Rrincipal:Kerberos所管理的一个用户或者一个服务,可以理解为Kerberos中保存的一个账号,其格式通常如下:primary**/**instance@realm
  • keytab:Kerberos中的用户认证,可通过密码或者密钥文件证明身份,keytab指密钥文件

1.3 Kerberos认证原理

2、Kerberos安装

2.1 安装Kerberos相关服务

# 需要进入root用户
# 选择集群中的一台主机(hadoop102)作为Kerberos服务端,安装KDC,所有主机都需要部署Kerberos客户端
# 服务端主机执行以下安装命令,主机器安装
yum install -y krb5-server# 客户端主机执行以下安装命令,三台机器分别安装
yum install -y krb5-workstation krb5-libs

2.2 修改配置文件

# 服务端主机(hadoop102)
vim /var/kerberos/krb5kdc/kdc.conf
# 修改如下内容,EXAMPLE.COM可以修改成自己的,这里我就暂时不修改了
[kdcdefaults]kdc_ports = 88kdc_tcp_ports = 88[realms]EXAMPLE.COM = {#master_key_type = aes256-ctsacl_file = /var/kerberos/krb5kdc/kadm5.acldict_file = /usr/share/dict/wordsadmin_keytab = /var/kerberos/krb5kdc/kadm5.keytabsupported_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}# 客户端主机(所有主机)
# 修改/etc/krb5.conf文件
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.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log[libdefaults]dns_lookup_realm = falsedns_lookup_kdc = falseticket_lifetime = 24hrenew_lifetime = 7dforwardable = truerdns = falsepkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crtdefault_realm = EXAMPLE.COM#default_ccache_name = KEYRING:persistent:%{uid}[realms]EXAMPLE.COM = {kdc = hadoop102admin_server = hadoop102}
[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM

2.3 其他配置与启动

# 初始化KDC数据库
# 在服务端主机(hadoop102)执行以下命令,并根据提示输入密码(123456)
kdb5_util create -s# 修改管理员权限配置文件
# 在服务端主机(hadoop102)修改/var/kerberos/krb5kdc/kadm5.acl文件
*/admin@EXAMPLE.COM     *# 启动Kerberos相关服务
# 在主节点(hadoop102)启动KDC,并配置开机自启
systemctl start krb5kdc
systemctl enable krb5kdc
# 在主节点(hadoop102)启动Kadmin,该服务为KDC数据库访问入口
systemctl start kadmin
systemctl enable kadmin# 创建Kerberos管理员用户
# 在KDC所在主机(hadoop102),执行以下命令,并按照提示输入密码
kadmin.local -q "addprinc admin/admin"

3、Kerberos使用概述

3.1 Kerberos数据库操作

# 本地登录(无需认证)
kadmin.local
# 远程登录(需进行主体认证,认证操作见下文)
kadmin# 创建Kerberos主体
# 登录数据库,输入以下命令,并按照提示输入密码
addprinc test
# 也可通过以下shell命令直接创建主体
kadmin.local -q"addprinc test"
# 修改主体密码
cpw test
# 查看所有主体
list_principals

3.2 Kerberos认证操作

# 密码认证
# 使用kinit进行主体认证,并按照提示输入密码
kinit test
# 查看认证凭证
klist# 密钥文件认证
# 生成主体test的keytab文件到指定目录/root/test.keytab
kadmin.local -q "xst -norandkey -k  /root/test.keytab test@EXAMPLE.COM"
# 注:-norandkey的作用是声明不随机生成密码,若不加该参数,会导致之前的密码失效
# 使用keytab进行认证
kinit -kt /root/test.keytab test
# 查看认证凭证
klist# 销毁凭证
kdestroy
klist

一些常用操作

# 1、密码形式创建kdc用户
sudo kadmin.local -q "addprinc -pw ${pwd} ${kdcPrinc}" 
# 2、keytab形式创建kdc用户
sudo kadmin.local -q "ktadd -norandkey -k ${kdcPath} ${kdcPrinc}"
# 3、删除kdc用户
sudo kadmin.local -q "delprinc -force ${kdcPrinc}"
# 4、修改kdc用户密码
sudo kadmin.local -q "cpw -pw ${newpwd} ${kdcPrinc}"
# 5、销毁票据
sudo su ${linuxUserName} kdestroy
# 6、认证票据
sudo su ${linuxUserName} kinit
# 7、查看票据缓存文件目录地址
sudo su ${linuxUserName} klist
# 8、查找某个目录下是否有该文件
find ${kdcPath} -name ${keytabFile}

二、Hadoop Kerberos配置

1、创建Hadoop系统用户

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

User:GroupDaemons
hdfs:hadoopNameNode, Secondary NameNode, JournalNode, DataNode
yarn:hadoopResourceManager, NodeManager
mapred:hadoopMapReduce JobHistory Server
# 创建hadoop组,分别在三台机器创建
groupadd hadoop
# 创建各用户并设置密码,分别在三台机器创建
useradd hdfs -g hadoop
echo hdfs | passwd --stdin  hdfs
useradd yarn -g hadoop
echo yarn | passwd --stdin yarn
useradd mapred -g hadoop
echo mapred | passwd --stdin mapred

2、Hadoop Kerberos配置

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

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

服务所在主机主体(Principal)
NameNodehadoop102nn/hadoop102
DataNodehadoop102dn/hadoop102
DataNodehadoop103dn/hadoop103
DataNodehadoop104dn/hadoop104
Secondary NameNodehadoop104sn/hadoop104
ResourceManagerhadoop103rm/hadoop103
NodeManagerhadoop102nm/hadoop102
NodeManagerhadoop103nm/hadoop103
N****odeManagerhadoop104nm/hadoop104
JobHistory Serverhadoop102jhs/hadoop102
W****eb UIhadoop102HTTP/hadoop102
W****eb UIhadoop103HTTP/hadoop103
W****eb UIhadoop104HTTP/hadoop104

创建主体说明

# 为服务创建的主体,需要通过密钥文件keytab文件进行认证,故需为各服务准备一个安全的路径用来存储keytab文件
mkdir /etc/security/keytab/
chown -R root:hadoop /etc/security/keytab/
chmod 770 /etc/security/keytab/# 管理员主体认证
# 为执行创建主体的语句,需登录Kerberos 数据库客户端,登录之前需先使用Kerberos的管理员用户进行认证,执行以下命令并根据提示输入密码
kinit admin/admin
# 登录数据库客户端
kadmin
# 执行创建主体的语句 
kadmin:  addprinc -randkey test/test
kadmin:  xst -k /etc/security/keytab/test.keytab test/test
# ======说明======
# (1)addprinc test/test:作用是新建主体
# addprinc:增加主体
# -randkey:密码随机,因hadoop各服务均通过keytab文件认证,故密码可随机生成
# test/test:新增的主体
# (2)xst -k /etc/security/keytab/test.keytab test/test:作用是将主体的密钥写入keytab文件
# xst:将主体的密钥写入keytab文件
# -k /etc/security/keytab/test.keytab:指明keytab文件路径和文件名
# test/test:主体# 为方便创建主体,可使用如下命令
kadmin -padmin/admin -wadmin -q"addprinc -randkey test/test"
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 

开始创建主体

# 在所有节点创建keytab文件目录,三台机器执行
mkdir /etc/security/keytab/
chown -R root:hadoop /etc/security/keytab/
chmod 770 /etc/security/keytab/# ==========以下命令在hadoop102节点执行============
kadmin -padmin/admin -wadmin -q"addprinc -randkey nn/hadoop102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nn.service.keytab nn/hadoop102"
kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/hadoop102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/hadoop102"
kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/hadoop102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/hadoop102"
kadmin -padmin/admin -wadmin -q"addprinc -randkey jhs/hadoop102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/jhs.service.keytab jhs/hadoop102"
kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/hadoop102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/hadoop102"# ==========以下命令在hadoop103节点执行============
kadmin -padmin/admin -wadmin -q"addprinc -randkey rm/hadoop103"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/rm.service.keytab rm/hadoop103"
kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/hadoop103"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/hadoop103"
kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/hadoop103"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/hadoop103"
kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/hadoop103"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/hadoop103"# ==========以下命令在hadoop104节点执行============
kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/hadoop104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/hadoop104"
kadmin -padmin/admin -wadmin -q"addprinc -randkey sn/hadoop104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/sn.service.keytab sn/hadoop104"
kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/hadoop104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/hadoop104"
kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/hadoop104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/hadoop104"# ==========修改所有节点keytab文件的所有者和访问权限============
# 三台机器依次执行
chown -R root:hadoop /etc/security/keytab/
chmod 660 /etc/security/keytab/*

2.2 修改Hadoop配置文件

需要修改的内容如下(添加),修改完毕需要分发所改文件

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><!-- RULE:[<规则编号>:<规则表达式>](<匹配的Kerberos主体>)s/<替换表达式>/<本地用户名称>/ -->
<!-- Kerberos主体到系统用户的具体映射规则, -->
<!-- 默认规则会将未匹配的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>

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>

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>

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>

最后分发四个文件

xsync /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
xsync /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml
xsync /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml
xsync /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml

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

# Keytool是java数据证书的管理工具,使用户能够管理自己的公/私钥对及相关证书。
# -keystore    指定密钥库的名称及位置(产生的各类信息将存在.keystore文件中)
# -genkey(或者-genkeypair)      生成密钥对
# -alias  为生成的密钥对指定别名,如果没有默认是mykey
# -keyalg  指定密钥的算法 RSA/DSA 默认是DSA
keytool -keystore /etc/security/keytab/keystore -alias jetty -genkey -keyalg RSA
keytool -keystore keystore -list
# 修改keystore文件的所有者和访问权限
chown -R root:hadoop /etc/security/keytab/keystore
chmod 660 /etc/security/keytab/keystore
# 密钥库的密码至少6个字符,可以是纯数字或者字母或者数字和字母的组合等等
# 确保hdfs用户(HDFS的启动用户)具有对所生成keystore文件的读权限# 将该证书分发到集群中的每台节点的相同路径
xsync /etc/security/keytab/keystore
# 然后修改hadoop配置文件ssl-server.xml.example
mv $HADOOP_HOME/etc/hadoop/ssl-server.xml.example $HADOOP_HOME/etc/hadoop/ssl-server.xml
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>

最后分发xsync $HADOOP_HOME/etc/hadoop/ssl-server.xml

2.4 配置Yarn使用LinuxContainerExecutor

因为默认提交任务的用户是启动hadoop的用户,因此需要把它改为提交者的用户

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

# 三台机器依次执行
chown root:hadoop /opt/module/hadoop-3.1.3/bin/container-executor
chmod 6050 /opt/module/hadoop-3.1.3/bin/container-executor# 三台节点依次修改
# 修改所有节点的container-executor.cfg文件的所有者和权限,
# 要求该文件及其所有的上级目录的所有者均为root,所有组为hadoop(启动NodeManger的yarn用户的所属组),权限为400。
# 其默认路径为$HADOOP_HOME/etc/hadoop
chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop
chown root:hadoop /opt/module/hadoop-3.1.3/etc
chown root:hadoop /opt/module/hadoop-3.1.3
chown root:hadoop /opt/module
chmod 400 /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg# 修改$HADOOP_HOME/etc/hadoop/container-executor.cfg
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

修改$HADOOP_HOME/etc/hadoop/yarn-site.xml文件,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>

最后分发

xsync $HADOOP_HOME/etc/hadoop/container-executor.cfg
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml

3、安全模式下启动Hadoop集群

3.1 修改特定本地路径权限

因为是不同的用户分别启动不同的程序,所以需要修改之前的所有者和权限

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
# $HADOOP_LOG_DIR(所有节点),三台机器依次运行
# 该变量位于hadoop-env.sh文件,默认值为 ${HADOOP_HOME}/logs
chown hdfs:hadoop /opt/module/hadoop-3.1.3/logs/
chmod 775 /opt/module/hadoop-3.1.3/logs/# dfs.namenode.name.dir(NameNode节点),102机器
# 该参数位于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/name
chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/name/
chmod 700 /opt/module/hadoop-3.1.3/data/dfs/name/# dfs.datanode.data.dir(DataNode节点),三台机器
# 该参数为于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/data
chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/data/
chmod 700 /opt/module/hadoop-3.1.3/data/dfs/data/# dfs.namenode.checkpoint.dir(SecondaryNameNode节点),104机器
# 该参数位于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/namesecondary
chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/namesecondary/
chmod 700 /opt/module/hadoop-3.1.3/data/dfs/namesecondary/# yarn.nodemanager.local-dirs(NodeManager节点),三台机器
# 该参数位于yarn-site.xml文件,默认值为file://${hadoop.tmp.dir}/nm-local-dir
chown -R yarn:hadoop /opt/module/hadoop-3.1.3/data/nm-local-dir/
chmod -R 775 /opt/module/hadoop-3.1.3/data/nm-local-dir/# yarn.nodemanager.log-dirs(NodeManager节点),三台机器
# 该参数位于yarn-site.xml文件,默认值为$HADOOP_LOG_DIR/userlogs
chown yarn:hadoop /opt/module/hadoop-3.1.3/logs/userlogs/
chmod 775 /opt/module/hadoop-3.1.3/logs/userlogs/

3.2 启动HDFS

# =================== 单点启动 ================
# -i:重新加载环境变量
# -u:以特定用户的身份执行后续命令
# 启动NameNode,102机器启动
sudo -i -u hdfs hdfs --daemon start namenode
# 启动DataNode,三台机器依次启动
sudo -i -u hdfs hdfs --daemon start datanode
# 启动SecondaryNameNode,104机器启动
sudo -i -u hdfs hdfs --daemon start secondarynamenode# =================== 群起 ===================
# 在主节点(hadoop102)配置hdfs用户到所有节点的免密登录。
su hdfs
ssh-keygen
# 输入密码hdfs设置免密登陆
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
exit# 修改主节点(hadoop102)节点的$HADOOP_HOME/sbin/start-dfs.sh脚本,在顶部增加以下环境变量
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集群
start-dfs.sh
# 查看HFDS web页面
# 访问地址为https://hadoop102:9871 

3.3 改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—

若上述路径不存在,需手动创建

# 以下操作都在hadoop102
# (1)创建hdfs/hadoop主体,执行以下命令并按照提示输入密码
kadmin.local -q "addprinc hdfs/hadoop"
# (2)认证hdfs/hadoop主体,执行以下命令并按照提示输入密码
kinit hdfs/hadoop
# 按照上述要求修改指定路径的所有者和权限
# 修改/、/tmp、/user路径
hadoop fs -chown hdfs:hadoop / /tmp /user
hadoop fs -chmod 755 /
hadoop fs -chmod 1777 /tmp
hadoop fs -chmod 775 /user
# 参数yarn.nodemanager.remote-app-log-dir位于yarn-site.xml文件,默认值/tmp/logs
hadoop fs -chown yarn:hadoop /tmp/logs
hadoop fs -chmod 1777 /tmp/logs
# (3)参数mapreduce.jobhistory.intermediate-done-dir位于mapred-site.xml文件,
# 默认值为/tmp/hadoop-yarn/staging/history/done_intermediate,需保证该路径的所有上级目录(除/tmp)的所有者均为mapred,所属组为hadoop,权限为770
hadoop fs -chown -R mapred:hadoop /tmp/hadoop-yarn/staging/history/done_intermediate
hadoop fs -chmod -R 1777 /tmp/hadoop-yarn/staging/history/done_intermediatehadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/
hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/
hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/history/
hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/
hadoop fs -chmod 770 /tmp/hadoop-yarn/
# (4)参数mapreduce.jobhistory.done-dir位于mapred-site.xml文件,默认值为/tmp/hadoop-yarn/staging/history/done,
# 需保证该路径的所有上级目录(除/tmp)的所有者均为mapred,所属组为hadoop,权限为770
hadoop fs -chown -R mapred:hadoop /tmp/hadoop-yarn/staging/history/done
hadoop fs -chmod -R 750 /tmp/hadoop-yarn/staging/history/donehadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/history/
hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/staging/
hadoop fs -chown mapred:hadoop /tmp/hadoop-yarn/hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/history/
hadoop fs -chmod 770 /tmp/hadoop-yarn/staging/
hadoop fs -chmod 770 /tmp/hadoop-yarn/

3.4 启动Yarn

# ==============单点启动================
# 启动ResourceManager
sudo -i -u yarn yarn --daemon start resourcemanager
# 启动NodeManager
sudo -i -u yarn yarn --daemon start nodemanager
sudo -i -u yarn yarn --daemon start nodemanager
sudo -i -u yarn yarn --daemon start nodemanager
# =================群起=====================
# 在Yarn主节点(hadoop103)配置yarn用户到所有节点的免密登录
# 修改主节点(hadoop103)的$HADOOP_HOME/sbin/start-yarn.sh,在顶部增加以下环境变量
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集群。
start-yarn.sh
# 访问Yarn web页面
# 访问地址为http://hadoop103:8088

3.5 启动HistoryServer

# 启动历史服务器
sudo -i -u mapred mapred --daemon start historyserver
# 查看历史服务器web页面
# 访问地址为http://hadoop102:19888

4、启动遇坑详解

4.1 DataNode无法连接上NameNode 提示 : GSS initiate failed

# 查看namenode的报错信息
2022-03-28 17:57:11,389 WARN SecurityLogger.org.apache.hadoop.ipc.Server: Auth failed for 192.168.31.213:44542:null (GSS initiate failed) with true cause: (GSS initiate failed)
2022-03-28 17:57:14,706 WARN SecurityLogger.org.apache.hadoop.ipc.Server: Auth failed for 192.168.31.213:34648:null (GSS initiate failed) with true cause: (GSS initiate failed)

原因是JDK没有装JCE组件, JDK需要下载安装JCE组件. 重启服务即可;或者使用使用JDK 1.8.0_161或更高版本时,不需要再安装JCE Policy File,因为JDK 1.8.0_161默认启用无限强度加密。

# JCE的安装
# 官网:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
# 随便找一个目录, 解压 unzip jce_policy-8.zip , 获取到UnlimitedJCEPolicyJDK8文件夹
# 解压
unzip jce_policy-8.zip
# 查看文件
ll UnlimitedJCEPolicyJDK8/
# 备份 ${JAVA_HOME}/jre/lib/security目录
cd ${JAVA_HOME}
cp -r ${JAVA_HOME}/jre/lib/security  ${JAVA_HOME}/jre/lib/security_bak
# 把UnlimitedJCEPolicyJDK8目录下的所有jar包(US_export_policy.jar和local_policy.jar)拷贝至集群所有节点的${JAVA_HOME}/jre/lib/security目录下
cp UnlimitedJCEPolicyJDK8/*.jar ${JAVA_HOME}/jre/lib/security
# 安装完成, 重启相关服务即可(比如kerberos/hadoop相关服务)
# 启用krb5kdc和重启kerberos服务

4.2 Hadoop集成kerberos后,报错:AccessControlException

# 报错信息
klist
Ticket cache: KEYRING:persistent:0:krb_ccache_MkHX3zi
Default principal: hdfs/hadoop102@EXAMPLE.COMValid starting       Expires              Service principal
2022-03-28T17:35:19  2022-03-29T17:35:19  krbtgt/EXAMPLE.COM@EXAMPLE.COM
hadoop fs -ls /
2022-03-28 20:23:27,667 WARN ipc.Client: Exception encountered while connecting to the server : org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]
ls: DestHost:destPort hadoop102:8020 , LocalHost:localPort master01/192.xx.xx:0. Failed on local exception: java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]

解决方法:修改 Kerboeros配置文件 /etc/krb5.conf , 注释掉 : default_ccache_name 属性,然后执行kdestroy,重新kinit

可以参考:https://blog.csdn.net/zhanglong_4444/article/details/115268262

5、安全集群使用说明

5.1 用户要求

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

  • 集群中的每个节点都需要创建该用户
  • 该用户需要属于hadoop用户组
  • 需要创建该用户对应的Kerberos主体
# 创建用户(存在可跳过),须在所有节点执行
useradd shawn
echo shawn| passwd --stdin shawn# 加入hadoop组,须在所有节点执行
usermod -a -G hadoop shawn# 创建主体,直接输入账户和密码
kadmin -p admin/admin -wadmin -q"addprinc -pw shawn shawn"

5.2 访问HDFS集群文件

首先针对是shell环境

# 认证
kinit shawn
# 查看当前认证用户
klist
# 查看
hadoop fs -ls /
# 注销认证
kdestroy
# 再次查看,发现报错没有认证
hadoop fs -ls /

对于web页面

# 下载认证客户端(windows),然后安装好
# http://web.mit.edu/kerberos/dist/kfw/4.1/kfw-4.1-amd64.msi
# 编辑C:\ProgramData\MIT\Kerberos5\krb5.ini文件
# 内容如下
[libdefaults]dns_lookup_realm = falseticket_lifetime = 24hforwardable = truerdns = falsedefault_realm = EXAMPLE.COM[realms]EXAMPLE.COM = {kdc = hadoop102admin_server = hadoop102}[domain_realm]

配置火狐浏览器(其他浏览器有可能有问题),打开浏览器,在地址栏输入about:config,点击回车;搜索network.negotiate-auth.trusted-uris,修改值为要访问的主机名(hadoop102);下一步搜索network.auth.use-sspi,双击将值变为false

最后启动认证,启动Kerberos客户端,点击Get Ticket,输入主体名和密码,点击OK,认证成功,访问web界面

5.3 提交MapReduce任务

# 认证
kinit shawn
# 提交任务
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1

三、Hive安全认证

1、Hive用户认证配置

1.1 创建Hive系统用户和Kerberos主体

hive作为服务来进行Kerberos认证

# 创建系统用户,三台机器都要创建
useradd hive -g hadoop
echo hive | passwd --stdin hive# 创建Kerberos主体并生成keytab文件,在hadoop102创建
# 创建hive用户的Kerberos主体
kadmin -padmin/admin -wadmin -q"addprinc -randkey hive/hadoop102"
# 在Hive所部署的节点生成keytab文件
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hive.service.keytab hive/hadoop102"
# 修改keytab文件所有者和访问权限
chown -R root:hadoop /etc/security/keytab/
chmod 660 /etc/security/keytab/hive.service.keytab

1.2 配置认证

修改$HIVE_HOME/conf/hive-site.xml文件,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>

修改$HADOOP_HOME/etc/hadoop/core-site.xml文件,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>
# 分发配置core-site.xml文件
xsync $HADOOP_HOME/etc/hadoop/core-site.xml
# 重启Hadoop集群
stop-dfs.sh
stop-yarn.shstart-dfs.sh
start-yarn.sh

1.3 启动hiveserver2

# 注:需使用hive用户启动
sudo -i -u hive hiveserver2

2、Hive Kerberos认证使用说明

以下说明均基于普通用户

2.1 beeline客户端

# 认证,执行以下命令,并按照提示输入密码
kinit shawn
# 使用beeline客户端连接hiveserver2
beeline
# 使用如下url进行连接
!connect jdbc:hive2://hadoop102:10000/;principal=hive/hadoop102@EXAMPLE.COM
# 测试查询

2.2 DataGrip客户端

jar包获取:https://download.csdn.net/download/lemon_TT/87951242

首先需要新建driver(自带的没有认证功能),配置Driverurl模板:jdbc:hive2://{host}:{port}/{database}[;<;,{:identifier}={:param}>](注意jar包路径)

第二步新建连接,选择刚刚创建的driver,选择配置连接,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\\shawn.conf"
-Djavax.security.auth.useSubjectCredsOnly=false

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

com.sun.security.jgss.initiate{com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=trueuseTicketCache=falsekeyTab="C:\\ProgramData\\MIT\\Kerberos5\\shawn.keytab"principal="shawn@EXAMPLE.COM";
};

为用户生成keytab文件,在krb5kdc所在节点(hadoop102)执行以下命令,然后将生成的atguigu.keytab文件,置于Windows中的特定路径,测试连接

kadmin.local -q"xst -norandkey -k /home/shawn/shawn.keytab shawn"

四、安全环境实战

Hadoop启用Kerberos安全认证之后,之前的非安全环境下的全流程调度脚本和即席查询引擎均会遇到认证问题,故需要对其进行改进,本章内容仅限参考,具体可以参考官网

1、数仓全流程改造

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

1.1 用户准备

# 在各节点创建hive用户,如已存在则跳过,三个节点
useradd hive -g hadoop
echo hive | passwd --stdin hive# 为hive用户创建Keberos主体,102节点
# 创建主体
kadmin -padmin/admin -wadmin -q"addprinc -randkey hive"
# 生成keytab文件
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hive.keytab hive"
# 修改keytab文件所有者和访问权限
chown hive:hadoop /etc/security/keytab/hive.keytab
chmod 440 /etc/security/keytab/hive.keytab
# 分发keytab文件
xsync /etc/security/keytab/hive.keytab

1.2 数据采集通道修改

# 修改/opt/module/flume/conf/kafka-flume-hdfs.conf配置文件,
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# 业务数据
# 修改sqoop每日同步脚本/home/atguigu/bin/mysql_to_hdfs.sh
# 在顶部增加如下认证语句,shell脚本都可以如此认证
kinit -kt /etc/security/keytab/hive.keytab hive# 数仓各层脚本均需在顶部加入如下认证语句
kinit -kt /etc/security/keytab/hive.keytab hive
# 举例
# 表示将text内容加入到file文件的第1行之后
sed -i '1 a kinit -kt /etc/security/keytab/hive.keytab hive' hdfs_to_ods_log.sh

1.3 修改HDFS特定路径所有者

# 认证为hdfs用户,执行以下命令并按提示输入密码
kinit hdfs/hadoop
# 修改数据采集目标路径
hadoop fs -chown -R hive:hadoop /origin_data
hadoop fs -chown -R hive:hadoop /warehouse
# 修改hive家目录/user/hive
hadoop fs -chown -R hive:hadoop /user/hive
# 修改spark.eventLog.dir路径
hadoop fs -chown -R hive:hadoop /spark-history

1.4 Azkaban举例

# 在各节点创建azkaban用户
useradd azkaban -g hadoop
echo azkaban | passwd --stdin azkaban# 将各节点Azkaban安装路径所有者改为azkaban用户
chown -R azkaban:hadoop /opt/module/azkaban# 使用azkaban用户启动Azkaban
# 在各节点执行以下命令,启动Executor
sudo -i -u azkaban bash -c "cd /opt/module/azkaban/azkaban-exec;bin/start-exec.sh"
# 激活Executor Server,任选一台节点执行以下激活命令即可
curl http://hadoop102:12321/executor?action=activate
curl http://hadoop103:12321/executor?action=activate
curl http://hadoop104:12321/executor?action=activate
# 启动Web Server
sudo -i -u azkaban bash -c "cd /opt/module/azkaban/azkaban-web;bin/start-web.sh"
# 修改数仓各层脚本访问权限,确保azkaban用户能够访问到,三台机器都设置
chown -R atguigu:hadoop /home/atguigu
chmod 770 /home/atguigu

2、即席查询之Presto

2.1 改动说明

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

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

2.2 用户准备

# 在所有节点创建presto系统用户
useradd presto -g hadoop
echo presto | passwd --stdin presto# 为Hive Connector创建Kerberos主体,hadoop102节点
# 创建presto用户的Kerberos主体
kadmin -padmin/admin -wadmin -q"addprinc -randkey presto"
# 生成keytab文件
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/presto.keytab presto"
# 修改keytab文件的访问权限
chown presto:hadoop /etc/security/keytab/presto.keytab
# 分发keytab文件
xsync /etc/security/keytab/presto.keytab# 为Presto Coordinator创建Kerberos主体,HADOOP102节点
# 创建presto用户的Kerberos主体
kadmin -padmin/admin -wadmin -q"addprinc -randkey presto/hadoop102"
# 生成keytab文件
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/presto.service.keytab presto/hadoop102"
# 修改keytab文件的访问权限
chown presto:hadoop /etc/security/keytab/presto.service.keytab

2.3 创建HTTPS协议所需的密钥对

# 注意:
# (1)alias(别名)需要和Presto Coordinator的Kerberos主体名保持一致
# (2)名字与姓氏 需要填写Coordinator所在的主机名
# 使用Java提供的keytool工具生成密钥对
keytool -genkeypair -alias presto -keyalg RSA -keystore /etc/security/keytab/keystore.jks
# 您的名字与姓氏是什么?
#  [Unknown]:  hadoop102# 修改keystore文件的所有者和访问权限
chown presto:hadoop /etc/security/keytab/keystore.jks
chmod 660 /etc/security/keytab/keystore.jks

2.4 修改Presto Coordinator配置文件

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

http-server.authentication.type=KERBEROShttp.server.authentication.krb5.service-name=presto
http.server.authentication.krb5.keytab=/etc/security/keytab/presto.service.keytab
http.authentication.krb5.config=/etc/krb5.confhttp-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

2.5 修改Hive Connector配置文件

/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.keytabhive.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

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

xsync /opt/module/presto/etc/catalog/hive.properties

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

新建/opt/module/presto/etc/access-control.properties配置文件

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

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

{"catalogs": [{"allow": true}],"user_patterns": ["(.*)","([a-zA-Z]+)/?.*@.*"]
}

2.7 配置Presto代理用户

# 修改Hadoop配置文件
# 修改$HADOOP_HOME/etc/hadoop/core-site.xml配置文件,增加如下内容
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># 分发修改的文件
xsync $HADOOP_HOME/etc/hadoop/core-site.xml
# 重启Hadoop集群
stop-dfs.sh
stop-yarn.shstart-dfs.sh
start-yarn.sh

2.8 重启Presto集群

# 关闭集群,三台机器依次执行
/opt/module/presto/bin/launcher stop
# 修改Presto安装路径所有者为presto,三台机器依次执行
chown -R presto:hadoop /opt/module/presto
# 使用hive用户启动MetaStore服务,102机器
sudo -i -u hive hive --service metastore
# 使用presto用户启动Presto集群,三台机器
sudo -i -u presto /opt/module/presto/bin/launcher 

2.9 客户端认证访问Presto集群

# 102机器执行
./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

3、即席查询之Kylin

3.1 改动说明

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

但是Kylin(这里的kylin版本为3.x)所依赖的HBase需要进行额外的配置,才能在安全的Hadoop环境下正常工作

3.2 HBase开启Kerberos认证

首先进行用户准备

# 在各节点创建hbase系统用户
useradd -g hadoop hbase
echo hbase | passwd --stdin hbase# 创建hbase Kerberos主体
# 在hadoop102节点创建主体,生成密钥文件,并修改所有者
kadmin -padmin/admin -wadmin -q"addprinc -randkey hbase/hadoop102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hbase.service.keytab hbase/hadoop102"
chown hbase:hadoop /etc/security/keytab/hbase.service.keytab
# 在hadoop103节点创建主体,生成密钥文件,并修改所有者
kadmin -padmin/admin -wadmin -q"addprinc -randkey hbase/hadoop103"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hbase.service.keytab hbase/hadoop103"
chown hbase:hadoop /etc/security/keytab/hbase.service.keytab
# 在hadoop104节点创建主体,生成密钥文件,并修改所有者
kadmin -padmin/admin -wadmin -q"addprinc -randkey hbase/hadoop104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/hbase.service.keytab hbase/hadoop104"
chown hbase:hadoop /etc/security/keytab/hbase.service.keytab

修改HBase配置文件,修改$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>
# 分发配置文件
xsync $HBASE_HOME/conf/hbase-site.xml
# 修改hbase.rootdir路径所有者
# 使用hdfs/hadoop用户进行认证
kinit hdfs/hadoop
# 修改所有者
hadoop fs -chown -R hbase:hadoop /hbase# 启动HBase
# 修改各节点HBase安装目录所有者,三台机器都修改
chown -R hbase:hadoop /opt/module/hbase
# 配置hbase用户从主节点(hadoop102)到所有节点的ssh免密
# 使用hbase用户启动HBase,hadoop102启动
sudo -i -u hbase start-hbase.sh
# 停止HBase
# 启用Kerberos认证之后,关闭HBase时,需先进行Kerberos用户认证,认证的主体为hbase。
sudo -i -u hbase kinit -kt /etc/security/keytab/hbase.service.keytab hbase/hadoop102
sudo -i -u hbase stop-hbase.sh

3.3 Kylin进行Kerberos认证

# 用户准备,创建kylin系统用户,102机器
useradd -g hadoop kylin
echo kylin | passwd --stdin kylin
# 修改kylin.env.hdfs-working-dir路径所有者为kylin
# 使用hdfs/hadoop用户进行认证
kinit hdfs/hadoop
hadoop fs -chown -R hive:hadoop /kylin
# 修改/opt/module/kylin所有者为kylin
chown -R kylin:hadoop /opt/module/kylin
# 启动kylin
# 在kylin用户下认证为hive主体
sudo -i -u kylin kinit -kt /etc/security/keytab/hive.keytab hive
# 以kylin用户的身份启动kylin
sudo -i -u kylin /opt/module/kylin/bin/kylin.sh start

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海外仓管理系统的“实用性”讨论:没办法自由设置信息的,都是伪功能

和很多经营海外仓的企业都聊过这样一个问题&#xff1a;对于海外仓的管理系统&#xff0c;到底什么样的设计&#xff0c;什么样的功能才是真的有价值的。 那这就不得不说到一个概念&#xff1a;自由性。什么意思呢&#xff0c;海外仓看似都一样&#xff0c;大家都在经营仓储、…

ppt里的音乐哪里来的?

心血来潮&#xff0c;想照着大神的模板套一个类似于快闪的ppt。 ppt里是有一段音乐的&#xff0c;那段音乐就是从幻灯片第二页开始响起的。 但是我就找不到音乐在哪。 甚至我把ppt里的所有素材都删除了&#xff0c;再看动画窗格&#xff0c;仍然是空无一物&#xff0c;显然&…

研究表明,全球互联网流量竟有一半来自机器人

据Cyber News消息&#xff0c;Thales Imperva Bad Bot近期做了一份报告&#xff0c;显示在2023年有49.6%的互联网流量竟来自机器人&#xff0c;比上一年增长 2%&#xff0c;达到自2013年以来观察到的最高水平。 报告称&#xff0c;这一趋势正对企业组织产生负面影响&#xff0c…

Oracle 正则,开窗,行列转换

1.开窗函数 基本上在查询结果上添加窗口列 1.1 聚合函数开窗 基本格式: ..... 函数() over([partition by 分组列,...][order by 排序列 desc|asc][定位框架]) 1&#xff0c;partition by 字段 相当于group by 字段 起到分组作用2&#xff0c;order by 字段 即根据某个字段…

《教学管理与教育研究》简介及投稿邮箱

《教学管理与教育研究》简介及投稿邮箱 《教学管理与教育研究》是教育部主管、语文出版社主办的国家级教育类学术期刊&#xff0c;本刊面向全国学校教育的发展管理、教学研究、科研创新和师资培养等领域&#xff0c;展示我国学校教育科研领域的最新成果&#xff0c;交流教学管…

Docker安装xxl-job分布式任务调度平台

文章目录 Docker安装xxl-job分布式任务调度平台1.xxl-job介绍2. 初始化“调度数据库”3、docker挂载运行xxl-job容器3.1、在linux的opt目录下创建xxl_job文件夹&#xff0c;并在里面创建logs文件夹和application.properties文件3.2、配置application.properties文件&#xff0c…

基于springboot+vue+Mysql的校园新闻网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

分布式锁设计

一、为什么需要分布式锁 1.1 单体项目同步实现 在单进程&#xff08;启动一个jvm&#xff09;的系统中&#xff0c;当存在多个线程可以同时改变某个变量&#xff08;可变共享变量&#xff09;时&#xff0c;就需要对变量或代码块做同步&#xff0c;使其在修改这种变量时能够线…

关于Git的一些基础用法

关于Git的一些基础用法 1. 前言2. 使用GitHub/gitee创建项目2.1 创建账号2.2 创建项目2.3 下载仓库到本地2.4 提交代码到远端仓库2.5 查看日志2.6 同步远端仓库和本地仓库 1. 前言 首先说一个冷知识&#xff08;好像也不是很冷&#xff09;&#xff0c;Linux和git的创始人是同…

客户关系管理(CRM)是什么?CRM 客户关系管理系统完整指南

通过本文&#xff0c;你将了解&#xff1a; CRM是什么样的软件呢&#xff1f; 企业CRM普遍存在哪些难题&#xff1f;又该怎样解决呢&#xff1f; CRM软件有什么样的功能&#xff1f; 未来CRM软件将朝什么方向发展呢&#xff1f; 以我们公司正在使用的CRM系统为例—— 简道云…

最佳实践:高并发之扩容思路

系统在业务平峰期间运行稳定、性能良好&#xff0c;但在大流量时就会出现各种各样的问题&#xff0c;例如接口时延变大&#xff0c;CPU占用率升高、频繁发生Full GC、代码中出现死锁等等。大流量意味着高并发&#xff0c;高并发也是很多开发人员所期望拥有的经验&#xff0c;一…

Wireshark TS | 再谈应用传输缓慢问题

问题背景 来自于朋友分享的一个案例&#xff0c;某某客户反馈电脑应用软件使用时打开很慢&#xff0c;并提供了一个慢时所捕获的数据包文件以及服务端 IP。以前也说过&#xff0c;所谓的慢有很多种现象&#xff0c;也会有很多原因引起&#xff0c;在没有更多输入条件的情况下&…

浅入浅出之nginx

目录 工作流程正向代理概念 反向代理概念 nginx反向代理配置文件介绍解释作用 参考文章Nginx 常用指令和操作启动 Nginx测试配置文件快速关闭 Nginx优雅关闭 Nginx重载配置文件查看版本查看编译时的参数查看进程配置用户访问日志配置错误日志设置 web 根目录配置 server 块配置…

LeetCode_1304.和为零的 N 个不同整数

题目&#xff1a; 题解&#xff1a; 题目说让我们返回一个由n个各不相同的整数组成的数组&#xff0c;相加为0。 这里的比较好的办法就是类似于 1 2 3 0 -3 -2 -1这样对称的数组。既满足要求&#xff0c;又好实现。 先calloc出一个容量为n的整型数组&#xff0c;定义两个变量…

解决java.lang.NoClassDefFoundError 问题

解决java.lang.NoClassDefFoundError 问题 一、背景二、分析三、解决 一、背景 项目运行成功之后&#xff0c;调用某个接口时报错,信息如下: 2024-04-17 14:59:23 [ERROR] --- [nio-8070-exec-1] c.c.c.e.LogExceptionHandleFilter : Handler dispatch failed; nest…

如何使用Git-Secrets防止将敏感信息意外上传至Git库

关于Git-Secrets Git-secrets是一款功能强大的开发安全工具&#xff0c;该工具可以防止开发人员意外将密码和其他敏感信息上传到Git库中。 Git-secrets首先会扫描提交的代码和说明&#xff0c;当与用户预先配置的正则表达式模式匹配时&#xff0c;便会阻止此次提交。该工具的优…

分布式光纤测温解决方案

安科瑞电气股份有限公司 祁洁 15000363176 一、方案介绍 分布式光纤测温&#xff08;DTS&#xff09;集光电信号检测、计算机技术等为一体&#xff0c;具有实时监测、测温精度高、测量距离长、可精确定位、采用光纤作为传感器和传输介质&#xff0c;具有抗电磁干扰、本征防…

项目文档维护(一) 快速生成项目结构图

IDEA快速生成项目树形结构图 1. 执行指令 在项目根目录下&#xff0c;进入cmd或terminal, 输入如下指令&#xff1a; tree . > tr.txt 只有文件夹 tree /f . > tr.txt 包括文件夹和文件注意尽量要使用idea, pycharm等ide, 其他工具需自己测试效果, 本人使用power …

详解网络通讯框架Netty原理,看这一篇就够了

NIO网络通信 网络通信BIONIOselectpollepollselect poll epoll对比 Netty原理Netty架构reactor响应式编程netty组件eventLoop 线程间交互Future接口Promise接口 Handler和PipelineByteBuf组成指针常用方法 网络通信 通过网络编程的基础可以知道&#xff0c;各设备通过I/O流写入…

如何阻止访问您的网站

本周有一个客户&#xff0c;购买Hostease的HK Basic Linux虚拟主机&#xff0c;询问我们的在线客服&#xff0c;如何阻止部分地区或IP段访问他的网站。我们为用户提供教程&#xff0c;用户很快完成了设置。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对您有帮助…