Hadoop安全认证(2)
凭证过期处理策略
在最早的 Security features for Hadoop 设计中提出这样的假设:
A Hadoop job will run no longer than 7 days (configurable) on a MapReduce cluster or accessing HDFS from the job will fail.
对于一般的任务, 24小时甚至延迟到一周的凭证时限是足够充分的。所以大部分时间我们只需要在执行操作之前使用 kinit 认证一遍,再起后台任务进行周期性凭证更新即可。
while true ; do kinit -R; sleep $((3600 * 6)) ; done &
不过对于需要常驻的访问Hadoop集群的服务来说,上述假设就不成立了。这时候我们可以
扩大
ticket_lifetime
和renew_lifetime
时限
扩大凭证存活时限可以解决此问题,但由于Kerberos跟我们线上用户登陆认证绑定,会带来安全隐患,故不方便修改。定期重新进行kinit 认证更新凭证
不仅仅是定期延长认证时间,可以直接定期重新认证以延长凭证有限期限。一般我们需要导出 keytab 来进行定期认证的操作。
Hadoop 将 Kerberos 认证部分进行了一定的封装,实际上并不需要那么复杂, 这里重点可以看看 UserGroupInformation
这个类。
UserGroupInformation
UserGroupInformation
这个类在 JAAS 框架上封装了 Hadoop 的用户信息, 更确切地说是对 Subject 做了一层封装。
UserGroupInformation(Subject subject) {this.subject = subject;this.user = subject.getPrincipals(User.class).iterator().next();this.isKeytab = !subject.getPrivateCredentials(KerberosKey.class).isEmpty();this.isKrbTkt = !subject.getPrivateCredentials(KerberosTicket.class).isEmpty();}
JAAS 是 Java 认证和授权服务(Java Authentication and Authorization Service)的缩写, 主要包含以下几个实体:
- Subject
Subject 是一个不可继承的实体类,它标志一个请求的来源, 包含相关的凭证标识(Principal) 和 公开和私有的凭据(Credential)。 - Principal
凭证标识,认证成功后,一个 Subject 可以被关联多个Principal。 - Credential
凭据,有公有凭据以及私有凭据。
JAAS的认证过程如下:
- An application instantiates a LoginContext.
- The LoginContext consults a Configuration to load all of the LoginModules configured for that application.
- The application invokes the LoginContext's login method.
- The login method invokes all of the loaded LoginModules. Each LoginModule attempts to authenticate the subject. Upon success, LoginModules associate relevant Principals and credentials with a Subject object that represents the subject being authenticated.
- The LoginContext returns the authentication status to the application.
- If authentication succeeded, the application retrieves the Subject from the LoginContext.
需要认证的代码片段可以包装在 doPrivileged 当中, 可以直接使用 Subject.doAs
方法,支持嵌套。
在安全模式下,UGI 支持不同LoginContext 配置, 均是通过 HadoopConfiguration 类动态产生:
- hadoop-user-kerberos
使用kerberos缓存凭证登陆的配置,useTicketCache
置为 true. - hadoop-keytab-kerberos
使用keytab登陆的配置,useKeyTab
置为 true.
UGI 当中有多处认证, getLoginUser 方法使用 hadoop-user-kerberos
配置认证:
- 通过配置生成 LoginContext
- 调用 LoginContext.login 方法完成登陆, 通过 ticket cache 中凭证完成登陆
- 判断是否需要其他用户身份(proxy user)执行
- 将
HADOOP_TOKEN_FILE_LOCATION
中的 token 加入 Credentials 集合当中 - 另起一个线程做周期性的凭证更新
spawnAutoRenewalThreadForUserCreds
步骤5可以看出当我们存在凭证后并不需要主动做周期性地凭证更新。
而 loginUserFromKeytab 方法使用 hadoop-kerberos
配置认证:
- 通过配置生成 LoginContext
- 调用 LoginContext.login 方法完成登陆, 使用keytab完成登陆
loginUserFromKeytab 没有对凭证做周期的更新, 那怎么保证凭证不会过期呢?
- 在访问集群执行相关操作前, 可以调用
checkTGTAndReloginFromKeytab
来尝试更新凭证(实际上是重新登陆了) - 在凭证过期时,创建 IPC 失败会触发调用
reloginFromKeytab
来重新登陆
Client.java
private synchronized void handleSaslConnectionFailure(final int currRetries, final int maxRetries, final Exception ex,final Random rand, final UserGroupInformation ugi) throws IOException,InterruptedException {ugi.doAs(new PrivilegedExceptionAction<Object>() {@Overridepublic Object run() throws IOException, InterruptedException {final short MAX_BACKOFF = 5000;closeConnection();disposeSasl();if (shouldAuthenticateOverKrb()) {if (currRetries < maxRetries) {if(LOG.isDebugEnabled()) {LOG.debug("Exception encountered while connecting to "+ "the server : " + ex);}// try re-loginif (UserGroupInformation.isLoginKeytabBased()) {UserGroupInformation.getLoginUser().reloginFromKeytab();} else {UserGroupInformation.getLoginUser().reloginFromTicketCache();}
可见如果是使用 keytab 认证的话,认证是长期有效的。
从上述代码中可以看到,不论是否是keytab认证,创建IPC失败均会尝试重新登陆。
基于keytab 的Kerberos认证方式
为了让用户免于记忆密码,我们可以考虑导出并交付keytab给相关用户(前提是用户数量可控, 比如是以虚拟用户为单位)。
这样,用户的Hadoop任务认证方式可以有:
- 直接使用 keytab kinit 之后访问
- 或者调用
loginUserFromKeytab
完成登录,然后将代码片段包裹在 UGI 的doAs
方法当中执行
确定了部署方案之后, 我们在升级 hadoop 版本的同时完成了安全认证的部署。在部署和使用中我们遇到若干问题,这里一一说明。
JCE 部署
开启安全认证时发现 Kerberos 认证不通过:
Client failed to SASL authenticate: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed)]
由于我们部署的Kerberos默认使用 AES-256 加密, 需要在Hadoop环境(集群以及客户端)上安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File, 否则Kerberos认证不通过。可以通过此 gist 验证改动是否生效。此步骤可以添加到puppet当中。
SNN getimage 返回 NPE
开启安全认证发现 SNN 持续由于 getimage 报错NPE 退出, 相关错误如下。
2013-12-29 23:56:19,572 DEBUG org.apache.hadoop.security.authentication.server.AuthenticationFilter: Request [http://XXX.com:50070/getimage?getimage=1&txid=8627&storageInfo=-47:200271
8265:0:CID-3dce02cb-a1c2-4ab8-8b12-f23bbefd7bcc] triggering authentication
2013-12-29 23:56:19,580 WARN org.apache.hadoop.security.authentication.server.AuthenticationFilter: Authentication exception: GSSException: Failure unspecified at GSS-API level (Mechanism level: Specifiedversion of key is not available (44))
org.apache.hadoop.security.authentication.client.AuthenticationException: GSSException: Failure unspecified at GSS-API level (Mechanism level: Specified version of key is not available (44))at org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.authenticate(KerberosAuthenticationHandler.java:360)at org.apache.hadoop.security.authentication.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:349)
根据报错信息 Specified version of key is not available
发现是由于同一个 HTTP 凭证被导出多遍导致之前的keytab中的凭证失效了,重新生成部署所需的 keytab 即可。
这里的提醒就是不要重复导出相同的凭证, 以防止已经分发使用的keytab中的凭证失效。
Balancer 执行过长导致认证过期
在部署安全认证之后, 我们对hdfs数据进行 balance 就需要预先认证一下再执行, 这样就会遇到我们之前说的认证期限的问题。
这里有两种方式可以解决此问题:
- 添加外部定时任务重新认证, 刷新凭证缓存, 延迟凭证有效期限。
- 可以写一个小代码对 balance 的入口
org.apache.hadoop.hdfs.server.balancer.Balancer
进行一点封装,将其封装在一个 doAs 当中, 类似 hue 中的 SudoFsShell 一样的思路
sssd 服务认证异常
sssd 是指我们用于线上登陆认证的一个底层服务,在过去一段时间内经常出现问题退出,导致用户登录动作hang住,进而导致相关任务执行失败。部署Hadoop安全认证之后相关 kerberos 认证也走这个服务,增大了服务异常退出的概率。目前看起来sssd服务问题是由于系统版本过低sssd服务代码有bug导致,解决方案最方便的是升级系统或切换服务到新的机器。
"KDC can't fulfill requested option while renewing credentials"
应用执行日志偶尔会报如下错误:
2014-03-12 21:30:03,593 WARN security.UseGroupInformation (UserGroupInformation.java:run(794)) - Exception encountered while running the renewal command. Aborting renew thread. org.apache.hadoop.util.Shell$ExitCodeException: kinit(v5): KDC can't fulfill requested option while renewing credentials
表示 UGI的凭证更新线程失败退出了。目前HADOOP-10041 记录了此问题,主要原因是由于凭证无法更新导致, 一般不需要特殊处理。
Hadoop安全认证(2)相关推荐
- 聊聊Hadoop安全认证体系:Delegation Token和Block Access Token
前言 本文继续上一篇Hadoop安全认证方面的内容主题,来简单聊聊Hadoop内部的其它认证体系:Delegation Token(授权令牌认证)和Block Access Token(块访问认证). ...
- Hadoop安全认证(1)
前言 在2014年初,我们将线上使用的 Hadoop 1.0 集群切换到 Hadoop 2.2.0 稳定版, 与此同时部署了 Hadoop 的安全认证.本文主要介绍在 Hadoop 2.2.0 上部署 ...
- hadoop相关认证
前言: 关于Hadoop课程及认证证书的事,想着整理一下,可能觉得有用的. 首先我所知道的在做Hadoop认证的有两家,Hortonworks跟Cloudera.因为工作的原因接触Cloudera比较 ...
- Hadoop Kerberos 认证下 Sentry 安装 + Sentry 权限设置使用
目录 一.安装Sentry 1.MariaDB中创建sentry数据库 2.CDH中添加sentry 服务 3.hive配置 启动Sentry 4.Impala配置 启动Sentry 5.Hue配置 ...
- Ronald Van Loon/Greg White带你领略Hadoop/Spark大数据CCA175认证(一)
目录 圣普伦Simplilearn课程概述: 圣普伦的Hadoop/Spark大数据CCA175认证培训课程特点: 上课模式: 预修课程: 适合人群 主要学习成果: 认证考试: 认证条件: 课程设置: ...
- 2022 年 best 大数据认证:康奈尔大学,Intellipaat,SAS, USDI, Cloudera CCA175 Hadoop
对于 IT 专业人士来说,这是一个充满机遇的时代. 目录 为什么要成为认证数据专家? 数字时代的顶级大数据认证 助理大数据分析师 (ABDA) 助理大数据工程师 高级大数据工程师 康奈尔大学 1. 理 ...
- Hadoop安全实践
前言 在2014年初,我们将线上使用的 Hadoop 1.0 集群切换到 Hadoop 2.2.0 稳定版, 与此同时部署了 Hadoop 的安全认证.本文主要介绍在 Hadoop 2.2.0 上部署 ...
- 《精通Hadoop》:第 1 章 Hadoop 2.X
第 1 章 Hadoop 2.X "没有什么是不能通过搜索引擎或互联网找到的." --埃里克·施密特,谷歌执行主席 在大规模.高并行和分布式计算处理这个行业中,Hadoop实际上是 ...
- 什么是Hadoop?大数据与Hadoop简介
要了解什么是Hadoop,我们必须首先了解与大数据和传统处理系统有关的问题.前进,我们将讨论什么是Hadoop,以及Hadoop如何解决与大数据相关的问题.我们还将研究CERN案例研究,以突出使用Ha ...
最新文章
- 【iOS数据持久化】Plist使用
- 二十、 二叉树的同构
- 第三十八期:美国数据隐私保护法案来临,明年1月生效,现仅2%企业合规
- windows API 第13篇 MoveFileEx
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM中的查询
- ((CTRL-CHAR,code 8)) : only regular white space is allowed between tokens
- 如何防止盗号 使用windows自带的 屏幕键盘 OSK
- 每天Leetcode 刷题 初级算法篇-数学问题-计数质数
- ZT: Delphi编程规范1.0.0.0 (yckxzjj )
- CentOS和Ubuntu区别
- windows 软件推荐
- Linux 攻击防护基础排查
- Gerrit搭建与代码下载
- 男孩应该懂的,女孩应该懂的
- Java面试题!5年经验Java程序员面试27天,看看这篇文章吧!
- 基于Matlab的数字图像gui界面设计
- java将多个excel合并为一个
- php移除excel密码,excel保护密码忘记怎么撤销保护工作表
- 计算机打印状态错误,打印机状态错误怎么办 打印机状态错误解决方法【图文】...
- 既是计算机高手,也是情书高手,原来王小波才是最会撩妹的程序员
热门文章
- 没有人觉得B站的搜索很难用吗?— 怎么用Tableau(数据可视化)帮助饭圈女孩磕CP
- ETL数据仓库工程师笔试题和面试题整理
- 使用mysql workbench显示Tables/Views could not be fetched
- 开发和运维的关系,实施和运维的区别
- python蚂蚁森林自动偷能量_蚂蚁森林自动偷能量 激活 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn...
- 2021年中国宽带网速发展状况分析:我国宽带网速增长快速[图]
- Pygame 实现一个简单画图板
- 【Week15作业 B】ZJM与生日礼物【字典树】
- js获取html中图片路径,用js快速的获取html页面中图片的地址
- 美团红包变成了3元红包的原因