hadoop安装完之后,默认情况下,可以通过 http://ip:50070/dfshealth.jsp 访问hdfs页面,查看namenode、datanode状态,查看存放的文件等。但这个页面在默认配置下,是不需要输入用户名密码的,直接输入地址到浏览器就可以访问,这为hdfs带来了安全隐患 – 所有人都可以通过这个页面删除文件。
鉴于这样的情况,我们希望在访问这个页面时,必须输入用户名密码,这样就只有少部分知情的人能操作这个页面。
在baidu上查相关的解决方案,基本都是通过配置core-site.xml等,在访问地址后面加上user.name=xx,即http://ip:50070/dfshealth.jsp?user.name=xx 的方式,开始觉得这样也能接受,后面发现,user.name=xx,这个xx输入任意字符就能通过检验,就比如我设置的user.name是abcdefg,在访问页面时我填?user.name=123也是可以访问页面的,这是不能接受了。
那既然这是一个web界面,那我们就可以从为web项目添加用户校验入手,为hadoop页面添加用户校验。
1 效果
在访问页面时,要输入用户名密码,我把50070端口改成了8070
2 具体的配置如下
在namenode节点配置即可,不用在datanode中配置
2.1 web.xml
路径: $HADOOP_HOME/share/hadoop/hdfs/webapps/hdfs/WEB-INF
编辑web.xml,填入以下内容(这是我的配置,role-name要根据自己的实际情况配置,我的hadoop用户是在root group下的,所以填root):
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
<!-- Add this towards the bottom of the xml document. -->
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>root</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>jobtrackerRealm</realm-name>
</login-config>
</web-app>
这是对各配置项的说明:
2.2 jetty-web.xml
和web.xml在同一个文件夹下,如果没有,则新增一个,填入以下内容(/etc/hadoop/realm.properties是配置用户名密码的文件,在同一行配置中已经加上hadoop.home.dir前缀了,这里补充实际路径就可以了):
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<Get name="securityHandler">
<Set name="userRealm">
<New class="org.mortbay.jetty.security.HashUserRealm">
<Set name="name">jobtrackerRealm</Set>
<Set name="config">
<SystemProperty name="hadoop.home.dir"/>/etc/hadoop/realm.properties
</Set>
</New>
</Set>
</Get>
</Configure>
2.3 realm.properties
$HADOOP_HOME/etc/hadoop/realm.properties,这个文件是没有的,要先创建
$ cd $HADOOP_HOME/etc/hadoop/
$ vi realm.properties
在编辑器中输入
用户名:密码,用户所在的组 #比如: hadoop:hadoop123,root 一个用户密码一行,要配置多个,就多行
2.4 重启使修改生效
$ cd $HADOOP_HOME/sbin
$ ./stop-all.sh
# stop执行完之后,start
$ ./start-all.sh
3 参考文档