|
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, сопровождаемыми закрытием соединения.
Содержание | Предыдущий | Затем