Kerberos安全认证-连载10-Hive Kerberos 安全设置及访问_idea毗连 kerberos ...

打印 上一主题 下一主题

主题 830|帖子 830|积分 2490

​​​​​​​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安全认证。
  1. #切换zhangsan用户,查看kerberos认证主体,目前没有认证
  2. [root@node3 ~]# su zhangsan
  3. [zhangsan@node3 root]$ cd
  4. [zhangsan@node3 ~]$ klist
  5. klist: No credentials cache found (filename: /tmp/krb5cc_1003)
  6. #进行zhangsan主体认证
  7. [zhangsan@node3 root]$ kinit zhangsan
  8. Password for zhangsan@EXAMPLE.COM: 123456
  9. [zhangsan@node3 ~]$ klist
  10. Ticket cache: FILE:/tmp/krb5cc_1003
  11. Default principal: zhangsan@EXAMPLE.COM
  12. #登录并操作Hive,需要先在node1 hive服务端启动metastore服务。
  13. [zhangsan@node3 ~]$ hive
  14. hive>  create table test (id int,name string,age int ) row format delimited fields terminated by '\t';
  15. FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: java.io.IOException Dest
  16. 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。
  1. #node1~node5所有节点执行命令创建hive用户,设置密码为123456
  2. useradd hive -g hadoop
  3. passwd hive
复制代码
留意:创建hive用户以后,最好重启下HDFS集群,否则后续利用hive用户执行SQL时没有操作目录的权限。
2) 创建Hive服务的Princial主体
在kerberos 服务端执行如下下令,创建Hive服务的kerberos Princial主体,然后将服务主体写入keytab文件。
  1. #在kerberos 服务端node1节点执行如下命令
  2. [root@node1 ~]# kadmin.local -q "addprinc -pw 123456 hive/node1"
  3. #将hive服务主体写入keytab文件
  4. [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节点即可。
  1. #发送keytab 到node3节点
  2. [root@node1 ~]# scp /home/keytabs/hive.service.keytab node3:/home/keytabs/
  3. #在node1、node3两个节点修改keytab所属用户和组
  4. chown root:hadoop /home/keytabs/hive.service.keytab
  5. chmod 770 /home/keytabs/hive.service.keytab
复制代码
4) 修改hive-site.xml设置文件
在hive服务端和客户端设置hive-site.xml,向该设置中追加如下设置:
  1. <!-- hiveserver2 支持kerberos认证 -->
  2. <property>
  3.   <name>hive.server2.authentication</name>
  4.   <value>KERBEROS</value>
  5. </property>
  6. <!--  hiveserver2 kerberos主体 -->
  7. <property>
  8.   <name>hive.server2.authentication.kerberos.principal</name>
  9.   <value>hive/node1@EXAMPLE.COM</value>
  10. </property>
  11.   
  12. <!-- hiveserver2 keytab密钥文件路径 -->
  13. <property>
  14.   <name>hive.server2.authentication.kerberos.keytab</name>
  15.   <value>/home/keytabs/hive.service.keytab</value>
  16. </property>
  17. <!-- hivemetastore 开启kerberos认证 -->
  18. <property>
  19.   <name>hive.metastore.sasl.enabled</name>
  20.   <value>true</value>
  21. </property>
  22. <!-- metastore kerberos主体 -->
  23. <property>
  24.   <name>hive.metastore.kerberos.principal</name>
  25.   <value>hive/node1@EXAMPLE.COM</value>
  26. </property>
  27. <!-- metastore keytab密钥文件路径 -->
  28. <property>
  29.   <name>hive.metastore.kerberos.keytab.file</name>
  30.   <value>/home/keytabs/hive.service.keytab</value>
  31. </property>
