问题标签 [securitymanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3412 浏览

tomcat - 从 Tomcat servlet 连接到 HTTP 服务器时出现 AccessControlException

我试图让我的 tomcat servlet 下载许多文件,但是我在同一台服务器上运行 apache 和 tomcat,所以我认为这就是它不起作用的原因。我已经在不运行 apache 的服务器上进行了测试,一切都很好。

这是我尝试使用 new Url(fileUrl).openStream() 时遇到的异常:

如何在运行 apache 的同时通过 tomcat 运行 http 下载?我卡住了吗?

编辑:
无论我做什么,我都无法通过tomcat。这是 03catalina.policy:

// ========== CATALINA 代码权限 =================================== ====

0 投票
1 回答
1728 浏览

java - 如何对预期在小程序安全管理器中运行的 Java 代码进行单元测试

我有一些 Java 库代码,有时作为未签名的小程序运行。因此,并不总是允许执行某些操作(例如检查系统属性)。

我想使用类似 Applet 的安全管理器运行一些单元测试,以便我可以验证代码是否未执行任何受限操作,或正确处理任何安全异常。

使用真实的安全管理器配置运行这些单元测试的最佳方法是什么?最好的解决方案是可以与 JUnit 集成的东西。

0 投票
3 回答
5740 浏览

java - java中的SecurityManager有没有办法选择性地授予ReflectPermission(“suppressAccessChecks”)?

Java 中的 SecurityManager 有什么方法可以根据调用的 setAccessible() 的详细信息选择性地授予 ReflectPermission("suppressAccessChecks") ?我看不出有什么办法可以做到这一点。

对于某些沙盒代码,允许调用 setAccessible() 反射 API 将非常有用(例如,对于运行各种动态 JVM 语言),但当在源自的类的方法/字段上调用 ​​setAccessible() 时在沙盒代码中。

如果这是不可能的,除了选择性授予 ReflectPermission("suppressAccessChecks") 之外,还有其他人有其他建议吗?如果 SecurityManager.checkMemberAccess() 具有足够的限制性,也许在所有情况下都可以安全地授予?

0 投票
3 回答
294 浏览

.net - 小而快的 .NET 程序?- ResolvePolicy 中 65% 的运行时间

我尝试在 F# 中构建一个非常非常小的 .NET 应用程序。

它只需要将一个小字符串转换为另一个字符串并将结果打印到控制台,如下所示:

convert.exe myString ==> 打印类似“myConvertedString”的内容

我使用dottrace来分析性能:

  • 26% (168ms) 在我的实际字符串转换中(我认为这没问题。)
  • System.Security.SecurityManager 中的 ResolvePolicy 65,80% (425ms)

每次执行的运行时间 > 500 毫秒太慢了。我可以做些什么来改善这一点吗?

如果这次只需要第一次通话就可以了。

问候,叉子

0 投票
2 回答
498 浏览

java - 其他可用的 SecurityManager 实现?

是否有任何其他可用的Java SecurityManager实现(例如在 OSS 项目中),它比 JDK 中的功能更多?

我正在寻找类似的功能

  • 在运行时可配置
  • security.policy可在运行时更新的策略,从文件以外的其他数据源读取
  • 线程感知,例如每个线程的不同策略
  • 更高级别的策略,例如“禁用网络功能,但允许 JDBC 流量”
  • 常见的预定义策略,例如“允许对通常的系统属性(如file.encodingor line.separator)进行读取访问,但不允许对 user.home 进行读取访问”
  • 监控和审计跟踪日志,例如“记录所有文件访问,记录所有不访问 knownhost.example.org 的网络访问”
  • 阻止作业“请求”权限,直到管理员授予权限,让线程/作业继续
  • ...

我很确定应用服务器(至少是商业服务器)有自己的SecurityManager实现或至少有自己的策略配置。我想知道是否有任何具有类似要求的免费项目。

0 投票
4 回答
13009 浏览

java - 如何在 Tomcat 6 中合理配置安全策略

我使用的是为 Ubuntu Karmic 打包的 Tomcat 6.0.24。Ubuntu 的 Tomcat 包的默认安全策略非常严格,但看起来很简单。在/var/lib/tomcat6/conf/policy.d中,有多种建立默认策略的文件。

开头值得注意:

  • 我根本没有更改股票 tomcat 安装 - 没有新的 jars 进入它的公共 lib 目录,没有server.xml更改等。将 .war 文件放在webapps目录中是唯一的部署操作。
  • 在此默认策略下,我正在部署的 Web 应用程序因数千次访问被拒绝而失败(由于-Djava.security.debug="access,stack,failure"系统属性而向日志报告)。
  • 完全关闭安全管理器不会导致任何错误,并且应用程序功能正常

我想做的是将特定于应用程序的安全策略文件添加到policy.d目录中,这似乎是推荐的做法。我将此添加到policy.d/100myapp.policy(作为起点——我希望最终将授予的权限缩减为仅应用程序实际需要的权限):

请注意试图找到正确codeBase声明的挣扎。我认为这可能是我的根本问题。

无论如何,上面的(实际上只有前两个授权似乎有任何效果)几乎可以工作:成千上万的访问拒绝已经消失,我只剩下一个。相关堆栈跟踪:

我非常确信触发拒绝的实际文件是无关紧要的——它只是我们检查可选配置参数的一些属性文件。有趣的是:

  1. 在这种情况下不存在
  2. 文件不存在的事实最终会引发安全异常,而不是java.io.File.exists()简单地返回 false (尽管我认为这只是读取权限的语义问题)。

另一个解决方法(除了在 tomcat 中禁用安全管理器之外)是向我的策略文件添加开放式权限:

我认为这在功能上等同于关闭安全管理器。

我想我一定是codeBase在我的赠款中得到了微妙的错误,但我现在没有看到它。

0 投票
2 回答
481 浏览

jruby - JRuby 的 Java 安全管理器

为 Jruby 脚本使用 Java 安全管理器时,是否可以单独授予特定脚本完全权限?

0 投票
1 回答
336 浏览

java - 授予权限时替代策略文件?

是否可以通过策略文件以外的方式授予权限?我想要实现的是一个可以在运行时修改的基于权限的系统。

0 投票
1 回答
1873 浏览

java - Spring 应用程序的 Tomcat 配置

我已经构建了用于 Tomcat 的 Web 应用程序。这取决于春天。尝试访问它时出现以下异常:

我阅读了tomcat docs,发现我需要配置安全性。
我在“/usr/share/tomcat/conf/catalina.policy”中添加了以下几行:

但这没有帮助。要添加,我通过粘贴以下命令安装了 Tomcat :

我已经重新启动了服务器。该项目存在于指定位置。

我究竟做错了什么?

我真的很想尽可能少地修改服务器上的东西,而无需将其他 jar 复制到服务器 lib 文件夹中。


我的

Tomcat 版本 = Apache Tomcat/6.0.20

春季版 = 3.0.1.RELEASE


堆栈跟踪太大,无法在此处发布,因此请点击链接查看。


有谁能够帮我?补充一点,它在我的 Apache Geronimo 上毫无例外地执行。

0 投票
2 回答
2385 浏览

java - 为什么我不能在 SecurityManager 下关闭我自己的 ExecutorService?

在默认的安全管理器下,如果我创建一个ExecutorService(在这种情况下是ThreadPoolExecutor),我无法关闭它,shutdown()只是调用checkPermission("modifyThread")并因此立即死亡:

孙 JDK:

$ java -Djava.security.manager 当前线程:线程“main”中的 Thread[main,5,main] 异常 java.security.AccessControlException:java.security.AccessControlContext.checkPermission 的访问被拒绝(java.lang.RuntimePermission modifyThread) (AccessControlContext.java:323) 在 java.security.AccessController.checkPermission(AccessController.java:546) 在 java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 在 java.util.concurrent.ThreadPoolExecutor.shutdown(ThreadPoolExecutor. java:1094) 在 A.main(A.java:22)

OpenJDK:

$ java -Djava.security.manager 当前线程:线程“main”中的 Thread[main,5,main] 异常 java.security.AccessControlException:java.security.AccessControlContext.checkPermission 的访问被拒绝(java.lang.RuntimePermission modifyThread) (AccessControlContext.java:342) 在 java.security.AccessController.checkPermission(AccessController.java:553) 在 java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 在 java.util.concurrent.ThreadPoolExecutor.checkShutdownAccess(ThreadPoolExecutor. java:711) 在 java.util.concurrent.ThreadPoolExecutor.shutdown(ThreadPoolExecutor.java:1351) 在 A.main(A.java:22)

为什么???????创建一个只有你控制的线程池并关闭它有什么安全隐患?这是实现中的错误,还是我遗漏了什么?

让我们看看ExecutorService.shutdown的规范是怎么说的……

启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,调用没有额外的效果。

抛出:SecurityException - 如果安全管理器存在并且关闭此 ExecutorService 可能会操作不允许调用者修改的线程,因为它不持有 RuntimePermission("modifyThread"),或者安全管理器的 checkAccess 方法拒绝访问。

这……是最模糊的。该规范没有说明在 ExecutorService 的生命周期中创建的任何“系统线程”,此外,它允许您提供自己的线程,这证明当您这样做时不应该涉及“系统线程”。(如上所述在我的示例源中完成)

感觉就像 Java SE 实现者看到了shutdownraise是可能的SecurityException,所以他们就像,“哦,好吧,我将在这里添加一个随机安全检查以确保合规性”......

问题是,阅读 OpenJDK 源代码(openjdk-6-src-b20-21_jun_2010),事实证明,创建任何线程的唯一方法是调用您提供的ThreadFactory(在我的测试用例中从未调用过,因为我没有'不创建任何工作,我不调用prestartCoreThreadpreStartAllCoreThreads)。因此,在 OpenJDK 的 ThreadPoolExecutor 中没有明显的原因进行安全检查(就像在 sun-jdk-1.6 中所做的那样,但我没有源代码):

checkShutdownAccess在做任何事情之前被调用...

如您所见,它无条件地调用checkPermission(shutdownPerm)安全管理器.... shutdownPerm 定义为... private static final RuntimePermission shutdownPerm = new RuntimePermission("modifyThread");

...据我所知,这绝对没有意义,因为这modifyThread意味着访问系统线程,并且这里没有系统线程在起作用,事实上,根本没有线程,因为我没有提交任何工作或预启动,即使有线程,它们也会是我的线程,因为我传入了ThreadFactory. 规范没有说任何关于神奇死亡的内容,除了如果涉及系统线程(它们不是),可能会有一个SecurityException.

基本上,为什么我不能删除检查系统线程访问的行?我认为没有安全隐患需要它。还有其他人怎么没有遇到过这个问题???我在问题跟踪器上看到了一篇帖子,他们通过将调用更改为 来“解决”了这个问题shutdownNowshutdown显然,这并没有为他们解决这个问题。