ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護
12c (12.1.2)
E47967-02
  目次へ移動
目次

前
 
次
 

E スクリプトおよびMBeanプログラミングを使用した管理

この付録では、WLSTコマンドとMBeanプログラミングを使用して実行される拡張管理タスクについて説明します。

次の項目について説明します。

E.1 スクリプトを使用したOPSSサービス・プロバイダ・インスタンスの構成

アプリケーションでユーザーおよびロールAPIを使用しており、デフォルト属性(cn)とは異なる認証プロバイダのユーザー属性にアクセスする必要がある場合には、WebLogic管理コンソールを使用して、必要なユーザー属性を使用できるように認証プロバイダを構成します。デフォルトとは異なる属性を使用するユーザーおよびロールAPI以外でも、認証プロバイダの適切な初期化は必要です。

次の手順では、スクリプトを使用して認証プロバイダの初期化を変更する方法について説明します。これにより、構成されたユーザー属性をユーザーおよびロールAPIで使用して、構成された認証プロバイダのデータにアクセスできるようになります。

WebLogicスクリプトの詳細は、『WebLogic Scripting Toolの理解』を参照してください。

サービス・インスタンスのカスタム・プロパティを追加または更新するには、次の手順を実行します。

  1. 次のコンテンツを含むpyスクリプト・ファイルを作成します。

    import sys
    connect('userName', 'userPassword', 'url', 'adminServerName')
    domainRuntime()
    
    val = None
    key = None
    si = None
    for  i in range(len(sys.argv)):
        if sys.argv[i] == "-si":
            si = sys.argv[i+1]
        if sys.argv[i] == "-key":
            key  = sys.argv[i+1]
        if sys.argv[i] == "-value":
            val = sys.argv[i+1]
     
    on = ObjectName("com.oracle.jps:type=JpsConfig")
    sign = ["java.lang.String","java.lang.String","java.lang.String"]
    params = [si,key,val]
    mbs.invoke(on, "updateServiceInstanceProperty", params, sign)
    mbs.invoke(on, "persist", None, None)
    
  2. 作成したスクリプトで、userNameuserPasslocalHostおよびportNumberを、目的のドメインの管理サーバーへの接続に適した文字列に置換します。connectを使用するには、スクリプトが呼び出されたときに接続先のサーバーが稼働している必要があります。

    このスクリプトをファイル/tmp/updateServiceInstanceProperty.pyに保存すると仮定します。

  3. wlst.shファイルが格納されているディレクトリ$ORACLE_HOME/common/binに変更します。

    >cd $ORACLE_HOME/common/bin
    
  4. 次のコマンドを実行します。

    >wlst.sh /tmp/updateServiceInstanceProperty.py -si servInstName -key propKey -value propValue
    

    説明:

    • servInstNameは、変更対象のプロパティがあるサービス・インスタンス・プロバイダの名前です。

    • propKeyは、挿入または変更するプロパティの名前を識別します。

    • propValueは、追加または更新する値の名前です。

    空白文字が含まれている引数は、二重引用符で囲む必要があります。

    前述のコマンドが起動するたびに、渡されたインスタンス・プロバイダにプロパティを追加または更新することによって、ドメイン構成ファイル$DOMAIN_HOME/config/fmwconfig/jps-config.xmlが変更されます。渡されたキーが既存のプロパティの名前と一致する場合、そのプロパティは渡された値で更新されます。

  5. Oracle WebLogicサーバーを再起動します。構成に加えられた変更は、サーバーを再起動しないと有効になりません。

使用例

ここでは、ドメイン構成ファイルに、idstore.ldapという名前の認証プロバイダが含まれていることを前提とします。次の呼出しを実行します。

wlst.sh /tmp/updateServiceInstanceProperty.py -si idstore.ldap -key "myPropName" -value "myValue"

これによって、次のスニペットに示されているように、このインスタンス・プロバイダが持つ指定のプロパティが追加または更新されます。

<serviceInstance provider="idstore.ldap.provider" name="idstore.ldap">
   ...
   <property name="myPropName" value="myValue"/>
   ...
