我是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。 感谢
答案 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%的部署方案,其中大多数应用程序在其主机环境中受到保护,并且不允许执行远程代码。