目前Hadoop的稳定版本为1.2.1,我们的实验就在hadoop-1.2.1上进行

Hadoop 版本:1.2.1

OS 版本: Centos6.4

环境配置

机器名

Ip地址

功能

用户

Hadoop1

192.168.124.135

namenode, datanode,

secondNameNode

jobtracker, tasktracer

hadoop

Hadoop2

192.168.124.136

Datanode, tasktracker

hadoop

Hadoop3

192.168.124.137

Datanode, tasktracker

hadoop

client

192.168.124.141

client

test

简单介绍一下hadoop安全需要哪些授权

先来看一下hdfs,当一个用户需要读写hadoop集群上的一个文件时,他通常先跟namenode联系,这就需要namenode的认证(org.apache.hadoop.hdfs.protocol.ClientProtocol定义了需要授权的接口),当namenode成功的认证client用户时,会返回给用户存储文件的datanode,client需要读写datanode上的数据时,同样也需要datanode的认证(org.apache.hadoop.hdfs.protocol.ClientDatanodeProtocol定义了需要授权的接口)。datanode和namenode之间也需要联系,datanode需要定时向namenode发送heartbeat和数据块的信息(org.apache.hadoop.hdfs.server.protocol.DatanodeProtocol定义了需要授权的接口)。Datanode之间也要发生数据交换,比如负载均衡,数据失效(org.apache.hadoop.hdfs.server.protocol.InterDatanodeProtocol定义了需要授权的接口)。Hadoop通常还需要一个secondnamenode来备份数据,因为secondnamenode定期向namenode发送数据请求,这中间也需要namenode的认证(org.apache.hadoop.hdfs.server.protocol.NamenodeProtocol定义了需要授权的接口)。还有两个不常用的授权org.apache.hadoop.security.authorize.RefreshAuthorizationPolicyProtocol和org.apache.hadoop.security.RefreshUserMappingsProtocol,这两个授权时检查是否有刷新授权和用户的权限。

我们再来看一下mapred框架需要哪些授权

当一个client写好map和reduce以及其他相关的程序后,他首先向jobtracker提交job,这就需要得到jobtracker的授权(org.apache.hadoop.mapred.JobSubmissionProtocol定义了需要授权的接口)。提交的job经过jobtracker调度后,会合理的分配到tasktracker节点上,hadoop采用的是tasktracker向jobtracker发送heartbeat或其他信息的返回值来得到task的信息,而不是jobttracker将task推送给tasktracker,也就是说tasktracker需要jobtracker的认证(org.apache.hadoop.mapred.InterTrackerProtocol定义了需要授权的接口)。还有一个必要重要的授权,tasktracker在得到task后,不是直接在自己的进程里执行,而是启动一个叫做Child的子进程,tasktracker和这些Child子进程(通常最多只有两个map和两个reduce)需要交换数据。尽管linux存在很多种进程共享数据的方式,Child和tasktracker还是通过网络的方式来的,这个交换过程主要都是由Child发起的。所以这些Child也需要得到tasktracer的认证(org.apache.hadoop.mapred.TaskUmbilicalProtocol定义了需要授权的接口)。跟hdfs一样,mapredu中也有两个不常用的授权org.apache.hadoop.security.authorize.RefreshAuthorizationPolicyProtocol和org.apache.hadoop.security.RefreshUserMappingsProtocol,这两个授权时检查是否有刷新授权和用户的权限。

这些授权都在org.apache.hadoop.hdfs.HDFSPolicyProvider和org.apache.hadoop.mapred.MapReducePolicyProvider中定义,有兴趣的可能看看。

简单方式配置

conf/core-site.xml加上

<property>

<name>hadoop.security.authorization</name>

<value>true</value>

</property>

<property>

<name>hadoop.security.authentication</name>

<value>simple</value>

</property>

下面做一些简单测试,来验证一下配置

测试代码1

Configuration conf = new Configuration();

conf.set("fs.default.name", "hdfs://hadoop1:9000");

FileSystem hdfs = FileSystem.get(conf);

