JAAS - 恶意主题和主体创作

时间:2013-03-24 19:17:13

标签: security jaas

我是JAAS的新手,我仍然无法得到一件事:如果恶意用户手动创建主题和主体会怎么样?

如果用户篡改了主题/主体,是否应该进行一些验证?我见过的所有教程都没有提到这一点。

请看这个例子(来自jaasbook.com的ch02):

SimpleCallbackHandler cb = new SimpleCallbackHandler(username,
    password);
LoginContext ctx = new LoginContext("chp02", cb);
ctx.login();
Subject subject = ctx.getSubject();
System.out.println("Logged in " + subject);
Subject.doAsPrivileged(subject, new PrivilegedAction() { ...

如果我用这个替换这个代码:

Subject subject = new Subject();
Principal p = new SysAdminPrincipal(username);
subject.getPrincipals().add(p);
Subject.doAsPrivileged(subject, new PrivilegedAction() { ...

它的工作原理也一样(至少在这个示例代码中)。

我一定错过了......否则根本就没有意义使用jaas。 感谢

1 个答案:

答案 0 :(得分:0)

区别在于受信任和不受信任的代码。

如果允许代码在您不信任的JVM中运行,则需要使用已配置的策略保护JVM并在启用SecurityManager的情况下运行。这类似于Java Applet环境。在这样的环境中,您通常会锁定部分代码库,以便只有来自可靠来源的代码(可选择加密签名)才能运行或调用其他代码部分。

在Java安全性中,当进行权限检查时,将检查整个调用堆栈以确保允许堆栈的每个部分使用该权限。

在这种情况下,您将启动PrivilegedAction,它将Subject与AccessControlContext相关联。如果您查看源代码,您将看到执行权限检查:

javax.security.auth.AuthPermission "doAs";

在默认的Java安全策略中,唯一可以执行此操作的代码是安装Java扩展,因此如果要在自己的代码中执行此操作,使用正在运行的SecurityManager,则需要手动设置此权限。

因此,Subject类是不受保护的,因为除非它与AccesssControlContext关联,否则它没有任何影响。

AccesssControlContext受AuthPermission保护。

AuthPermission的设置由安全策略和SecurityManager保护,它们是在JVM启动时配置的。

在这种情况下,如果您在没有SecurityManager的情况下运行,或者将AllPermission授予任何代码库的自定义策略,并且您允许运行不受限制的代码,那么您就会遇到很大的安全问题。

如果您想运行不受信任的代码并将Subjects分配给AccessControlContexts,那么保护代码,这将执行以下策略文件:

grant codebase "file://home/me/myapp.jar" signedby "me" {
    javax.security.auth.AuthPermission "doAs";
} 

这可以保护只有您的代码库(包括调用堆栈)才能执行主题分配。

或者只是确保您信任部署到应用程序的代码......这是99%的部署方案,其中大多数应用程序在其主机环境中受到保护,并且不允许执行远程代码。