Поддержка аутентификации / авторизации Kerberos на клиенте / сервере JMX, работающем на Java 6 - PullRequest
6 голосов
/ 16 декабря 2011

У меня есть JMX-сервер, который регистрирует чтение бинов из локального файла и делает их доступными для других клиентов JMX по требованию.Доступ к серверу можно получить либо с помощью «jconsole», либо с помощью приложения Java, работающего в контейнере Tomcat.

Я хочу добавить аутентификацию, чтобы предотвратить доступ «неизвестного» идентификатора к серверу JMX.Для этого я добавил Kerberos аутентификацию @ сервер, используя следующие параметры JVM

-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=5555
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=false
-Djava.security.auth.login.config=./conf/jaas.conf
-Djava.security.krb5.conf=./conf/krb5.conf
-Dcom.sun.management.jmxremote.login.config=MyKrbAuth
-Ddynamic.mbean.store=./conf/mbeans
-Djava.net.preferIPv4Stack=true

, мой jaas.conf выглядит следующим образом >>

MyKrbAuth {
com.sun.security.auth.module.Krb5LoginModule required debug=true debugNative=true;
};

Когда я запускаю свой сервер JMX с вышеуказанной конфигурациейи попробуйте подключить его с помощью "jconsole", я получаю следующее исключение на стороне клиента, и соединение не удается >>

Cipher: Crypto Permission check failed
Cipher: granted: (CryptoPermission * 128)
Cipher: requesting: (CryptoPermission AES 256)

Но на сервере аутентификация кажется успешной >>

[java] [STARTED] Mbean Server
[java] Debug is  true storeKey false useTicketCache false useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false
[java] [Krb5LoginModule] user entered username: username
[java] 
[java] Acquire TGT using AS Exchange
[java] principal is user@localhost.com
[java] EncryptionKey: keyType=3 keyBytes (hex dump)=0000: FD 46 7C 02 19 9B 34 E9   
[java] EncryptionKey: keyType=1 keyBytes (hex dump)=0000: FD 46 7C 02 19 9B 34 E9   
[java] EncryptionKey: keyType=23 keyBytes (hex dump)=0000: FE 6D 82 01 8A D7 AB 60   98 
[java] EncryptionKey: keyType=16 keyBytes (hex dump)=0000: 89 02 31 5D F7 5B 3E 89   BC F7 8A 01 A1 80 C7 
[java] EncryptionKey: keyType=17 keyBytes (hex dump)=0000: A5 67 71 17 F6 57 A9 26   01 09 B1 EB 75 46 6C 
[java] 
[java] Commit Succeeded 
[java] 

Сверху кажется, что клиент не может декодировать ответ (который зашифрован AES256). Как это исправить ??

Ответы [ 3 ]

4 голосов
/ 16 декабря 2011

Вам необходимо включить файл политики шифрования неограниченной силы (ссылка на Java 6, см. java.oracle.com для других) в вашу установку Java.По умолчанию Java не позволяет вам использовать надежное шифрование, такое как AES256 (из-за абсурдных законов США об экспорте, которые считают шифрование оружием / боеприпасом).Файл политики разблокирует более надежное шифрование.

3 голосов
/ 17 декабря 2011

удалось решить вышеупомянутую проблему.Вот шаги, чтобы ввести аутентификацию / авторизацию Kerberos на вашем клиенте / сервере JMX

Чтобы включить сервер Kerberos @ JMX,

  1. Запустить сервер со следующим набором аргументов =>

    -Dcom.sun.management.jmxremote=true
    -Dcom.sun.management.jmxremote.port=<port_no>
    -Dcom.sun.management.jmxremote.authenticate=true
    -Dcom.sun.management.jmxremote.ssl=false
    -Djava.security.auth.login.config=<locatin_of_jaas.conf>
    -Djava.security.krb5.conf=<locatin_of_krb5.conf>
    -Dcom.sun.management.jmxremote.login.config=<name_of_login_config_to_be_used>
    -Djava.net.preferIPv4Stack=true
    
  2. Добавить запись доступа в $ JAVA_HOME / jre / lib / management / jmxremote.access.Как только пользователь будет аутентифицирован, доступ на чтение / запись к серверу JMX будет предоставлен на основе jmxremote.access.Расположение файла .access можно указать, используя следующую jvm arg при запуске сервера

    -Dcom.sun.management.jmxremote.access.file=<acees_control_file>    
    

Чтобы включить Kerberos @ JMX Client (jconsole)

  1. Запустите jconsole с опцией отладки и подключитесь к серверу

    jconsole -J-Djava.security.debug=all
    
  2. , если запрашивается шифрование AES256, затем загрузите файлы jar политики криптографии неограниченной силы , извлеките и поместитефайлы политики в $ JAVA_HOME / jre / lib / security /.[Спасибо Марку за то, что он указал на включение политики.]

Выше должен работать Kerberos как на стороне клиента JMX, так и на стороне сервера JMX

Если проблема все еще остается в соединениизатем вы можете включить подробную отладку для jconsole с помощью файла logging.properties =>

handlers = java.util.logging.ConsoleHandler
.level = INFO
java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
// Use FINER or FINEST for javax.management.remote.level - FINEST is very verbose...
javax.management.level = FINEST
javax.management.remote.level = FINER

и запустить jconsole с помощью

jconsole -J-Djava.util.logging.config.file=<location_of_logging.properties>
0 голосов
/ 29 декабря 2011

Я следовал приведенным выше инструкциям и смог запустить аутентификацию Kerberos при условии, что я ввел свой ИД пользователя и пароль в jconsole. Это неизбежно отправляет мой пароль по сети в виде открытого текста, так как я установил com.sun.management.jmxremote.ssl = false на сервере.

Удалось ли вам подключить jconsole с помощью кэшированного билета на стороне клиента? Например, если вы сделали:

kinit user
Password for user@REALM:
New ticket is stored in cache file C:\Users\user\krb5cc_user

затем попытался подключить jconsole к серверу без ввода вашего ИД пользователя / пароля?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...