Skip to content

Hue

1. 访问hive

问题当前通过Hue的hive插件无法正常访问Hive

解决:没有解决,请使用命令行访问hive

原因:Hue通过HiveServer2的hive.server2.enable.doAs功能获取Hive中的数据,当前平台没有配置HS2的doAs配置。

2. 访问HBase

问题当前通过Hue的HBase插件无法正常访问HBase

解决:没有解决,请使用命令行访问HBase

原因:Hue通过HBase Thrift 服务访问 HBase,此时需要同时配置HBase Thrift的doAs和SSL功能,当前平台没有开启这两个配置。

3. 访问Impala

问题当前通过Hue的Impala插件无法正常访问Impala

解决:已经解决,但是没有和入安装包,请安装完手动配置。

原因:Hue 通过21050端口访问Impalad,配置Kerberos后需要修改下面的配置项才能正常使用Impala的相关功能。在“hue_safety_valve_server.ini 的 Hue Server 高级配置代码段(安全阀)”中添加:

[impala]
server_port=31050

Hue在连接impalad时是通过hue账户连接的,如果需要打开代理功能,那么需要配置 impersonation_enabled=True !但是,impala官方文档中提到使用HUE的代理功能时,需要环境部署Sentry。当前,Impala没有开启权限管理,因此hue可以访问任何表。

4. 访问HDFS文件

Hue访问大部分Hadoop服务时,是通过代理的方式进行的。Hue进行认证的身份永远是hue/_HOST@EXAMPLE.COM。在HDFS中hadoop.proxyuser.hue.hosts和hadoop.proxyuser.hue.groups都配置成了*,这样hue可以模拟任意用户。其他服务,如Oozie、Flume、Hive使用的也是这个原理!!

因此,如果需要在Hue上访问、修改hdfs、idata等用户的文件,那么请在Hue管理员界面中创建同名账号,然后使用该账号登录即可。

Hive

1. 使用Beeline命令行

使用beeline连接Hive时需要注意以下几点:

  • hive.users.in.admin.role需要在HS2和metastore中同时配置,否者不生效。
  • 通过beeline登录后,需要使用set role admin命令获取管理员权限
  • 使用idata登录后,beeline上的任务以hive用户身份提交到root.users.idata队列~~~! 这种情况发发现/data/dataXXX/yarn/nm/usercache/hive的权限可能会不对,但是好像不是必现情况。
  • 初始化安装完需要将HDFS上/user/hive的owner改成hive,不然beeline没法提交Yarn任务。(必现,已经和入安装包)

2. MetaStore 权限管理带来的性能问题

联调过程中发现MetaStore服务引入基于文件系统的权限问题时带来性能问题,导致流处理卡住。当前已经关闭这个功能。

Zookeeper

1. 临时关闭认证

通过-Dzookeeper.skipACL=yes配置在ZK的JVM启动参数中,能够在配置不动的情况下跳过Keberos认证。

2. 如何修改Znode节点权限

Zookeeper添加Znode权限时是覆盖操作,在/solr上添加idata的权限应该像这样,

setAcl /solr sasl:idata:cdrwa,sasl:solr:cdrwa,world:anyone:r [[表示为多个用户添加znode]]节点的权限

Flume

1. 指定hdfs插件的Kerberos配置

hdfs.kerberosPrincipal 配置需要指定全名,使用短名称不行。

2. Flume连接kafka

参考agent中kafka插件需要添加下面三个配置,

tier1.sources.r3.kafka.consumer.security.protocol = SASL_PLAINTEXT
tier1.sources.r3.kafka.consumer.sasl.mechanism = GSSAPI
tier1.sources.r3.kafka.consumer.sasl.kerberos.service.name = kafka

Flume Agent 的 Java 配置选项,添加下面两个配置:

 -Djava.security.krb5.conf=/etc/krb5.conf
 -Djava.security.auth.login.config=/opt/idata_security/etc/jaas.conf

Kafka

1. 创建Kafka Topic

进行创建/修改Topic时,需要刷环境变量 export KAFKA_OPTS="${KAFKA_OPTS} -Djava.security.auth.login.config=/opt/idata_security/kafka/jaas.conf"

这个改环境变量已经和入到平台安装包的/etc/profile.d/idata_security.sh文件中。