</serviceInstance>

前述の構成を使用して認証プロバイダが初期化されると、ユーザーおよびロールAPIは、ユーザー属性mailを使用して、この認証プロバイダのユーザー情報にアクセスできます。

E.2 MBeanを使用したOPSSサービスの構成

Oracle Platform Security Servicesには、Oracle Enterprise Manager Fusion Middleware ControlおよびOPSSのセキュリティ・スクリプトによってOracle Platform Security Servicesの管理、構成および監視に使用されるJMX準拠のJava EE Beansが用意されています。

MBeansは、Java EEアプリケーションでのみ使用することをお薦めします。

OPSS MBeans API javadocを含むOPSS API javadocsへのリンクは、第G.1項の「OPSS APIリファレンス」に記載されています。

この項の内容は次のとおりです。

E.2.1 サポートされるOPSS MBeansのリスト

表E-1は、サポートされるMBeansとその基本機能、およびタスクを実行するためにカスタム・スクリプトまたはJava SEプログラムで使用するオブジェクト名を示しています。

表E-1 OPSS MBeansのリスト

MBean 機能 MBeanServerの接続名

Jps構成

jps-config.xmlファイルに格納されているドメイン構成データを管理します。このMBeanは、構成データを変更するための唯一の方法として機能します。

更新または書込み操作では、サーバーを再起動して変更を有効にする必要があります。

com.oracle.jps:type=JpsConfig

資格証明ストア

資格証明データ、つまりデフォルトのコンテキストで構成されたストア・サービスを管理します。

更新または書込み操作の場合は、変更を有効にするためにサーバーを再起動する必要はありません。変更はすべて、ただちに有効になります。アクセスは、管理者のみに制限されます。

com.oracle.jps:type=JpsCredentialStore

グローバル・ポリシー・ストア

デフォルトのコンテキストで構成されたポリシー・ストアで、グローバル・ポリシーを管理します。

更新または書込み操作の場合は、変更を有効にするためにサーバーを再起動する必要はありません。変更はすべて、ただちに有効になります。

com.oracle.jps:type=JpsGlobalPolicyStore

アプリケーション・ポリシー・ストア

デフォルトのコンテキストで構成されたポリシー・ストアで、アプリケーション・ポリシーを管理します。

更新または書込み操作の場合は、変更を有効にするためにサーバーを再起動する必要はありません。変更はすべて、ただちに有効になります。

com.oracle.jps:type=JpsApplicationPolicyStore

管理ポリシー・ストア

現在のJMXコンテキストにログインしたユーザーが特定のロールに属しているかどうかを検証します。これによって構成の変更が容易になることはありません。

com.oracle.jps:type=JpsAdminPolicyStore


E.2.2 OPSS MBeanの起動

OPSS MBeanを起動するには、次の2つの基本的な方法があります。

  • Oracle WebLogic Scripting Toolを使用してスクリプトを作成し、実行します(詳細は、『WebLogic Scripting Toolの理解』の「MBeanの移動(WLSTオンライン)」を参照してください)。

  • Javaプログラムを作成します。第E.2.3項の「OPSS MBeansを使用したプログラミング」に、このアプローチを説明するサンプル・プログラムが記載されています。


注意:

別の方法として、Fusion Middleware ControlでMBeanブラウザを使用してMBeanを起動することもできます。ただし、この方法ではかぎられた操作しか実行できず、データの作成手順も複雑です。

このブラウザにアクセスするには、Fusion Middleware Controlにログインし、次の手順を実行します。

  1. 該当するドメインで、メニュー項目「管理サーバー」→「システムMBeanブラウザ」を選択し、「システムMBeanブラウザ」ページを表示します。

  2. 階層が表示されているペインで、ノード「アプリケーション定義のMBeans」「com.oracle.jps」および「ドメイン: myDomain」(この場合のmyDomainはユーザーのドメイン名です)を開きます。この最後のノードの下には、OPSS MBeanごとに1つのノードが表示されます。

  3. このいずれかのノードを開いた後で、アイテムとしてMBeanを選択し、右ペインの「属性」「操作」および「通知」の各タブを使用して、現在の属性値を調べるか、選択したMBeanのメソッドを起動します。

