为hdfs配置kerberos-程序员宅基地

技术标签: java  操作系统  大数据  

1 概述

默认情况下hadoop中hdfs和mapreduce运行在一种不安全的环境中,引用《hadoop权威指南》中的一段话:“从安全角度分析,Hadoop缺乏一个安全打的认证机制,以确保试图在集群上执行操作的用户恰是所声称的安全用户。但是,Hadoop的文件许可模块只提供一种简单的认证机制,以决定各个文件对特定文件的访问权限。

上面一段话描述的安全问题,我也遇到了,对于启用权限的伪分布式hadoop环境,写文件的时候不提供用户信息,则访问出错,但是在写文件的api中加上启动hadoop的用户信息,则顺利写入。这应该是为什么hadoop要使用kerbeos的最直接的原因吧

2.4.1的hadoop可以为hdfs和mapreduce配置kerberos,这里以hdfs为例记录配置过程。

2 配置说明

2.1 部署kerberos服务

主要做两件事情:

1、安装部署过程请参考我的博客:http://my.oschina.net/psuyun/blog/326486

2、在kerberos中为namenode和datanode分别新建principal:

nn/[email protected]

host/[email protected]

dn/[email protected]

http/[email protected]

2.2 配置hdfs

Hdfs的配置主要参考“hadoop-2.4.1/share/doc/hadoop/hadoop-project-dist/hadoop-common/SecureMode.html”,下面是我的实施步骤。

1、关于hdfs启动用户的说明

操作系统用户这块我没有做特别的操作,用的是之前创建的hadoop帐号,apache Hadoop的文档上说新建hdfs用户启动hdfs服务,新建yarn用户启动yarn服务,我直接偷懒了。

2、创建密钥文件,用于无密码登录

在任何一台机上运行命令:

ktutil: add_entry -password -p nn/[email protected] -k 3 -e aes256-cts-hmac-sha1-96

ktutil: add_entry -password -p host/[email protected] -k 3 -e aes256-cts-hmac-sha1-96

ktutil: write_kt /hadoop-data/etc/hadoop/nn.service.keytab

ktutil: add_entry -password -p dn/[email protected] -k 3 -e aes256-cts-hmac-sha1-96

ktutil: add_entry -password -p host/[email protected] -k 3 -e aes256-cts-hmac-sha1-96

ktutil: write_kt /hadoop-data/etc/hadoop/dn.service.keytab

ktutil: add_entry -password -p http/[email protected] -k 3 -e aes256-cts-hmac-sha1-96

ktutil: write_kt /hadoop-data/etc/hadoop/http.service.keytab

3、修改配置文件

core-site.xml

<property>

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

<value>kerberos</value>

</property>

<property>

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

<value>true</value>

</property>

<property>

<name>hadoop.security.auth_to_local</name>

<value>RULE:[2:$1@$0](.*@psy.com)s/.*/hadoop/

DEFAULT

</value>

</property>

Hdfs-site.xml

<property>

<name>dfs.block.access.token.enable</name>

<value>true</value>

</property>

<property>

<name>dfs.namenode.https-address</name>

<value>namenode:50470</value>

</property>

<property>

<name>dfs.https.port</name>

<value>50470</value>

</property>

<property>

<name>dfs.namenode.keytab.file</name>

<value>/hadoop-data/etc/hadoop/nn.service.keytab</value>

</property>

<property>

<name>dfs.namenode.kerberos.principal</name>

<value>nn/[email protected]</value>

</property>

<property>

<name>dfs.namenode.kerberos.https.principal</name>

<value>host/[email protected]</value>

</property>

<property>

<name>dfs.namenode.secondary.http-address</name>

<value>namenode:50090</value>

</property>

<property>

<name>dfs.namenode.secondary.https-port</name>

<value>50470</value>

</property>

<property>

<name>dfs.namenode.secondary.keytab.file</name>

<value>/hadoop-data/etc/hadoop/sn.service.keytab</value>

</property>

<property>

