BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedo ホーム   |   CORBA 要求レベルのインターセプタ   |   前へ   |   次へ   |   目次   |   索引

InterceptorSec サンプル・インターセプタ

 

ここでは、次の内容について説明します。

この章で説明する手順を実行してみる前に、PersonQuery サンプル・アプリケーションで解説した手順がすべて完了していることを確認してください。

 


PersonQuery サンプル・インターセプタのしくみ

InterceptorSec サンプル・インターセプタにより、基本的なセキュリティ・モデルをインプリメントする単純なクライアント/サーバ・インターセプタのペアが示されます。InterceptorSec クライアント側インターセプタは単に、ORB で処理される各クライアント要求をログに記録します。InterceptorSec ターゲット側インターセプタは、クライアント・アプリケーションのユーザが要求のオペレーションの実行を認可されているかどうかを確認する、単純なセキュリティ・メカニズムをインプリメントします。

InterceptorSec サンプル・インターセプタでは、単一の初期化関数で初期化され、単一のライブラリにインプリメントされた、クライアントおよびターゲット・インターセプタのペアが示されます。単一の初期化関数が呼び出されるので、インターセプタ登録コマンドで登録されるのは初期化関数 1 つとインプリメンテーション・ライブラリ 1 つです。

InterceptorSec ターゲット側インターセプタのしくみ

ターゲット側 ORB で要求が受信されると、ORB は InterceptorSec ターゲット側インターセプタを呼び出し、クライアント要求からの RequestContext および DataInputStream オブジェクトを渡します。

ターゲット側インターセプタはその後、次の処理により、クライアント・アプリケーションのユーザに対して要求に含まれるオペレーションの認可を行います。

  1. 要求が PersonQuery インターフェイスに対する呼び出しであるかどうかを確 認します。違っていた場合、インターセプタは INVOKE_NO_EXCEPTION を返 します。

  2. 要求に含まれるオペレーションが PersonQuery インターフェイスに対する呼 び出しであった場合、インターセプタは次の処理を行います。

    1. SecurityCurrent オブジェクトへのリファレンスを取得します。その後、こ のオブジェクトはインターセプタによってナロー変換されます。

    2. SecurityContext オブジェクトを呼び出し、クライアント・アプリケー ションのユーザの属性リストを要求します。

    3. 属性リストの中から、2 つの属性を取得します。

      PrimaryGroupId

      クライアント・アプリケーションのユーザのクライアント名を識別します。このインターセプタでは、クライアント名には文字 r と NULL 文字列のどちらかが含まれている必要があります。

      AccessId

      クライアント・アプリケーションのユーザを識別します。このインターセプタでは、ユーザ名に文字 RP 、または N が入っている必要があります (大文字でも小文字でも可)。


       

    4. ユーザを PrimaryGroupId および AccessId と照合します。ユーザがこれ ら 2 つの属性の判定基準に問題なく一致していた場合、インターセプタは INVOKE_NO_EXCEPTION を返します。

    5. 一致していなければ、インターセプタは REPLY_EXCEPTION を返します。 これにより、ターゲット・オブジェクトへの要求の送信は回避されます。 その代わりに、ORB はクライアント・アプリケーションに例外を返しま す。

以降の節ではインターセプタのセキュリティについて説明し、InterceptorSec ターゲット側インターセプタの中から、該当するコードの抜粋部分を示します。

SecurityCurrent オブジェクトの使用

インターセプタは、Bootstrap オブジェクトではなく、ORB から SecurityCurrent オブジェクトを取得します。ORB から取得可能な SecurityCurrent オブジェクトには、インターセプタがクライアントの情報を取得するために必要とする API が含まれます。

インターセプタで ORB に対する resolve_initial_references("SecurityCurrent") オペレーションを呼び出すと、SecurityCurrent オブジェクトを取得できます。インターセプタは次に、SecurityCurrent リファレンスを SecurityCurrentLevel1 カレントにナロー変換します。

SecurityCurrent オブジェクトの取得

