`
alartin
  • 浏览: 209836 次
社区版块
存档分类
最新评论
阅读更多
[转帖]如何使基于JAVA技术的应用更安全(3)- JAAS关键技术剖析
作者:Fleshwound
Email:fleshwound@smatrix.org              

安全矩阵(Security Matrix):http://www.smatrix.org

 

一 JAAS简介

上次我们谈到JAVA可以支持几乎所有的基础密码学处理操作(包括加密、解密、数字签名、消息摘要),也许有人会为之欣喜若狂,但是更多的“黑人”可能在 底下暗暗的笑,如何在实际世界中应用密码学往往使人手足无措,网络世界也并非因为加密技术的存在而风平浪静。这次我要谈的是JAVA中的一项重要安全技术 -JAVA的认证和授权服务(JAAS)(该技术比较复杂,有专著),首先谈谈JAAS的身世。

大家知道,JAVA的口号是“一次编译,处处执行”。分布式执行可以给我们美好的憧憬,但是也给我们带来了隐患。一次编译没有问题,但是处处执行似乎有些 令人担心。试想,一段不友好的代码(比如RMI调用、携带恶意代码的BEAN)处处肆无忌惮的执行肯定是让人感到恶心的。于是在JAAS出现之前, JAVA安全部署就要先检查代码来自何处仙山(代码来源)、哪位神仙的签名(对代码负有不可推卸的责任人的数字签名),然后决定是否执行,其过程非常麻 烦。因此在上帝的指引下,SUN推出了JAAS。有了它,JAVA安全框架就可以准确的识别谁在运行代码,运行的是什么代码,这就是JAVA认证,另外就 是确定代码运行的权限,这就是JAVA授权。

JAAS是对JCE安全框架的重要补充,通过提供认证用户和确定用户授权来增强JAVA解决方案的动态安全性,使得资源能够得到很好得到保护和控制(JAAS使用动态的安全策略来定义权限,而不是将其静态的嵌入到代码中)。

JAAS采用的是插件的运行方式,一开始就被设计成可插拔的(Pluggable),根据应用的需要,只要配置一下JAAS的配置文件,这些组件即可包含 在我们的应用程序中。使用JAAS包接口,开发者和第三方可以开发一些组件或者BEAN来实现登陆认证,或者通过与使用者或外部的系统的进行交互来访问认 证信息(当然我们可以设计更为稳妥安全的密码学协议)。JAAS提供了一组用于用户鉴别的类和接口,这意味着支持JAAS的应用会要求用户登陆,同时 JAAS提供了另一组用于用户授权的类和接口。在讨论例子之前,先对JAAS API中常用的一些类和接口做个简单的说明。

LoginModule :确认用户的合法性(使用CallbackHandler或者其他类方法),并分配访问权限principal给subject;

LoginContext:为了实现用户鉴别,建立相应的环境,从配置文件中导入规则;

CallbackHandler:回调处理器,负责与用户(代码拥有者和执行者)交互,确认其身份的合法性;

Subject:表示登陆处理的目标,即一个被鉴别的用户。并可关联一个或多个pirncipal;

Principal:表示具有访问权限的一个实体,可以看作是可以执行某种操作的证件。

理解这些类和接口的关系我给个生动的比方:一个军事学校,入学的时候校方(LoginModule)根据学生(Subject)的入学通知来确定其合法 性,这个过程交由某工作人员(CallbackHandler)执行,(CallbackHandler)确认后,(LoginModule)给不同 (Subject)根据其身份发给相关的证件(Principal),有了该证件就可以访问对应的资源,(Subject)根据自己的 (Principal)的级别可以使用和访问学校不同资源。

一个(Subject)的(Principal)如果是士官级,那么可以访问的资源就相对少些,如果是将军级那就多些。当然一个(Subject)可以拥有多个(Principal)。

通过分析我们会发现,JAAS采用的也是身份检查+权限分配模式。因此JAAS的应用也分成两个部分:(1)认证;(2)授权。过程是先认证后根据身份来授权(有歧视的嫌疑的东东,本人可是反歧视人士)。

那么JAAS是如何实现认证的呢?又是如何实现授权的呢?且听我慢慢分解,将其妙处展现给大家。

二 JAAS的认证原理

(要深入理解该部分的内容,需要有一定《设计模式》方面的知识,否则会感到头昏目眩,不知所云,推荐一本居家旅行必备的好书James W.Cooper写的《JAVA设计模式》)

(1)       设置JAAS配置文件,关于配置非常有技巧,跟设置防火墙的过滤规则有得一拼;

(2)       根据JAAS配置文件的条目加载一个或者多个LoginModule(通常一个,也可以变态得使用多个);

(3)       为了管理用户认证的有关过程,将提供一个可选的LoginModule构造函数和一个回调处理器CallbackHandler。如果没有在构造函数中提供回调处理器,系统采用默认设置;

(4)       初始并实例化LoginContext(加载配置规则),如果成功,则调用LoginContext的login方法。无论是否需 要,LoginContext都会去首先读取JAAS配置文件,从中获得要加载的登陆模块信息,其initialize方法将按照配置文件中的相关内容提 供LoginModule运行所需要的信息;

(5)       LoginContext的login方法将调用LoginModule的login方法,确定用户身份。该方法将设置相关的回调,并由回调处理器CallbackHandler来管理登陆处理回调;

(6)       LoginModule的login方法将负责与用户进行交互(可能是人机交互,也可能是机机交互),如果用户输入信息无效,则该方 法返回FALSE,一次交互过程结束,如果用户输入信息有效,则该方法将设置Principal对象的Subject对象,并返回TRUE;当然 LoginModule也可以将与用户之间的所有交互过程全部委托给处理器CallbackHandler来处理。如果登陆成功, LoginContext将调用LoginModule的commit方法将结果提交给LoginModule实例的内部状态。


三 实战JAAS认证

(1)    创建一个登陆配置文件smatrix_login.config,形式如下:

conf_smatrix_login

{

 com.sun.security.auth.module.KeyStoreLoginModule required

 keyStoreURL="file:d:/j2ee/jaas/smatrix/mykeystore";

}

(2)    登陆程序

import com.sun.security.auth.callback.DialogCallbackHandler;

import javax.security.auth.*;

import javax.security.auth.login.*;

 

public class smatrix_login {

   public static void main(String[] args) throws Exception {

      //采用对话框式的回调处理器,并初始化,关于回调处理器形式有多种,也可自己做个

       DialogCallbackHandler handler=new DialogCallbackHandler( );

          //建立登陆上下文,并通过配置文件初始化,在这里配置文件必须与程序同目录

          LoginContext ct = new LoginContext("conf_smatrix_login",handler);

       boolean pass=false;//是否通过认证标志

       try {

             //ct会自动调用登陆模块的login()和commit()方法

                 ct.login();

              pass=true;

       } catch (LoginException e) {

             pass=false;

             System.err.println("身份认证失败!");

             System.err.println("原因:" + e.getMessage());

       } 

       if(!pass){

           System.out.println("交换失败,很抱歉不能使用我们的资源");

       }

       else{

           System.out.println("认证成功");

           Subject s = ct.getSubject();

           System.out.println(s.getPrincipals());

       }

     }

}

我刚刚给了一个最简单的例子,实际上关于回调处理器和登陆模块的代码完全可以由自己来写(当然必须建立在你比较牛的基础上,而且精通JAAS的处理过 程),具体可以去看看SUN公司的相关著作。如果大家愿意听我婆婆妈妈,下次可以深入的讲讲如何写自己的回调处理器和DIY自己的登陆模块。

四 JAAS的授权原理

完成JAAS的认证,只是万里长征的第一步,有关JAAS的授权技术也非常精彩,有多种不同类型的授权方法。你可以通过多种方式来体会其中奥妙。JAAS 授权也要通过建立安全策略设置和用于授权的类文件来实现。认证成功并不意味着用户可以为所欲为,首先你需要创建对应动作的Permission类,创建能 够映射执行某种特殊操作的Principal类。以下的过程是必需的:

(1)       创建一个或者多个严格的安全策略文件(该操作非常有技巧,如果太严格了,会给用户操作代码非常大的麻烦,但是太松了,有可能带来安全隐患);

(2)       创建定制合适的Permission类;

(3)       创建定制动作类,实现PrivilegedAction;

(4)       执行静态Subject doAsPrivileged方法,传递含有必需的principal的Subject实例、定制的动作PrivilegedAction;

(5)       在PrivilegedAction的run方法中,访问SecurityManager并使用定制Permission类调用CheckPermission方法。

分享到:
评论
1 楼 千秋万世 2009-06-09  
很好,非常好,尤其其中的比喻,通俗明了,看了半天其他的资料都一头雾水,现在一下子就明白了很多

相关推荐

    jaas.jar jaas.jar

    jaas.jar jaas.jar jaas.jar

    JAAS简介及实例

    1. **配置JAAS**:在jaas.conf文件中,指定哪个登陆模块用于哪个应用程序领域。 ```properties MyApp { com.example.MyLoginModule required; }; ``` 2. **编写登陆模块**:实现`javax.security.auth.spi....

    java JAAS登陆验证

    1. **配置**:首先,应用程序通过Jaas.login()方法触发JAAS流程,系统会查找相应的jaas.conf配置文件,确定需要使用的LoginModule。 2. **身份验证**:接着,JAAS根据配置启动对应的LoginModule,执行用户身份验证...

    jaas规范实现代码

    Java Authentication and Authorization Service (JAAS) 是 Java 平台中用于安全管理的重要组件,它提供了一种框架,使得应用程序可以进行用户身份验证和权限控制。在本文中,我们将深入探讨 JAAS 的核心概念、工作...

    JAAS简介及示例代码

    1. **配置**:开发者首先需要配置JAAS,定义认证和授权的策略。这涉及到创建一个或多个配置文件,其中包含了特定安全域(也称为“登录模块”)的设置。 2. **登录**:当用户尝试访问受保护的资源时,系统会启动登录...

    JAAS认证与授权教程

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

    JAAS in Web Applications

    **1. JAAS基础** - **身份验证(Authentication)**:这是验证用户身份的过程,通常通过用户名和密码、数字证书、智能卡等方式完成。 - **授权(Authorization)**:验证通过后,授权决定用户可以访问哪些资源或执行...

    JAAS Demo

    ### JAAS基础知识与应用 #### 一、JAAS概述 JAAS(Java Authentication and Authorization Service)作为Java平台标准版(JSE)的一部分,为Java应用程序提供了灵活且强大的身份验证和授权服务。相比于早期版本的...

    JAAS登录验证文档

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

    websphere 6 JAAS登陆例子

    1. 配置Websphere服务器以使用JAAS:可能需要在Websphere的管理控制台中设置安全属性,指定认证和授权的JAAS登录模块。 2. 配置LDAP连接:可能涉及设置LDAP服务器的URL、绑定DN和密码,以及定义如何从LDAP检索用户...

    JAAS In Action download

    1. 应用程序调用JAAS API启动认证过程。 2. JAAS读取配置文件,确定要使用的登录模块。 3. 每个登录模块依次执行,验证用户凭证。 4. 如果所有登录模块都成功,主体被创建并填充认证信息。 5. 应用程序可以使用主体...

    jaas详细配置精讲

    1. **配置JAAS模块**: 在`server.xml`中,可以通过`<Realm>`元素来配置认证机制。例如,使用JaasRealm,可以这样写: ```xml ``` 其中,`appName`指定了JAAS的配置名称,`userClassNames`和`roleClassNames`...

    java软件包文件 jaas.jar

    Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全性的关键组件,它提供了一种框架,用于在Java应用程序中实现认证(Authentication)和授权(Authorization)。`jaas.jar` 文件是这个...

    jaas j2se例子

    jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas ...

    基于JAAS的Java安全编程

    ### 基于JAAS的Java安全编程 #### JAAS概览 JAAS(Java Authentication and Authorization Service,Java认证与授权服务)是Sun Microsystems为Java 2平台开发的一套安全框架扩展,旨在加强Java应用程序的安全性。...

    JAAS简介及实例.

    1. 应用程序创建一个LoginContext实例,传入特定的配置信息。 2. 调用LoginContext的login方法启动认证流程。 3. 用户通过CallbackHandler提供认证信息。 4. LoginModule验证信息并设置Subject中的Principal。 5. ...

    JAAS样例

    1. **配置文件(sample_jaas.config)** JAAS 配置文件定义了认证机制和策略。`sample_jaas.config` 文件中可能包含了一个或多个配置条目,每个条目关联一个特定的安全域(login module)。例如,它可能会定义一个...

Global site tag (gtag.js) - Google Analytics