<name>dfs.namenode.secondary.kerberos.principal</name>

<value>sn/[email protected]</value>

</property>

<property>

<name>dfs.namenode.kerberos.https.principal</name>

<value>host/[email protected]</value>

</property>

<property>

<name>dfs.datanode.data.dir.perm</name>

<value>700</value>

</property>

<property>

<name>dfs.datanode.keytab.file</name>

<value>/hadoop-data/etc/hadoop/dn.service.keytab</value>

</property>

<property>

<name>dfs.datanode.kerberos.principal</name>

<value>dn/[email protected]</value>

</property>

<property>

<name>dfs.datanode.kerberos.https.principal</name>

<value>host/[email protected]</value>

</property>

<property>

<name>dfs.encrypt.data.transfer</name>

<value>true</value>

</property>

<property>

<name>dfs.webhdfs.enabled</name>

<value>true</value>

</property>

<property>

<name>dfs.web.authentication.kerberos.principal</name>

<value>http/[email protected]</value>

</property>

<property>

<name>dfs.web.authentication.kerberos.keytab</name>

<value>/hadoop-data/etc/hadoop/http.service.keytab</value>

</property>

<property>

<name>ignore.secure.ports.for.testing</name>

<value>true</value>

</property>

特别说明如下:

Ø 在apache hadoop的安全配置文档中并没用提到“ignore.secure.ports.for.testing”这个属性,参看本文的读者可以视自己的环境添加。由于作者在配置过程中遇到一个异常,跟踪源码后,发现了这个属性,做了设置后,异常不再;

Ø 在apache hadoop的安全配置文档中是有ssl的配置的,作者去掉了这块,因为这块的配置,作者不太了解,并且重点在kerberos,所以就忽略他了;

Ø 在启动namenode的时候,作者遇到了一个很奇怪的问题,之所以奇怪,大部分原因是作者的学识不够。显然本文的目的是为hadoop的hdfs服务配置kerberos,作者同时打开了webhdfs的权限开关,这就出现一个问题了。namenode启动失败,原因是http/[email protected]登录失败,但是nn/[email protected]却能够成功登录。namenode的日志信息中有如下的出错信息:

2014-10-24 01:44:54,376 INFO org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler: Login using keytab /hadoop-data/etc/hadoop/http.service.keytab, for principal http/[email protected]

2014-10-24 01:44:54,382 WARN org.mortbay.log: failed SpnegoFilter: javax.servlet.ServletException: javax.security.auth.login.LoginException: No key to store

2014-10-24 01:44:54,383 WARN org.mortbay.log: Failed startup of context org.mortbay.jetty.webapp.WebAppContext@4f98b5c{/,file:/opt/hadoop-2.4.1/share/hadoop/hdfs/webapps/hdfs}

javax.servlet.ServletException: javax.security.auth.login.LoginException: No key to store

at org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.init(KerberosAuthenticationHandler.java:203)

at org.apache.hadoop.security.authentication.server.AuthenticationFilter.init(AuthenticationFilter.java:150)

at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97)

at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)

at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:713)

at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)

at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)

at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)

at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)

at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)

at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)

at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)

at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)

at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)

at org.mortbay.jetty.Server.doStart(Server.java:224)

at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)

at org.apache.hadoop.http.HttpServer2.start(HttpServer2.java:796)

at org.apache.hadoop.hdfs.server.namenode.NameNodeHttpServer.start(NameNodeHttpServer.java:132)

at org.apache.hadoop.hdfs.server.namenode.NameNode.startHttpServer(NameNode.java:666)

at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:557)

at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:724)

at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:708)

at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1358)

at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1424)

Caused by: javax.security.auth.login.LoginException: No key to store

at com.sun.security.auth.module.Krb5LoginModule.commit(Krb5LoginModule.java:1072)

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:606)

at javax.security.auth.login.LoginContext.invoke(LoginContext.java:762)

at javax.security.auth.login.LoginContext.access$000(LoginContext.java:203)

at javax.security.auth.login.LoginContext$4.run(LoginContext.java:690)

