以上环境变量常用的有
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();
...
}
获取环境变量:KRB5PRINCIPAL
、KRB5KEYTAB
、KRB5CCNAME
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
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-KPROscE9-1712868873226)]