Конструктор MQQueueManager зависает при установке SecurityManager - PullRequest
0 голосов
/ 06 июня 2018

Host foo - это клиент IBM MQ (т. Е. Соединение в режиме клиента по TCP / IP).Панель хоста - это система, в которой работает администратор очередей.Bar предоставляет разрешение (по IP-адресу) для foo на создание экземпляра объекта com.ibm.mq.MQQueueManager, но не предоставляет разрешение на размещение foobar.

Поэтому я инкапсулирую все контакты IBM MQ в новыйприложение работает на Foo.Вместе с foobar клиент-серверное приложение формируется с использованием сокетов, где foo - сервер, а foobar - клиент.Foo по-прежнему является клиентом IBM MQ, как и раньше.

Пока что все, что я пытался сделать с foo в новом приложении (связанном с MQ), - это создать объект 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

Следующее разрешение на 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] ...

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

В IBM MQ v8 KC есть страница " Запуск классов IBM MQ для приложений Java в Java Security Manager ".

На этой странице указано, что относится к клиентским соединениям MQ:

//For the client transport type.
permission java.net.SocketPermission "*","connect,resolve";

Единственное, что я заметил, это отсутствие пробелов в приведенном выше примере по сравнению с тем, что вы опубликовали, также вам не нужно было бы предоставлять разрешение accept, и я также заметил в sunдокументация о том, что resolve подразумевается с connect, поэтому в этом нет особой необходимости.

Существует множество других настроек, связанных с другими разрешениями, которые могут вам понадобиться, поэтому я предлагаю рассмотреть приведенную выше страницу для получения более подробной информации..


Вы можете взять трассировку IBM MQ Classes for Java, используя следующее системное свойство java:

-Dcom.ibm.msg.client.commonservices.trace.status=ON

По умолчанию трассировка будет выводиться в файл в текущем каталоге с именемmqjms_%PID%.trc, где %PID% заменяется идентификатором вашего процесса Java.

Если вы хотите указать другое имя файла или путь, вы можете добавить следующееСистемное свойство java:

-Dcom.ibm.msg.client.commonservices.trace.outputName=/tmp/x/y/z/mqjms_%PID%.trc 

Пример команды с обоими:

java -Dcom.ibm.msg.client.commonservices.trace.status=ON -Dcom.ibm.msg.client.commonservices.trace.outputName=mqjms_%PID%.trc SomeJavaApp

Может помочь трассировка менеджера безопасности Java, вы можете включить ее, добавив следующую систему Javaсвойство:

-Djava.security.debug="access,failure"
0 голосов
/ 06 июня 2018

Но мы получаем некоторое вмешательство во взаимодействие между foo и bar.Помехи исходит от SecurityManager.Не запускайте с установленным SecurityManager, и foo может создать MQQueueManager.Запустите с SecurityManager, и foo зависнет в конструкторе MQQueueManager.

Это просто странно.Где в документации MQ сказано использовать Java SecurityManager.Кто-то дал вам плохую информацию.Кроме того, вы не делаете MQ-безопасность с SecurityManager.

Следующее разрешение на foo приводит к зависанию конструктора MQQueueManager.Разрешение java.net.SocketPermission "bar", "connect, accept";

Почему вы ограничиваете возможности клиентской библиотеки MQ?Если он не может прослушивать и разрешать протокол tcp, он не будет работать.Просто удали эту строку.

...