欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos

程序员文章站 2022-06-16 15:26:38
...

(1)hadoop2.7.1源码编译           http://zilongzilong.iteye.com/blog/2246856

(2)hadoop2.7.1安装准备           http://zilongzilong.iteye.com/blog/2253544

(3)hadoop2.7.1安装                   http://zilongzilong.iteye.com/blog/2245547

(4)hbase安装准备                   http://zilongzilong.iteye.com/blog/2254451

(5)hbase安装                   http://zilongzilong.iteye.com/blog/2254460

(6)snappy安装                   http://zilongzilong.iteye.com/blog/2254487

          (7)hbase性能优化     http://zilongzilong.iteye.com/blog/2282670

          (8)雅虎YCSBC测试hbase性能测试     http://zilongzilong.iteye.com/blog/2248863

(9)spring-hadoop实战                   http://zilongzilong.iteye.com/blog/2254491

(10)hadoop hbase kerberos         http://zilongzilong.iteye.com/blog/2287536

 

1.hadoop安全机制历史

    在Hadoop1.0.0或者CDH3 版本之前, hadoop并不存在安全认证一说。默认集群内所有的节点都是可靠的,值得信赖的。用户与HDFS或者M/R进行交互时并不需要进行验证。导致存在恶意用户伪装成真正的用户或者服务器入侵到hadoop集群上,恶意的提交作业,修改JobTracker状态,篡改HDFS上的数据,伪装成NameNode 或者TaskTracker接受任务等。 尽管在版本0.16以后, HDFS增加了文件和目录的权限,但是并没有强认证的保障,这些权限只能对偶然的数据丢失起保护作用。恶意的用户可以轻易的伪装成其他用户来篡改权限,致使权限设置形同虚设。不能够对Hadoop集群起到安全保障。

    在Hadoop1.0.0或者CDH3版本后,加入了Kerberos认证机制。使得集群中的节点就是它们所宣称的,是信赖的。Kerberos可以将认证的密钥在集群部署时事先放到可靠的节点上。集群运行时,集群内的节点使用密钥得到认证。只有被认证过节点才能正常使用。企图冒充的节点由于没有事先得到的密钥信息,无法与集群内部的节点通信。防止了恶意的使用或篡改Hadoop集群的问题,确保了Hadoop集群的可靠安全。

2.Hadoop面临的安全问题

2.1  用户到服务器的认证问题

    1)NameNode,,JobTracker上没有用户认证

        用户可以伪装成其他用户入侵到一个HDFS 或者MapReduce集群上。

    2)DataNode上没有认证

        Datanode对读入输出并没有认证。导致如果一些客户端如果知道block的ID,就可以任意的访问DataNode上block的数据

    3)JobTracker上没有认证

        可以任意的杀死或更改用户的jobs,可以更改JobTracker的工作状态

2.2  服务器到服务器的认证问题

    1)没有DataNode, TaskTracker的认证

        用户可以伪装成datanode ,tasktracker,去接受JobTracker, Namenode的任务指派。

 

3.安全机制

3.1Java的安全机制

    详细介绍请参考JAAS:灵活的Java安全机制

    简单来说,用户首先使用LoginContext的接口进行登录验证。LoginContext可以配置使用不同的验证协议。验证通过后,用户得到一个subject,里面包含凭证,公私钥等。之后,在涉及到需要进行权限认证的地方(例如,资源访问,外部链接校验,协议访问等),使用doAs函数()代替直接执行。

    这样,java的权限认证就和用户的业务逻辑分离了。

    //一段典型的代码如下

    

LoginContext lc = new LoginContext("MyExample");
    try {
    lc.login();
    } catch (LoginException) {
    // Authentication failed.
    }

    // Authentication successful, we can now continue.
    // We can use the returned Subject if we like.
    Subject sub = lc.getSubject();
    Subject.doAs(sub, new MyPrivilegedAction());

 

3.2Kerberos认证协议

    Kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。

    简单介绍

    使用Kerberos时,一个客户端需要经过三个步骤来获取服务:

    认证:客户端向认证服务器发送一条报文,并获取一个含时间戳的Ticket-Granting Ticket(TGT)。

授权:客户端使用TGT向Ticket-Granting Server(TGS)请求一个服务Ticket。

服务请求:客户端向服务器出示服务Ticket,以证实自己的合法性。该服务器提供客户端所需服务,在Hadoop应用中,服务器可以是namenode或jobtracker。

为此,Kerberos需要The Key Distribution Centers(KDC)来进行认证。KDC只有一个Master,可以带多个slaves机器。slaves机器仅进行普通验证。Mater上做的修改需要自动同步到slaves。

 

    另外,KDC需要一个admin,来进行日常的管理操作。这个admin可以通过远程或者本地方式登录。

 

4.Hadoop  Kerberos安全机制安装

     安装这里就不讲解了,网上资料一大堆

 

5.kerberos安装后,hbase客户端链接的变化

    5.1 客户端链接kerberos的准备

          一台机器叫hbaseclient.com,首先在其上安装kerberos客户端,安装后连接kadmin工具创建用户test,并生成keytab文件

kinit admin/admin
kadmin: addprinc -randkey test
kadmin: xst -k test.keytab test

 

    5.2 未安装kerberos之前,hbase客户端链接代码

public class Test1 {
  public static void main(String[] args) throws IOException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.zookeeper.quorum", "zookeeperserver1,zookeeperserver2,zookeeperserver3"); 
    conf.set("hbase.zookeeper.property.clientPort", "2181"); 
    