SecurityCurrent オブジェクトは、ORB からのみ取得可能です。このオブジェクトの主要な機能は、CORBA サーバ・アプリケーションがクライアント呼び出し関連の属性にアクセスできるようにすることです。

ORB の resolve_initial_references("SecurityCurrent") メソッドは、インターセプタに SecurityCurrent オブジェクトのリファレンスを提供します。このオブジェクトから、インターセプタにレベル 1 のセキュリティ機能が与えられます。インターセプタは、SecurityCurrent オブジェクトの get_attributes メソッドを介してクライアント呼び出しの属性を取得します。このオブジェクトは、属性リストをインターセプタに返します。属性リストには、インターセプトされている呼び出しを実行したクライアント・アプリケーションのユーザに関連する属性が含まれます。上記の例外を除けば、CORBA セキュリティ・サービスからのどのメソッドの振る舞いも同じです。

次の C++ コードの抜粋では、SecurityCurrent オブジェクトの取得方法を示します。

try
  {
  sec_current = m_orb->resolve_initial_references("SecurityCurrent");
  }
  catch (...)
  {
  *m_outfile <<
  "ERROR: ORB::resolve_initial_references threw exception"
  << endl << endl << flush;
  excep_val = new CORBA::UNKNOWN();
  return Interceptors::REPLY_EXCEPTION;
  }
  if (CORBA::is_nil(sec_current.in()))
  {
  *m_outfile << "ERROR: No SecurityCurrent present"
  << endl << endl << flush;
  excep_val = new CORBA::NO_PERMISSION();
  return Interceptors::REPLY_EXCEPTION;
  }
 
  m_security_current = SecurityLevel1::Current::_narrow(sec_current.in());
  if (!m_security_current)
  {
  *m_outfile << "ERROR: Couldn't narrow security
  current to SecurityLevel1::Current"
  << endl << endl << flush;
  excep_val = new CORBA::NO_PERMISSION();
  return Interceptors::REPLY_EXCEPTION;
  }

ユーザ属性リストの作成

この節のコード抜粋部分は、InterceptorSec ターゲット側インターセプタが、ユーザ属性のリストを作成し、その後このリスト内を調べて、ユーザが認可基準に適合しているかどうかを判定する方法を示します。

InterceptorSec サンプルでは、属性リストの作成と、そのリスト内容の検討は、個別の手順で行われます。長さ 0 のクライアント属性リストが返るように指定を行うと、SecurityCurrent オブジェクトはそのクライアントの全属性を返すことに注意してください。

