zoukankan      html  css  js  c++  java
  • 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节点,如果有多台,上面的操作就要执行多次,其中yjtHadoop服务节点的主机名。

    下面是写的一个小脚本,不完善,但可以稍微简单的创建认证用户:

    #!/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_localkerberos认证用户映射到本地文件系统下的什么用户。

    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.principalnamenode 服务认证主体,变量_HOST在实际中会替换成节点对应的主机名
    dfs.namenode.keytab.file: 密钥文件
    dfs.https.port:用于hsftpswebhdf文件系统的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_HTTPSHHTPS_ONLY(ssl支持)
    dfs.web.authentication.kerberos.principal: web认证

    2.3、配置sasl

    如果dfs.datanode.addressdfs.datanode.http.address的端口号被设置成特权端口(小于1024),那么,在后面启动datanode节点时候,需要先使用root启动,并且还需要编译安装jsvc,以及修改hadoop-env.sh环境变量文件中HADOOP_SECURE_DN_USER值为集群的用户,比较麻烦,不推荐这种方法。

    使用如下的方法比较简单:

    dfs.datanode.addressdfs.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对目录或者文件授予相对应的权限才可以。

    这里做一个测试,测试普通用户只能在自己的家目录进行增删改操作,对其他目录或者权限只有读取的权限。

    列如:

    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 2 2” > 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

  • 相关阅读:
    多态实现--虚函数与纯虚函数
    CentOS6编译安装gcc高版本
    Linux多进程CS服务器简单测试
    Linux单用户CS模型TCP通讯完全注释手册
    进程线程及其状态
    Java学习-字符串、字符、ASCII、数字的互相转换
    Java学习-素数
    Java学习-日期
    Java学习-多态
    Java学习-练习
  • 原文地址:https://www.cnblogs.com/yjt1993/p/11769515.html
Copyright © 2011-2022 走看看