3

JConsole を使用してアプリケーション MBean にアクセスし、password.properties ファイルを使用しています。ただし、Sun の仕様によると、このファイルには平文形式のパスワードしか含まれていません。

com.sun.management.jmxremote.password.file=<someLocation>/password.properties

ここで、パスワードを暗号化し、それを JConsole (リモート セクションのユーザー名とパスワード フィールド) からの JMX ユーザー認証に使用したいと考えています。定義済みの暗号化ロジックまたは独自の暗号化アルゴリズムを使用できます。

JMX フレームワークも暗号化されたパスワードを認識できるように、プレーン テキストのパスワードを暗号化されたパスワードに変更するような傍受を知っている人はいますか?

私の現在のパスワードファイル:

guest  guest
admin  admin

暗号化を使用すると、次のようになります。

guest  ENC(RjqpRYbAOwbAfAEDBdHJ7Q4l/GO5IoJidZctNT5oG64=)
admin  ENC(psg3EnDei6fVRuqHeLwOqNTgIWkwQTjI2+u2O7MXXWc=)
4

1 に答える 1

8

com.sun.management.jmxremote.login.configmanagement.propertiesファイル(%JAVA_HOME%/ lib / management / management.propertiesを参照)の構成パラメーターを使用して、使用するオーセンティケーターとLoginModuleを構成できます。

デフォルトは次のとおりです。

JMXPluggableAuthenticator {
    com.sun.jmx.remote.security.FileLoginModule required;
};

プレーンテキストのパスワードファイルを読み取りますjmxremote.password。は任意のLoginModule実装を使用するように再構成できるためcom.sun.jmx.remote.security.JMXPluggableAuthenticator、既存のLoginModuleを選択するか、暗号化されたパスワードファイルを使用する独自の実装を自由に実装できます。

再実装するには、実際に認証を実行し、おそらく置き換えるメソッドをFileLoginModule確認する必要があります。attemptAuthentication(boolean)インターフェイスを実装しjavax.security.auth.spi.LoginModule、指定されたCallbackHandler(init()メソッドから取得します)を使用して、ユーザー名とパスワードを要求します。受信したパスワードを暗号化/ハッシュし、暗号化されたパスワードファイルから読み取ったパスワードと比較します。擬似コード:

public class EncryptedFileLoginModule implements LoginModule {

@Override
public void initialize(Subject subject, CallbackHandler callbackHandler,
        Map<String, ?> sharedState, Map<String, ?> options) {
    this.subject = subject;
    this.callbackHandler = callbackHandler;
}

public boolean login() throws LoginException {
    attemptLogin();
    if (username == null || password == null) {
        throw new LoginException("Either no username or no password specified");
    }
    MessageDigest instance = MessageDigest.getInstance("SHA-1");
    byte[] raw = new String(password).getBytes();
    byte[] crypted = instance.digest(raw);
    // TODO: Compare to the one stored locally
    if (!authenticated) throw new LoginException();
    return true;
}

private void attemptLogin() throws LoginException {
    Callback[] callbacks = new Callback[2];
    callbacks[0] = new NameCallback("username");
    callbacks[1] = new PasswordCallback("password", false);
        callbackHandler.handle(callbacks);
        username = ((NameCallback) callbacks[0]).getName();
        user = new JMXPrincipal(username);
        char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword();
        password = new char[tmpPassword.length];
        System.arraycopy(tmpPassword, 0, password, 0, tmpPassword.length);
        ((PasswordCallback) callbacks[1]).clearPassword();
}

ただし、これはすでにサーバー側であるため、JMX over SSLを適用しない場合でも、パスワードはプレーンテキストで転送されます。したがって、SSLを適用するか、ネットワークを介してクレデンシャルを送信する前にクレデンシャルをエンコードする別のトランスポートプロトコルメカニズムを使用します。

結論として、JAASが提供する既存の認証メカニズムに依存する方がおそらくはるかに優れています。たとえば、ローカルのWindows環境で実行している場合はNTLoginModule、自動ログインにを簡単に使用できます。ただし、ローカルマシンでのみ機能します。

ファイルc:/temp/mysecurity.cfgを作成します。

MyLoginModule {
 com.sun.security.auth.module.NTLoginModule REQUIRED  debug=true debugNative=true;
};

次に、jmxremote.accessファイルを構成して、JMXサーバーへのアクセスを許可するユーザー名またはロールを含めます。

monitorRole readonly
controlRole readwrite ...
mhaller readonly

(動作するまでデバッグモードを有効にすることをお勧めします。ユーザーがログインしようとすると、すべてのユーザー名、ドメイン名、およびグループ名が表示されます)サーバーに次のJVM引数を設定します。

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8686
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=true
-Djava.net.preferIPv4Stack=true
-Djava.security.auth.login.config=c:/temp/mysecurity.cfg
-Dcom.sun.management.jmxremote.login.config=MyLoginModule

アプリケーションを起動し、JConsoleまたはVisualVMを使用して接続してみてください。

JConsoleは使用されませんが、ユーザー名とパスワードを指定する必要があることに注意してください。任意のパスワードと任意のユーザー名が機能します。その理由は、jconsoleがnullユーザー名とnullパスワードで認証を試み、明示的にブロックされているためです。VisualVMは、ユーザーが何も入力していない場合に、ユーザー名とパスワードに空の文字列を使用することで、より適切に機能します。

また、リモート接続時にはNTLoginModuleが機能しないことにも注意してください。より高度なログインモジュールを使用する必要があると思いますが、Sunはすでに十分な数を提供しています。

  • com.sun.security.auth.module.Krb5LoginModule: Kerberosプロトコルを使用してユーザーを認証します
  • com.sun.security.auth.module.LdapLoginModule:(Java 6の新機能):テクニカル接続ユーザーを指定して、LDAPサーバーに対して認証を実行します
  • com.sun.security.auth.module.JndiLoginModule: JNDIコンテキストに登録されているLDAPサーバーに対して認証を実行します
  • com.sun.security.auth.module.KeyStoreLoginModule: Javaキーストアを使用してユーザーを認証します。PINまたはスマートカード認証をサポートします。

LdapLoginModuleを確認する必要があります

于 2009-11-04T23:07:49.687 に答える