`
alartin
  • 浏览: 207703 次
社区版块
存档分类
最新评论
阅读更多
[转帖]如何使基于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规范实现代码

    jaas实现,单纯java文件

    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 ...

    Java JAAS安全认证 demo

    JAAS JaasDemo JAAS例子

    JAAS简介及实例.

    JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.

    java JAAS登陆验证

    java JAAS登陆验证

    JAAS Demo

    JAAS简单入门例子

    jaas详细配置精讲

    jaas详细配置精讲 tomcat web.xml

    JAAS认证与授权教程

    JAAS认证与授权教程,包含本教程的源代码

    tomcat_jaas_demo

    1、需要修改 bin\startup.bat(根据自己的环境修改) SET JAVA_HOME=C:\programs\Java\jdk1.8.0_211 SET TOMCAT_HOME=C:\programs\apache-tomcat-5.5.20 2、需要修改 bin\catlina.bat(可不修改) rem ----- added ...

    java软件包文件 jaas.jar

    JAAS 本身包括文档和一个lib 目录,其中只有一个jar 文件(jaas.jar)。

    JAAS in Web Applications

    JAAS in Web Applications主要是关于java 的认证与授权.例子很详细,如果有需要此类功能开发可以联系我,收费2000

    基于JAAS的Java安全编程

    JAAS是对原有Java 2安全框架的一个重要补充。本文较全面地介绍了JAAS的特点、组成及其在Jay。安全编程中的应 用。并简单分析了一个例子,该例经扩充后可直接应用于实践

    在JAAS基础上的Java安全编程

    JAAS(Java Authentication and Authentication Service Jay,认证和授权服务)是Java安全编程的一个重要补 充。它提供了根据验证主题身份来验证主题和授权资源访问的标准方法。本文较全面地介绍了JAAS的特点、组成 ...

    JAAS简介及实例

    原代码 博文链接:https://callan.iteye.com/blog/158392

    JAAS基础教程

    JAAS基础教程,学习JAAS的入门好资料,适合初学,也适合深入学习,不错的教程。

    JAAS简介及示例代码

    Java Authentication Authorization Service(JAAS,Java验证和授权API)提供了灵活和可伸缩的机制来保证客户端或服务器端的Java程序

    JAAS 身份验证技术入门

    JAAS 身份验证技术入门 作者 马林

Global site tag (gtag.js) - Google Analytics