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

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

то, что я хочу, это добавить аутентификацию, чтобы предотвратить "неизвестную" идентификацию доступа к серверу JMX. Для этого я добавил Kerberos authentication @ server, используя следующие параметры 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 ответов


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


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

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

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

    -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.доступ. После аутентификации пользователя доступ для чтения / записи на сервер JMX будет предоставлен на основе jmxremote.доступ. Расположение .файл доступа может быть предоставлен с помощью следующего JVM arg при запуске сервера

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

включить клиент Kerberos @ JMX (jconsole)

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

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

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

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

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>

я следовал инструкциям выше и сумел получить работу проверки подлинности kerberos при условии, что я ввел свой идентификатор пользователя и пароль в jconsole. Неизбежно это отправляет мой пароль по проводу в ясном тексте, поскольку я установил com.солнце.управление.jmxremote.ssl=false на сервере.

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

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

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