目录
1.Hive 配置 Kerberos
2. Hive Cli使用Kerberos
3. Hive beeline使用Kerberos
4. JDBC访问Kerberos认证Hive
5. Spark访问Kerberos认证Hive
6. Flink访问Kerberos认证Hive
技术连载系列,前面内容请参考前面连载9内容:Kerberos安全认证-连载9-访问Kerberos安全认证Hadoop_IT贫道的博客-
CSDN博客
Hive底层数据存储在HDFS中,HQL执行默认会转换成MR执行在Yarn中,当HDFS配置了Kerberos安全认证时,只对HDFS进行认证是不够的,因为Hive作为数据仓库基础架构也需要访问HDFS上的数据。因此,为了确保整个大数据环境的安全性,Hive也需要配置Kerberos安全认证,这样可以控制对Hive和底层HDFS数据的访问权限,防止未经授权的访问和操作,确保数据的安全性。
目前对HDFS进行了Kerberos安全认证后,在Hive ** 客户端**
虽然进行了用户主体认证,但在操作Hive时也不能正常操作Hive,需要对Hive进行kerberos安全认证。
#切换zhangsan用户,查看kerberos认证主体,目前没有认证
[root@node3 ~]# su zhangsan
[zhangsan@node3 root]$ cd
[zhangsan@node3 ~]$ klist
klist: No credentials cache found (filename: /tmp/krb5cc_1003)
#进行zhangsan主体认证
[zhangsan@node3 root]$ kinit zhangsan
Password for zhangsan@EXAMPLE.COM: 123456
[zhangsan@node3 ~]$ klist
Ticket cache: FILE:/tmp/krb5cc_1003
Default principal: zhangsan@EXAMPLE.COM
#登录并操作Hive,需要先在node1 hive服务端启动metastore服务。
[zhangsan@node3 ~]$ hive
hive> create table test (id int,name string,age int ) row format delimited fields terminated by '\t';
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: java.io.IOException Dest
Host:destPort node1:8020 , LocalHost:localPort node1/192.168.179.4:0. Failed on local exception: java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS])
1. Hive 配置 Kerberos
Hive配置Kerberos的前提是Hadoop需要配置Kerberos,这里已经在Hadoop集群中配置了Kerberos。按照如下步骤进行Hive使用Kerberos配置即可。
1) 创建hive用户并设置组
在Hadoop集群中操作不同的服务有不同的用户,这里使用hive用户操作hive。在node1~node5所有hadoop节点上创建hive用户(非hive服务端和客户端也需要创建),后续执行HQL时会转换成MR任务执行于各个NodeManager节点,所以这里在所有集群节点中创建hive用户并设置所属组为hadoop。
#node1~node5所有节点执行命令创建hive用户,设置密码为123456
useradd hive -g hadoop
passwd hive
注意:创建hive用户以后,最好重启下HDFS集群,否则后续使用hive用户执行SQL时没有操作目录的权限。
2) 创建Hive服务的Princial主体
在kerberos 服务端执行如下命令,创建Hive服务的kerberos Princial主体,然后将服务主体写入keytab文件。
#在kerberos 服务端node1节点执行如下命令
[root@node1 ~]# kadmin.local -q "addprinc -pw 123456 hive/node1"
#将hive服务主体写入keytab文件
[root@node1 ~]# kadmin.local -q "ktadd -norandkey -kt /home/keytabs/hive.service.keytab hive/node1@EXAMPLE.COM"
以上命令执行后,可以在node1节点的/home/keytabs目录下看到生成对应的hive.server.keytab文件。
3) 分发keytab文件并修改所属用户和组
将生成的hive服务对应的keytab密钥文件发送到hive服务端和客户端,这里node1为hive服务端,只需要发送到hive客户端node3节点即可。
#发送keytab 到node3节点
[root@node1 ~]# scp /home/keytabs/hive.service.keytab node3:/home/keytabs/
#在node1、node3两个节点修改keytab所属用户和组
chown root:hadoop /home/keytabs/hive.service.keytab
chmod 770 /home/keytabs/hive.service.keytab
4) 修改hive-site.xml配置文件
在hive服务端和客户端配置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/node1@EXAMPLE.COM</value>
</property>
<!-- hiveserver2 keytab密钥文件路径 -->
<property>
<name>hive.server2.authentication.kerberos.keytab</name>
<value>/home/keytabs/hive.service.keytab</value>
</property>
<!-- hivemetastore 开启kerberos认证 -->
<property>
<name>hive.metastore.sasl.enabled</name>
<value>true</value>
</property>
<!-- metastore kerberos主体 -->
<property>
<name>hive.metastore.kerberos.principal</name>
<value>hive/node1@EXAMPLE.COM</value>
</property>
<!-- metastore keytab密钥文件路径 -->
<property>
<name>hive.metastore.kerberos.keytab.file</name>
<value>/home/keytabs/hive.service.keytab</value>
</property>
5) 修改Hadoop core-site.xml
修改core-site.xml中相关代理配置为hive代理用户,node1~node5节点core-site.xml中修改如下配置项:
<!-- 允许hive用户在任意主机节点代理任意用户和任意组 -->
<property>
<name>hadoop.proxyuser.hive.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.users</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.groups</name>
<value>*</value>
</property>
以上配置分发到Hadoop各个集群节点后, ** 需要重新启动HDFS。**
6) hive conf中准备hdfs-site.xml和core-site.xml
将hdfs配置文件hdfs-site.xml,core-site.xml 发送到客户端和服务端HIVE_HOME/conf/目录中。
2. Hive Cli使用Kerberos
使用Hive Client操作Kerberos需要首先启动HDFS,然后在Hive服务端启动Hive Metastore,操作如下:
#启动zookeeper及HDFS
[root@node3 ~]# zkServer.sh start
[root@node4 ~]# zkServer.sh start
[root@node5 ~]# zkServer.sh start
[root@node1 ~]# start-all.sh
#在Hive服务端node1节点启动Hive Metastore,这里可以切换成Hive用户,也可以不切换
[root@node1 ~]# su hive
[hive@node1 ~]$ hive --service metastore &
在Hive客户端node3节点上登录hive客户端:
#需要切换用户为hive,其他用户没有操作hql底层转换成mr操作的目录权限
[root@node3 ~]# su hive
[hive@node3 root]$ cd
#进行节点认证kerberos
[hive@node3 ~]$ kinit hive/node1
Password for hive/node1@EXAMPLE.COM:123456
#登录hive,建表、插入数据及查询
[hive@node3 ~]$ hive
hive> create table person (id int,name string,age int ) row format delimited fields terminated by '\t';
OK
Time taken: 0.236 seconds
hive> insert into person values (1,'zs',18);
...
hive> select * from person;
OK
1 zs 18
#在node3节点准备如下文件及数据
[hive@node3 ~]$ cat /home/hive/person.txt
2 ls 19
3 ww 20
#在hive客户端将以上文件数据加载到hive person表中,操作如下
hive> load data local inpath '/home/hive/person.txt' into table person;
hive> select * from person;
OK
1 zs 18
2 ls 19
3 ww 20
3. Hive beeline使用Kerberos
除了在hive客户端操作Hive外,还可以通过beeline方式操作Hive,具体步骤如下:
1) 在Hive服务端启动hiveserver2
#启动hiveserver2
[hive@node1 root]$ hiveserver2
2) 在Hive客户端执行beeline登录hive
#在hive 客户端通过beeline登录hive
[hive@node3 ~]$ beeline
beeline> !connect jdbc:hive2://node1:10000/default;principal=hive/node1@EXAMPLE.COM
0: jdbc:hive2://node1:10000/default> select * from person;
+------------+--------------+-------------+
| person.id | person.name | person.age |
+------------+--------------+-------------+
| 1 | zs | 18 |
| 2 | ls | 19 |
| 3 | ww | 20 |
+------------+--------------+-------------+
#也可以通过以下方式通过beeline直接操作hive
[hive@node3 ~]$ beeline -u "jdbc:hive2://node1:10000/default;principal=hive/node1@EXAMPLE.COM"
注意:无论使用哪种方式通过beeline连接hive,针对kerberos认证的hive都需要指定principal参数。
4. JDBC访问Kerberos认证Hive
在IDEA中使用JDBC方式读取Kerberos认证Hive时需要指定krb5.conf文件、Principal主体、keytab密钥文件,然后在代码中进行设置即可JDBC方式访问Kerberos认证的Hive。具体操作步骤如下:
1) 准备krb5.conf及keytab文件
在node1
kerberos服务端将/etc/krb5.conf文件放在window固定路径中,同时将hive主体对应的keytab密钥文件放在windows固定路径中。
2) 启动HiveServer2
需要在Hive服务端启动HiveServer2服务:
#在Hive服务端node1节点执行如下命令
[root@node1 ~]# su hive
[hive@node1 root]$ hiveserver2
3) 编写JDBC访问Hive代码
/**
* 通过JDBC方式读取Kerberos认证Hive的数据
*/
public class JDBCReadAuthHive {
// Kerberos主体
static final String principal = "hive/node1@EXAMPLE.COM";
// Kerberos配置文件路径
static final String krb5FilePath = "D:\\idea_space\\KerberosAuth\\KerberosAuthHive\\src\\main\\resources\\krb5.conf";
// Keytab文件路径
static final String keytabFilePath = "D:\\idea_space\\KerberosAuth\\KerberosAuthHive\\src\\main\\resources\\hive.service.keytab";
public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
// 1.加载Kerberos配置文件
System.setProperty("java.security.krb5.conf", krb5FilePath);
// 2.设置Kerberos认证
Configuration configuration = new Configuration();
configuration.set("hadoop.security.authentication", "kerberos");
UserGroupInformation.setConfiguration(configuration);
UserGroupInformation.loginUserFromKeytab(principal, keytabFilePath);
// 3.JDBC连接字符串
String jdbcURL = "jdbc:hive2://node1:10000/default;principal=hive/node1@EXAMPLE.COM";
Class.forName("org.apache.hive.jdbc.HiveDriver");
try {
// 4.创建Hive连接
Connection connection = DriverManager.getConnection(jdbcURL, "", "");
// 5.执行Hive查询
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery("SELECT id,name,age FROM person");
// 6.处理查询结果
while (rs.next()) {
System.out.println(rs.getInt(1) + "," +
rs.getString(2)+ "," +
rs.getInt(3)) ;
}
// 7.关闭连接
rs.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
以上代码需要在项目maven pom.xml文件中加入如下依赖:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>3.1.3</version>
</dependency>
以上代码运行结果如下:
1,zs,18
2,ls,19
3,ww,20
5. Spark访问Kerberos认证Hive
这里是通过SparkSQL来读取Kerberos认证Hive中的数据,按照如下步骤配置即可。
1) 准备krb5.conf及keytab文件
在node1
kerberos服务端将/etc/krb5.conf文件放在window固定路径中,同时将hive主体对应的keytab密钥文件放在windows固定路径中。这里项目中已经有了,可以忽略。
2) 准备访问 ** Hive** ** 需要的资源文件**
将HDFS中的core-site.xml 、hdfs-site.xml 、yarn-site.xml文件及Hive客户端配置hive-
site.xml上传到项目resources资源目录中。
3) 准备Maven项目依赖
在IDEA项目中将hive-jdbc依赖进行注释,该包与SparkSQL读取Hive中的数据的包有冲突,向maven依赖中导入如下依赖包:
<!-- Spark-core -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.4.0</version>
</dependency>
<!-- SparkSQL -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.4.0</version>
</dependency>
<!-- SparkSQL ON Hive-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.12</artifactId>
<version>3.4.0</version>
</dependency>
4) 编写SparkSQL读取Hive代码
/**
* Spark 读取Kerberos认证Hive的数据
*/
public class SparkReadAuthHive {
public static void main(String[] args) throws IOException {
//进行kerberos认证
System.setProperty("java.security.krb5.conf", "D:\\idea_space\\KerberosAuth\\KerberosAuthHDFS\\src\\main\\resources\\krb5.conf");
String principal = "hive/node1@EXAMPLE.COM";
String keytabPath = "D:\\idea_space\\KerberosAuth\\KerberosAuthHive\\src\\main\\resources\\hive.service.keytab";
UserGroupInformation.loginUserFromKeytab(principal, keytabPath);
SparkSession spark = SparkSession.builder().appName("SparkReadAuthHive")
.master("local")
// .config("hive.metastore.uris", "thrift://node1:9083")
.enableHiveSupport()
.getOrCreate();
spark.sql("select * from person").show();
spark.stop();
}
}
以上代码编写完成后执行可以查询hive表中对应的数据。
6. Flink访问Kerberos认证Hive
Flink读取Kerberos认证Hive也需要进行认证,这里以FlinkSQL读取Hive中数据为例来演示,步骤如下。
1) 准备krb5.conf及keytab文件
在node1
kerberos服务端将/etc/krb5.conf文件放在window固定路径中,同时将hive主体对应的keytab密钥文件放在windows固定路径中。
** 这里项目中已经有了,可以忽略。**
2) 准备访问 ** Hive** ** 需要的资源文件**
将HDFS中的core-site.xml 、hdfs-site.xml 、yarn-site.xml文件及Hive客户端配置hive-
site.xml上传到项目resources资源目录中。 ** 这里项目中已经有了,可以忽略。**
3) 准备Maven项目依赖
在IDEA项目中引入如下Flink依赖包:
<!-- Flink 读取Hive表数据需要依赖 -->
<!-- Flink批和流开发依赖包 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>1.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-common</artifactId>
<version>1.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java</artifactId>
<version>1.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.12</artifactId>
<version>1.16.0</version>
</dependency>
<!-- Flink Dependency -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-hive_2.12</artifactId>
<version>1.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge</artifactId>
<version>1.16.0</version>
</dependency>
<!-- Hive Dependency -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.3</version>
</dependency>
注意:Spark操作Hive依赖与Flink操作Hive依赖也有冲突,这里由于把代码放在一个项目中,所以执行Spark或者Flink代码时把对方依赖注释掉即可。
4) 编写FlinkSQL读取Hive代码
/**
* Spark 读取Kerberos认证Hive的数据
*/
public class SparkReadAuthHive {
public static void main(String[] args) throws IOException {
//进行kerberos认证
System.setProperty("java.security.krb5.conf", "D:\\idea_space\\KerberosAuth\\KerberosAuthHDFS\\src\\main\\resources\\krb5.conf");
String principal = "hive/node1@EXAMPLE.COM";
String keytabPath = "D:\\idea_space\\KerberosAuth\\KerberosAuthHive\\src\\main\\resources\\hive.service.keytab";
UserGroupInformation.loginUserFromKeytab(principal, keytabPath);
SparkSession spark = SparkSession.builder().appName("SparkReadAuthHive")
.master("local")
// .config("hive.metastore.uris", "thrift://node1:9083")
.enableHiveSupport()
.getOrCreate();
spark.sql("select * from person").show();
spark.stop();
}
}
以上代码编写完成后执行可以查询hive表中对应的数据。
欢迎点赞、评论、收藏,关注IT贫道,获取IT技术知识!
接下来我将给各位同学划分一张学习计划表!
学习计划
那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:
阶段一:初级网络安全工程师
接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。
综合薪资区间6k~15k
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
那么,到此为止,已经耗时1个月左右。你已经成功成为了一名“脚本小子”。那么你还想接着往下探索吗?
阶段二:中级or高级网络安全工程师(看自己能力)
综合薪资区间15k~30k
7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。
零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;
Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完
用Python编写漏洞的exp,然后写一个简单的网络爬虫
PHP基本语法学习并书写一个简单的博客系统
熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)
了解Bootstrap的布局或者CSS。
阶段三:顶级网络安全工程师
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
学习资料分享
当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。