2. Spark消费Kafka的topic

使用DataFram直接读写Kafka时,需要在 sasl.mechanism 、sasl.kerberos.service.name、security.protocol、以及sasl.jaas.config这四个配置上加上"kafka."的前缀,否者Spark的DF初始化时会使用通常方式去连接Broker,导致认证失败。(参考:Spark官方文档

3. 使用kafka命令行连接Topic

使用kafka-console-consumer、kafka-console-producer连接topic时请分别加上下面两个配置:

kinit -k idata
kafka-console-producer --producer.config  /opt/idata_security/kafka/client.properties ...
kafka-console-consumer --consumer.config  /opt/idata_security/kafka/client.properties ...

HBase

1. HBase的Client配置

使用 hbase.client.kerberos.principal、hbase.client.keytab.file 可以在 hbase-site.xml 中指定 Client 的Kerberos参数(已经合入到平台安装包)。

2. Spark任务连接HBase

Oozie启动Spark任务时不会主动加载hbase-site.xml文件,导致Spark没有使用Kerberos认证的方式连接hbase。

可以添加以下配置解决:spark-conf/spark-defaults.conf 的 Spark 客户端高级配置代码段(安全阀)

   spark.hadoop.hbase.security.authentication=kerberos
   spark.hadoop.hbase.master.kerberos.principal=hbase/_HOST@IDATA.RUIJIE.COM
   spark.hadoop.hbase.regionserver.kerberos.principal=hbase/_HOST@IDATA.RUIJIE.COM
   spark.hadoop.hbase.zookeeper.quorum=bdnode3,bdnode4,bdnode5

idata应用在spark任务中没有通过hbase-site.xml来加载hbase配置的,可以在application.conf中添加下面的配置。!

hbase_security_authentication = kerberos
hbase_master_kerberos_principal = "hbase/_HOST@IDATA.RUIJIE.COM"
hbase_regionserver_kerberos_principal = "hbase/_HOST@IDATA.RUIJIE.COM"
hbase_client_kerberos_principal = "idata@IDATA.RUIJIE.COM"
hbase_client_keytab_file = "/etc/krb5.keytab"

Hadoop

1. Yarn无法终止Spark任务

安全模式时通过Cloudera、Hue无法杀死Yarn上的任务,需要通过yarn application -kill {app_id}在后台杀死Spark任务。

2. 在代码中切换认证HDFS的Kerberos用户

配置了代理配置后,可以使用doAs方式进行用户切换,如从idata临时切换到hdfs进行一些特权操作。

只使用proxy前,需求配置以下参数:

hadoop.proxyuser.idata.hosts: *
hadoop.proxyuser.idata.groups:*

示例代码

package com.ruijie.idata.demo.security;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.security.UserGroupInformation;
import java.io.IOException;
import java.security.PrivilegedExceptionAction;

public class HDFS_SUPER {
​    public static void main(String[] args) throws InterruptedException {
​        final Configuration conf = new Configuration();
​        conf.addResource(new Path("/etc/hadoop/conf/hdfs-site.xml"));
​        conf.addResource(new Path("/etc/hadoop/conf/core-site.xml"));

​        // 使用Idata用户登入

​        KrbLoginDemo.krbLogin4Hadoop(conf, "idata", KrbLoginDemo.default_keytab);
​        try {
​            // 以idata用户的身份代理,hdfs进行操作 -- 成功

​            UserGroupInformation ugi_proxy_hdfs = UserGroupInformation.createProxyUser("hdfs", UserGroupInformation.getCurrentUser());
​            ugi_proxy_hdfs.doAs(new PrivilegedExceptionAction<Void>() {
​                public Void run() throws Exception {
​                    DistributedFileSystem fs_hdfs = (DistributedFileSystem) FileSystem.get(conf);
​                    datanode_usage(fs_hdfs);
​                    return null;
​                }
​            });

​            // idata用户的身份来操作 -- 失败
​            System.out.println(UserGroupInformation.getCurrentUser());
​            DistributedFileSystem fs_idata = (DistributedFileSystem) FileSystem.get(conf);
​            datanode_usage(fs_idata);
​        } catch (IOException e) {
​            e.printStackTrace();
​        }
​    }

​    public static void datanode_usage(DistributedFileSystem fs) {
​        try {
​            System.out.println(UserGroupInformation.getCurrentUser());
​            for (DatanodeInfo datanodeInfo : fs.getDataNodeStats()) {
​                System.out.println(datanodeInfo.getDfsUsedPercent());
​            }
​        } catch (IOException e) {
​            e.printStackTrace();
​        }
​    }
}

Oozie

1. 提交Oozie任务用户不争取

默认情况下,Oozie优先使用 ${home}/.oozie-auth-token 缓存中票据。如果用户先使用HDFS等blacklist中的用户生成了该文件,会导致后续提交的任务的用户缓存文件中的用户,进而导致提交任务失败。

Kerberos

1. 主机名对Kerberos的影响

当在/etc/hosts中为一个ip指定多个域名时,域名的顺序会影响ZK、Impala等服务的认证。如果别名先定义会导致认证失败。

以下方式配置/etc/hosts时会导致Kerberos认证失败

## Case 1
172.29.32.61   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.29.32.61 bdnode1

## Case 2
172.29.32.64         mysqlVirtualHost
172.29.32.61           realhost
172.29.32.64         nginxVirtualHost
172.29.32.61         nginxRealHost1
172.29.32.62         nginxRealHost2

172.29.32.61 bdnode1
172.29.32.62 bdnode2
172.29.32.63 bdnode3
172.29.32.64 cdh.vip

以下方式配置/etc/hosts时不影响Kerberos

172.29.32.61 bdnode1
172.29.32.62 bdnode2
172.29.32.63 bdnode3
172.29.32.64 cdh.vip

172.29.32.64         mysqlVirtualHost
172.29.32.61           realhost
172.29.32.64         nginxVirtualHost
172.29.32.61         nginxRealHost1
172.29.32.62         nginxRealHost2

2. Kerberos的票据有效期

Kerberos ticket具有lifetime,超过此时间则ticket就会过期,需要重新申请或renew。

ticket lifetime取决于以下5项设置中的最小值:

  • Kerberos server上/var/kerberos/krb5kdc/kdc.conf中max_life
  • 内置principal krbtgt的maximum ticket life,可在kadmin命令行下用getprinc命令查看
  • principal的maximum ticket life,可在kadmin命令行下用getprinc命令查看
  • Kerberos client上/etc/krb5.conf的ticket_lifetime
  • kinit -l 参数后面指定的时间

ticket过期后,如果想延长,一种方法是重新申请(需要输入密码),另一种是renew(不需要输入密码),每renew一次,就延长一个lifetime。不过renew操作本身也有lifetime,即在ticket renew lifetime,在此lifetime之内,才能进行renew操作。与上面的很相似,ticket renew lifetime取决于以下5项设置中的最小值:

  • Kerberos server上/var/kerberos/krb5kdc/kdc.conf中max_renewable_life
  • 内置principal krbtgt的maximum renewable life,可在kadmin命令行下用getprinc命令查看
  • principal的maximum renewable life,可在kadmin命令行下用getprinc命令查看
  • Kerberos client上/etc/krb5.conf的renew_lifetime
  • kinit -r 参数后面指定的时间

解決TGT超期的注意事項

  • 不使用cache,配置删除ticketCache配置,useTicketCache=false,renewTGT=fasle
  • Zookeeper的client不会读取ticketCache指定的cache地址,需要直接使用KRB5CCNAME的地址。
  • 可以用 kinit -k idata -c /tmp/idata_krbcc 生成缓存文件。默认情况下,kinit如果不带-c,且没有指定KRB5CCNAME,默认存储读取的Cache为/tmp/krb5cc_{uid},否则为环境变量指定的值。

3. 卸载过程中多人操作导致的一些问题

由于同一个节点中多个用户反复执行kinit会导致bash环境变量中的Kerberos用户切换,影响一些正在运行的脚本。因此请卸载、安装服务时,最好避免多个人同时操作节点1.

其他問題

1. 重新生成服务票据

  • 重新生成服务票据如果失败,请检查节点1的kadmin服务是不是挂了
  • 重新生成服务票据后,LDAP服务有可能需要时间同步,导致部分服务启动时认证失败,等一会就好了