Spec-Zone .ru
спецификации, руководства, описания, API
|
Содержание | Предыдущий | Затем | Расширения управления Java (JMX) Технологическое Учебное руководство |
Эта глава дает примеры того, как установить технологические средства защиты JMX, как описано в следующих разделах:
Предостережение: Приложения должны запросить пользователя вводить пароли вместо того, чтобы ожидать, что пользователь обеспечит их на командной строке. Используйте безопасные механизмы аутентификации в производственных системах.
Самый простой тип безопасности, которую можно использовать с технологией JMX, основан на шифровании, имени пользователя и аутентификации по паролю, и управлении доступом к файлу.
Можно найти пример соединителя RMI с простой безопасностью в каталоге work_dir/jmx_examples/Security/simple
.
/jmx_examples
/Security/simple
каталог.
В этом каталоге Вы найдете следующие каталоги:
/server
, содержа файлServer.java
/config
, содержа конфигурационные файлы безопасности:/mbeans
, содержа следующие файлы:/client
, содержа следующие файлы:*.java
и *.properties
файлы в текстовом редакторе
Эти файлы будут проанализированы в следующих разделах.
Server.java
class показывают в ПРИМЕРЕ КОДА 5-1.
public class Server { public static void main(String[] args) { try { MBeanServer mbs = MBeanServerFactory.createMBeanServer(); HashMap env = new HashMap(); SslRMIClientSocketFactory csf = new SslRMIClientSocketFactory(); SslRMIServerSocketFactory ssf = new SslRMIServerSocketFactory(); env.put(RMIConnectorServer. RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE,csf); env.put(RMIConnectorServer. RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE,ssf); env.put("jmx.remote.x.password.file", "config" + File.separator + "password.properties"); env.put("jmx.remote.x.access.file", "config" + File.separator + "access.properties"); JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://localhost:9999/server"); JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs); cs.start(); } catch (Exception e) { e.printStackTrace(); } } }
Server
class, показанный в ПРИМЕРЕ КОДА 5-1, создает сервер MBean mbs
, и заполняет карту среды env
с безопасным RMI клиент снабжают фабрику сокетом csf
, безопасный сервер RMI снабжает фабрику сокетом ssf
, и файлы свойств password.properties
и access.properties
.
Файл свойств password.properties
содержит имя пользователя и пароль и получается доступ, используя JMX Удаленный API-интерфейс JMXAuthenticator
. Используя свойство jmx.remote.x.
password.file
то же самое как создание основанного на пароле JMXAuthenticator
и передача этого в среду отображается через jmx.remote.authenticator
свойство.
Файл свойств access.properties
содержит имя пользователя и уровень права доступа, которое может быть также readwrite
или readonly
. Это представляет уровень доступа, который этот пользователь может иметь к операциям сервера MBean. Это основанное на файле управление доступом реализуется, используя технологический интерфейс JMX MBeanServerForwarder
, который обертывает реальный сервер MBean в контроллере доступа сервер MBean. Контроллер доступа сервер MBean только передает запросы к реальному серверу MBean после выполнения соответствующих проверок.
Server
создает службу JMX URL, названный url
, для соединителя RMI, который будет управлять по значению по умолчанию транспортом JRMP, и регистрировать тупик соединителя RMI в реестре RMI на порту 9999
из локального узла.
Сервер MBean mbs
, конверт карты среды и служба URL url
ко все передают JMXConnectorServer
чтобы создать новое, защитите названный сервер соединителя JMX cs
.
SimpleStandardMBean
class определяет тот же самый прямой интерфейс MBean, как использовался в Главе 3, "Соединители JMX".
SimpleStandard
class определяет тот же самый прямой MBean, как использовался в Главе 3, "Соединители JMX".
ClientListener
class определяет того же самого прямого слушателя уведомления, как использовался в Главе 3, "Соединители JMX".
Client.java
class показывают в ПРИМЕРЕ КОДА 5-1.
public class Client { public static void main(String[] args) { try { HashMap env = new HashMap(); String[] credentials = new String[] { "username" , "password" }; env.put("jmx.remote.credentials", credentials); JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://localhost:9999/server"); JMXConnector jmxc = JMXConnectorFactory.connect(url, env); MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); String domains[] = mbsc.getDomains(); for (int i = 0; i < domains.length; i++) { System.out.println("Domain[" + i + "] = " + domains[i]); } ObjectName mbeanName = new ObjectName("MBeans:type=SimpleStandard"); mbsc.createMBean("SimpleStandard", mbeanName, null, null); // Perform MBean operations [...] mbsc.removeNotificationListener(mbeanName, listener); mbsc.unregisterMBean(mbeanName); jmxc.close(); } catch (Exception e) { e.printStackTrace(); } } }
Client
class, показанный в ПРИМЕРЕ КОДА 5-1, заполняет карту среды env
с рядом учетных данных, а именно, username
и password
ожидаемый Server
. Эти учетные данные тогда даются экземпляру JMXConnector
именованный jmxc
когда к службе URL тупика соединителя и карты среды передают JMXConnectorFactory.connect()
. Через jmxc
, Client
соединяется с сервером MBean, запущенным Server
, и выполняет операции MBean.
Когда соединение устанавливается, учетные данные, предоставленные в карте среды env
отправляются серверу. Сервер тогда вызывает authenticate()
метод JMXAuthenticator
интерфейс, передавая удостоверения клиента как параметры. authenticate()
метод аутентифицирует клиент и возвращает предмет, который содержит набор принципалов, на которые будут выполняться проверки управления доступом.
Чтобы выполнить пример соединителя RMI с простой безопасностью, выполните следующие шаги:
$ javac mbeans/SimpleStandard.java \ mbeans/SimpleStandardMBean.java \ server/Server.java \ client/Client.java \ client/ClientListener.java
Server
.
$
java -classpath server:mbeans \
-Djavax.net.ssl.keyStore=config/keystore \
-Djavax.net.ssl.keyStorePassword=password \
Server &
Вы будете видеть подтверждение создания сервера MBean и соединителя RMI.
Client
.
$
java -classpath client:server:mbeans \
-Djavax.net.ssl.trustStore=config/truststore \
-Djavax.net.ssl.trustStorePassword=trustword \
Client
Вы будете видеть подтверждение создания клиента соединителя, различных операций MBean, сопровождаемых закрытием соединения.
Как можно видеть, все вышеупомянутое, кажется, продолжается точно тем же самым способом как основной пример соединителя RMI, показанный в Главе 3, "Соединители JMX". Однако, если Вы должны были открыться password.properties
и измените пароль, Вы видели бы a java.lang.SecurityException
когда Вы запускались Client
, и связь прервалась бы.
Если Ваша реализация требует, чтобы клиентский конец соединения выполнил различные операции от имени многочисленных пользователей или приложений, используя механизмы безопасности, демонстрируемые в Разделе "Простая Безопасность", каждый различный пользователь потребовал бы одного безопасного соединения для каждой работы, которую это выполняет. Если Вы ожидаете, что Ваши клиенты соединителя будут взаимодействовать с многочисленными пользователями, можно уменьшить загрузку на своей системе, реализовывая подчиненную делегацию. Подчиненная делегация устанавливает единственное безопасное соединение для пользователя, и это соединение может использоваться, чтобы выполнить связанные операции от имени любого числа пользователей. Само соединение делается аутентифицируемым пользователем. Если аутентифицируемому пользователю предоставили a SubjectDelegationPermission
это позволяет этому действовать от имени другого пользователя, тогда операции могут быть выполнены по соединению от имени того пользователя.
Можно найти пример безопасного соединителя RMI, который реализует подчиненную делегацию в каталоге work_dir/jmx_examples/Security/subject_delegation
.
/jmx_examples
/Security/subject_delegation
каталог
В этом каталоге Вы найдете следующие каталоги:
/server
, содержа файл Server.java
:/config
, содержа конфигурационные файлы безопасности:/mbeans
, содержа следующие файлы:/client
, содержа следующие файлы:*.java
и *.properties
файлы в текстовом редакторе
Эти файлы будут проанализированы в следующих разделах.
Server.java
class показывают в ПРИМЕРЕ КОДА 5-1:
public class Server { public static void main(String[] args) { try { MBeanServer mbs = MBeanServerFactory.createMBeanServer(); HashMap env = new HashMap(); env.put("jmx.remote.x.password.file", "config" + File.separator + "password.properties"); env.put("jmx.remote.x.access.file", "config" + File.separator + "access.properties"); JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://localhost:9999/server"); JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs); cs.start(); } catch (Exception e) { e.printStackTrace(); } } }
ПРИМЕР КОДА 5-1 начинается с создания сервера MBean mbs
, и совокупность карты среды env
с файлом пароля и файлом доступа, вызванным password.properties
и access.properties
соответственно:
Server
тогда создает названный сервер соединителя cs
, и запускает это точно таким же образом как в предыдущих примерах соединителя RMI.
java.policy
файл предоставляет username
a SubjectDelegationPermission
таким образом, это может выполнить операции от имени пользователя delegate
, экземпляр JMXPrincipal
создаваемый Client
class. java.policy
файл требуется, запускаясь Server
class.
SimpleStandardMBean
class определяет тот же самый прямой интерфейс MBean, как использовался в предыдущих примерах.
SimpleStandard
class определяет тот же самый прямой MBean, как использовался в предыдущих примерах.
ClientListener
class определяет того же самого прямого слушателя уведомления, как использовался в предыдущих примерах.
Client.java
class показывают в ПРИМЕРЕ КОДА 5-1:
public class Client { public static void main(String[] args) { try { HashMap env = new HashMap(); String[] credentials = new String[] { "username" , "password" }; env.put("jmx.remote.credentials", credentials); JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://localhost:9999/server"); JMXConnector jmxc = JMXConnectorFactory.connect(url, env); Subject delegationSubject = new Subject(true, Collections.singleton(new JMXPrincipal("delegate")), Collections.EMPTY_SET, Collections.EMPTY_SET); MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(delegationSubject); String domains[] = mbsc.getDomains(); ObjectName mbeanName = new ObjectName("MBeans:type=SimpleStandard"); mbsc.createMBean("SimpleStandard", mbeanName, null, null); // Perform MBean operations // [...] mbsc.removeNotificationListener(mbeanName, listener); mbsc.unregisterMBean(mbeanName); jmxc.close(); } catch (Exception e) { e.printStackTrace(); } } }
ПРИМЕР КОДА 5-1 начинается с создания карты среды env
это заполняется с именем пользователя username
и пароль password
. Эти строки соответствуют имя пользователя и пароль, сохраненный в password.properties
файл, который сохранен Server
аутентифицировать пользователей, получающих доступ к серверу соединителя.
Технологический клиент соединителя JMX jmxc
создается таким же образом как в предыдущих примерах соединителя RMI, с именем пользователя и паролем, который передают в карту среды env
.
Client
тогда создает экземпляр Subject
, вызванный delegationSubject
, с a Principal
это - экземпляр JMXPrincipal
, именованный delegate
.
Соединение сервера MBean, названное mbsc
, создается, вызывая getMBeanServerConnection()
метод JMXConnector
, с delegationSubject
переданный в в качестве параметра. Это соединение сервера MBean поэтому позволяет операциям выполняться на удаленном сервере MBean от имени принципалов, сохраненных в delegationSubject
, который в этом примере является JMXPrincipal
именованный delegate
.
Пример продолжается, создавая и регистрируясь SimpleStandard
MBean в сервере MBean, и операции выполнения на этом, точно таким же образом как в предыдущих примерах.
Чтобы выполнить безопасный пример соединителя RMI с подчиненной делегацией, выполните следующие шаги:
$ javac mbeans/SimpleStandard.java \ mbeans/SimpleStandardMBean.java \ server/Server.java \ client/Client.java \ client/ClientListener.java
$
экспорт CLASSPATH=server; rmiregistry 9999 &
Server
.Вы будете видеть подтверждение создания сервера MBean, инициализации карты среды, создания соединителя RMI, и регистрации соединителя в сервере MBean.
Client
.$
java - путь к классу client:server:mbeans Клиент
Вы будете видеть подтверждение создания клиента соединителя, создания предмета делегации, соединения с сервером MBean и различными операциями MBean, сопровождаемыми закрытием соединения.
Можно реализовать более мелкомодульный уровень безопасности в Ваших соединителях, управляя пользовательским доступом через Службу Аутентификации и авторизации Java (JAAS) и платформу Java Standard Edition (Java SE) Архитектура безопасности. JAAS и Java безопасность SE основаны на использовании менеджеров безопасности и файлов политики, чтобы выделить разные уровни доступа к различным пользователям. Следовательно, можно решить более точно, который пользователям разрешают выполнить который операции.
Эти два примера в этом разделе очень подобны показанным в Разделе "Простая Безопасность" с различием, являющимся, что простое, основанное на файле управление доступом было заменено основанным на политике управлением доступом.
Можно найти пример соединителя RMI с мелкомодульной безопасностью в каталоге work_dir/jmx_examples/Security/fine_grained
.
/jmx_examples
/Security/fine_grained.
В этом каталоге Вы найдете следующие каталоги:
/server
, содержа файлServer.java
/config
, содержа конфигурационные файлы безопасности:/mbeans
, содержа следующие файлы:/client
, содержа следующие файлы:*.java
и *.properties
файлы в текстовом редакторе.
Server.java
class, используемый в этом примере, очень подобен тому, используемому в примере соединителя RMI с простой безопасностью. Единственная разница - то, что есть нет access.properties
файл, чтобы отобразиться в среду отображается в мелкомодульном примере. Иначе, эти два класса идентичны.
java.policy
файл предоставляет следующие полномочия:
server
кодовая база, так, чтобы сервер соединителя мог создать соединители, и затем выполнить операции, которые требуют удаленные пользовательские вызовыMBeanTrustPermission
к mbeans
кодовая база, позволяя доверяла MBeans, чтобы зарегистрироваться в сервере MBeanJMXPrincipal
именованный username.
SimpleStandardMBean
class определяет тот же самый прямой интерфейс MBean, как использовался в предыдущих примерах.
SimpleStandard
class определяет тот же самый прямой MBean, как использовался в предыдущих примерах.
ClientListener
class определяет того же самого прямого слушателя уведомления как, как использовался в предыдущих примерах.
Client.java
class является точно тем же самым как тем, используемым в примере соединителя RMI с простой безопасностью.
Чтобы выполнить пример соединителя RMI с мелкомодульной безопасностью, выполните следующие шаги:
$ javac mbeans/SimpleStandard.java \ mbeans/SimpleStandardMBean.java \ server/Server.java \ client/Client.java \ client/ClientListener.java
$
экспорт CLASSPATH=server; rmiregistry 9999 &
Server
.
$
java -classpath server:mbeans \
-Djavax.net.ssl.keyStore=config/keystore \
-Djavax.net.ssl.keyStorePassword=password \
-Djava.security.manager \
-Djava.security.policy=config/java.policy \
Server &
Вы будете видеть подтверждение инициализации карты среды, создание сервера MBean и соединителя RMI.
Client
. $ java -classpath client:server:mbeans \ -Djavax.net.ssl.trustStore=config/truststore \ -Djavax.net.ssl.trustStorePassword=trustword \ Client
Вы будете видеть подтверждение создания клиента соединителя, соединения с сервером RMI и различными операциями MBean, сопровождаемыми закрытием соединения.
Содержание | Предыдущий | Затем