    HTable t = new HTable(conf, "test");
    Scan s = new Scan();
    ResultScanner rs = t.getScanner(s);
    try{
      for(Result r:rs){
        for(Cell cell:r.rawCells()){
          System.out.println("Row: "+new String(CellUtil.cloneRow(cell)));
          System.out.println("CF: "+new String(CellUtil.cloneFamily(cell)));
          System.out.println("Qualifier: "+new String(CellUtil.cloneQualifier(cell)));
          System.out.println("Value: "+new String(CellUtil.cloneValue(cell)));
        }
      }
    }finally{
      t.close();
    }
    System.out.println("Done!");
  }

 

    5.3 安装kerberos之后,hbase客户端链接代码

public class Test1 {
  public static void main(String[] args) throws IOException {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.zookeeper.quorum", "zookeeperserver1,zookeeperserver2,zookeeperserver3"); 
    conf.set("hbase.zookeeper.property.clientPort", "2181"); 
    
    conf.set("hadoop.security.authentication", "kerberos");
    UserGroupInformation.setConfiguration(conf);
    UserGroupInformation.loginUserFromKeytab("hbaseclient.com", "/home/test/test.keytab");
    
    HTable t = new HTable(conf, "test");
    Scan s = new Scan();
    ResultScanner rs = t.getScanner(s);
    try{
      for(Result r:rs){
        for(Cell cell:r.rawCells()){
          System.out.println("Row: "+new String(CellUtil.cloneRow(cell)));
          System.out.println("CF: "+new String(CellUtil.cloneFamily(cell)));
          System.out.println("Qualifier: "+new String(CellUtil.cloneQualifier(cell)));
          System.out.println("Value: "+new String(CellUtil.cloneValue(cell)));
        }
      }
    }finally{
      t.close();
    }
    System.out.println("Done!");
  }

 

6.spring-data-hadoop中如何使用kerberos

    6.1 kerberos安装之前配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:hdp="http://www.springframework.org/schema/hadoop"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/hadoop 
    http://www.springframework.org/schema/hadoop/spring-hadoop.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd">

	<!-- 默认的hadoopConfiguration,默认ID为hadoopConfiguration,且对于file-system等不需指定ref,自动注入hadoopConfiguration -->
	<hdp:configuration>
		fs.defaultFS=hdfs://master:9000/
	</hdp:configuration>

	<!-- hadoop hdfs 操作类FileSystem,用来读写HDFS文件 -->
	<hdp:file-system id="hadoop-cluster" uri="hdfs://master:9000/" />

	<!-- 配置zookeeper地址和端口 -->
	<hdp:hbase-configuration configuration-ref="hadoopConfiguration" zk-quorum="zookeeperserver1,zookeeperserver2,zookeeperserver3" zk-port="2181">
	</hdp:hbase-configuration>

	<!-- 配置HbaseTemplate -->
	<bean id="hbaseTemplate" class="org.springframework.data.hadoop.hbase.HbaseTemplate">
		<property name="configuration" ref="hbaseConfiguration" />
	</bean>
</beans>

 

    6.2 kerberos安装之后配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:hdp="http://www.springframework.org/schema/hadoop"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/hadoop 
    http://www.springframework.org/schema/hadoop/spring-hadoop.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd">

	<!-- 默认的hadoopConfiguration,默认ID为hadoopConfiguration,且对于file-system等不需指定ref,自动注入hadoopConfiguration -->
	<hdp:configuration>
		fs.defaultFS=hdfs://master:9000/
		hadoop.security.authentication=kerberos
                hadoop.security.authorization=true
		keyTab=/home/test/test.keytab
		principal=hbaseclient.com
	</hdp:configuration>

	<!-- hadoop hdfs 操作类FileSystem,用来读写HDFS文件 -->
	<hdp:file-system id="hadoop-cluster" uri="hdfs://master:9000/" />

	<!-- 配置zookeeper地址和端口 -->
	<hdp:hbase-configuration configuration-ref="hadoopConfiguration" zk-quorum="zookeeperserver1,zookeeperserver2,zookeeperserver3" zk-port="2181">
	</hdp:hbase-configuration>

	<!-- 配置HbaseTemplate -->
	<bean id="hbaseTemplate" class="org.springframework.data.hadoop.hbase.HbaseTemplate">
		<property name="configuration" ref="hbaseConfiguration" />
	</bean>
</beans>

 

7.以上配置是参见hadoop-common-2.6.0.jar中源码org.apache.hadoop.security.UserGroupInformation.java得知

Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos
            
    
    博客分类: Hadoop hadoophbasekerberosspring-data-hadoop 
 


Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos
            
    
    博客分类: Hadoop hadoophbasekerberosspring-data-hadoop 
 


Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos
            
    
    博客分类: Hadoop hadoophbasekerberosspring-data-hadoop 
 

8.参考资料

Hadoop Kerberos安全机制介绍       http://dongxicheng.org/mapreduce/hadoop-kerberos-introduction/

Hadoop的kerberos的实践部署        http://blog.csdn.net/xiao_jun_0820/article/details/39375819

Hadoop的kerberos的实践部署        http://bbs.superwu.cn/forum.php?mod=viewthread&tid=331&extra=

  • Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos
            
    
    博客分类: Hadoop hadoophbasekerberosspring-data-hadoop 
  • 大小: 40.8 KB
  • Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos
            
    
    博客分类: Hadoop hadoophbasekerberosspring-data-hadoop 
  • 大小: 18.6 KB
  • Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos
            
    
    博客分类: Hadoop hadoophbasekerberosspring-data-hadoop 
  • 大小: 34.1 KB