zoukankan      html  css  js  c++  java
  • Kerberos与各大组件的集成

    1. 概述

      Kerberos可以与CDH集成,CDH里面可以管理与hdfs、yarn、hbase、yarn、kafka等相关组件的kerberos凭证。但当我们不使用CDH的时候,也需要了解hdfs、yarn、hbase和kafka是如何配置关联kerberos的。

      该文是建立在Kerberos基本原理、安装部署及用法博客的前提上的,需要首先了解Kerberos的基本原理、安装用法,才能阅读下文。

    2. Cloudera Manager添加Kerberos

    2.1. 创建Kerberos管理员principal

    # 需要设置两次密码 
    //使用cloudera-scm/admin作为CM创建其它principals的超级用户
    kadmin.local -q "addprinc cloudera-scm/admin"

       principal的名字的第二部分是admin,是根据Kerberos安装部署文章里面提到的配置acl文件,该principal就拥有administrative privileges,这个账号将会被CDH用来生成其他用户/服务的principal。

      注意:需要先kinit保证已经有principal缓存。

    [root@master ~]# kinit cloudera-scm/admin
    Password for cloudera-scm/admin@EXAMPLE.COM: 
    [root@master ~]# klist 
    Ticket cache: KEYRING:persistent:0:0
    Default principal: cloudera-scm/admin@EXAMPLE.COM
    
    Valid starting       Expires              Service principal
    07/01/2020 11:51:17  07/02/2020 11:51:16  krbtgt/BOCLOUD.COM@EXAMPLE.COM
        renew until 07/08/2020 11:51:16

    2.2. Cloudera Manager添加Kerberos  

      在此之前,请确保一下前序工作完成:

    • KDC已经安装好并且正在运行
    • 将KDC配置为允许renewable tickets with non-zerolifetime,我们在之前修改kdc.conf文件的时候已经添加了max_life和max_renewable_life这2个属性,前者表示服务端允许的Service ticket最大生命周期,后者表示服务端允许的Service ticket更新周期。这2个属性必须分别大于等于客户端对应的配置ticket_lifetime和renew_lifetime。我们假设,不这样进行配置:ticket_lifetime=8d,max_life=7d,renew_lifetime=25h, max_renew_life=24h,那么可能造成的结果就是当service持有的票据超过24小时没有更新,在第24.5小时的时候去进行更新,请求会遭到拒绝,报错:Ticket expired while renewing credentials,永远无法进行正常更新。对于Cloudera来说,因为更新机制被透明(Cloudera有renew进程会去定期更新),即使我们手动使用modprinc -maxrenewlife 1 week krbtgt/DOMAIN.COM@DOMAIN.COM进行更新,也无济于事。
    • 在Clouder Manager Server上安装openldap-clients
    • 为Cloudera Manager 创建了超级管理员principal,使其能够有权限在KDC中创建其他的principals,如上面创建的cloudera-scm;

      再次确认完毕后进入如下步骤:

    2.2.1. 启动Kerberos

      

    2.2.2. 确认完成后启用Kerbero前的准备

    2.2.3. KDC信息

       要注意的是:这里的Kerberos Encryption Types必须跟KDC实际支持的加密类型匹配(即kdc.conf中的值)

    2.2.4.KDB5信息

    2.2.5. KDC Account Manager

    2.2.6. 导入KDC Account Manager凭据

    2.2.7. Kerberos Principals

       如下为,CDH为各个组件自动生成的principals:

      

    2.2.8. Set HDFS Port

    2.2.9. 重启服务

       之后Cloudera Manager会自动重启集群服务,启动之后会提示Kerberos已启用。在Cloudera Manager上启用Kerberos的过程中,会自动做以下的事情:

    • 集群中有多少个节点,每个账号就会生成对应个数的principal;
    • 为每个对应的principal创建keytab;  
    • 部署keytab文件到指定的节点中;
    • 在每个服务的配置文件中加入有关kerberos的配置;

      启用之后访问集群的所有资源都需要使用相应的账号来访问,否则会无法通过Kerberos的authentication。对于HDFS,Yarn,需要开启Web Console的认证,以防未认证用户访问资源界面。

    2.2.10. 开启HTTP Web认证

       HDFS开启HTTP Web:

       Yarn开启HTTP Web

       HBase 开启REST认证

    2.3. Cloudera Manager禁用Kerberos

    2.3.1. 停止整个hadoop集群

      在CDH界面停止整个集群

    2.3.2. 修改相关组件参数

    • Zookeeper:
      • 取消勾选enableSecurity

                     

    • HDFS:
      • hadoop.security.authentication设置为:Simple
      • hadoop.security.authorization取消勾选(FALSE)

           

      • dfs.datanode.address from 1004(for Kerberos)修改为50010(default)
      • dfs.datanode.http.address from 1006(for Kerberos)修改为50075(default)

          

      • Data Directory Permissions from 700 修改为755

          

    • HBase:
      • hbase.security.authentication设置为:Simple
      • hbase.security.authorization取消勾选(FALSE)

            

    • Hue:
      • Kerberos Ticket Renewer删除或停止role 

    2.3.3. 删除相应的ZNode目录

      当CDH部署Kerberos后,zookeeper里面的节点目录hbase、kafka、hdfs会带有权限;而当CDH去掉Kerberos后,这些目录仍然有权限,需要先删除再重新创建。

      1. 在CDH界面打开zookeeper的配置,搜索java关键字:

      2. 添加-Dzookeeper.skipACL=yes配置,关闭zookeeper的权限检查配置项:

        

      3. 重启zookeeper服务

      4. 登录zookeeper shell:zkCli.sh -server ip:port 

      5. 删除HBase znode:rmr /hbase

      6. 删除RM znode:rmr /rmstore/ZKRMStateRoot

      7. 删除zkfc znode:rmr /hadoop-ha/nameservice-test1

      8. 删除kafka znode:rmr /kafka

      9. 删除-Dzookeeper.skipACL=yes配置项

      10. 重启zookeeper及相应服务

    3. Hadoop集成Kerberos  

      上面2节点是CDH集成hadoop,会自动配置hadoop相关的kerberos配置,如果不依赖CDH的话,我们也需要了解HDFS与Kerberos方面的相关配置。

    3.1. 创建kerberos用户和keytab  

      在kerberos数据库中增加hadoop、HTTP两个用户。各个hadoop组件都使用这两个用户访问kerberos。

    kadmin.local -q "addprinc -randkey hadoop/cdh1@EXAMPLE.COM"
    kadmin.local -q "addprinc -randkey hadoop/cdh2@EXAMPLE.COM"
    kadmin.local -q "addprinc -randkey hadoop/cdh3@EXAMPLE.COM"
    
    kadmin.local -q "addprinc -randkey HTTP/cdh1@EXAMPLE.COM"
    kadmin.local -q "addprinc -randkey HTTP/cdh2@EXAMPLE.COM"
    kadmin.local -q "addprinc -randkey HTTP/cdh3@EXAMPLE.COM"

       为hdfs和HTTP两个用户创建keytab,这里HTTP只能大写,不能小写

    cd /opt/hadoop/etc/
    kadmin.local -q "xst -k hadoop.keytab hadoop/cdh1@EXAMPLE.COM"
    kadmin.local -q "xst -k hadoop.keytab hadoop/cdh2@EXAMPLE.COM"
    kadmin.local -q "xst -k hadoop.keytab hadoop/cdh3@EXAMPLE.COM"
    
    kadmin.local -q "xst -k hadoop.keytab HTTP/cdh1@EXAMPLE.COM"
    kadmin.local -q "xst -k hadoop.keytab HTTP/cdh2@EXAMPLE.COM"
    kadmin.local -q "xst -k hadoop.keytab HTTP/cdh3@EXAMPLE.COM"

      测试keytab是否可用:

    kinit -kt /opt/hadoop/etc/hadoop.keytab hadoop/cdh1
    klist

    3.2. 为HADOOP添加认证

       core-site.xml添加的配置内容为:

    <property>
        <name>hadoop.security.authorization</name>
        <value>true</value>
    </property>
    <property>
        <name>hadoop.security.authentication</name>
        <value>kerberos</value>
    </property>

      

      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>hadoop/_HOST@EXAMPLE.COM</value>
    </property>
    <property>
        <name>dfs.namenode.keytab.file</name>
        <value>/opt/hadoop/etc/hadoop.keytab</value>
    </property>
    <property>
    <name>dfs.namenode.kerberos.internal.spnego.principal</name>
        <value>HTTP/_HOST@EXAMPLE.COM</value>
    </property>
    
    <!-- DataNode Kerberos Config -->
    <property>
        <name>dfs.datanode.kerberos.principal</name>
        <value>hadoop/_HOST@EXAMPLE.COM</value>
    </property>
    <property>
        <name>dfs.datanode.keytab.file</name>
        <value>/opt/hadoop/etc/hadoop.keytab</value>
    </property>
    <property>
        <name>dfs.datanode.address</name>
        <value>0.0.0.0:1004</value>
    </property>
    <property>
        <name>dfs.datanode.http.address</name>
        <value>0.0.0.0:1006</value>
    </property>
    
    <!-- Journalnode Kerberos Config -->
    <property>
        <name>dfs.journalnode.kerberos.principal</name>
        <value>hadoop/_HOST@EXAMPLE.COM</value>
    </property>
    <property>
        <name>dfs.journalnode.keytab.file</name>
        <value>/opt/hadoop/etc/hadoop.keytab</value>
    </property>
    <property>
    <name>dfs.journalnode.kerberos.internal.spnego.principal</name>
        <value>HTTP/_HOST@EXAMPLE.COM</value>
    </property>
    
    <!-- 配置WebHDFS安全 -->
    <property>
      <name>dfs.webhdfs.enabled</name>
      <value>true</value>
    </property>
    <property>
        <name>dfs.web.authentication.kerberos.principal</name>
        <value>HTTP/_HOST@EXAMPLE.COM</value>
    </property>
    <property>
        <name>dfs.web.authentication.kerberos.keytab</name>
        <value>/opt/hadoop/etc/hadoop.keytab</value>
    </property>

      

      yarn-site.xml添加的配置内容为:

    <!--配置resourcemanager kerberos config-->
    <property>
      <name>yarn.resourcemanager.principal</name>
      <value>hadoop/_HOST@EXAMPLE.COM</value>
    </property>
    <property>
      <name>yarn.resourcemanager.keytab</name>
      <value>/opt/hadoop/etc/hadoop.keytab</value>
    </property>
    
    <!--配置nodemanager kerberos config-->
    <property>
      <name>yarn.nodemanager.principal</name>
      <value>hadoop/_HOST@EXAMPLE.COM</value>
    </property>
    <property>
      <name>yarn.nodemanager.keytab</name>
      <value>/opt/hadoop/etc/hadoop.keytab</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.spnego-principal</name>
        <value>HTTP/_HOST@EXAMPLE.COM</value>
    </property>
    
    <property>
      <name>yarn.nodemanager.container-executor.class</name>
    <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
    </property>
    <property>
      <name>yarn.nodemanager.linux-container-executor.group</name>
      <value>hadoop</value>
    </property>

      

      mapred-site.xml添加的配置内容为:

    <property>
      <name>mapreduce.jobhistory.keytab</name>
      <value>/opt/hadoop/etc/hadoop.keytab</value>
    </property>
    <property>
      <name>mapreduce.jobhistory.principal</name>
      <value>hdfs/_HOST@EXAMPLE.COM</value>
    </property>

      当开启Kerberos认证时,core-site.xml还需要添加各个组件的代理用户,不然所有用户都没权限访问,配置内容为:

    <!--hadoop user-->
    <property>
        <name>hadoop.proxyuser.hadoop.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.hadoop.groups</name>
        <value>*</value>
    </property>
    
    <!--root user-->
    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>
    
    <!--HTTP user-->
    <property>
        <name>hadoop.proxyuser.HTTP.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.HTTP.groups</name>
        <value>*</value>
    </property>

    3.3. 测试

    • 首先,使用hadoop用户kinit进行kerberos登录
    kinit -kt /opt/hadoop/etc/hadoop.keytab hadoop@EXAMPLE.COM
    klist
    • 然后,使用hadoop fs -ls /命令或者yarn application -list命令等
    hadoop fs -ls /
    yarn application -list

    4. Hive集成Kerberos

    4.1. 为HIVE添加认证

      hive-site.xml添加的配置内容为:

    <property>
        <name>hive.server2.authentication</name>
        <value>KERBEROS</value>
    </property>
    
    <property>
       <name>hive.server2.authentication.kerberos.principal</name>
        <value>hadoop/_HOST@CHEYO.NET</value>
    </property>
    <property>
        <name>hive.server2.authentication.kerberos.keytab</name>
        <value>/opt/hadoop/etc/hadoop.keytab</value>
    </property>
    
    <property>
        <name>hive.metastore.kerberos.principal</name>
        <value>hadoop/_HOST@CHEYO.NET</value>
    </property>
    <property>
        <name>hive.metastore.kerberos.keytab.file</name>
        <value>/opt/hadoop/etc/hadoop.keytab</value>
        <description>The path to the Kerberos Keytab file containing the
        metastore thrift server's service principal.</description>
    </property>

      core-site.xml还需要添加hive组件的代理用户,配置内容为:

    <!-- hive user -->
    <property>
        <name>hadoop.proxyuser.hive.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.hive.groups</name>
        <value>*</value>
    </property>

    4.2. HIVE的beeline连接

      启动hiveserver2后,使用beeline客户端连接

    • 首先,使用hadoop用户kinit进行kerberos登录
    kinit -kt /opt/hadoop/etc/hadoop.keytab hadoop@EXAMPLE.COM
    klist
    • 然后,beeline使用如下方式连接,注意:-u 后面的参数需加双引号,hadoop/cdh1为hiveserver2所在的节点
    beeline -u "jdbc:hive2://cdh1:10000/default;principal=hadoop/cdh1@EXAMPLE.COM"

      或者

    beeline
    > !connect jdbc:hive2://cdh1:10000/default;principal=hadoop/cdh1@EXAMPLE.COM
    用户名密码不输入,直接回车

    5. HBase集成Kerberos

    5.1. 为HBase添加认证

       hbase-site.xml添加的配置内容为:

    <property>
        <name>hbase.security.authentication</name>
        <value>kerberos</value>
    </property>
    
    <!--master-->
    <property>
        <name>hbase.master.kerberos.principal</name>
        <value>hadoop/_HOST@EXAMPLE.COM</value>
    </property>
    <property>
        <name>hbase.master.keytab.file</name>
        <value>/opt/hadoop/etc/hadoop.keytab</value>
    </property>
    
    <!--regionserver-->
    <property>
        <name>hbase.regionserver.kerberos.principal</name>
        <value>hadoop/_HOST@EXAMPLE.COM</value>
    </property>
    <property>
        <name>hbase.regionserver.keytab.file</name>
        <value>/opt/hadoop/etc/hadoop.keytab</value>
    </property>
    
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
     <property>
        <name>hbase.coprocessor.master.classes</name>
        <value>org.apache.hadoop.hbase.security.access.AccessController</value>
      </property>
    <property>
        <name>hbase.coprocessor.region.classes</name>
        <value>org.apache.hadoop.hbase.security.token.TokenProvider,
        org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint,
        org.apache.hadoop.hbase.security.access.AccessController</value>
    </property>

      core-site.xml还需要添加hbase组件的代理用户hadoop,配置内容为:

    <!--hadoop user-->
    <property>
        <name>hadoop.proxyuser.hadoop.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.hadoop.groups</name>
        <value>*</value>
    </property>

    【参考资料】

     https://blog.csdn.net/u011026329/article/details/79167884 Cloudera Manager5.11.1 集成Kerberos

    https://www.jianshu.com/p/dd7b04b49c18 CDH禁用Kerberos

    http://blog.cheyo.net/222.html Hadoop配置Kerberos认证(2.7.1)

    https://www.cnblogs.com/yjt1993/p/11769515.html hdfs、yarn集成kerberos

  • 相关阅读:
    SSH和SSL比较
    SSL虚拟主机安全方案
    https在电子邮件安全解决方案
    centos tomcat安装
    laravel 添加第三方扩展库
    laravel-1 安装.配置
    centos7.0 vsftp配置
    centos 日常操作指令
    centos redis 安装
    centos php 扩展安装
  • 原文地址:https://www.cnblogs.com/swordfall/p/13301097.html
Copyright © 2011-2022 走看看