at javax.security.auth.login.LoginContext$4.run(LoginContext.java:688)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:687)

at javax.security.auth.login.LoginContext.login(LoginContext.java:596)

at org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.init(KerberosAuthenticationHandler.java:187)

... 23 more

说实话,到我写这篇文章的时候,我还是不明白其中的缘由,所以我没直接解决这个问题,但是我注意到一个现象,为什么nn/[email protected]能够成功登录,而http/[email protected]却不能,对比了这两部分登录代码,我又发现对于nn/[email protected]登录,loginContext使用的配置类是HadoopConfiguration,但是http/[email protected]使用的却是另外一个java类KerberosConfiguration,打印调试日志后,又让我发现其中的不同:

Debug is true storeKey true useTicketCache false useKeyTab true doNotPrompt true ticketCache is null isInitiator true KeyTab is /hadoop-data/etc/hadoop/nn.service.keytab refreshKrb5Config is true principal is nn/[email protected] tryFirstPass is false useFirstPass is false storePass is false clearPass is false

Refreshing Kerberos configuration

principal is nn/[email protected]

Will use keytab

Commit Succeeded

Debug is true storeKey true useTicketCache true useKeyTab true doNotPrompt true ticketCache is null isInitiator false KeyTab is /hadoop-data/etc/hadoop/http.service.keytab refreshKrb5Config is true principal is http/[email protected] tryFirstPass is false useFirstPass is false storePass is false clearPass is false

Refreshing Kerberos configuration

Acquire TGT from Cache

Principal is http/[email protected]

[Krb5LoginModule]: Entering logout

[Krb5LoginModule]: logged out Subject

两端调试日志中不一样的部分已经标出来了,在没有其他解决办法的情况下,我改了KerberosConfiguration的源码。

Ø 在core-site.xml中hadoop.security.auth_to_local的写法需要特别注意,参考链接:http://docs.hortonworks.com/HDPDocuments/HDP1/HDP-1.3.0/bk_installing_manually_book/content/rpm-chap14-2-2-1.html

2.3 验证hdfs
2.3.1 授权不过的现象
2.3.2 授权通过的现象

转载于:https://my.oschina.net/psuyun/blog/337560

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34082854/article/details/91840979

智能推荐

组合数学中的项链计数_组合数学项链问题-程序员宅基地

文章浏览阅读789次。给c种不同颜色宝石能穿成多少种长度为s的宝石项链(本质不同)Burnside定理的应用:当n为奇数时,有n种翻转,每种翻转都是以一个顶点和该顶点对边的中点对称。有k^(n/2+1)*n种。当n为偶数时,有n种翻转,其中一半是以两个对应顶点,另一半是以两条对边对称。有k^(n/2+1)*n/2+k^(n/2)*n/2种。..._组合数学项链问题

蓝桥杯第八届 省赛 c语言A组_第八届蓝桥杯c语言a组-程序员宅基地

文章浏览阅读575次,点赞2次,收藏7次。第一题标题:迷宫X星球的一处迷宫游乐场建在某个小山坡上。它是由10x10相互连通的小房间组成的。房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R表示走到右边的房间,U表示走到上坡方向的房间,D表示走到下坡方向的房间。X星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!开始的时候,直升机把10..._第八届蓝桥杯c语言a组

常用的抓包工具_tcap包-程序员宅基地

文章浏览阅读1.3k次。建议先了解不同协议和网络层的数据包结构。不然,你将无法了解如何做包分组工作,以及这些工具如何使用。出于学习目的,在使用这些工具列表之前,你必须了解不同协议的数据包,包中的不同字段,这些包字段的含义或目的,以及这些包在网络通信中的使用方式。一旦你知道这些事情,你将能够改变这些值,以便你在网络中看到你所需的效果。1. HpingHping是最受欢迎和免费的抓包工具之一。它允许你修改和发送自定义..._tcap包

解决linux指令“没有那个文件或目录”-程序员宅基地

