hadoop的kerberos认证
言归正传,介绍过hadoop的simple认证和kerberos后,我们在这一章介绍hadoop的kerberos认证
我们还使用hadoop集群的机器。
OS 版本: Centos6.4
Kerberos版本: krb5-1.10.3
环境配置
|
机器名 |
Ip地址 |
功能 |
安装模块 |
|
ganglia.localdomain |
192.168.124.140 |
Kerberos server |
krb5-libs krb5-server krb5-workstation krb5-devel |
|
hadoop1.localdomain |
192.168.124.135 |
Namenode Datanode Jobtracker tasktracker |
krb5-libs krb5-workstation krb5-appl-clients |
|
hadoop2.localdomain |
192.168.124.136 |
Datanode tasktracker |
Krb5-libs Krb5-workstation krb5-appl-servers |
|
hadoop3.localdomain |
192.168.124.137 |
Datanode tasktracker |
Krb5-libs Krb5-workstation krb5-appl-servers |
kerberos的安装,这里就不介绍了,我们创建了一个LOCALDOMAIN域的数据库
我们还是要给出配置文件的信息给大家参考
vi /etc/krb5.conf 主要修改realm
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = LOCALDOMAIN
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
LOCALDOMAIN = {
kdc = ganglia.localdomain
admin_server = ganglia.localdomain
}
[domain_realm]
.example.com = LOCALDOMAIN
example.com = LOCALDOMAIN
vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
LOCALDOMAIN = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
max_renewable_life=10d
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
vi /var/kerberos/krb5kdc/kadm5.acl
*/admin@LOCALDOMAIN *
在hadoop中,kerberos需要创建principle和生成keytab文件。
1. 创建principle
hadoop的kerberos认证,需要三种principle: hadoop, host, HTTP
addprinc -randkey hadoop/hadoop1.localdomain@LOCALDOMAIN
addprinc -randkey hadoop/hadoop2.localdomain@LOCALDOMAIN
addprinc -randkey hadoop/hadoop3.localdomain@LOCALDOMAIN
addprinc -randkey host/hadoop1.localdomain@LOCALDOMAIN
addprinc -randkey host/hadoop2.localdomain@LOCALDOMAIN
addprinc -randkey host/hadoop3.localdomain@LOCALDOMAIN
addprinc -randkey HTTP/hadoop1.localdomain@LOCALDOMAIN
addprinc -randkey HTTP/hadoop2.localdomain@LOCALDOMAIN
addprinc -randkey HTTP/hadoop3.localdomain@LOCALDOMAIN
使用listprincs查看一下结果

2. 创建keytab文件:hadoop.keytab
ktadd -norandkey -k /root/hadoop.keytab hadoop/hadoop1.localdomain@LOCALDOMAIN
ktadd -norandkey -k /root/hadoop.keytab hadoop/hadoop2.localdomain@LOCALDOMAIN
ktadd -norandkey -k /root/hadoop.keytab hadoop/hadoop3.localdomain@LOCALDOMAIN
ktadd -norandkey -k /root/hadoop.keytab host/hadoop1.localdomain@LOCALDOMAIN
ktadd -norandkey -k /root/hadoop.keytab host/hadoop2.localdomain@LOCALDOMAIN
ktadd -norandkey -k /root/hadoop.keytab host/hadoop3.localdomain@LOCALDOMAIN
ktadd -norandkey -k /root/hadoop.keytab HTTP/hadoop1.localdomain@LOCALDOMAIN
ktadd -norandkey -k /root/hadoop.keytab HTTP/hadoop2.localdomain@LOCALDOMAIN
ktadd -norandkey -k /root/hadoop.keytab HTTP/hadoop3.localdomain@LOCALDOMAIN
查看一下结果
klist -kt /root/hadoop.keytab

