hdfs、yarn集成kerberos
1、kdc创建principal
1.1、创建认证用户
登陆到kdc服务器,使用root或者可以使用root权限的普通用户操作:
# kadmin.local -q “addprinc -randkey hdfs/yjt”
# kadmin.local -q “addprinc -randkey yarn/yjt”
# kadmin.local -q “addprinc -randkey mapred/yjt”
# kadmin.local -q “addprinc -randkey HTTP/yjt”
注意:我这里只有一台Hadoop节点,如果有多台,上面的操作就要执行多次,其中yjt是Hadoop服务节点的主机名。
下面是写的一个小脚本,不完善,但可以稍微简单的创建认证用户:
#!/bin/bash
KADMINLOCAL=`which kadmin.local`
if [[ $# -lt 2 ]]; then
echo "Usage: " $0 " prinvipal keytab_File"
exit 2
fi
PRINCIPAL=${@:1:$#-1}
KEYTAB_FILE=${!#}
function addPrincipal(){
for principal in $PRINCIPAL
do
${KADMINLOCAL} -q "addprinc -randkey ${principal}"
done
${KADMINLOCAL} -q "listprincs"
}
KLIST=`which klist`
function addToKeytabFile(){
${KADMINLOCAL} -q "xst -norandkey -k ${KEYTAB_FILE} ${PRINCIPAL}"
$KLIST -kt ${KEYTAB_FILE}
}
addPrincipal
addToKeytabFile
脚本使用方法: 必须至少传入两个参数(不包括$0), 最后一个参数为密钥文件,第一个参数到倒数第二个参数为要创建的认证主体
列如:
./addPrincipal_createKeytab.sh nn/yjt rm/yjt dn/yjt jn/yjt HTTP/yjt nm/yjt mr/yjt hadoop.keytab
1.2、创建keytab文件
# kadmin.local -q “xst -norankey -k /etc/hadoop.keytab hdfs/yjt yarn/yjt mapred/yjt HTTP/yjt”
1.3、拷贝密钥文件
拷贝上述的Hadoop.keytab文件到所有Hadoop集群机器的${HADOOP_HOME}/etc/hadoop目录下面
# scp /etc/hadoop.keytab hduser@hostname:${HADOOP_HOME}/etc/hadoop
1.4、修改密钥文件权限
修改Hadoop集群上的hadoop.keytab密钥文件权限(所有节点都要修改),例如:
# chown hduser:hadoop ${HADOOP_HOME}/etc/hadoop/hadoop.keytab
#chmod 400 ${HADOOP_HOME}/etc/hadoop/hadoop.keytab
2、配置hdfs kerberos认证
2.1、修改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](hdfs@HADOOP.COM)s/.*/hduser/
RULE:[2:$1@$0]([yarn@HADOOP.COM)s/.*/hduser/
RULE:[2:$1@$0](mapred@HADOOP.COM)s/.*/hduser/
RULE:[2:$1@$0](hive@HADOOP.COM)s/.*/hduser/
RULE:[2:$1@$0](hbase@HADOOP.COM)s/.*/hduser/
DEFAULT
</value>
</property>
参数解析:
hadoop.security.authorization: 是否开启认证
hadoop.security.authentication:当开启认证以后,使用什么样的方式认证
hadoop.security.auth_to_local: kerberos认证用户映射到本地文件系统下的什么用户。
2.2、配置hdfs-site.xml文件
添加如下配置:
<!-- NameNode Kerberos Config-->
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hdfs/_HOST@HADOOP.COM</value>
</property>
<property>
<name>dfs.namenode.keytab.file</name>
<value>/data1/hadoop/hadoop/etc/hadoop/hadoop.keytab</value>
</property>
<property>
<name>dfs.https.port</name>
<value>50470</value>
</property>
<property>
<name>dfs.https.address</name>
<value>0.0.0.0:50470</value>
</property>
<property>
<name>dfs.namenode.kerberos.https.principal</name>
<value>HTTP/_HOST@HADOOP.COM</value>
</property>
<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@HADOOP.COM</value>
</property>
<!-- JournalNode Kerberos Config -->
<property>
<name>dfs.journalnode.kerberos.principal</name>
<value>hdfs/_HOST@HADOOP.COM</value>
</property>
<property>
<name>dfs.journalnode.keytab.file</name>
<value>/data1/hadoop/hadoop/etc/hadoop/hadoop.keytab</value>
</property>
<!-- DataNode Kerberos Config -->
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>700</value>
</property>
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>hdfs/_HOST@HADOOP.COM</value>
</property>
<property>
<name>dfs.datanode.keytab.file</name>
<value>/data1/hadoop/hadoop/etc/hadoop/hadoop.keytab</value>
</property>
<!-- DataNode SASL Config -->
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:61004</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:61006</value>
</property>
<property>
<name>dfs.http.policy</name>
<value>HTTPS_ONLY</value>
</property>
<property>
<name>dfs.data.transfer.protection</name>
<value>integrity</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/_HOST@HADOOP.COM</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/data1/hadoop/hadoop/etc/hadoop/hadoop.keytab</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
<value>${dfs.web.authentication.kerberos.principal}</value>
</property>
<!--SecondaryNamenode Kerberos Config-->
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>hdfs/_HOST@HADOOP.COM</value>
</property>
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/data1/hadoop/hadoop/etc/hadoop/hadoop.keytab</value>
</property>
参数解析:
dfs.block.access.token.enable: 开启数据节点访问检查
dfs.namenode.kerberos.principal: namenode 服务认证主体,变量_HOST在实际中会替换成节点对应的主机名
dfs.namenode.keytab.file: 密钥文件
dfs.https.port:用于hsftp和swebhdf文件系统的https端口。也就是安全访问端口
dfs.namenode.kerberos.https.principal: (猜测是用于namenode web服务的认证主体,在官网没找到这个属性)
dfs.namenode.kerberos.internal.spnego.principal: 默认值${dfs.web.authentication.kerberos.principal}, 用于web ui spnego身份验证的服务器主体
dfs.datanode.data.dir.perm: 数据目录的权限,默认就是700
dfs.datanode.address: 用于传输数据的端口,如果配置了特权端口(小于1024),在启动datanode的时候需要以root启动,同时还还得配置Hadoop环境变量和其他的配置,比较麻烦
dfs.datanode.http.address:同上,如果是非特权端口,则可以配置sasl方式进行数据的传输(Hadoop版本需要在2.6以上)
dfs.http.policy: 协议类型,默认是HTTP_ONLY, 可选值:HTTP_AND_HTTPS, HHTPS_ONLY(ssl支持)
dfs.web.authentication.kerberos.principal: web认证
2.3、配置sasl
如果dfs.datanode.address和 dfs.datanode.http.address的端口号被设置成特权端口(小于1024),那么,在后面启动datanode节点时候,需要先使用root启动,并且还需要编译安装jsvc,以及修改hadoop-env.sh环境变量文件中HADOOP_SECURE_DN_USER值为集群的用户,比较麻烦,不推荐这种方法。
使用如下的方法比较简单:
dfs.datanode.address和 dfs.datanode.http.address的端口号改成非特权端口,在kdc服务器执行
# openssl req -new -x509 -keyout test_ca_key -out test_ca_cert -days 9999 -subj '/C=CN/ST=China/L=Beijin/O=hduser/OU=security/CN=hadoop.com'
上述主要是用于生成根证书文件,把生成的文件拷贝到集群
# scp * 集群节点ip:/data1/hadoop/keystore
接下来在每台集群节点操作如下步骤:
# keytool -keystore keystore -alias localhost -validity 9999 -genkey -keyalg RSA -keysize 2048 -dname "CN=hadoop.com, OU=test, O=test, L=Beijing, ST=China, C=cn"
# keytool -keystore truststore -alias CARoot -import -file test_ca_cert
keytool -certreq -alias localhost -keystore keystore -file cert
# openssl x509 -req -CA test_ca_cert -CAkey test_ca_key -in cert -out cert_signed -days 9999 -CAcreateserial -passin pass:123456
# keytool -keystore keystore -alias CARoot -import -file test_ca_cert
# keytool -keystore keystore -alias localhost -import -file cert_signed
上述的所有命令在需要输入密码的时候最好统一,我这里做测试就设置的简单了,比如123456
2.5、修改ssl-server.xml文件
# cd ${HADOOP_HOME}/etc/hadoop/
# cp ssl-server.xml.examples ssl-server.xml
修改ssl.server.xml文件,改成如下:
<configuration>
<property>
<name>ssl.server.keystore.location</name>
<value>/data1/hadoop/keystore/keystore</value>
</property>
<property>
<name>ssl.server.keystore.password</name>
<value>123456</value>
</property>
<property>
<name>ssl.server.truststore.location</name>
<value>/data1/hadoop/keystore/truststore</value>
</property>
<property>
<name>ssl.server.truststore.password</name>
<value>123456</value>
</property>
<property>
<name>ssl.server.keystore.keypassword</name>
<value>123456</value>
</property>
<property>
<name>ssl.server.exclude.cipher.list</name>
<value>TLS_ECDHE_RSA_WITH_RC4_128_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,
SSL_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_WITH_DES_CBC_SHA,
SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,
SSL_RSA_WITH_RC4_128_MD5</value>
<description>Optional. The weak security cipher suites that you want excluded
from SSL communication.</description>
</property>
</configuration>
2.6、修改ssl-client.xml文件
# cd ${HADOOP_HOME}/etc/hadoop/
# cp ssl-client.xml.examples ssl-client.xml
改成如下值:
<configuration>
<property>
<name>ssl.client.keystore.location</name>
<value>/data1/hadoop/keystore/keystore</value>
</property>
<property>
<name>ssl.client.keystore.password</name>
<value>123456</value>
</property>
<property>
<name>ssl.client.truststore.location</name>
<value>/data1/hadoop/keystore/truststore</value>
</property>
<property>
<name>ssl.client.truststore.password</name>
<value>123456</value>
</property>
<property>
<name>ssl.client.keystore.keypassword</name>
<value>123456</value>
</property>
</configuration>
2.7、客户端测试
(1) 、首先从Hadoop集群拷贝一份Hadoop配置到客户端
# scp -r ${HADOOP_HOME} client_ip:/data1/hadoop
(2) 、在kdc服务器创建认证用户test/yjt,并生成密钥文件,然后拷贝到客户端,修改权限。
# kadmin.local -q “addprinc -randkey test/yjt”
# kadmin.local -q “xst -norandkey -k test.keytab test/yjt”
# scp test.keytab client_ip:/data1/ #这个目录随意,但最好放在一个安全的地方
# chown test:test test.keytab
(3) 、执行 hadoop fs -ls / 查看是否可以获取集群的信息
结果输出如下:
ls: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]; Host Details : local host is: "localhost/127.0.0.1"; destination host is: "yjt":9000;
上述信息说的就是获取信息的时候,没有通过认证,说白了就是没有获取到Kerberos认证用户,导致访问失败。
(4) 、获取票据
# kinit -kt test.keytab test/yjt
使用klist查看刚才获取的剽据,如果能查看到,说明票据获取成功,接着在使用hadoop fs -ls /获取信息,不出意外,现在可以获取到信息了。
(5) 、如何在Hadoop集群上进行增删改操作?
想要使用非hadoop集群的用户在集群进行数据的改变操作,需要acl对目录或者文件授予相对应的权限才可以。
这里做一个测试,测试普通用户只能在自己的家目录进行增删改操作,对其他目录或者权限只有读取的权限。
列如:
l 在Hadoop集群创建一个目录。比如/user/yjt,这个目录的权限被授予yjt权限,
# hadoop fs -chown yjt:yjt /user/yjt
# hadoop fs -setfacl -m user:yjt:rwx /user
接下来在客户端操作:
l Hadoop fs -touch /user/yjt/file #添加操作,正常可以创建
l Hadoop fs -rm /user/yjt/file #删除操作,正常可以删除
在Hadoop集群创建一个file2
客户端删除file2,看是否可以成功
l Hadoop fs -rm /file2
Permission denied: user=yjt, access=WRITE, inode="/":hduser:supergroup:drwxr-xr-x
发现是不能操作的。
3、配置yarn kerberos 认证
3.1、修改yarn-site.xml文件
添加如下配置:
<!--kerberos 配置-->
<!--配置resourcemanager认证用户-->
<property>
<name>yarn.resourcemanager.principal</name>
<value>rm/_HOST@HADOOP.COM</value>
</property>
<!--配置resourcemanager密钥表-->
<property>
<name>yarn.resourcemanager.keytab</name>
<value>/data1/hadoop/hadoop/etc/hadoop/hadoop.keytab</value>
</property>
<!--配置nodemanager 认证用户-->
<property>
<name>yarn.nodemanager.principal</name>
<value>nm/_HOST@HADOOP.COM</value>
</property>
<!--配置nodemanager密钥表-->
<property>
<name>yarn.nodemanager.keytab</name>
<value>/data1/hadoop/hadoop/etc/hadoop/hadoop.keytab</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.spnego-principal</name>
<value>HTTP/_HOST@HADOOP.COM</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.spnego-keytab-file</name>
<value>/data1/hadoop/hadoop/etc/hadoop/hadoop.keytab</value>
</property>
3.2、修改mapred-site.xml
添加如下配置:
<!--配置jobhistory 认证用户-->
<property>
<name>mapreduce.jobhistory.principal</name>
<value>mr/_HOST@HADOOP.COM</value>
</property>
<!--配置jobhistory密钥表-->
<property>
<name>mapreduce.jobhistory.keytab</name>
<value>/data1/hadoop/hadoop/etc/hadoop/hadoop.keytab</value>
</property>
3.3、客户端跑wordcount测试
创建yujt用户测试
# useradd yujt
# echo ‘123456’ |passwd --stdin ‘yujt’
切换到hduser操作
$ hadoop chmod -R 777 /tmp
$ touch test.txt;echo “1\n2\n2” > test.txt
$ hadoop fs -mkdir /user/yujt
$ hadoop fs -put test.txt /user/yujt
$ hadoop chown -R yujt:yujt /user/yujt
切换到yujt用户
$ hadoop jar /data1/hadoop/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /user/yujt/text.txt /user/yujt/out1
hdfs、yarn集成kerberos的更多相关文章
- kerberos系列之hdfs&yarn认证配置
一.安装hadoop 1.解压安装包重命名安装目录 [root@cluster2_host1 data]# tar -zxvf hadoop-2.7.1.tar.gz -C /usr/local/ [ ...
- HDP安全之集成kerberos/LDAP、ranger(knox自带LDAP)
----------------------目录导航见左上角------------------------------- 环境 HDP 3.0.1.0 (已有) JDK 1.8.0_91 (已有 ...
- Ambari集成Kerberos报错汇总
Ambari集成Kerberos报错汇总 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看报错的配置信息步骤 1>.点击Test Kerberos Client,查看相 ...
- 2.安装hdfs yarn
下载hadoop压缩包设置hadoop环境变量设置hdfs环境变量设置yarn环境变量设置mapreduce环境变量修改hadoop配置设置core-site.xml设置hdfs-site.xml设置 ...
- Hue联合(hdfs yarn hive) 后续......................
1.启动hdfs,yarn start-all.sh 2.启动hive $ bin/hive $ bin/hive --service metastore & $ bin/hive --ser ...
- presto集成kerberos以及访问集成了kerberos的hive集群
1.创建主体 注: 192.168.0.230 为单节点集群 192.168.4.50为kdc服务器 192.168.0.9为客户端 1.1.Kdc服务器创建主体 # kadmin.local -q ...
- hdfs、yarn集成ranger
一.安装hdfs插件 从源码安装ranger的服务器上拷贝hdfs的插件到你需要安装的地方 1.解压安装 # tar zxvf ranger-2.1.0-hdfs-plugin.tar.gz -C / ...
- 挖坑:hive集成kerberos
集成hive+kerberos前,hadoop已经支持kerberos,所以基础安装略去: https://www.cnblogs.com/garfieldcgf/p/10077331.html 直接 ...
- zookeeper、hbase集成kerberos
1.KDC创建principal 1.1.创建认证用户 登陆到kdc服务器,使用root或者可以使用root权限的普通用户操作: # kadmin.local -q “addprinc -randke ...
随机推荐
- win10 bcdedit testsigning
win10 bcdedit testsigning # 禁用系统完整性检查和禁用驱动签名以及进入测试签名驱动模式> bcdedit.exe /set nointegritychecks on & ...
- 如何导出UML图片以及小人的组件在哪里
首先先要创建一个新项目 接着在右侧栏目创建一个modal 添加usecase,里面就有小人的组件(注意:是Add Diagram) 将做好的图进行保存程jpg格式(快捷键 ctrl +shift+D) ...
- 2019 搜狐java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.搜狐等公司offer,岗位是Java后端开发,因为发展原因最终选择去了搜狐,入职一年时间了,也成为了面试官,之 ...
- jmeter学习笔记(二十二)——监听器插件之jp@gc系列
一.jp@gc - Actiive Threads Over Time 不同时间活动用户数量展示 下面是一个阶梯加压测试的图标 二.jp@gc - Transactions per Second ...
- Android为TV端助力记录EditText.setInputType的坑
如XML中设置android:inputType=”numberDecimal”在Java代码中仅设置setInputType(EditorInfo.TYPE_NUMBER_FLAG_DECIMAL) ...
- WebApi中将静态页面作为首页
WebApi中将静态页面作为首页 使用场景 在我的项目中使用Asp.Net WebApi作为后端数据服务,使用Vue作为前端Web,在服务器IIS上部署时需要占用两个端口,一个是80端口,用户在浏览器 ...
- 我的oracle 健康检查报告
最近一直想用sql来生成oracle的健康检查报告,这样看起来一目了然,经过网上搜资料加自己整理终于算是成型了,部分结果如下图所示, 具体参考附件,恳请广大网友看看是否还有需要添加的地方. DB_he ...
- Android笔记(七十四) 详解Intent
我们最常使用Intent来实现Activity之间的转跳,最近做一个app用到从系统搜索图片的功能,使用到了intent的 setType 方法和 setAction 方法,网上搜索一番,发现实现转跳 ...
- centos 宝塔 使用命令行快速导入数据库sql
先将sql文件上传到服务器,例如上传到www文件夹 然后打开命令行工具 输入 mysql -u 数据库用户名 -p 然后复制密码进去 然后输入 use 数据库名 回车 然后输入 source /www ...
- Altium Designer常用快捷键总结
一.PCB中常用快捷键 ● R+L 输出PCB中所有网络的布线长度 ● Ctrl+左键点击 对正在布的线完成自动布线连接 ● M+G 可更改铜的形状; ● 按P+T在布线状态下,按Shift+A可直接 ...