Path path = new Path("/user/hadoop/input");

FileStatus[] files = hdfs.listStatus(path);

for(int i=0; i< files.length; i++ ){

System.out.println(files[i].getPath());

}

控制台打出的结果

Exception in thread "main" org.apache.hadoop.ipc.RemoteException: User test is not authorized for protocol interface org.apache.hadoop.hdfs.protocol.ClientProtocol, expected client Kerberos principal is null

at org.apache.hadoop.ipc.Client.call(Client.java:1113)

at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:229)

at com.sun.proxy.$Proxy1.getProtocolVersion(Unknown Source)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:601)

at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:85)

at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:62)

at com.sun.proxy.$Proxy1.getProtocolVersion(Unknown Source)

at org.apache.hadoop.ipc.RPC.checkVersion(RPC.java:422)

at org.apache.hadoop.hdfs.DFSClient.createNamenode(DFSClient.java:183)

at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:281)

at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:245)

at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:100)

at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1446)

at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:67)

at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1464)

at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:263)

at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:124)

at test.TestHdfs.main(TestHdfs.java:18)

从上面的结果可以看出,client机器上的test用户没有权限访问hdfs系统。当我们将代码稍作改变,见测试代码2:

测试代码2

Configuration conf = new Configuration();

conf.set("fs.default.name", "hdfs://hadoop1:9000");

//FileSystem hdfs = FileSystem.get(conf);

FileSystem hdfs = FileSystem.get(new URI("hdfs://hadoop1:9000"), conf, "hadoop");

Path path = new Path("/user/hadoop/input");

FileStatus[] files = hdfs.listStatus(path);

