【kerberos】hadoop集群使用keytab认证的逻辑

一、背景:

haoop的kerberos认证核心是org.apache.hadoop.security.UserGroupInformation类。
UserGroupInformation一般有两种:(1)apache原生的(2)cdh hdp改良过的,即cloudera改良过的。
由此衍生出两个验证方法。
kerberos是有MIT研发出来的,mit也为kerberos开发了客户端。

MIT官网为kerberos规定的常用环境变量有如下:

KRB5CCNAME
Default name for the credentials cache file, in the form TYPE:residual. The type of the default cache may determine the availability of a cache collection. FILE is not a collection type; KEYRING, DIR, and KCM are.
If not set, the value of default_ccache_name from configuration files (see KRB5_CONFIG) will be used. If that is also not set, the default type is FILE, and the residual is the path /tmp/krb5cc_uid, where uid is the decimal user ID of the user.

KRB5_KTNAME
Specifies the location of the default keytab file, in the form TYPE:residual. If no type is present, the FILE type is assumed and residual is the pathname of the keytab file. If unset, DEFKTNAME will be used.

KRB5_CONFIG
Specifies the location of the Kerberos configuration file. The default is SYSCONFDIR/krb5.conf. Multiple filenames can be specified, separated by a colon; all files which are present will be read.

KRB5_KDC_PROFILE
Specifies the location of the KDC configuration file, which contains additional configuration directives for the Key Distribution Center daemon and associated programs. The default is LOCALSTATEDIR/krb5kdc/kdc.conf.

KRB5RCACHENAME
(New in release 1.18) Specifies the location of the default replay cache, in the form type:residual. The file2 type with a pathname residual specifies a replay cache file in the version-2 format in the specified location. The none type (residual is ignored) disables the replay cache. The dfl type (residual is ignored) indicates the default, which uses a file2 replay cache in a temporary directory. The default is dfl:.

KRB5RCACHETYPE
Specifies the type of the default replay cache, if KRB5RCACHENAME is unspecified. No residual can be specified, so none and dfl are the only useful types.

KRB5RCACHEDIR
Specifies the directory used by the dfl replay cache type. The default is the value of the TMPDIR environment variable, or /var/tmp if TMPDIR is not set.

KRB5_TRACE
Specifies a filename to write trace log output to. Trace logs can help illuminate decisions made internally by the Kerberos libraries. For example, env KRB5_TRACE=/dev/stderr kinit would send tracing information for kinit to /dev/stderr. The default is not to write trace log output anywhere.

KRB5_CLIENT_KTNAME
Default client keytab file name. If unset, DEFCKTNAME will be used).

KPROP_PORT
kprop port to use. Defaults to 754.

GSS_MECH_CONFIG
Specifies a filename containing GSSAPI mechanism module configuration. The default is to read SYSCONFDIR/gss/mech and files with a .conf suffix within the directory SYSCONFDIR/gss/mech.d.

以上环境变量常用的有
KRB5_CONFIG :krb5.conf或krb5.ini文件路径
KRB5CCNAME:kerberos cache文件路径(注:此文件可由MIT kerberos客户端生成)

二、具体认证步骤

1、krb5.conf信息配置

注意:UserGroupInformation中设置KRB5_CONFIG是没有用的,必须要设置java.security.krb5.conf

如下方法都可以:
(1)项目启动指定java vm变量:-Djava.security.krb5.conf=D:/xxx/xxx/krb5.conf
(2)程序中指定:System.setProperty("java.security.krb5.conf", "D:/xxx/xxx/krb5.conf")

如果不指定程序会找不到kdc,报异常,如下:

org.apache.hadoop.security.KerberosAuthException: failure to login: for principal: xxx@HADOOP.COM from keytab D:\xxx\xxx\xxx.keytab javax.security.auth.login.LoginException: null (68)
Caused by: javax.security.auth.login.LoginException: null (68)
Caused by: KrbException: null (68) 
Caused by: KrbException: Identifier doesn't match expected value (906)

2、hadoop conf信息配置