将/root/hadoop.keytab 上传到hadoop1,hadoop2和hadoop3上
修改三个bug
- Jdk,需要下载jce(Java Cryptography Extension)1.6.32不需要安装,低一点的版本需要。http://www.oracle.com/technetwork/java/javase/downloads/index.html
- 时间同步问题,kdc和运行hadoop的服务器,时间必须是同步的,如果在虚拟机中运行,如果时间不一致,也会造成credential失效。
- Kdc默认不支持renew功能的,运行kinit 后”valid starting" and "renew until"的值是相同的时间,或者运行kinit –R后出现 kinit: Ticket expired while renewing credentials
有两种方法可以解决此问题,第一种方式就是在创建domain之前,在kdc.conf中增加 max_renewable_life = 7d,然后创建domain。第二种方式使用modprinc修改所有的principle,modprinc -maxrenewlife 7days krbtgt/ganglia.localdoamin/LOCALDOMAIN
modprinc -maxrenewlife 7days K/M/LOCALDOMAIN
modprinc -maxrenewlife 7days hadoop/hadoop1.localdomain/LOCALDOMAIN
modprinc -maxrenewlife 7days hadoop/hadoop2.localdomain/LOCALDOMAIN
modprinc -maxrenewlife 7days hadoop/hadoop3.localdomain/LOCALDOMAIN
modprinc -maxrenewlife 7days host/hadoop1.localdomain/LOCALDOMAIN
modprinc -maxrenewlife 7days host/hadoop2.localdomain/LOCALDOMAIN
modprinc -maxrenewlife 7days host/hadoop3.localdomain/LOCALDOMAIN
modprinc -maxrenewlife 7days HTTP/hadoop1.localdomain/LOCALDOMAIN
modprinc -maxrenewlife 7days HTTP/hadoop2.localdomain/LOCALDOMAIN
modprinc -maxrenewlife 7days HTTP/hadoop3.localdomain/LOCALDOMAIN
配置hadoop
vi conf/core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/repo4/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop1.localdomain:9000</value>
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
</configuration>
修改conf/hadoop-env.sh,增加下面一句
export HADOOP_SECURE_DN_USER=hadoop
启动hdfs
在hadoop1上运行: bin/hadoop namenode
在hadoop1,hadoop2和hadoop3上运行: sudo bin/hadoop datanode
如果按照上面的步骤做,应该是可以能够启动hdfs的。
下面我们再配置一下mapred
vi conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/repo4/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/repo4/data</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/_HOST@LOCALDOMAIN</value>
</property>
<property>
<name>dfs.namenode.kerberos.https.principal</name>
<value>host/_HOST@KERBEROS_HADOOP</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/home/hadoop/hadoop-1.2.1/conf/hadoop.keytab</value>
</property>
<property>
<name>dfs.namenode.keytab.file</name>
<value>/home/hadoop/hadoop-1.2.1/conf/hadoop.keytab</value>
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hadoop/_HOST@LOCALDOMAIN</value>
</property>
<property>
<name>dfs.namenode.kerberos.https.principal</name>
<value>host/_HOST@LOCALDOMAIN</value>
</property>
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/home/hadoop/hadoop-1.2.1/conf/hadoop.keytab</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>hadoop/_HOST@LOCALDOMAIN</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.https.principal</name>
<value>host/_HOST@LOCALDOMAIN</value>
</property>
<property>
<name>dfs.datanode.keytab.file</name>
<value>/home/hadoop/hadoop-1.2.1/conf/hadoop.keytab</value>
</property>
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>hadoop/_HOST@LOCALDOMAIN</value>
</property>
<property>
<name>dfs.datanode.kerberos.https.principal</name>
<value>host/_HOST@LOCALDOMAIN</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:1004</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:1006</value>
</property>
</configuration>
- 修改conf/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>http://hadoop1.localdomain:9001</value>
</property>
<property>
<name>mapreduce.jobtracker.kerberos.principal</name>
<value>mapred/_HOST@LOCALDOMAIN</value>
</property>
<property>
<name>mapreduce.jobtracker.kerberos.https.principal</name>
<value>host/_HOST@LOCALDOMAIN</value>
</property>
<property>
<name>mapreduce.jobtracker.keytab.file</name>
<value>/home/hadoop/hadoop-1.2.1/conf/mapred.keytab</value>
</property>
<property>
<name>mapreduce.tasktracker.kerberos.principal</name>
<value>mapred/_HOST@LOCALDOMAIN</value>
</property>
<property>
<name>mapreduce.tasktracker.kerberos.https.principal</name>
<value>host/_HOST@LOCALDOMAIN</value>
</property>
<property>
<name>mapreduce.tasktracker.keytab.file</name>
<value>/home/hadoop/hadoop-1.2.1/conf/mapred.keytab</value>
</property>
<property>
<name>mapred.task.tracker.task-controller</name>
<value>org.apache.hadoop.mapred.LinuxTaskController</value>
</property>
<property>
<name>mapreduce.tasktracker.group</name>
<value>hadoop</value>
</property>
</configuration>
修改后xml配置文件后,还需要做如下几步
1. 修改tasktracker的配置文件
先修改conf/taskcontroller.cfg
mapred.local.dir=/home/hadoop/repo4/mapred/local
hadoop.log.dir=/home/hadoop/hadoop-1.2.1/logs
mapreduce.tasktracker.group=hadoop
banned.users=hdfs
在创建mapred.local.dir和hadoop.log.dir指定的目录
2. 启动一下tasktracker来看一下 bin/hadoop tasktracker
出现了第一个异常: /etc/hadoop/taskcontroller.cfg not found,原因是bin/tasktracker默认使用etc/hadoop位置的taskcontroller.cfg

