我正在编写一个pGina插件,用于在登录时从我们的KDC获取AFS令牌和Kerberos TGT,同时写作我注意到kinit的一个"功能"是它不会让你提供任何输入,除非它来自键盘,我想到了只是重定向标准输入...
有人建议使用keytab文件作为主体,这看起来非常简单,直到我意识到我只在linux上使用kutil并且遇到了ktpass.exe的Windows版本的困难.我已经反复尝试使用大量参数组合来创建keytab但到目前为止绝对没有成功,我发出的当前命令是:
ktpass /out key.tab /mapuser user$@MERP.EDU /princ user.merp.edu@MERP.EDU /crypto RC4-HMAC-NT /ptype KRB5_NT_PRINCIPAL /pass mahpasswordlol /target MERP.EDU
不幸的是,这些产出都是
Using legacy password setting method
FAIL: ldap_bind_s failed: 0x31
根据我的研究,根据我的研究是认证/加密问题,我已经尝试了其他DES设置,但这似乎也没有用......任何人都有任何经验/想法如何这可能工作?
我在Linux系统上使用keytab文件来验证使用kerberos的服务.我想知道这个密码是如何实际存储到该keytab文件中的.正如我们在/ etc/passwd中所知,密码是在应用单向散列方法后存储的 - 因此无法从中计算明文密码.
但是如何在keytab文件中完成?使用keytab的进程必须知道密码才能验证用户?!它是否使用主密码加密,因此可以解密?
我用它来创建一个keytab文件:
$ ktutil
ktutil: addent -password -p my_user@MYREALM -k 1 -e rc4-hmac
Password for my_user@MYREALM:
ktutil: wkt my_user.keytab
ktutil: quit
Run Code Online (Sandbox Code Playgroud)
使用该keytab,我可以在不输入密码的情况下获得krbtgt.创建密钥表时,无法与AD/KDC进行通信(因此没有可用于签名的共享密钥或其他内容).
那么如何将密码加密到keytab中?如果它不是哈希算法 - 是否可以解密它?
我在不同的网站上寻找上述问题的答案,但在每种情况下都有如何生成密钥表文件。我需要 keytab 来获取包含 kerberos 身份验证的 hbase 连接。
我有一个 krb5.conf 文件。我创建了一个密钥表并按照此处的说明进行了检查。
在 docker 文件中,我将其全部添加到容器中
FROM java:8
ADD krb5.conf /etc/krb5.conf
ADD evkuzmin.keytab /etc/evkuzmin.keytab
ADD scripts/ /opt/scripts/
ADD report.jar report.jar
RUN sh -c 'touch report.jar'
ENTRYPOINT ["java","-Dspring.data.mongodb.uri=mongodb://audpro_mongo/report","-Djava.security.egd=file:/dev/./urandom","-jar","/report.jar","/opt/scripts/init-keytab.sh"]
Run Code Online (Sandbox Code Playgroud)
并尝试在 init-keytab.sh 中对其进行初始化
#!/bin/bash
kinit EvKuzmin@REALM -k -t /etc/evkuzmin.keytab
Run Code Online (Sandbox Code Playgroud)
但是每次我尝试访问受保护的集群时,都会收到未经授权的错误。当我检查我的密钥表时
klist -k evkuzmin.keytab
Run Code Online (Sandbox Code Playgroud)
我找不到 evkuzmin.keytab。
为什么?
我使用 Oracle 虚拟机和 docker quickstrat 终端来测试本地的所有内容。Keytab 在服务器上生成并复制到本地机器上的项目中。
编辑
我使用检查图像中的文件
docker run -it --entrypoint sh <image-name>
Run Code Online (Sandbox Code Playgroud)
他们在场。
我正在尝试使用下面的代码连接到 Kerberized hdfs 集群,使用下面相同的代码我当然可以使用 HBaseConfiguration 访问 hbase,
Configuration config = new Configuration();
config.set("hadoop.security.authentication", "Kerberos");
UserGroupInformation.setConfiguration(config);
UserGroupInformation ugi = null;
ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("me@EXAMPLE>COM","me.keytab");
model = ugi.doAs((PrivilegedExceptionAction<Map<String,Object>>) () -> {
testHadoop(hcb.gethDFSConfigBean());
return null;
});
Run Code Online (Sandbox Code Playgroud)
我已经能够使用相同的密钥表和主体成功访问 Solr、Impala,但我遇到了这个奇怪的问题:无法找到 hdfs 的服务名称。
请查看下面的堆栈跟踪
java.io.IOException: Failed on local exception: java.io.IOException: java.lang.IllegalArgumentException: Failed to specify server's Kerberos principal name; Host Details : local host is: "Securonix-int3.local/10.0.4.36"; destination host is: "sobd189.securonix.com":8020;
at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:772)
at org.apache.hadoop.ipc.Client.call(Client.java:1472)
at org.apache.hadoop.ipc.Client.call(Client.java:1399)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:232)
at com.sun.proxy.$Proxy9.getFileInfo(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:752)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) …Run Code Online (Sandbox Code Playgroud) 我使用hadoop与kerberos keytab文件名userid.keytab很长一段时间.但现在我不知道密码.无论如何从密钥表文件中获取密码.
我试图了解Kerberos的基本概念.我在这里读到了关于这里的原理,通常看起来像:
primary/instance@REALM
Run Code Online (Sandbox Code Playgroud)
我想问一下什么是主要的,实例和领域.当然,上面的页面和互联网上的其他几个地方都有定义,但有人可以举个例子吗?
我的理解是:主要是消费者(用户或服务).实例是用于访问控制的东西.主要可以是多个实例的一部分.Realm是实例的集合?如果我错了,请纠正我.
如果我有一台服务器:foo.bar.com
,我可以拥有2个领域:REALM1,REALM2.这些可以这样命名吗?或者我可以在这里只有1个领域作为FOO.BAR.COM?
现在我说3个服务:s1,s2,s3相互通信.由于启用了kerberos,它们中的每一个都必须拥有一个带有自己的keytab文件的主体?或者由于每个服务都与其他服务进行通信,每个keytab文件是否需要为其他服务都有主体?