// 認可チェックを行う必要のある情報に対応する
// 属性を取得する
// PrimaryGroupId (ログインしたクライアントのクライアント名)
// AccessId (ログインしたクライアントのユーザ名)
Security::AttributeList_var client_attr = 0;
try
{
  client_attr = m_security_current->get_attributes(*m_attributes_to_get);

次の抜粋部分では、リストの作成方法を示します。

  Security::AttributeTypeList_var attr = new Security::AttributeTypeList(2);
  if (!attr.ptr())
  {
  cout <<
  "ERROR: can't allocation security list: Out of memory"
  << endl << endl << flush;
  return;
  }
  attr.inout().length(2);
  attr[(CORBA::ULong)0].attribute_family.family_definer = 0;
  attr[(CORBA::ULong)0].attribute_family.family = 1;
  attr[(CORBA::ULong)0].attribute_type = Security::PrimaryGroupId;
  attr[(CORBA::ULong)1].attribute_family.family_definer = 0;
  attr[(CORBA::ULong)1].attribute_family.family = 1;
  attr[(CORBA::ULong)1].attribute_type = Security::AccessId;
  m_attributes_to_get = attr._retn();
  return;

次の抜粋部分は、属性リストでユーザが認可基準に適合するかどうかを確認する方法を示します。

if (client_attr[i].attribute_type.attribute_type == Security::PrimaryGroupId)
  {
  //
  // この属性はクライアント名。
  // 何らかのクライアント名値と比較する。
  // たとえば、「r」を含むすべての文字列か、
  // NULL 文字列を受け入れるとする。その場合、クライアント名を、
  // 認可済みの値のセットのどれかに比較する
  //
  if ((strlen(value_buffer) == 0) ||
  (strchr(value_buffer, 'r') != 0))
  {
  *m_outfile << " INFO: Valid client name found: "
  << value_buffer << endl;
  clientname_ok = 1;
  }
  else
  {
  *m_outfile << " ERROR: Invalid client name found: "
  << value_buffer << endl;
  }
  }
 else if (client_attr[i].attribute_type.attribute_type == Security::AccessId)
  {
  // この属性はユーザ名。ユーザ ID 中に「r」、「n」
  // または「p」が含まれるユーザであれば、任意に選択し、
  // 認可する。別の認可基準を
  // 選択することもできる
  //
  if ((strchr(value_buffer, 'r') != 0) ||
        (strchr(value_buffer, 'R') != 0) ||
        (strchr(value_buffer, 'P') != 0) ||
        (strchr(value_buffer, 'p') != 0) ||
        (strchr(value_buffer, 'N') != 0) ||
        (strchr(value_buffer, 'n') != 0))
  {
  *m_outfile << " INFO: Valid username found: "
            << value_buffer << endl;
  username_ok = 1;
  }

 


PersonQuery インターセプタの登録および実行

PersonQuery サンプル・アプリケーションの PersonQuery サンプル・アプリケーションをビルドする makefile を実行すると、InterceptorSec インターセプタを含むサンプル・インターセプタ一式全部が、同様にビルドされます。この節では、実行時に PersonQuery アプリケーションと共に機能するように InterceptorSec インターセプタを登録する方法を説明します。

InterceptorSec クライアント・インターセプタおよびサーバ・インターセプタを登録して実行するには、以下の手順に従います。

  1. InterceptorSec サンプルのディレクトリに移動します。ここで workdirectory は、PersonQuery サンプル・アプリケーションに示す手順で インターセプタのサンプル・アプリケーションをコピーしたディレクトリの 名前を表します。

    Windows 2000

    > cd <workdirectory>\cxx\security_cxx

    UNIX

    $ cd <workdirectory>/cxx/security_cxx

  2. インターセプタを登録します。

    Windows 2000

    > nmake -f makefile.nt config

    UNIX

    $ make -f makefile.mk config

  3. CORBA サーバをブートして CORBA クライアントを実行します。

    Windows 2000

    > cd <workdirectory>\cxx\app_cxx
    > tmboot -y
    > PersonQueryClient

    UNIX

    > cd <workdirectory>/cxx/app_cxx
    > tmboot -y
    > PersonQueryClient

  4. PersonQuery サンプル・アプリケーションで説明したコマンド構文を使用し て、PersonQuery クライアント・アプリケーションで呼び出しを任意の回数 行います。

  5. PersonQuery アプリケーションを停止します。

    > tmshutdown -y

 


インターセプタ出力の検証

InterceptorSec クライアント・インターセプタおよびターゲット・インターセプタは、指定されたファイルに出力のログを記録します。ファイル名はそれぞれ、InterceptorSecClientxxx.out および InterceptorSecTargetxxx.out です。これらのファイルには、インターセプタからのデバッグ出力が含まれます。これは PersonQuery アプリケーション用に、ORB によって自動的にロードおよび実行されます。

 


インターセプタの登録解除

InterceptorSec サンプル・インターセプタで PersonQuery サンプル・アプリケーションを実行後に、次の手順でこれらのインターセプタの登録を解除できます。

  1. 次のコマンドを入力して、実行中の CORBA アプリケーションをすべて シャットダウンします。

    > tmshutdown -y

  2. InterceptorSec サンプルのディレクトリに移動します。ここで workdirectory は、PersonQuery サンプル・アプリケーションに示す手順で インターセプタのサンプル・アプリケーションをコピーしたディレクトリの 名前を表します。

    Windows 2000

    > cd <workdirectory>\cxx\security_cxx

    UNIX

    $ cd <workdirectory>/cxx/security_cxx

  3. インターセプタの登録を解除します。

    Windows 2000

    > nmake -f makefile.nt unconfig

    UNIX

    $ make -f makefile.mk unconfig

 

back to top previous page next page