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
ユーティリティを使用して管理対象サーバに直接接続し、その StdoutSeverityLevel
属性の値をルックアップします。サーバの ServerMBean
に属するこの属性は、サーバが標準出力に出力するメッセージの重大度を決めるしきい値を指定します。
値の変更には管理 MBean のみを使用することをお勧めしますが、ローカル コンフィグレーション MBean の値をルックアップする方が適切な場合もあります。たとえば、管理サーバがダウンした場合は、管理 MBean にアクセスすることができなくなります。
-username
引数および -password
引数を使用して、MBean の属性を表示するパーミッションを持つユーザの資格を指定します。MBean の表示や変更のパーミッションの詳細については、『WebLogic リソースのセキュリティ』の「セキュリティ ロール」を参照してください。ローカル コンフィグレーション MBean を指定する場合は、MBean
が削除され、ServerMBean
インタフェース名に Config
が追加されます。ServerMBean
のローカル コンフィグレーション インスタンスの -type
値は ServerConfig
ですが、対応する管理 MBean インスタンスの -type
値は Server
です。詳細については、表 3-1 の Type
の説明を参照してください。
コード リスト 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 管理サービスを利用してその変更を管理対象サーバに伝播します。
この例で、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 のコンフィグレーションと管理』の「サーバのルート ディレクトリ」を参照してください。
ユーザの入力したパスワードなどの値と暗号化された属性値とを比較するには、次の手順に従います。
コード リスト 4-3 に示すクラスでは、カスタム ID キー ストア用に、暗号化されたパス フレーズを取得して表示します。続いてそのパス フレーズを変更し、新しく暗号化されたパス フレーズを取得して表示します。
この例ではコンフィグレーション値を変更するので、管理 MBean の値も変更されます。
MBeanHome.getMBean(String name, String type)
API を使用して、myserver というサーバ インスタンスの ServerMBean
管理 MBean の型保証インタフェースを取得します。ServerMBean.getCustomIdentityKeyStorePassPhraseEncrypted()
を呼び出して、カスタム ID キー ストア用に暗号化されたパス フレーズを取得します。
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();
}
}
}
![]() ![]() |
![]() |
![]() |