复制代码
​​​​​​​5) 修改Hadoop core-site.xml
修改core-site.xml中相干代理设置为hive代理用户,node1~node5节点core-site.xml中修改如下设置项:
  1.     <!-- 允许hive用户在任意主机节点代理任意用户和任意组 -->
  2.     <property>
  3.       <name>hadoop.proxyuser.hive.hosts</name>
  4.       <value>*</value>
  5.     </property>
  6.     <property>
  7.       <name>hadoop.proxyuser.hive.users</name>
  8.       <value>*</value>
  9.     </property>
  10.     <property>     
  11.             <name>hadoop.proxyuser.hive.groups</name>   
  12.         <value>*</value>
  13.     </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,操作如下:
  1. #启动zookeeper及HDFS
  2. [root@node3 ~]# zkServer.sh start
  3. [root@node4 ~]# zkServer.sh start
  4. [root@node5 ~]# zkServer.sh start
  5. [root@node1 ~]# start-all.sh
  6. #在Hive服务端node1节点启动Hive Metastore,这里可以切换成Hive用户,也可以不切换
  7. [root@node1 ~]# su hive
  8. [hive@node1 ~]$ hive --service metastore &
复制代码
在Hive客户端node3节点上登录hive客户端:
  1. #需要切换用户为hive,其他用户没有操作hql底层转换成mr操作的目录权限
  2. [root@node3 ~]# su hive
  3. [hive@node3 root]$ cd
  4. #进行节点认证kerberos
  5. [hive@node3 ~]$ kinit hive/node1
  6. Password for hive/node1@EXAMPLE.COM:123456
  7. #登录hive,建表、插入数据及查询
  8. [hive@node3 ~]$ hive
  9. hive> create table person (id int,name string,age int ) row format delimited fields terminated by '\t';
  10. OK
  11. Time taken: 0.236 seconds
  12. hive> insert into person values (1,'zs',18);
  13. ...
  14. hive> select * from person;
  15. OK
  16. 1        zs        18
  17. #在node3节点准备如下文件及数据
  18. [hive@node3 ~]$ cat /home/hive/person.txt
  19. 2        ls        19
  20. 3        ww        20
  21. #在hive客户端将以上文件数据加载到hive person表中,操作如下
  22. hive> load data local inpath '/home/hive/person.txt' into table person;
  23. hive> select * from person;
  24. OK
  25. 1        zs        18
  26. 2        ls        19
  27. 3        ww        20
复制代码
​​​​​​​​​​​​​​3. Hive beeline利用Kerberos

除了在hive客户端操作Hive外,还可以通过beeline方式操作Hive,详细步调如下:
1) 在Hive服务端启动hiveserver2​​​​​​​
  1. #启动hiveserver2
  2. [hive@node1 root]$ hiveserver2
复制代码
​​​​​​​​​​​​​​2) 在Hive客户端执行beeline登录hive
  1. #在hive 客户端通过beeline登录hive
  2. [hive@node3 ~]$ beeline
  3. beeline> !connect jdbc:hive2://node1:10000/default;principal=hive/node1@EXAMPLE.COM
  4. 0: jdbc:hive2://node1:10000/default> select * from person;
  5. +------------+--------------+-------------+
  6. | person.id  | person.name  | person.age  |
  7. +------------+--------------+-------------+
  8. | 1          | zs           | 18          |
  9. | 2          | ls           | 19          |
  10. | 3          | ww           | 20          |
  11. +------------+--------------+-------------+
  12. #也可以通过以下方式通过beeline直接操作hive
  13. [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服务:
  1. #在Hive服务端node1节点执行如下命令
  2. [root@node1 ~]# su hive
  3. [hive@node1 root]$ hiveserver2
复制代码
​​​​​​​​​​​​​​3) 编写JDBC访问Hive代码
  1. /**
  2. * 通过JDBC方式读取Kerberos认证Hive的数据
  3. */
  4. public class JDBCReadAuthHive {
  5.     // Kerberos主体
  6.     static final String principal = "hive/node1@EXAMPLE.COM";
  7.     // Kerberos配置文件路径
  8.     static final String krb5FilePath = "D:\\idea_space\\KerberosAuth\\KerberosAuthHive\\src\\main\\resources\\krb5.conf";
  9.     // Keytab文件路径
  10.     static final String keytabFilePath = "D:\\idea_space\\KerberosAuth\\KerberosAuthHive\\src\\main\\resources\\hive.service.keytab";
  11.     public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
  12.         // 1.加载Kerberos配置文件
  13.         System.setProperty("java.security.krb5.conf", krb5FilePath);
  14.         // 2.设置Kerberos认证
  15.         Configuration configuration = new Configuration();
  16.         configuration.set("hadoop.security.authentication", "kerberos");
  17.         UserGroupInformation.setConfiguration(configuration);
  18.         UserGroupInformation.loginUserFromKeytab(principal, keytabFilePath);
  19.         // 3.JDBC连接字符串
  20.         String jdbcURL = "jdbc:hive2://node1:10000/default;principal=hive/node1@EXAMPLE.COM";
  21.         Class.forName("org.apache.hive.jdbc.HiveDriver");
  22.         try {
  23.             // 4.创建Hive连接
  24.             Connection connection = DriverManager.getConnection(jdbcURL, "", "");
  25.             // 5.执行Hive查询
  26.             Statement statement = connection.createStatement();
  27.             ResultSet rs = statement.executeQuery("SELECT id,name,age FROM person");
  28.             // 6.处理查询结果
  29.             while (rs.next()) {
  30.                 System.out.println(rs.getInt(1) + "," +
  31.                         rs.getString(2)+ "," +
  32.                         rs.getInt(3)) ;
  33.             }
  34.             // 7.关闭连接
  35.             rs.close();
  36.             statement.close();
  37.             connection.close();
  38.         } catch (SQLException e) {
  39.             e.printStackTrace();
  40.         }
  41.     }
  42. }
