当前位置: 首页 > 知识库问答 >
问题:

使用JAAS在Keytab和KDC中Kerberos用户主体

祁烈
2023-03-14

我正在构建一个简单的Jaas登录模块。这使用以下代码:

public class Jaas {
    private static String name;
    private static final boolean verbose = false;

    public static void main(String[] args) throws Exception {
        if (args.length > 0) {
            name = args[0];
        } else {
            name = "client";
        }

        // Create action to perform
        PrivilegedExceptionAction action = new MyAction();

        loginAndAction(name, action);
    }

    static void loginAndAction(String name, PrivilegedExceptionAction action)
        throws LoginException, PrivilegedActionException {

        // Create a callback handler
        CallbackHandler callbackHandler = new TextCallbackHandler();

        LoginContext context = null;

        try {
            // Create a LoginContext with a callback handler
            context = new LoginContext(name, callbackHandler);

            // Perform authentication
            context.login();
        } catch (LoginException e) {
            System.err.println("Login failed");
            e.printStackTrace();
            System.exit(-1);
        }

        // Perform action as authenticated user
        Subject subject = context.getSubject();
        if (verbose) {
            System.out.println(subject.toString());
        } else {
            System.out.println("Authenticated principal: " +
                subject.getPrincipals());
        }

        Subject.doAs(subject, action);

        context.logout();
    }

    // Action to perform
    static class MyAction implements PrivilegedExceptionAction {
        MyAction() {
        }

        public Object run() throws Exception {
            // Replace the following with an action to be performed
            // by authenticated user
            System.out.println("Performing secure action ...");
            return null;
        }
    }
}

这是使用以下命令运行的:

java -Djava.security.auth.login.config=jaas-krb5.conf Jaas client

jaas-krb5:

client{
    com.sun.security.auth.module.Krb5LoginModule required
    principal="name@Host.COM";
};
server{
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    storeKey=true
    KeyTab=myKeyTab.keytab
    principal="host.name.com";
};

在myKeyTab中,我们有以下主体:

slot KVNO Principal
---- ---- ---------------------------------------------------------------------
   1    4        name@Host.COM

所以我已经编译并运行了,但登录时总是会出现错误:

Kerberos password for name@Host.COM: //I enter the password
Login failed

使用堆栈跟踪:

javax.security.auth.login.LoginException: Cannot get kdc for realm Host.COM
        at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:696)
        at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:542)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at javax.security.auth.login.LoginContext.invoke(LoginContext.java:769)
        at javax.security.auth.login.LoginContext.access$000(LoginContext.java:186)
        at javax.security.auth.login.LoginContext$4.run(LoginContext.java:683)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
        at javax.security.auth.login.LoginContext.login(LoginContext.java:579)
        at Jaas.loginAndAction(Jaas.java:77)
        at Jaas.main(Jaas.java:61)
Caused by: KrbException: Cannot get kdc for realm Host.COM
        at sun.security.krb5.KrbKdcReq.send(KrbKdcReq.java:195)
        at sun.security.krb5.KrbKdcReq.send(KrbKdcReq.java:174)
        at sun.security.krb5.KrbAsReq.send(KrbAsReq.java:431)
        at sun.security.krb5.Credentials.sendASRequest(Credentials.java:400)
        at sun.security.krb5.Credentials.acquireTGT(Credentials.java:350)
        at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:662)

我的问题是:

我想我对 KDC/Keytab 和用户条目之间发生的事情有一个根本性的误解。我的理解是,主体是要验证的内容,如果是这样,我如何输入新的主体并分配密码?

我的目标是简单地向keytab添加一个测试主体,并使用它来运行这个登录脚本。

共有1个答案

艾凌龙
2023-03-14

看起来你做了一个错误的假设。

主体是用户名Kerberos领域(或active directory域)。这可能与DNS域的值相同,也可能不同。但从根本上说,它们是完全不同的东西。在您的特殊情况下,看起来您的kerberos领域是< code > intranet . barcapint . com 。但是,您的keytab包含< code>name@host.com的密钥。因此,Jaas Kerberos客户端会忽略keytab中的内容,并退回到默认的领域解析。看起来你的领域到域的映射被破坏了,所以它找不到KDC,并出现上面的错误。因此你得到了内部异常。

要解决上述所有问题,首先您需要修复域到域的映射。如何做取决于操作系统。在Unix系统上,您应该检查/etc/krb5.conf,在Windows上是c:\windows\krb5.ini。但它可能在其他地方。检查此选项以获取更多信息。

另一件事是,您只需要无人值守服务器的密钥表。这只是存放克尔贝罗斯钥匙的便捷方式。我建议你首先让服务器和客户端像上面一样使用文本回调工作。获得此内容后,您可以继续对服务器使用密钥表。

 类似资料:
  • 我有一个服务到服务模型,其中我有一个 Kerberos 身份验证的密钥表。 在这个模型中,我定义了一个登录配置,如下所示:- 此登录配置可替代jaas.conf 现在我正在尝试登录上下文的登录方法,这是有效的。然后我从中获取主题。 现在使用这个主题,我执行特权操作。 这失败了。相关日志(我在设置日志系统属性后找到的):- 现在真正令人困惑的是:- 第一部分是创建证书本身。然而,第二个似乎是针对某些

  • 我正在尝试连接到配置为使用Kerberos进行身份验证的蜂巢元存储。当我不尝试使用keytab文件时,即当程序在身份验证过程中提示我输入密码时,这对我很有效。当我将配置更改为使用keytab时,我会收到一个长堆栈跟踪,其中包含以下语句: 有人能对我做错了什么提出建议吗? 如果相关的话,我的问题的背景是,我想从mapreduce作业访问配置单元元存储,当然,mapreduced作业无法响应提示。 我

  • 问题内容: 我正在尝试连接到在Cloudera上运行的HDFS实例。我的第一个步骤启用Kerberos和创建Keytabs(如图所示这里)。 在下一步中,我想使用密钥表进行身份验证。 它失败并显示以下错误 java.io.IOException:从keytab /etc/hadoop/conf/hdfs.keytab登录hdfs @ CLOUDERA失败:javax.security.auth.l

  • 所有的, 有人能就如何使用JAAS LoginContext对多个KDC/Realm组合进行身份验证提供建议吗?换句话说,如果尝试1对领域A失败,请尝试领域B。 类似于下面的伪代码。 一如既往,任何帮助都非常感谢。 查看剪贴板打印文本?

  • 我正在使用一个keytab,并使用windows命令行上的kinit命令设置它。我得到消息“new ticket is storage in cache file”。之后,当我运行java应用程序访问keytab文件以获取密钥时,我得到以下错误。 C:\users\cxxxxx\git\abcd.keytab refreshKrb5Config为false主体为xxxx_dev@xxxx.xxxx

  • 我正在用Jaas构建一个将被Jconsole使用的Kerberos登录模块。 Jconsole 将是用于访问具有暴露 MBean 的进程的客户端,kerberos 登录模块将对用户进行身份验证。 用户将通过 Jconsole 登录,Jconsole 会将用户数据传递给登录模块,用户名和密码随后由 Kerberos 登录模块处理,用户凭据根据中央活动目录进行验证。 我对Kerberos的配置有问题。