Skip to content

TAO関連の不具合について #1016

@Nobu19800

Description

@Nobu19800

Describe the bug
OpenRTM-aist+TAOでSSLIOP通信させる際に以下の不具合が発生する。

  • RTCの起動に失敗する。
  • マスターマネージャがTAOで動作している場合、スレーブマネージャの登録に失敗する。

To Reproduce
Steps to reproduce the behavior:

  1. 設定ファイルrtc.ssl.confとsvc.ssl.confを用意する。
corba.args: -ORBEndpoint ssliop:// -ORBSvcConf ./svc.ssl.conf -ORBDebugLevel 10

corba.nameservers: corbaloc:ssliop:localhost:2809
corba.master_manager: ssliop://localhost:2810
dynamic SSLIOP_Factory Service_Object *
        TAO_SSLIOP:_make_TAO_SSLIOP_Protocol_Factory()
        "-SSLPrivateKey PEM:server.pem -SSLCertificate PEM:root.crt -SSLPassword passward"
static Advanced_Resource_Factory "-ORBProtocolFactory SSLIOP_Factory"
  1. 以下のコマンドを実行する。
./ConsoleOutComp -d -f rtc.ssl.conf
./ConsoleInComp -f rtc.ssl.conf
  1. 以下のようにTAOのデバッグメッセージを確認したらsvc.ssl.confに-SSLNoProtection オプションを追加して再度コマンドを実行
SSLIOP (18845|18845) Interceptor (context), ssl=0 collocated=1
TAO (18845|18845) SL2_AccessDecision::access_decision(0,get_port_profile) collocated 1 NOT FOUND using default 0
TAO (18845|18845) SL2::access_allowed_ex returned false
terminate called after throwing an instance of 'CORBA::NO_PERMISSION'
  1. TAOのデバッグメッセージを確認すると以下のエラーが発生している。
TAO (17744|17770) - GIOP_Message_State::parse_message_header_i
TAO (17744|17770) - TAO_GIOP_Message_State::parse_magic_bytes, bad �IOP header: magic word [16,03,01,01]
TAO (17744|17770) - Transport[12]::handle_input, error parsing incoming message
TAO (17744|17770) - Resume_Handle::handle_input_return_value_hook, handle_input returning -1, so handle is not resumed.
TAO (17744|17770) - Connection_Handler[12]::handle_input_internal, handle = 12/12, retval = -1
TAO (17744|17770) - Connection_Handler[12]::close_connection_eh, purging entry from cache

Reproducibility
100%

Expected behavior

  • RTCが正常に起動する
  • マネージャを登録できる

Screenshots or Logs

Environment

  • OS: Ubuntu 18.04
  • OpenRTM-aist master branch

Additional context

  • マスターマネージャへのスレーブマネージャの登録について

マスターマネージャへのスレーブマネージャの登録についてはcorbaloc形式での接続が失敗してから問題が起こっている。
エンドポイントをssliop://localhost:2810という形式ではなく、iiop://localhost:/ssl_port=2809もしくはssliop://localhost:/ssl_port=2810のようにssl_portのパラメータでポート番号を指定すると何故か問題が発生しない。TAOの仕様なのかバグなのかは不明。
現在のOpenRTM-aistの実装ではcorba.master_managerの項目に指定したエンドポイントを自動的にcorbaloc形式に変換するようになっているが、上記のようなssl_portのパラメータでポート番号を指定する場合の変換には対応していないため、現状ではマスターマネージャとスレーブマネージャで別々の設定ファイルを用意する必要がある。

  • RTCの起動失敗について

TAOのSSLIOPにはCORBAオブジェクトごとにアクセス権限を設定する仕組み(OMG Security Service Specification Version 1.8のThe SecurityLevel2::AccessDecision Interfaceに対応する仕組み)があり、プロセス内からのCORBAオブジェクトへのアクセスはSSLではないため基本的にCORBA::NO_PERMISSION例外を投げるようになっている。

TAOではデフォルトでアクセスを許可/拒否を設定するdefault_decision関数とプロセス内部からのアクセスを許可/拒否を設定するdefault_collocated_decision関数が用意されており、特定のCORBAオブジェクトのアクセスの許可/拒否を設定したものを除き、設定していないCORBAオブジェクトについてはデフォルトの設定で許可/拒否を判断する。

ただし、現在のTAO(ver. 3.0.6)ではdefault_collocated_decision関数が上手く動作しておらず、プロセス内部からのアクセスだけではなく、プロセス外部からの通信の許可/拒否も設定されてしまう。
ソースコードを読んでみたのですが、意図が分からなかったのでバグだと思います。
正常に動作させるには、SL2_SecurityManager.cppの以下の部分に修正が必要です。

    // if (this->default_collocated_decision_)  //修正前
    if (this->default_collocated_decision_ && collocated) //修正後
        access_decision = true;

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions