ナビゲーションをスキップ

WebLogic JMX Service プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

コンフィグレーション情報のアクセスと変更

管理サーバ (管理 MBean) 上のコンフィグレーション MBean は、ドメイン内のすべての WebLogic Server インスタンスの管理対象リソースをコンフィグレーションします。各サーバ インスタンスでは、パフォーマンス向上のために管理 MBean のローカル レプリカを作成して使用します。それらのローカル レプリカは、ローカル コンフィグレーション MBean と呼びます。

注意 : ローカル コンフィグレーション MBean の値は表示することができますが、ローカル コンフィグレーション MBean の属性値は変更しないことをお勧めします。代わりに、管理 MBean の属性の値のみ変更します。他の管理対象サーバのデータをレプリケートする際、管理対象サーバは管理 MBean に格納された値を使用します。管理 MBean とローカル コンフィグレーション MBean の間で値に相違があると、通信に問題が起こることがあります。

以下の節では、weblogic.Admin ユーティリティ、JMX MBeanServer API、および WebLogic Server 型保障インタフェースを使用して WebLogic Server リソースのコンフィグレーションをプログラム的に表示して変更する例を紹介します。

 


例 : weblogic.Admin を使用して標準出力のメッセージ レベルを表示する

この例では、weblogic.Admin ユーティリティを使用して管理対象サーバに直接接続し、その StdoutSeverityLevel 属性の値をルックアップします。サーバの ServerMBean に属するこの属性は、サーバが標準出力に出力するメッセージの重大度を決めるしきい値を指定します。

値の変更には管理 MBean のみを使用することをお勧めしますが、ローカル コンフィグレーション MBean の値をルックアップする方が適切な場合もあります。たとえば、管理サーバがダウンした場合は、管理 MBean にアクセスすることができなくなります。

コマンド例は次のように機能します。

  1. -url 引数を使用して、myHost というホストで動作しポート 8001 でリスンする管理対象サーバに接続します。
  2. -username 引数および -password 引数を使用して、MBean の属性を表示するパーミッションを持つユーザの資格を指定します。MBean の表示や変更のパーミッションの詳細については、『WebLogic リソースのセキュリティ』の「セキュリティ ロール」を参照してください。
  3. GET コマンドを使用して、ローカル コンフィグレーション MBean を取得します。
  4. ローカル コンフィグレーション MBean を指定する場合は、MBean が削除され、ServerMBean インタフェース名に Config が追加されます。ServerMBean のローカル コンフィグレーション インスタンスの -type 値は ServerConfig ですが、対応する管理 MBean インスタンスの -type 値は Server です。詳細については、表 3-1Type の説明を参照してください。

コード リスト 4-1 メッセージ レベルのコンフィグレーション

java weblogic.Admin -url myHost:8001 -username weblogic -password weblogic 
GET -pretty -type ServerConfig
---------------------------
MBeanName: "medrec:Location=MedRecServer,Name=MedRecServer,Type=ServerConfig"
AcceptBacklog: 50
AdministrationPort: 0
...
        StdoutDebugEnabled: false
StdoutEnabled: true
StdoutFormat: standard
StdoutLogStack: true
StdoutSeverityLevel: 16

 


例 : 標準出力のメッセージ レベルをコンフィグレーションする

この例のクラスは、weblogic.management.configuration.ServerMBean の StdoutSeverityLevel 属性の値を変更して、MedRecServer というサーバ インスタンスが標準出力に送信するメッセージのレベルを変更します。

この例はコンフィグレーション値を変更するので、管理 MBean の値を変更し、WebLogic 管理サービスを利用してその変更を管理対象サーバに伝播します。

クラス例は次のように機能します。

  1. JNDI を使用して、管理サーバ上の管理 MBeanHome インタフェースをルックアップします。
  2. MBeanHome.getMBean(String name, String type) API を使用して、Server1 というサーバ インスタンスの ServerMBean 管理 MBean の型保証インタフェースを取得します。
  3. 型保証インタフェースを使用して、ServerMBean.setStdoutSeverityLevel メソッドを呼び出し、重大度を 64 に設定します。

この例で、weblogic は MBean 属性を表示および変更するパーミッションを持つユーザです。MBean の表示や変更のパーミッションの詳細については、『WebLogic リソースのセキュリティ』の「セキュリティ ロール」を参照してください。

コード リスト 4-2 標準出力の重大度のコンフィグレーション

import java.util.Set;
import java.util.Iterator;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.management.MBeanServer;
import javax.management.Attribute;
import java.lang.Object;
import weblogic.jndi.Environment;
import weblogic.management.MBeanHome;
import weblogic.management.configuration.ServerMBean;
public class ChangeStandardOut1 {
    public static void main(String[] args) {
        MBeanHome home = null;
        ServerMBean server = null;
        //ドメイン変数
        String url = "t3://localhost:7001";
        String username = "weblogic";
        String password = "weblogic";
        String serverName = "Server1";
        //初期コンテキストを設定
        try {
            Environment env = new Environment();
            env.setProviderUrl(url);
            env.setSecurityPrincipal(username);
            env.setSecurityCredentials(password);
            Context ctx = env.getInitialContext();
            //管理 MBeanHome を取得
            home = (MBeanHome) ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);
            // MBeanHome.getMBean(name, type) を使用して ServerMBean の
            // 型保証インタフェースを取得
            server = (ServerMBean)home.getMBean(serverName,"Server");
            // ServerMBean.setStdoutSeverityLevel を使用
            server.setStdoutSeverityLevel(64);
            //  操作が成功したことをフィードバック
            System.out.println("Changed standard out severity level to: " +
                                 server.getStdoutSeverityLevel());
        } catch (Exception e) {
            System.out.println("Caught exception: " + e);
        }
    }
}

 


暗号化された値の設定と取得

権限のないアクセスからパスワードなどの重要なデータを保護するために、コンフィグレーション MBean のいくつかの属性は暗号化されます。そうした属性の値はドメインの config.xml ファイルに暗号化された文字列として保持され、メモリ内の値は暗号化されたバイト配列の形で表されます。暗号化されている属性は、名前が Encrypted で終わります。たとえば JDBCConnectionPoolMBean では、データベースへのアクセスに使用されるパスワードが PasswordEncrypted という名前の属性として公開されます。

以下の節では、暗号化された属性の扱い方について説明します。

暗号化された属性の値の設定

暗号化された属性の値を設定するには、String 型のオブジェクトをバイト配列としてエンコードし、出力を直接パラメータとしてセッター メソッドに渡します。ここで、バイト配列を変数に割り当てないでください。変数に割り当てると、暗号化されていないバイト配列がガベージ コレクションによって削除されるまでメモリ内に残ることになります。

たとえば weblogic.management.MBeanHome を使用する場合、次のようにします。

ServerMBean.setCustomIdentityKeyStorePassPhraseEncrypted(
    (new String("myNewCustomIdentityKeyStorePassPhrase")).getBytes());

weblogic.management.RemoteMBeanServer を使用する場合は、次のようにします。

Attribute passphrase = new Attribute("CustomIdentityKeyStorePassPhrase",
    new String("myNewCustomIdentityKeyStorePassPhrase").getBytes());

String server = "examples:Name=examplesServer,Type=Server";
ObjectName serverOn = new ObjectName(server);
RemoteMBeanServer.setAttribute(serverOn, passphrase);

暗号化された値と暗号化されていない値の比較

管理アプリケーションでは、ユーザが入力するパスワードなどの値と MBean の暗号化された属性値との比較が必要になる場合があります。このような場合に MBean の属性値を復号化すると、権限のないアクセスに対してデータを公開するリスクを負うことになります。そうではなく、ユーザの入力値を暗号化して、暗号化された 2 つの値を比較するようにします。

ユーザの入力値は、当初 MBean の値が暗号化されたのと同じサーバ上で暗号化する必要があります。他のサーバとルート ディレクトリを共有していない限り、各サーバで独自の SALT ファイルを使用してデータが暗号化されるためです。『WebLogic Server のコンフィグレーションと管理』の「サーバのルート ディレクトリ」を参照してください。

ユーザの入力したパスワードなどの値と暗号化された属性値とを比較するには、次の手順に従います。

  1. MBean 内に暗号化された値を設定したサーバと同じサーバ上にユーザの入力値をバイト配列として書き込んでから、そのバイト配列を weblogic.management.EncryptionHelper.encrypt() メソッドに渡します。
  2. MBean の暗号化された値のゲッター メソッドを使用して、その暗号化されたバイト配列を取得します。
  3. たとえば JDBCConnectionPoolMBean.getPasswordEncrypted などを呼び出します。このメソッドからは暗号化されたバイト配列が返されます。

  4. 暗号化された 2 つのバイト配列を比較します。

例 : 暗号化された属性の設定と取得

コード リスト 4-3 に示すクラスでは、カスタム ID キー ストア用に、暗号化されたパス フレーズを取得して表示します。続いてそのパス フレーズを変更し、新しく暗号化されたパス フレーズを取得して表示します。

この例ではコンフィグレーション値を変更するので、管理 MBean の値も変更されます。

クラス例は次のように機能します。

  1. JNDI を使用して、管理サーバ上の管理 MBeanHome インタフェースをルックアップします。
  2. MBeanHome.getMBean(String name, String type) API を使用して、myserver というサーバ インスタンスの ServerMBean 管理 MBean の型保証インタフェースを取得します。
  3. ServerMBean.getCustomIdentityKeyStorePassPhraseEncrypted() を呼び出して、カスタム ID キー ストア用に暗号化されたパス フレーズを取得します。
  4. getCustomIdentityKeyStorePassPhraseEncrypted() メソッドからは、暗号化されたバイト配列が返されます。

  5. 暗号化されたバイト配列を変換して String 型のオブジェクトとし、それを標準出力に出力することにより、暗号化された値を表示します。
  6. 以下の手順で、カスタム ID キー ストア用に新しいパス フレーズを設定します。
    1. 新しいパス フレーズを格納した String 型のオブジェクトを作成します。
    2. String.getBytes() を使用して、String 型オブジェクトの値が格納されたバイト配列を作成します。
    3. そのバイト配列を ServerMBean.setCustomIdentityKeyStorePassPhraseEncrypted メソッドに入力として渡します。

    mbean.setCustomIdentityKeyStorePassPhraseEncrypted((new String("myCustomIdentityKeyStorePassPhrase")).getBytes())

  7. ServerMBean.getCustomIdentityKeyStorePassPhraseEncrypted() を呼び出して、カスタム ID キー ストア用に暗号化されたパス フレーズを取得します。
  8. 暗号化されたバイト配列を変換して String 型のオブジェクトとし、それを標準出力に出力することで、暗号化された値を表示します。

コード リスト 4-3 暗号化された値の設定と取得

import java.util.*;
import java.rmi.RemoteException;
import javax.naming.*;
import javax.management.MBeanServer;
import javax.management.Attribute;
import javax.management.InstanceNotFoundException;
import weblogic.jndi.Environment;
import weblogic.management.WebLogicMBean;
import weblogic.management.MBeanHome;
import weblogic.management.configuration.ServerMBean;
public class GetSetEncrypted {
    private static MBeanHome home = null;
    static MBeanHome getHome(String[] args) {
       Context ctx= null;
       Hashtable ht = new Hashtable();
       ht.put(Context.INITIAL_CONTEXT_FACTORY,
           "weblogic.jndi.WLInitialContextFactory");
       ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
       ht.put(Context.SECURITY_PRINCIPAL, args[0]);
       ht.put(Context.SECURITY_CREDENTIALS, args[1]);
       try {
          System.out.println("Getting the initialContext ...");
          ctx = new InitialContext(ht);
          System.out.println("Got initialContext");
          home = (MBeanHome)ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);
        } catch(Exception e) {
            e.printStackTrace();
       }
       return home;
    }
    static void getsetServerMBean() throws Exception {
       byte[] bytes = null;
       String serverName = "myserver";
       ServerMBean mbean=(ServerMBean)home.getMBean(serverName,"Server");
       System.out.println("Found admin mbean,name=" +
           ((WebLogicMBean)mbean).getObjectName());
       bytes = mbean.getCustomIdentityKeyStorePassPhraseEncrypted();
       if (bytes != null) {
          System.out.println("\n\ngetCustomIdentityKeyStorePassPhraseEncry
                  pted returned=\n" + (new String(bytes)));
       } else {
          System.out.println("\n\ngetEncrypted Attribute returned NULL");
       }
       System.out.println("\n\nInvoking
            setCustomIdentityKeyStorePassPhraseEncrypted() with
            myNewCustomIdentityKeyStorePassPhrase");
       mbean.setCustomIdentityKeyStorePassPhraseEncrypted((new
          String("myNewCustomIdentityKeyStorePassPhrase")).getBytes());
       bytes = mbean.getCustomIdentityKeyStorePassPhraseEncrypted();
       System.out.println("\n\nAfter
            setCustomIdentityKeyStorePassPhraseEncrypted(),
            getCustomIdentityKeyStorePassPhraseEncrypted returned=\n" +
            (new String(bytes)));
    }
    public static void main (String[] args) {
       getHome(args);
       try {
          getsetServerMBean();
       } catch (Exception e) {
          e.printStackTrace();
       }
    }
}

 

フッタのナビゲーションのスキップ  ページの先頭 前 次