for(int i=0; i< files.length; i++ ){

System.out.println(files[i].getPath());

控制台打出的结果

hdfs://hadoop1:9000/user/hadoop/input/Balancer.java

hdfs://hadoop1:9000/user/hadoop/input/BalancerBandwidthCommand.java

hdfs://hadoop1:9000/user/hadoop/input/BlockAlreadyExistsException.java

hdfs://hadoop1:9000/user/hadoop/input/BlockCommand.java

很显然,使用hadoop用户来访问hdfs就没有任何问题。换一句话说,一旦客户端知道hadoop集群的用户,就可以执行hdfs的操作。这将会存在很大的安全隐患。至少应该有一个登录系统来提供一个认证功能。

目前常用的认证的方式有如下几种:

  1. 用户名/密码认证。这是一种常用方式,当用户数量比较多时,可以采用sql/ldap方式。这种方式通常性能较能。
  2. 机器地址过滤。 这种方式通常有两种方式实行,黑名单列表:机器不能访问,白名单列表:机器能够访问。这种方式尽管配置简单,但是部署比较麻烦,通常表现在:一次修改到处部署。Hadoop实现了此种方式:dfs.hosts,dfs.hosts.exclude。但默认不使用

Kerboros方式,hadoop1后面都实现了这种方式,而且推荐使用这种方式。

hadoop的simple认证的更多相关文章

  1. hadoop的kerberos认证

    言归正传,介绍过hadoop的simple认证和kerberos后,我们在这一章介绍hadoop的kerberos认证 我们还使用hadoop集群的机器. OS 版本: Centos6.4 Kerbe ...

  2. hadoop开启Service Level Authorization 服务级认证-SIMPLE认证-过程中遇到的坑

    背景描述: 最近在进行安全扫描的时候,说hadoop存在漏洞,Hadoop 未授权访问[原理扫描],然后就参考官方文档及一些资料,在测试环境中进行了开启,中间就遇到了很多的坑,或者说自己没有想明白的问 ...

  3. Cloudera公司主要提供Apache Hadoop开发工程师认证

    Cloudera Cloudera公司主要提供Apache Hadoop开发工程师认证(Cloudera CertifiedDeveloper for Apache Hadoop ,CCDH)和Apa ...

  4. 自带的simple认证

    参考: hdfs权限: 官网http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html hdfs权限: http://dyi ...

  5. Cloudera Hadoop启用Kerberos认证

    一.Kerberos 二.安装 node01服务器安装Kerberos的核心服务master KDC,node02和node03安装Kerberos client cm也安装在node01上了 1.m ...

  6. kerboros安装

    尽管前面尝试了hadoop的simple认证方式,这种方法不是特别安全,在介绍一下hadoop的kerberos方式之前,下面我们尝试一下kerberos. 首先介绍一下Kerboros安装 OS 版 ...

  7. 《Hadoop》对于高级编程Hadoop实现构建企业级安全解决方案

    本章小结 ●    理解企业级应用的安全顾虑 ●    理解Hadoop尚未为企业级应用提供的安全机制 ●    考察用于构建企业级安全解决方式的方法 第10章讨论了Hadoop安全性以及Hadoop ...

  8. hadoop配置文件详解系列(一)-core-site.xml篇

    接上一个属性,这个属性就是设置阈值的. hadoop.security.groups.cache.secs 300 配置用户组映射缓存时间的,当过期时重新获取并缓存. hadoop.security. ...

  9. Hadoop-2.2.0中文文档——Common-Hadoop HTTP web控制台认证

    简单介绍 此文档描写叙述了怎样配置Hadoop HTTP web控制台,去要求用户认证. 默认地,Hadoop HTTP web控制台(JobTracker, NameNode, TaskTracke ...

随机推荐

  1. 将Android Studio工程导入到Eclipse中

    1.前言 studio项目中src/main/java目录里面的代码对应的是eclispe项目中的src目录中的代码. 而studio中src目录里面包括整个项目的所有代码包括资源文件和xml. 2. ...

  2. Codeforces Round #215 (Div. 1) B

    出来冒个泡 由于数比较大  开了map计数  然后边走边删边加 勉强可过 #include <iostream> #include<cstdio> #include<cs ...

  3. R语言多重共现性的检测

    1.kappa值 2. library(car)vif(lm.sol) 得到各个系数的方差膨胀因子,当0<VIF<10的时候,不存在多重共线性,当10<=VIF<100,存在较 ...

  4. Qt之QHeaderView自定义排序(QSortFilterProxyModel)

    简述 对以上节的排序,我们衍伸了两点: 把一个字符串前面的数据按照字符串比较,而后面的数据按照整形比较. 将整形显示为字符串,而排序依然正常呢. 为了分别描述,这里我们先解决问题1. 简述 效果 处理 ...

  5. iOS富文本(二)初识Text Kit

    概述 Text Kit 是建立在Core Text上的文本布局系统,虽然没有Core Text那么强大的文本处理功能,但是对于大多数常见的文本布局用Text Kit能够很简单的实现,而不是用Core ...

  6. 如何在Windows系统中配置Mysql群集(Mysql Cluster)

    Mysql群集(Cluster)简介 MySQL群集需要有一组计算机,每台计算机的角色可能是不一样的.MySQL群集中有三种节点:管理节点.数据节点和SQL节点.群集中的某计算机可 能是某一种节点,也 ...

  7. 51nod1199 Money out of Thin Air

    链剖即可.其实就是利用了链剖后子树都在一段连续的区间内所以可以做到O(logn)查询和修改. 线段树细节打错了..要专心!肉眼差错都能找出一堆出来显然是不行的!. #include<cstdio ...

  8. 安卓 Pickers(选择器)

    概述 安卓提供了现成的对话框,让用户选择一个时间或日期.每一个选择器控制时间(小时,分钟,AM/PM)或日期(月,日,年)的每一部分的选择.使用这些选择器帮助 确保用户正确的,格式化的,和适合的选择一 ...

  9. mkdir -p命令

    如果要创建目录A并创建目录A的子目录B,没有用-p的情况下是mkdir 2次如果用-p 可以直接创建2个目录 mkdir -p 目录A/子目录B就可以

  10. 嵌入式 uboot引导kernel,kernel引导fs

    1.uboot引导kernel: u-boot中有个bootm命令,它可以引导内存中的应用程序映像(Kernel),bootm命令对应 common/cmd_bootm.c中的do_bootm()函数 ...