Hadoop configuration配置(类org.apache.hadoop.conf.Configuration
文档中明确了:会默认加载类路径下的core-default.xml文件内容。

Unless explicitly turned off, Hadoop by default specifies two resources, loaded in-order from the classpath:
core-default.xml: Read-only defaults for hadoop.
core-site.xml: Site-specific configuration for a given hadoop installation.

core-default.xml中含有hadoop的安全配置hadoop.security.authentication,在UserGroupInformation中依据此项配置,查询集群是否启动kerberos。
HADOOP_SECURITY_AUTHENTICATION路径如下:
org.apache.hadoop.fs.CommonConfigurationKeysPublic#HADOOP_SECURITY_AUTHENTICATION

  public static AuthenticationMethod getAuthenticationMethod(Configuration conf) {String value = conf.get(HADOOP_SECURITY_AUTHENTICATION, "simple");try {return Enum.valueOf(AuthenticationMethod.class,StringUtils.toUpperCase(value));} catch (IllegalArgumentException iae) {throw new IllegalArgumentException("Invalid attribute value for " +HADOOP_SECURITY_AUTHENTICATION + " of " + value);}}

所以如果在环境变量中配置了HADOOP_HOME或者HADOOP_CONF_DIR对于UserGroupInformation是没有用的。
必须将core-site.xml放在类路径下,或者直接调用org.apache.hadoop.security.UserGroupInformation#setConfiguration设置加载过core-site.xml的conf对象。

3、UserGroupInformation认证

3.1 、apache原生的UserGroupInformation验证:

UserGroupInformation类中使用静态变量存放hadoop conf和已认证用户信息,所以只需要程序中认证一次,不同类不需要传递认证的user,只需要都到UserGroupInformation取即可。

    private static Configuration conf;private static UserGroupInformation loginUser = null;private static String keytabPrincipal = null;private static String keytabFile = null;

调用org.apache.hadoop.security.UserGroupInformation#loginUserFromKeytab传入principal和keytab就可以完成认证。

3.2、cloudera改良过的UserGroupInformation验证:

当然,可以调用原生的loginUserFromKeytab也可以。

改良内容就是通过配置环境变量的方法,隐性完成kerberos用户认证。无需UserGroupInformation认证,在调用getLoginUser可以自动完成认证。
具体过程如下:
org.apache.hadoop.security.UserGroupInformation#getLoginUser方法获取用户

  public static UserGroupInformation getLoginUser() throws IOException {...if (loginUser == null) {UserGroupInformation newLoginUser = createLoginUser(null);... }}

实际是调用了doSubjectLogin(null, null)

  UserGroupInformation createLoginUser(Subject subject) throws IOException {UserGroupInformation realUser = doSubjectLogin(subject, null);...}

如下代码subject == null && params == null判断true

 private static UserGroupInformation doSubjectLogin(Subject subject, LoginParams params) throws IOException {ensureInitialized();// initial default login.if (subject == null && params == null) {params = LoginParams.getDefaults();}HadoopConfiguration loginConf = new HadoopConfiguration(params);try {HadoopLoginContext login = newLoginContext(authenticationMethod.getLoginAppName(), subject, loginConf);login.login();
...}

获取环境变量:KRB5PRINCIPALKRB5KEYTABKRB5CCNAME

  private static class LoginParams extends EnumMap<LoginParam,String>implements Parameters {...static LoginParams getDefaults() {LoginParams params = new LoginParams();params.put(LoginParam.PRINCIPAL, System.getenv("KRB5PRINCIPAL"));params.put(LoginParam.KEYTAB, System.getenv("KRB5KEYTAB"));params.put(LoginParam.CCACHE, System.getenv("KRB5CCNAME"));return params;}}

结果是利用环境变量设置的pricipal+keytab或者cache认证。
环境变量配置:
(1)每个程序单独配置:
-DKRB5PRINCIPAL=xxx -DKRB5KEYTAB=xxx 或者 -DKRB5CCNAME=xxx

(2)系统环境默认配置:
win环境如下:
在这里插入图片描述linux环境下/etc/profile添加:
export KRB5PRINCIPAL=xxx -DKRB5KEYTAB=xxx或者export KRB5CCNAME=xxx

完成以上配置就认证成功了,如下info日志信息:

2024-03-08 17:28:11 [org.apache.hadoop.security.UserGroupInformation] INFO : Login successful for user xxx@HADOOP.COM using keytab file D:\xxx\xxx.keytab

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/521968.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openJDK17官方镜像报Error loading shared library libfreetype.so

新项目使用openJDK17做的&#xff0c;做完后打包成docker镜像到服务器上运行 docker镜像基础镜像用的是openjdk:17-jdk-alpine 运行后加载验证码的时候报&#xff1a;Error loading shared library libfreetype.so 搜了一圈没找到哪里有共用的带字体库的jdk17镜像&#xff0…

idea2023和历史版本的下载

1.idea中文官网 idea官网历史版本下载(https://www.jetbrains.com.cn/idea/download/other.html)

kafka报文模拟工具的使用

日常项目中经常会碰到消费kafka某个topic的数据&#xff0c;如果知道报文格式&#xff0c;即可使用工具去模拟发送报文&#xff0c;以此测试代码中是否能正常消费到这个数据。 工具资源已上传&#xff0c;可直接访问连接下载&#xff1a;https://download.csdn.net/download/w…

光谱下的养殖业:数据可视化的现代变革

在数字化时代&#xff0c;数据可视化在养殖业中崭露头角&#xff0c;为这一传统行业注入了新的活力。无论是家禽养殖还是水产养殖&#xff0c;数据可视化都以其直观、高效的特点&#xff0c;为养殖业带来了全新的发展机遇。下面我就以可视化从业者的角度&#xff0c;简单聊聊这…

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(二)

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验&#xff08;前导&#xff09; Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验&#xff08;一&#xff09; Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验&#xff08;三&#xff09; 五、实验目的 本次实验使用电脑上的…

IPSEC VPN安全介绍以及相关实验

目录 一、IPSEC相关的安全服务 二、IPSEC的安全协议 三、实验 IPSEC一组协议集合&#xff0c;用于确保在IP网络上进行通信时的安全性和保密性。它提供了一种标准化的方法&#xff0c;用于对IP数据包进行加密、身份验证和完整性保护。IPSEC通常用于建立虚拟私人网络VPN连接&am…

通俗易懂讲解Redis的哨兵模式

redis的哨兵模式,就是用于在一主多从的集群环境下,如果主服务器宕机了,它会自动的将从服务器中的一台设为新的master,并且将其余的slave的配置文件自动修改,这样就切换出一套新的主从服务,不需要人工干预,且不会影响服务的使用。 背景 在生产环境中,为了保证redis服务…

nVisual+AI实现综合布线智能化运维管理

传统的综合布线系统依据TIA-606规范在配线架、跳线、面板上都粘贴了标签&#xff0c;标签作为一个综合布线项目中元器件的唯一标识&#xff0c;对综合布线日常运维管理过程中查询连接关系、定位设备位置至关重要&#xff0c;但标签所能记录的信息毕竟有限&#xff0c;因此可视化…

Grafana dashboards as ConfigMaps

文章目录 1. 简介2. 创建 configmaps3. grafana 界面查看 1. 简介 将 Grafana 仪表板存储为 Kubernetes ConfigMap 相比传统的通过 Grafana 界面导入仪表板有以下一些主要优点: 版本控制&#xff1a; ConfigMap 可以存储在版本控制系统(如Git)中,便于跟踪和管理仪表板的变更历…

深度解析Broker的角色与魔法

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 深度解析Broker的角色与魔法 前言Broker的基本概念Kafka Broker 的定义&#xff1a;Kafka Broker 的基本原理&#xff1a;为何 Broker 是 Kafka 消息传递的核心组成部分&#xff1a; 创建于配置Broker…

浅谈碳化硅MOSFET TO-247封装单管引入开尔文管脚必要性

相较于传统的硅MOSFET和硅IGBT 产品&#xff0c;基于宽禁带碳化硅材料设计的碳化硅 MOSFET 具有耐压高、导通电阻低&#xff0c;开关损耗小的特点&#xff0c;可降低器件损耗、减小产品尺寸&#xff0c;从而提升系统效率。而在实际应用中&#xff0c;我们发现&#xff1a;带辅助…

一键转发朋友圈!微信快速营销推广必备法宝!

在这个“得私域者得天下”的互联网时代&#xff0c;如何能够在微信上进行快速、高效的营销推广成为了摆在许多人面前的一道难题。 幸运的是&#xff0c;随着微信管理系统的出现&#xff0c;一键转发朋友圈的快速营销推广法宝已经变得触手可及。 首先&#xff0c;微信管理系统…