【发布时间】:2018-06-06 17:16:04
【问题描述】:
主机 foo 是一个 IBM MQ 客户端(即通过 TCP/IP 的客户端模式连接)。主机栏是运行队列管理器的系统。 Bar 授予 foo 实例化 com.ibm.mq.MQQueueManager 对象的权限(通过 IP 地址),但不授予托管 foobar 的权限。
因此,我将所有 IBM MQ 联系人封装到一个在 foo 上运行的新应用程序中。与 foobar 一起,正在形成一个客户端/服务器应用程序,使用套接字,其中 foo 是服务器,而 foobar 是客户端。和以前一样,Foo 仍然是 IBM MQ 客户端。
到目前为止,我在新应用程序(MQ 相关)中尝试对 foo 做的只是实例化一个 MQQueueManager 对象。成功了,直到我介绍 java.lang.SecurityManager。
通过 java 命令执行的本地应用程序,例如 foo 上的这个应用程序,默认情况下不会在安装了 SecurityManager 的情况下运行。现在它在安装了 SecurityManager 的情况下运行。原因是控制对在 foo 上运行的这个应用程序的访问。安全策略接受来自 foobar (java.net.SocketPermission) 的连接。这行得通。 foo 的所有者现在可以控制授予 foobar 的权限。
但是我们在 foo 和 bar 之间的交互中受到了一些干扰。干扰来自 SecurityManager。不要在安装了 SecurityManager 的情况下运行,并且 foo 可以实例化 MQQueueManager。使用 SecurityManager 运行,并且 foo 在 MQQueueManager 构造函数中挂起。
Foo 正在使用 https://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html 中描述的 Policy 参考实现
对 foo 的以下权限导致 MQQueueManager 构造函数挂起。
permission java.net.SocketPermission "bar", "connect, accept";
-Dcom.ibm.msg.client.commonservices.trace.status=ON
-Djava.security.debug="access,failure"
... access denied ("java.util.PropertyPermission" "mqs.disable.all.intercept" "read") [java.security.AccessControlException] ...
... access denied ("java.util.PropertyPermission" "mqs.intercept.serializeconn" "read") [java.security.AccessControlException] ...
【问题讨论】:
-
只是为了澄清问题,我从您的问题中了解到,您正试图使用 SecurityManager 通过 IP 地址或主机名锁定从另一个应用程序到您的应用程序的连接,其次您必须允许您的应用程序作为 MQ 客户端连接到队列管理器,您尝试为 MQ 客户端到 MQ 服务器连接添加的安全性不是额外的。
-
MQ 版本,从每个具有 MANIFEST.MF 文件的 com.ibm.mq*.jar 文件来看,似乎是 8.0.0.3。
-
是的,我怀疑那个“连接”操作应该已经足够了。这里的挑战是 MQQueueManager 构造函数是一个黑盒子。
-
您的“只是为了澄清”的评论是完全正确的。 Foo 独自拥有 MQ 的访问权限(在 bar 上)。我不想违反它的精神,所以我让 foo 的所有者控制扩展(抽象)对 foobar 的访问。
-
查看我提供的链接我没有看到提到的那些特定属性,但我建议添加这个并重试
permission java.util.PropertyPermission "mqs.*","read";
标签: java ibm-mq securitymanager