文章浏览阅读1.5w次。本文介绍了一种面对linux指令“没有那个文件或目录”时的自查和解决方法_没有那个文件或目录

eslint配置大全_eslint 参数-程序员宅基地

文章浏览阅读462次。{"rules" : { // 定义对象的set存取器属性时,强制定义get "accessor-pairs": 2, // 指定数组的元素之间要以空格隔开(,后面), never参数:[ 之前和 ] 之后不能带空格,always参数:[ 之前和 ] 之后必须带空格 "array-bracket-spacing": [2, "never"], // 在块级作用域外访问块内定义的变量是否报错提示 "block-scoped-var": 0, // if while functi._eslint 参数

Mac安装anaconda后两个python版本共存,在终端pip无法为各自python版本倒入模块的解决办法_mac anaconda 配置两个 python-程序员宅基地

文章浏览阅读3.7k次。问题描述:使用anaconda来管理包,十分方便,也可以到达使得python2和python3共存的目的,但当导入anaconda以外的包时,可能会产生一些问题,在近期学习中,由于会用到scikit-learn模块,此模块为python2.7版本的模块,在使用终端通过pip安装时,ppip默认为为python3安装包。对此,可以尝试用pycharm导入此模块:打开pycharm,选择file菜_mac anaconda 配置两个 python

随便推点

可变模板参数_template<typename t, typename ...args>-程序员宅基地

文章浏览阅读1.1k次。背景在 C++11 之前,无论是类模板还是函数模板,都只能按其指定的样子,接受一组固定数量的模板参数;而C++11 加入了新的表示方法,允许任意个数、任意类别的模板参数,同时也不需要在定义时将参数的个数固定。可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“...”template<typename....._template

css实现超出长度文字自动隐藏或用省略号表示_css a标签超出宽度自动隐藏-程序员宅基地

文章浏览阅读269次。HTML<a href="" target="_blank"> 业务需求分析书-系统营业日扎帐报表、收费汇总表及收费明细表 </a>cssa{overflow: hidden;text-overflow: ellipsis;white-space: nowrap;width: 100%;display: inline-block;}overflow:..._css a标签超出宽度自动隐藏

前向纠错(FEC)之纠删码原理(EC)_向前纠错的编码过程-程序员宅基地

文章浏览阅读2k次。References:纠删码解析_向前纠错的编码过程

(六)使用Transformers进行情感分析_基于transformer的情感分析-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏53次。文章目录准备数据搭建模型训练模型推断完整代码在本笔记本中我们将使用在本论文中介绍的Transformer模型。具体来说,我们将使用来自这篇论文中的BERT(Bidirectional Encoder Representations from Transformers)模型。Transformer模型比之前笔记中介绍的任何模型都要大得多。因此,我们将使用transformers library获得预先训练的transformers,并使用它们作为我们的嵌入层。我们将冻结(而不是训练)transformer_基于transformer的情感分析

Computational Optimal Transport笔记——Introduction_最优运输理论 偏微分方程-程序员宅基地

文章浏览阅读1.2k次。Computational Optimal Transport笔记——Introduction最优运输可以看做是更一般的最短路问题最短路原则:当在给定的点处有一个商品、人或者一些信息,这些东西需要被送到目标点。我们希望使用最少的工作量完成任务。(我们可以沿着直线或者测地线移动)最忧运输理论将这个问题一般化,一个人不是一次移动一个物品而是同时移动多个物品。经证明,有计划地运输一堆个体到指定的位..._最优运输理论 偏微分方程

springboot2.0之配置spring security记住我(rememberMe功能)不起作用的原因_spring security记住我功能有令牌不实现-程序员宅基地

文章浏览阅读3.4k次。刚入门spring security,感觉东西有点多,不好好研究出了问题都不知道为什么。rememberMe功能配置核心代码(有问题的): protected void configure(HttpSecurity http) throws Exception { List<SysPermission> allPermission = permissionFe..._spring security记住我功能有令牌不实现

推荐文章

热门文章

相关标签