复制代码
以上代码需要在项目maven pom.xml文件中加入如下依赖:
  1. <dependency>
  2.   <groupId>org.apache.hive</groupId>
  3.   <artifactId>hive-jdbc</artifactId>
  4.   <version>3.1.3</version>
  5. </dependency>
复制代码
以上代码运行结果如下:
  1. 1,zs,18
  2. 2,ls,19
  3. 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依赖中导入如下依赖包:
  1. <!-- Spark-core -->
  2. <dependency>
  3.   <groupId>org.apache.spark</groupId>
  4.   <artifactId>spark-core_2.12</artifactId>
  5.   <version>3.4.0</version>
  6. </dependency>
  7. <!-- SparkSQL -->
  8. <dependency>
  9.   <groupId>org.apache.spark</groupId>
  10.   <artifactId>spark-sql_2.12</artifactId>
  11.   <version>3.4.0</version>
  12. </dependency>
  13. <!-- SparkSQL  ON  Hive-->
  14. <dependency>
  15.   <groupId>org.apache.spark</groupId>
  16.   <artifactId>spark-hive_2.12</artifactId>
  17.   <version>3.4.0</version>
  18. </dependency>
复制代码
​​​​​​​​​​​​​​4) 编写SparkSQL读取Hive代码
  1. /**
  2. * Spark 读取Kerberos认证Hive的数据
  3. */
  4. public class SparkReadAuthHive {
  5.     public static void main(String[] args) throws IOException {
  6.         //进行kerberos认证
  7.         System.setProperty("java.security.krb5.conf", "D:\\idea_space\\KerberosAuth\\KerberosAuthHDFS\\src\\main\\resources\\krb5.conf");
  8.         String principal = "hive/node1@EXAMPLE.COM";
  9.         String keytabPath = "D:\\idea_space\\KerberosAuth\\KerberosAuthHive\\src\\main\\resources\\hive.service.keytab";
  10.         UserGroupInformation.loginUserFromKeytab(principal, keytabPath);
  11.         SparkSession spark = SparkSession.builder().appName("SparkReadAuthHive")
  12.                 .master("local")
  13. //                .config("hive.metastore.uris", "thrift://node1:9083")
  14.                 .enableHiveSupport()
  15.                 .getOrCreate();
  16.         spark.sql("select * from person").show();
  17.         spark.stop();
  18.         
  19.     }
  20. }
复制代码
以上代码编写完成后执行可以查询hive表中对应的数据。
​​​​​​​​​​​​​​6. Flink访问Kerberos认证Hive

Flink读取Kerberos认证Hive也需要进行认证,这里以FlinkSQL读取Hive中数据为例来演示,步调如下。
1) 准备krb5.conf及keytab文件

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

祗疼妳一个

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表