我们将taskcontroller.cfg复制到/etc/hadoop
sudo mkdir /etc/hadoop
sudo scp conf/taskcontroller.cfg /etc/hadoop/
3. 启动tasktracer: bin/hadoop tasktracker
可执行文件task-controller的所属者必须是root

我们改变一下文件的所属者
sudo chown root:root bin/task-controller
4. 继续启动tasktracker: bin/hadoop tasktracker
异常继续出现:配置的组必须等于task-controller所属组

我们继续改变一下文件的所属着和所属组
sudo chown root:hadoop bin/task-controller
5. 继续启动tasktracker: bin/hadoop tasktracker
检查其他用户还有异常:task-controller其他用户不能有写和执行权限

运行命令去改变用户权限
sudo chmod o-rx bin/task-controller
6. 继续启动tasktracker: bin/hadoop tasktracker
task-controller还需要被设置setuid标志位

运行命令去设置setuid标志位
sudo chmod u+s bin/task-controller
7. 继续启动tasktracker: bin/hadoop tasktracker
用户的id比1000小

Cat /etc/passwd,查看一下用户id,然后设置参数min.user.id,通常普通用户创建,都是从500开始,因为我们可以修改sudo vi /etc/hadoop/taskcontroller.cfg
min.user.id=500
测试一下mapred程序,我们还是用wordcount作为例子
前面我们已经启动了hdfs,再启动mapred
在hadoop1运行:bin/hadoop jobtracker
在hadoop1,hadoop2和hadoop2上运行: bin/hadoop tasktracker
创建一个输入目录:
bin/hadoop dfs -mkdir /user/hadoop/input
上传一些文件
bin/hadoop dfs -copyFromLocal conf/* /user/hadoop/input/
查看一下结果
bin/hadoop dfs -ls /user/hadoop/input/

启动mapred程序


使用kerberos认证的缺点
- 存在单点失败:它需要KDC中心服务器的服务。当KDC挂掉时,整个系统有可能瘫痪。Hadoop花了很多时间来解决namenode的单点问题。幸亏这个缺陷可以通过使用复合Kerberos服务器和缺陷认证机制弥补
- Kerberos需要时间同步技术,Kerberos要求参与通信的主机的时钟同步,如果主机的时钟与Kerberos服务器的时钟不同步,认证会失败。默认设置要求时钟的时间相差不超过10分钟。通常用网络时间协议后台程序(NTP)来保持主机时钟同步。
- 配置非常繁琐,通常配置好一个100个节点的服务器,需要三天时间。而且还会存在一个大的问题:用户权限的问题,原来系统上的数据不能访问。这一点还需要完善。
- 因为所有用户使用的密钥都存储于中心服务器中,危及服务器的安全的行为将危及所有用户的密钥。
总结
Kerberos是一种性能比较高的认证和授权,并且能够进行数据加密的安全系统,但是并不是特别适合hadoop,原因有三点:1. Hadoop集群节点数多,配置和维护一个使用kerberos系统高性能,稳定的hadoop集群难度非常高。2. Hadoop中的hdfs是一个文件系统,用户的认证和授权比较复杂,难度不低于linux系统的用户和组管理。加上kerberos后,用户和用户组的管理更加复杂,通常一个合适的用户不能访问hdfs上的文件。 3. Hadoop加上kerberos后,通常原来的用户和文件,可能都失效导致数据流失。尤其是一些根目录,往往需要格式化整个系统才能使用。增加一个新用户也是比较难的。因为要考虑各个节点间的访问权限。 我认为可能轻量级的LDAP会适合hadoop系统,后面有时间来实现一下。
hadoop的kerberos认证的更多相关文章
- Cloudera Hadoop启用Kerberos认证
一.Kerberos 二.安装 node01服务器安装Kerberos的核心服务master KDC,node02和node03安装Kerberos client cm也安装在node01上了 1.m ...
- 配置两个Hadoop集群Kerberos认证跨域互信
两个Hadoop集群开启Kerberos验证后,集群间不能够相互访问,需要实现Kerberos之间的互信,使用Hadoop集群A的客户端访问Hadoop集群B的服务(实质上是使用Kerberos Re ...
- hadoop KerberosUtil 做Kerberos认证
网上找了一下,自己写了个KerberosUtil工具类,测试过可以用. 注意这个不是 org.apache.hadoop.security.authentication.util.KerberosUt ...
- Kerberos认证流程详解
Kerberos是诞生于上个世纪90年代的计算机认证协议,被广泛应用于各大操作系统和Hadoop生态系统中.了解Kerberos认证的流程将有助于解决Hadoop集群中的安全配置过程中的问题.为此,本 ...
- yarn 用户导致的被挖矿 启用Kerberos认证功能,禁止匿名访问修改8088端口
用户为dr.who,问下内部使用人员,都没有任务在跑: 结论: 恭喜你,你中毒了,攻击者利用Hadoop Yarn资源管理系统REST API未授权漏洞对服务器进行攻击,攻击者可以在未授权的情况下远程 ...
- hadoop HA+kerberos HA集群搭建
IP.主机名规划 hadoop集群规划: hostname IP hadoop 备注 hadoop1 110.185.225.158 NameNode,ResourceManager,DFSZKFai ...
- spark 2.x在windows环境使用idea本地调试启动了kerberos认证的hive
1 概述 开发调试spark程序时,因为要访问开启kerberos认证的hive/hbase/hdfs等组件,每次调试都需要打jar包,上传到服务器执行特别影响工作效率,所以调研了下如何在window ...
- Flink整合oozie shell Action 提交任务 带kerberos认证
最近这段时间一直在忙新集群迁移,上了最新的cdh6.3.0 于是Flink 提交遇到了许多的问题 还好有cloudera License 有了原厂的帮助和社区的伙伴,问题解决起来快了不少,手动滑稽 集 ...
- 使用kafka-python客户端进行kafka kerberos认证
之前说过python confluent kafka客户端做kerberos认证的过程,如果使用kafka python客户端的话同样也可以进行kerberos的认证,具体的认证机制这里不再描述,主要 ...
随机推荐
- Data Base Oracle下载及安装
Oracle 下载及安装 一.官方下地址: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/in ...
- C# 中间语言、CLR、CTS、CLS
c# 中间语言.CLR.CTS.CLS IL中间语言,区分大小写 中间语言的主要特征: 1. 面向 对象和使 用接口 2. 值类型和引 用类 型之间的 显 著差异 3. 强 数据类型化 4. 使 ...
- JavaScript —— 如何判断一个非数字输入
在页面里,如何用JS去判断一个用户输入是不是一个数字. 你是不是首先想到了正则表达式? JS里有个现成的函数,isNaN(x) isNaN(x) 函数可用于判断其参数是否是 NaN(Not a Num ...
- HDU 4609 3-idiots(FFT)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给出n个正整数(数组A).每次随机选出三个数.问这三个数能组成三角形的概率为多大? 思路: ...
- winform中关于panel中滚动条和键盘事件几点体会
最近在做winform开发中,遇到几个比较寄售的问题,通过上网查找计和自己琢磨,最终都圆满解决呢! 现在我将谈谈我在项目中遇到的问题集解决方案,以供大家参考! 一.就是我在使用键盘的keydown事件 ...
- 导出到Excel并且取消默认的科学计算法
导出Excel的代码很多,其中这种最简单: protected void btnDCAll_Click(object sender, EventArgs e) { ...
- BZOJ 4636 蒟蒻的数列
二分写错了血T..... 线段树标记永久化. #include<iostream> #include<cstdio> #include<cstring> #incl ...
- cakephp之查询
find public find( string $type 'first' , array $query array() ) Queries the datasource and returns a ...
- 浅析Android中的消息机制(转)
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
- 20160128.CCPP体系详解(0007天)
以下内容有所摘取,进行了某些整理和补充 论浮点数的存储原理:float浮点数与double浮点数的二进制存储原理–>阶码 浮点数转二进制 1.整数int类型和浮点数float类型都是占用4个字节 ...