`
etank
  • 浏览: 8596 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

使用JAAS以及GSSAPI登录Kerberos

    博客分类:
  • Java
阅读更多

 

    最近为了解决本地发布测试代码到服务器的问题,试用了下JAAS(Java Authencation and Authorization Service,Java授权与验证服务)和GSSAPI来完成Kerberos登录验证。完成了身份验证以后,就可以使用ant标准任务SCP来完成发布操作了。

    关于Kerberos验证机制请参考:一个不错的Kerberos机制讲解blog(虽然头像有点,但不要以貌取文)

    基于Kerberos的验证机制,需要两步来完成登录服务器身份验证:

    1、通过JAAS完成客户端与KDC服务器的验证工作,并获得登录服务器的ticket

    2、使用GSSAPI登录服务器

注:以下代码能够正常执行的前提是,执行的机器上已经正常配置了Kerberos登录的文件,可以参考Kerberos登录软件的配置方式,确保使用Kerberos的登录软件可以正常登录服务器之后再尝试以下代码。下面的代码只是用于辅助自动登录,并不包含具体Kerberos登录的配置



1、使用JAAS登录Kerberos账号

    关于JAAS的详细信息请参考:Sun的Jaas和Gssapi指南

    我使用的代码与指南中的基本相同,所以具体内容的详细解释请参考:Jaas验证样例

    使用JAAS登录Kerberos登录的步骤如下:

  1. JAAS服务中已经提供了Kerberos登录的实现,需要在启动程序时添加配置文件信息来指定登录的模式为Kerberos,例如:-Djava.security.auth.login.config=/data/jaas.conf,或者配置System属性也可以。
  2. jaas.conf的内容很简单,只是指定了登录模式为Kerberos:
    KerberosLogin 
    {
            com.sun.security.auth.module.Krb5LoginModule required debug=true;
    };
     
  3. 使用JAAS服务需要调用LoginContext(javax.security.auth.login包)来尝试登录,代码如下:
            LoginContext lc = null;
    
            try {
                lc = new LoginContext
    ("KerberosLogin
    ", new TextCallbackHandler());   //“KerberosLogin”这个名称必须与配置文件中的名称相同
            } catch (LoginException le) {
                System.err.println("Cannot create LoginContext. " + le.getMessage());
                System.exit(-1);
            } catch (SecurityException se) {
                System.err.println("Cannot create LoginContext. " + se.getMessage());
                System.exit(-1);
            }
    
            try {
                // attempt authentication
                lc.login();
    
            } catch (LoginException le) {
                System.err.println("Authentication failed:");
                System.err.println("  " + le.getMessage());
                System.exit(-1);
            }
     
  4. 如果正确的配置了Kerberos的登录信息,则以上代码如果正常运行完就表示客户端与KDC的通讯已经成功完成。

 

2、使用GSSAPI完成SSH的身份验证

 

     完成了客户端与KDC的通讯后,剩下的任务就是登录服务器了。以下的代码必须在成功完成步骤1之后进行,具体步骤为:

  1. 在subject的权限下进行登录。完成了步骤一之后,我们可以从login context中获得身份验证的一个subject对象,这个对象中包含了当前用户的权限,接下来的登录服务器操作必须在这个subject的权限范围内完成,如
    Subject.doAsPrivileged(lc.getSubject()
    ,
    
                    new java.security.PrivilegedExceptionAction<Object>() {
    
                        @Override
                        public Object run() throws Exception {
                             //登录操作
                        }
                     }
    }
     
  2. 构建GSS context对象。这个context对象包含了用于登录服务器的ticket以及客户端的相关信息。
    try {
                GSSManager manager = GSSManager.getInstance();
                //Kerberos的oid
                Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2");
    
                GSSName serverName = manager.createName("host/" + hostName, null);
    
                GssContext context = manager.createContext(serverName, krb5Mechanism, null, GSSContext.DEFAULT_LIFETIME);
                context.requestMutualAuth(true); // Mutual authentication
                context.requestConf(true); // Will use confidentiality later
                context.requestInteg(true); // Will use integrity later
            } catch (GSSException e) {
                // catch Exception
            }
     
  3. 拥有了GSS context对象之后,就可以进行SSH的身份验证,完成了身份验证之后就可以像普通的SCP一样进行操作了。下面的代码只包含了SSH中使用GSSAPI进行验证的过程,不包含SSH的建立,交换key以及后续的sftp操作。
    /*
      *   使用GSSAPI进行SSH验证的基本顺序是
      *   1、询问user-auth服务
      *   2、获得确认后传输验证的方式
      *   3、进行Kerberos的验证操作
      */
    
    1、询问user-auth服务
    请求数据: 5                            byte     
                    “ssh-userauth”      String
    响应标志    6
    
    2、请求身份验证方法为Kerberos 
         50                         byte  
         username             string      登录服务器的名称,不是登录Kerberos的名称
         "ssh-connection"  string
         "gssapi-with-mic" string
          1                           int          表示只有一种类型的oid在后面
          new Oid("1.2.840.113554.1.2.2").getDER()   Kerberos的oid的DER编码
    响应标志     60  表示支持Kerberos登录
    
    3、进行Kerberos验证,这里需要使用刚才构建的GSS context对象
            byte[] token = new byte[0];
    
            while (!context.isEstablished()) {
                try {
                    token = context.init(token, 0, token.length);
                } catch (JSchException e) {             
                    e.printStackTrace();
                    return;
                }
    
                if (token != null) {
                    // 会写数据
                    //  61        byte
                    //  token   string
                }
    
                if (!context.isEstablished()) {
                    // 读取返回信息,忽略错误和失败的情况
                    // 以下代码代表读取返回信息,并设置给token,用与继续context的初始化参数
                    buf.getInt();
                    buf.getByte();
                    buf.getByte();
                    token = buf.getString();
                }
            }
    
     

注:这段代码省略了关于SSH通讯数据的解析和输出部分,具体关于SSH的通讯格式请参数wikipedia的SSH页面

 

 

分享到:
评论

相关推荐

    JAAS.rar_Action!_Jaas Kerber_jaas KERBEROS_kerberos Java_login.a

    _Jaas_Kerber_jaas_KERBEROS_kerberos_Java_login.a"压缩包文件包含了关于如何在Java环境中使用JAAS实现Kerberos登录和委托的示例代码。Kerberos是一种广泛使用的网络身份验证协议,它提供了强大的安全性,通过一次...

    JAAS.rar_Kerberos_jaas_ldap kerberos

    JAAS强调的是通过验证谁在运行代码以及他/她的权限来保护系统面受用户的攻击。它让你能够将一些标准的安全机制,例如Solaris NIS(网络信息服务)、Windows NT、LDAP(轻量目录存取协议),Kerberos等通过一种通用...

    kerberos的java实现

    配置文件中指定Kerberos登录模块,并提供必要的Kerberos服务名和服务位置信息。 - **使用KerberosLoginModule** 在Java代码中,通过`Subject`对象和`LoginContext`来调用KerberosLoginModule进行登录操作。登录...

    JAAS登录验证文档,里面有详细步骤及例子

    3. **自定义登录模块**:JAAS允许开发者创建自己的登录模块,以适应特定的认证机制,如LDAP、数据库或Kerberos。开发者需要实现 javax.security.auth.login.LoginModule 接口,并在配置文件中指定。 4. **配置文件*...

    kerberos java system

    - 使用`LoginContext`和配置的JAAS配置文件进行登录操作,这将执行Kerberos认证流程。 - 登录成功后,可以从`Subject`中获取`KerberosTicket`,并用它来请求服务票证。 5. **Kerberos与Java SSO** - 在Java应用...

    JAAS认证与授权教程

    1. **配置安全策略**:开发者需要定义一个安全策略文件,指定哪些类和方法需要进行安全性检查,以及使用哪个登录模块(Login Module)进行认证。 2. **创建Subject对象**:Subject是JAAS中的核心类,代表了与安全...

    JAAS登录验证文档

    ### JAAS登录验证知识点 #### 一、JAAS概述 Java Authentication and Authorization Service(JAAS)是Java平台提供的一种安全框架,它允许开发者为应用程序添加认证和授权功能。与传统的基于容器的身份验证不同,...

    java实现flink订阅Kerberos认证的Kafka消息示例源码

    - 使用`FlinkKafkaConsumer`类来创建消费者实例,传入Kafka的topic名称、消费者的配置(包含Kerberos相关配置)以及序列化器。 - 在Flink的作业中,添加这个消费者作为源,如`stream.addSource(consumer)`。 4. *...

    jaas规范实现代码

    4. **配置文件(Configuration File)**:JAAS 使用配置文件来指定哪些登录模块应用于哪个主体(Subject,代表用户或实体),以及它们的配置选项。 现在,让我们来看看如何使用纯 Java 文件实现一个简单的 JAAS ...

    关于JAAS的一些学习资料

    在这个关于JAAS的学习资料中,我们将探讨如何使用JAAS实现一个简单的登录模块。 首先,我们看到一个名为"simp.config"的文件,这通常是JAAS配置文件。在JAAS中,配置文件定义了认证系统的行为,包括用于认证的模块...

    JAAS in Web Applications

    登录模块可以是基于数据库的、LDAP目录的,甚至可以是kerberos等更复杂的身份验证机制。 **2. JAAS配置** - **jaas.conf文件**:这是JAAS的主要配置文件,定义了不同的安全领域( realms )和对应的登录模块。 - **...

    java软件包文件 jaas.jar

    - **登录模块(Login Modules)**:登录模块是实现认证的具体逻辑,是JAAS的核心组件。它们实现了 `javax.security.auth.spi.LoginModule` 接口,负责实际的用户验证工作。每个登录模块都有其特定的认证方式,如使用...

    websphere 6 JAAS登陆例子

    这个主题涉及到Java Authentication and Authorization Service (JAAS)的安全框架,以及它如何在企业级应用服务器环境中确保安全登录。 Java Authentication and Authorization Service (JAAS) 是Java平台提供的一...

    CDH_5.15.1开启kerberos认证.docx

    以上就是CDH 5.15.1启用Kerberos的完整过程,以及Kafka在Kerberos环境中的配置和使用方法。确保遵循每个步骤,并根据实际情况调整配置,以保证系统的安全性和稳定性。参考链接中提供了更详细的指南,可进一步了解...

    kerberos环境搭建

    - 添加 Realm 和 Principal:通过管理员用户,添加你的Kerberos Realm,以及需要认证的用户和服务。 5. **客户端配置**: - 配置客户端:在 `/etc/krb5.conf` 文件中,设置正确的 Realm 和 KDC 地址。 - 测试...

    kafka 配置kerberos安全认证

    本文将详细介绍如何为 Kafka 配置 Kerberos 安全认证,包括安装 Kerberos 服务、配置 Zookeeper 的 Kerberos 认证以及最终配置 Kafka 的 Kerberos 认证。 #### 二、整体架构设计 Kerberos 的部署通常需要一个中心化...

    JAAS基础教程

    在本文的示例中,我们展示了一个基于Web的Java应用程序如何使用JAAS实现健壮而灵活的登录和身份验证模块。该示例中,关系数据库被用来保存用户的登录信息,通过JAAS的支持,我们能够轻松实现一个强大而灵活的身份...

    JAAS简介及示例代码

    配置文件通常在`jaas.conf`中编写,它指定了使用哪个登录模块以及其配置。例如: ``` MyApp { mypackage.MyLoginModule required; }; ``` 这里,`MyApp`是安全域的名称,`mypackage.MyLoginModule`是登录模块的全...

    JAAS In Action download

    在实际开发中,一些工具和库可以帮助简化JAAS的使用,例如使用Spring Security整合JAAS,或者利用开源的登录模块实现。这些工具通常提供更高级别的抽象,使得安全设置更加容易和灵活。 总结,Java Authentication ...

Global site tag (gtag.js) - Google Analytics