たとえば、「Jps Configuration MBean」は、この階層の次の場所にあります。

Application Defined MBeans/com.oracle.jps/Domain:myDomain/JpsConfig/JpsConfig

このブラウザの詳細は、Fusion Middleware Controlのオンライン・ヘルプ・システムを参照してください。


E.2.3 OPSS MBeansを使用したプログラミング

次のサンプル・コードは、WebLogic Server t3プロトコルを使用してJps Configuration MBeanを起動する方法を示しています。このサンプルでは、次の重要な点に留意してください。

  • 次のJARファイルがクラスパスに入っていることを前提とします。

    • $ORACLE_HOME/oracle_common/modules/oracle.jps_11.1.1/jps-api.jar

    • $ORACLE_HOME/oracle_common/modules/oracle.jps_11.1.1/jps-mbeans.jar

    • $ORACLE_HOME/oracle_common/modules/oracle.jmx_11.1.1/jmxframework.jar

    • $ORACLE_HOME/oracle_common/modules/oracle.idm_11.1.1/identitystore.jar

    • $WEBLOGIC_HOME/server/lib/wljmxclient.jar

  • 接続は、メソッドinitを使用して確立されています。

  • 更新操作の後では必ず、維持のためのコールを行います。

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.openmbean.CompositeData;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;
 
import oracle.security.jps.mas.mgmt.jmx.credstore.PortableCredential;
import oracle.security.jps.mas.mgmt.jmx.credstore.PortablePasswordCredential;
import oracle.security.jps.mas.mgmt.jmx.policy.PortableApplicationRole;
import oracle.security.jps.mas.mgmt.jmx.policy.PortableCodeSource;
import oracle.security.jps.mas.mgmt.jmx.policy.PortableGrant;
import oracle.security.jps.mas.mgmt.jmx.policy.PortableGrantee;
import oracle.security.jps.mas.mgmt.jmx.policy.PortablePermission;
import oracle.security.jps.mas.mgmt.jmx.policy.PortablePrincipal;
import oracle.security.jps.mas.mgmt.jmx.policy.PortableRoleMember;
import oracle.security.jps.mas.mgmt.jmx.util.JpsJmxConstants;
 
public class InvokeJpsMbeans {
    private static JMXConnector connector;
    private static MBeanServerConnection wlsMBeanConn;
    private static ObjectName configName;
    private static ObjectName credName;
    private static ObjectName appPolName;
    private static ObjectName gloPolName;
    private static ObjectName adminPolName;

    private final static String STR_NAME =String.class.getName();

    public static void main(String args[]) {
        // Intialize connection and retrieve connection object
        init();

        //Check registration
        if (isRegistered(configName)) 
            System.out.println("Jps Config MBean is registered");
        if (isRegistered(credName))
            System.out.println("Jps Credential Mbean is registered");
        if (isRegistered(appPolName)) 
            System.out.println("Jps Application policy Mbean is registered");
        if (isRegistered(gloPolName))
            System.out.println("Jps Global policy Mbean is registered");
        if (isRegistered(adminPolName)) 
           System.out.println("Jps Admin Policy Mbean is registered");

        //invoke MBeans
        invokeConfigMBeanMethods();
        invokeCredentialMBeanMethods();
        invokeApplicationPolicyMBeanMethods();
        invokeGlobalPolicyMBeanMethods();
        invokeAdminPolicyMBeanMethhods();
    }
    
