南大通用GCDW技术栈-hadoop+kerberos配置

GCDW新版本支持hdfs作为存储,其中hadoop使用kerberos作为安全模式。本文介绍hadoop下kerberos的配置方案。

参考

GCDW技术栈-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_HOMEHDFS_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访问的方案以后再介绍。