GCDW新版本支持hdfs作为存储,其中hadoop使用kerberos作为安全模式。本文介绍hadoop下kerberos的配置方案。
目录导航
参考
hadoop kerberos安全方案
主要针对datanode的数据安全,有两类,只能选择其中一个,不能混用。
我们选择私有端口方案,并用root启动。
1、私有安全端口+JSVC
私有安全端口,指小于1024的,这些只有root特权用户才能使用。
hadoop通过dfs.datanode.address和dfs.datanode.http.address
参数来指定私有端口。所以这个datanode必须运行在root权限下,
hadoop会先用root来绑定端口,然是释放掉,再用HDFS_DATANODE_SECURE_USER指定的用户进行绑定。所以需要使用JSVC工具来启动进程,该工具用JSVC_HOME
参数来指定。 这2个参数都在hadoop-env.sh配置文件里。
2、SASL 简单认证和安全层
Simple Authentication and Security Layer。从2.6.0开始支持SASL,无需使用root权限和私有端口。通过在 hdfs-site.xml配置文件里指定dfs.data.transfer.protection参数来开启。
要求dfs.datanode.address
.的端口不能是私有端口,同时
1、将dfs.http.policy设置为HTTPS_ONLY
2、 设置dfs.datanode.http.address
为私有端口并配置HDFS_DATANODE_SECURE_USER
和JVSC_HOME参数。
私有端口方案配置文件
如前面所讲,我们选择私有端口方案,并用root启动,HTTP协议访问。
/etc/profile
最后三个,是安全有关的环境变量。
export JAVA_HOME=/usr/java/jdk1.8.0_202-amd64/
export HADOOP_HOME=/opt/hadoop-3.2.4
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_CLASSPATH=$HADOOP_HOME/share/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HDFS_DATANODE_USER=root
export HDFS_NAMENODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
hadoop-env.sh
[root@hadoop141 hadoop]# cat hadoop-env.sh |grep -v '#\|^$'
export JAVA_HOME=/usr/java/jdk1.8.0_202-amd64/
export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)}
export JSVC_HOME=/opt/hadoop-3.2.4/libexec
export HDFS_DATANODE_SECURE_USER=root
有变动的是JSVC_HOME和HDFS_DATANODE_SECURE_USER, 我这里继续用的root用户
core-size.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop141:8020</value>
<description></description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description></description>
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
<description>是否开启hadoop的安全认证</description>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
<description>使用kerberos作为hadoop的安全认证方案</description>
</property>
</configuration>
- hadoop.security.authentication 认证方式设置kerberos。默认是simple 无需认证。
- hadoop.security.authorization 打开RPC服务级认证
hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop-3.2.4/data/namenode</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop-3.2.4/data/hdfs/data</value>
<final>true</final>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>0.0.0.0:9868</value>
<description>HTTP web UI address for the Secondary NameNode.</description>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop141:9870</value>
</property>
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
<description>Enable HDFS block access tokens for secure operations</description>
</property>
<property>
<name>dfs.namenode.keytab.file</name>
<value>/opt/keytab/hdfs.keytab</value>
<description>因为使用-randkey 创建的用户 密码随机不知道,所以需要用免密登录的keytab文件 指定namenode需要用的keytab文件在哪里</description>
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hdfs/_HOST@GCDW</value>
<description>namenode对应的kerberos账户为 nn/主机名@HENGHE.COM _HOST会自动转换为主机名</description>
</property>
<property>
<name>dfs.datanode.keytab.file</name>
<value>/opt/keytab/hdfs.keytab</value>
<description>datanode用到的keytab文件路径</description>
</property>
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>hdfs/_HOST@GCDW</value>
<description>datanode用到的账户</description>
</property>
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/opt/keytab/hdfs.keytab</value>
<description>sn对应的keytab文件</description>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>hdfs/_HOST@GCDW</value>
<description>secondarynamenode使用的账户</description>
</property>
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/_HOST@GCDW</value>
<description>web hdfs 使用的账户</description>
</property>
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/opt/keytab/hdfs.keytab</value>
<description>对应的keytab文件</description>
</property>
<property>
<name>dfs.http.policy</name>
<value>HTTP_ONLY</value>
<description>所有开启的web页面均使用https, 细节在ssl server 和client那个配置文件内配置, HTTPS_ONLY or HTTP_AND_HTTPS</description>
</property>
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:1004</value>
<description>[重要]安全数据节点必须使用特权端口,以确保服务器安全启动。这意味着服务器必须通过jsvc启动。 或者,如果使用SASL对数据传输协议进行身份验证,则必须将其设置为非特权端口. (See dfs.data.transfer.protection.)</description>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:1006</value>
<description>[重要]安全数据节点必须使用特权端口,以确保服务器安全启动。这意味着服务器必须通过jsvc启动。</description>
</property>
</configuration>
- dfs.webhdfs.enabled 开启webhdfs功能
- dfs.namenode.http-address 主namenode对外服务的端口。hadoop2里是50070,hadoop3是9870
- dfs.block.access.token.enable hdfs块级访问令牌
- dfs.namenode.keytab.file 从kerberos里导出的kerberos账号密码文件,后面都用这同一个。
- dfs.namenode.kerberos.principal 主namenode的kerberos用户,一般类似名字/_HOST@域名,比如hdfs/_HOST@GCDW。其中_HOST会自动匹配本地主机名,方便配置文件的分发。
- dfs.datanode.keytab.file 数据节点datanode的kerberos账号密码文件,同前面面
- dfs.datanode.kerberos.principal 数据节点的kerberos用户
- dfs.secondary.namenode.keytab.file 备用namenode的kerberos用户密码文件
- dfs.secondary.namenode.kerberos.principal 备用namenode的kerberos用户
- dfs.web.authentication.kerberos.principal SPNEGO认证用的kerberos用户,一般是HTTP开头。
- dfs.web.authentication.kerberos.keytab SPNEGO认证的kerberos用户密码文件
- dfs.http.policy WEB访问协议,本处采用HTTP_ONLY。如果前面的方案选择SASL,则必须设置为HTTPS_ONLY
- dfs.datanode.address 数据节点的服务地址和端口,采用小于1024的,本处使用1004。 必须用JSVC启动
- dfs.datanode.http.address 数据节点HTTP服务地址和端口,也要采用小于1024的。本处用1006。JSVC启动
JSVC配置
该程序在commons-daemon-1.3.4.jar里面,具体的版本号选择比较新的。
其中源代码和jar可以从如下地址下载
https://downloads.apache.org/commons/daemon/source/
https://downloads.apache.org/commons/daemon/binaries/
源代码解压后进行编译,指定JDK目录
cd commons-daemon-1.3.4-src/src/native/unix/
./configure --with-java=/opt/tools/jdk1.8.0_181
make
确认生成的jsvc可以运行
[root@hadoop141 unix]# ./jsvc --help
Usage: jsvc [-options] class [args...]
Where options include:
-help | --help | -?
show this help page (implies -nodetach)
-jvm <JVM name>
use a specific Java Virtual Machine. Available JVMs:
'server'
。。。。。。
复制jsvc到hadoop的libexec目录下,方便分发。当然其它目录也可以。
cp jsvc /opt/hadoop-3.2.4/libexec/
替换commons-daemon-XXX.jar为新版本。
rm /opt/hadoop-3.2.4/share/hadoop/hdfs/lib/commons-daemon-*.jar
cp commons-daemon-1.3.4.jar /opt/hadoop-3.2.4/share/hadoop/hdfs/lib/
总结
本文介绍的是私有端口配置kerberos的方案,需要使用JSVC来启动,在进行jps时是看不到这个进程的。通过ps -ef|grep jsvc可以看到其启动了datanode服务。
另一个HTTPS访问的方案以后再介绍。