    private static void invokeConfigMBeanMethods() {
        String KEY = "myKey";
        String VALUE = "myValue";
        String strVal;
        try {
            strVal = (String) wlsMBeanConn.invoke(configName, "updateProperty",
                     new Object[] { KEY, VALUE }, 
                     new String[] { STR_NAME, STR_NAME });
            wlsMBeanConn.invoke(configName,"persist",null,null);

            strVal = (String) wlsMBeanConn.invoke(configName, "getProperty", 
                     new Object[] { KEY }, new String[] { STR_NAME });
            System.out.println("Updated the property: " + strVal.equals(strVal));

            strVal = (String) wlsMBeanConn.invoke(configName, "removeProperty",
                     new Object[] { KEY }, new String[] { STR_NAME });
            wlsMBeanConn.invoke(configName,"persist",null,null);
        } catch (InstanceNotFoundException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (MBeanException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (ReflectionException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // auto-generated catch block
            e.printStackTrace();
        }
    }
 
private static void  invokeCredentialMBeanMethods() {
        
        String USER = "jdoe";
        String PASSWORD = "welcome1";
        String ALIAS = "mapName";
 String KEY = "keyValue";
         
 PortableCredential cred = new PortablePasswordCredential(USER, PASSWORD.toCharArray());
       
  try {
       //seed a password credential
       wlsMBeanConn.invoke(credName, "setPortableCredential", new Object[] { ALIAS, KEY, cred.toCompositeData(null) }, new String[] { STR_NAME, STR_NAME, CompositeData.class.getName() });
        boolean bContainsMap = (Boolean) wlsMBeanConn.invoke(credName, "containsMap", new Object[] { ALIAS }, new String[] { STR_NAME });
        System.out.println("Credstore contains map: " + ALIAS + " - " +bContainsMap);
 
        boolean bContainsCred = (Boolean) wlsMBeanConn.invoke(credName, "containsCredential", new Object[] { ALIAS, KEY }, new String[] { STR_NAME, STR_NAME });
        System.out.println("Contains Credential; " + bContainsCred);
 
        CompositeData cd = (CompositeData) wlsMBeanConn.invoke(credName, "getPortableCredential", new Object[] { ALIAS, KEY }, new String[] { STR_NAME, STR_NAME });
        cred = PortableCredential.from(cd);
 
        PortablePasswordCredential pc = (PortablePasswordCredential) cred;
 
        System.out.println("User name should be " +  USER + " Retrieved - " + pc.getName());
        System.out.println("Password should be " + PASSWORD + "retrieved - " +  new String(pc.getPassword()));
            
        //delete entire map
        wlsMBeanConn.invoke(credName, "deleteCredentialMap", new Object[] {ALIAS}, new String[] {STR_NAME} );
            
        } catch (InstanceNotFoundException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (MBeanException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (ReflectionException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // auto-generated catch block
            e.printStackTrace();
        }
 
    }

private static void invokeApplicationPolicyMBeanMethods() {
        //add grants to approles
        
        //first create application policy
        String TESTGET_APP_ROLES_MEMBERS = "testgetAppRolesMembers";
        try {
            wlsMBeanConn.invoke(appPolName, "deleteApplicationPolicy", new Object[] { TESTGET_APP_ROLES_MEMBERS }, new String[] { STR_NAME });
        } catch (Exception e ) {
            System.out.println("IGNORE: App " + TESTGET_APP_ROLES_MEMBERS + " might not exist");
        }
        try {
            wlsMBeanConn.invoke(appPolName, "createApplicationPolicy", new Object[] { TESTGET_APP_ROLES_MEMBERS }, new String[] { STR_NAME });
            // add remove members to applicaiton roles
            // Create App Role here
            String APP_ROLE_NAME = "ravenclaw_house";
            wlsMBeanConn.invoke(appPolName, "createApplicationRole", new Object[] { TESTGET_APP_ROLES_MEMBERS, APP_ROLE_NAME, null, null, null }, new String[] { STR_NAME, STR_NAME, STR_NAME, STR_NAME, STR_NAME });
            
            CompositeData cd = (CompositeData) wlsMBeanConn.invoke(appPolName, "getApplicationRole", new Object[] { TESTGET_APP_ROLES_MEMBERS, APP_ROLE_NAME }, new String[] { STR_NAME, STR_NAME });
            PortableApplicationRole appRole = PortableApplicationRole.from(cd);
            
            //Add custom principal here
            PortableRoleMember prm_custom = new PortableRoleMember("My.Custom.Principal","CustomPrincipal",null,null,null);
 
            CompositeData[] arrCompData = { prm_custom.toCompositeData(null) };
            cd = (CompositeData) wlsMBeanConn.invoke(appPolName, "addMembersToApplicationRole", new Object[] { TESTGET_APP_ROLES_MEMBERS, appRole.toCompositeData(null), arrCompData }, new String[] { STR_NAME, CompositeData.class.getName(), CompositeData[].class.getName() });
            
            // Chk if member got added
            CompositeData[] arrCD = (CompositeData[]) wlsMBeanConn.invoke(appPolName, "getMembersForApplicationRole", new Object[] { TESTGET_APP_ROLES_MEMBERS, appRole.toCompositeData(null) }, new String[] { STR_NAME, CompositeData.class.getName() });
            PortableRoleMember[] actRM = getRMArrayFromCDArray(arrCD);
            PortableRoleMember[] expRM = { prm_custom};
            chkRoleMemberArrays(actRM, expRM);
 
            cd = (CompositeData) wlsMBeanConn.invoke(appPolName, "removeMembersFromApplicationRole", new Object[] { TESTGET_APP_ROLES_MEMBERS, appRole.toCompositeData(null), arrCompData }, new String[] { STR_NAME, CompositeData.class.getName(), CompositeData[].class.getName() });
 
            // Chk if member got removed
            arrCD = (CompositeData[]) wlsMBeanConn.invoke(appPolName, "getMembersForApplicationRole", new Object[] { TESTGET_APP_ROLES_MEMBERS, appRole.toCompositeData(null) }, new String[] { STR_NAME, CompositeData.class.getName() });
            System.out.println("length should be zero :" + arrCD.length);
 
            // Remove the App Role
            wlsMBeanConn.invoke(appPolName, "removeApplicationRole", new Object[] { TESTGET_APP_ROLES_MEMBERS, APP_ROLE_NAME }, new String[] { STR_NAME, STR_NAME });
            wlsMBeanConn.invoke(appPolName, "deleteApplicationPolicy", new Object[] { TESTGET_APP_ROLES_MEMBERS }, new String[] { STR_NAME });
 
        } catch (InstanceNotFoundException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (MBeanException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (ReflectionException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // auto-generated catch block
            e.printStackTrace();
        }
    }

    private static PortableRoleMember[] getRMArrayFromCDArray(CompositeData[] arrCD) {
        PortableRoleMember[] actRM = new PortableRoleMember[arrCD.length];
        int idx = 0;
        for (CompositeData cdRM : arrCD) {
            actRM[idx++] = PortableRoleMember.from(cdRM);
        }
        return actRM;
    }

    private static void chkRoleMemberArrays(PortableRoleMember[] arrExpectedRM, PortableRoleMember[] arrActRM) {
 
        List < PortableRoleMember > lstExpRM = new ArrayList < PortableRoleMember >(Arrays.asList(arrExpectedRM));
        List < PortableRoleMember > lstActRM = new ArrayList < PortableRoleMember >(Arrays.asList(arrActRM));
 
        for (PortableRoleMember actRM : lstActRM) {
            for (int idx = 0; idx < lstExpRM.size(); idx++) {
                PortableRoleMember expRM = (PortableRoleMember) lstExpRM.get(idx);
                if (expRM.equals(actRM)) {
                    lstExpRM.remove(idx);
                    break;
                }
            }
        }
        System.out.println("List should be empty - " + lstExpRM.size());
    }

    private static void  invokeAdminPolicyMBeanMethhods() {
        //Connection is established as weblogic user, who by OOTB gets all permissions
        Boolean bool;
        try {
            bool = (Boolean) wlsMBeanConn.invoke(adminPolName,"checkRole",new Object[]{"Admin"}, new String[]{STR_NAME});
            System.out.println("Werblogic has Admin role: " + bool);
            bool = (Boolean) wlsMBeanConn.invoke(adminPolName,"checkRole",new Object[] {"Configurator"}, new String[]{STR_NAME});
            System.out.println("Werblogic has Configurator role: " + bool);
            bool = (Boolean) wlsMBeanConn.invoke(adminPolName,"checkRole", new Object[]{new String[] {"Operator", "Admin", "Configurator"}},
                    new String[]{String[].class.getName()});
            System.out.println("Werblogic has Admin,Operator,Configurator role: " + bool);
        } catch (InstanceNotFoundException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (MBeanException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (ReflectionException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // auto-generated catch block
            e.printStackTrace();
        }
    }

    private static void invokeGlobalPolicyMBeanMethods() {
        // lets create a grant in system policy
        PortablePrincipal CUSTOM_JDOE = new PortablePrincipal("oracle.security.jps.internal.core.principals.CustomXmlUserImpl", "jdoe", PortablePrincipal.PrincipalType.CUSTOM);
        PortablePrincipal CUSTOM_APP_ADMINS = new PortablePrincipal("oracle.security.jps.internal.core.principals.CustomXmlEnterpriseRoleImpl", "oc4j-app-administrators", PortablePrincipal.PrincipalType.CUSTOM);
        PortablePrincipal[] arrPrincs = {CUSTOM_JDOE, CUSTOM_APP_ADMINS};
        //code source URL        
        String URL = "http://www.oracle.com/as/jps-api.jar";
        PortableCodeSource pcs = new PortableCodeSource(URL);
        PortableGrantee pge = new PortableGrantee(arrPrincs, pcs);
        PortablePermission CSF_PERM = new PortablePermission("oracle.security.jps.service.credstore.CredentialAccessPermission", "context=SYSTEM,mapName=MY_MAP,keyName=MY_KEY", "read");
        PortablePermission[] arrPerms = {CSF_PERM};
        PortableGrant grnt = new PortableGrant(pge, arrPerms);
        CompositeData[] arrCompData = { grnt.toCompositeData(null) };
        try {
            System.out.println("Creating System Policy grant");
            wlsMBeanConn.invoke(gloPolName, "grantToSystemPolicy", new Object[] { arrCompData }, new String[] { CompositeData[].class.getName() });
            System.out.println("Deleting the created grant");
            wlsMBeanConn.invoke(gloPolName, "revokeFromSystemPolicy", new Object[] { arrCompData }, new String[] { CompositeData[].class.getName() });
            
        } catch (InstanceNotFoundException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (MBeanException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (ReflectionException e) {
            // auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // auto-generated catch block
            e.printStackTrace();
        }
    }

    private static boolean isRegistered(ObjectName name) {
        try {
            return wlsMBeanConn.isRegistered(name);
        } catch (IOException e) {
            // auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }
 
    private static void init() {
        String protocol = "t3";
        String jndi_root = "/jndi/";
        String wlserver = "myWLServer";
        String host =  "myHost.com";
        int port =  7001;
        String adminUsername = "myAdminName";
        String adminPassword = "myAdminPassw";
        JMXServiceURL url;
        try {
            url = new JMXServiceURL(protocol,host,port,jndi_root+wlserver);
            HashMap<String, Object> env = new HashMap<String, Object>();
            env.put(Context.SECURITY_PRINCIPAL, adminUsername);
            env.put(Context.SECURITY_CREDENTIALS, adminPassword);
            env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
                    "weblogic.management.remote");
            connector = JMXConnectorFactory.connect(url, env);
            wlsMBeanConn = connector.getMBeanServerConnection();
                        //create object names
        // the next string is set to com.oracle.jps:type=JpsConfig
            configName = new
                 ObjectName(JpsJmxConstants.MBEAN_JPS_CONFIG_FUNCTIONAL);
// the next string is set to com.oracle.jps:type=JpsApplicationPolicyStore
            appPolName = new
                 ObjectName(JpsJmxConstants.MBEAN_JPS_APPLICATION_POLICY_STORE);
// the next string is set to com.oracle.jps:type=JpsGlobalPolicyStore
            gloPolName = new
                 ObjectName(JpsJmxConstants.MBEAN_JPS_GLOBAL_POLICY_STORE);
// the next string is set to com.oracle.jps:type=JpsAdminPolicyStore
            adminPolName = new
                 ObjectName(JpsJmxConstants.MBEAN_JPS_ADMIN_POLICY_STORE);
// the next string is set to com.oracle.jps:type=JpsCredentialStore
            credName = new ObjectName(JpsJmxConstants.MBEAN_JPS_CREDENTIAL_STORE);
        } catch (MalformedURLException e) {
            // take proper action
            e.printStackTrace();
        } catch (IOException e) {
            // take proper action
            e.printStackTrace();
        } catch (MalformedObjectNameException e) {
            // auto-generated catch block
            e.printStackTrace();
        }
    }
}

プログラムによるサービスの構成の詳細は、第IV部「Oracle Platform Security ServicesのAPIを使用した開発」を参照してください。

E.3 アクセス制限

ここでの説明はOPPS MBeansにのみ限定されるものではなく、Oracle Fusion Middleware MBeans全般に当てはまります。

MBeansへのセキュリティ・アクセスは、セキュリティ許可ではなく、論理ロールに基づいています。MBeansには、JMX Frameworkによって実行時に適用されるロールベースの制約を使用して注釈が付けられます。

この項では、注釈の使用法や注釈の意味について説明し、特定のアクセス制限を示して、Oracle WebLogic Serverエンタープライズ・グループへの論理ロールのマッピングについて解説します。

E.3.1 注釈の例

次のコード・スニペットでは、MBeanインタフェースでのエンタープライズ・グループの注釈(太字テキストの部分)の使用法を示します。

@Description(resourceKey = "demo.ScreenCustomizerRuntimeMBean.description",
             resourceBundleBaseName = "demo.runtime.Messages")
@ImmutableInfo("true")
@Since("1.1")
public interface ScreenCustomizerRuntimeMXBean {
  @Description(resourceKey = "demo.ScreenCustomizerRuntimeMBean.Active",
               resourceBundleBaseName = "demo.runtime.Messages") 
  @AttrributeGetterRequiredGlobalSecurityRole(GlobalSecurityRole.Operator)
    public boolean isActive();
  @AttrributeSetterRequiredGlobalSecurityRole(GlobalSecurityRole.Admin)
    public void setActive(boolean val);
 
  @Description(resourceKey =
                     "demo.ScreenCustomizerRuntimeMBean.ActiveVirtualScreenId",
               resourceBundleBaseName = "demo.runtime.Messages") 
  @DefaultValue("0")
  @LegalValues( {"0", "2", "4", "6", "8" })
  @RequireRestart(ConfigUptakePolicy.ApplicationRestart) 
  @OperationRequiredGlobalSecurityRole(GlobalSecurityRole.Admin)
     public void setActiveVirtualScreenId(int id) throws IllegalArgumentException;
  …
}

前述のサンプル・コードの注釈は、次のとおりです。

  • @AtrributeGetterRequiredGlobalSecurityRoleは、ユーザーがgetメソッドisActiveにアクセスするには、Operatorロールに属している必要があることを指定します。

  • @AtrributeSetterRequiredGlobalSecurityRoleは、ユーザーがsetメソッドsetActiveにアクセスするには、Adminロールに属している必要があることを指定します。

  • @OperationRequiredGlobalSecurityRoleは、ユーザーがMBeanメソッドsetActiveVirtualScreenIdにアクセスするには、Adminロールに属している必要があることを指定します。

前述の3つの注釈はすべて、インタフェース内の特定のアイテムにのみ適用されることに注意してください。

次のコード・スニペットでは、範囲の異なる別の注釈(太字テキスト)の使用法を示します。

@Description(resourceKey = "demo.ScreenCustomizerRuntimeMBean.description",
             resourceBundleBaseName = "demo.runtime.Messages")
@ImmutableInfo("true")
@Since("1.1")
@MBeanRequiredGlobalSecurityRole(GlobalSecurityRole.Admin)
public interface ScreenCustomizerRuntimeMXBean { … }

前述のサンプル・コードの注釈@MbeanRequiredGlobalSecurityRoleでは、MBeanの操作または属性のすべてについて、ユーザーがそれらにアクセスするには、Adminロールに属している必要があることを指定しています。つまり、この場合MBean全体が対象範囲になります。メソッドまたは属性の範囲を指定している注釈は、MBean全体に適用される注釈よりも優先されます。

列挙GlobalSecurityRoleは、セキュリティ・チェックの実行前に、環境内で実際のロールにマップされるグローバルの論理ロール・セットを定義します。この列挙には、注釈付き操作または属性に対してすべてのユーザーが読取り/書込み権限を持っていることを示す値NONEが含まれています。

詳細は、oracle.jmx.framework Javadocのドキュメントを参照してください。

E.3.2 WebLogicロールへの論理ロールのマッピング

表E-2は、エンタープライズ・グループへの論理ロールのマッピングを示しています。

表E-2 WebLogicグループへの論理ロールのマッピング

論理ロール デフォルトの権限 WebLogicグループ

Admin

すべてのMBeansへの読取り/書込み権限

Admin

Configurator

構成MBeansへの読取り/書込み権限

Admin

Operator

構成MBeansへの読取り権限、すべての実行時MBeansへの読取り/書込み権限

Operator

Monitor

すべてのMBeansへの読取り権限

Monitor

ApplicationAdmin

すべてのアプリケーションMBeansへの読取り/書込み権限

Admin

ApplicationConfigurator

すべてのアプリケーションMBeansへの読取り/書込み権限

Admin

ApplicationOperator

アプリケーション構成MBeansへの読取り権限、アプリケーション実行時MBeansへの読取り/書込み権限

Operator

ApplicationMonitor

すべてのアプリケーション実行時MBeansおよび構成MBeansへの読取り権限

Monitor


WebLogicのロールの詳細は、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』の「ユーザー、グループ、セキュリティ・ロール」を参照してください。

E.3.3 特定のアクセス制限

デフォルトでは、すべての書込みおよび更新操作の実行には、ユーザーがAdminロールまたはConfiguratorロールのメンバーである必要があります。また、タグ@Impact(value=1)で注釈を付けられた操作の場合、ユーザーはAdminロールのメンバーであり、タグ@Impact(value=0)で注釈を付けられた操作の場合はAdminロールまたはOperatorロールのメンバーである必要があります。

表E-3は、Fusion Middleware Control MBeansの属性と操作へのアクセスに必要なロールを説明しています。

表E-3 操作別に必要なロール

影響値を持つ操作 MBeanのタイプ 必要なロール

INFOまたは属性ゲッター

システム構成MBean

Monitor、Operator、Configurator、Admin

INFOまたは属性ゲッター

アプリケーション構成MBean

Monitor、Operator、Configurator、Admin、ApplicationMonitor、ApplicationOperator、ApplicationConfigurator、ApplicationAdmin

ACTION、ACTION_INFO、UNKNOWNまたは属性セッター

システム構成MBean

Admin、Configurator

ACTION、ACTION_INFO、UNKNOWNまたは属性セッター

アプリケーション構成MBean

Admin、Configurator、ApplicationAdmin、ApplicationConfigurator

INFOまたは属性ゲッター

システム実行時MBean

Monitor、Operator、Configurator、Admin

INFOまたは属性ゲッター

アプリケーション実行時MBean

Monitor、Operator、Configurator、Admin、ApplicationMonitor、ApplicationOperator、ApplicationAdmin

ACTION、ACTION_INFO、UNKNOWNまたは属性セッター

システム実行時MBean

Admin、Operator

ACTION、ACTION_INFO、UNKNOWNまたは属性セッター

アプリケーション実行時MBean

Admin、Operator、ApplicationAdmin、ApplicationOperator