RMCP +とOpenSSLについての探偵小説、またはWiresharkがOpenIPMIの誤った議論を打ち負かすのにどのように役立ったか

内部には、Cコード、Wiresharkダンプ、およびコンソールコマンドが含まれます。

与えられた:GNU / Linuxの下からIPMIインターフェースを介して尋問されるべき鉄のいくつかの断片と、これを拒否した2つの断片。



画像






IPMI(英語版Intelligent Platform Management Interfaceから)は、サーバープラットフォームのハードウェアとファームウェアに直接組み込まれた機能のオフライン監視と管理のために設計されたインテリジェントプラットフォーム管理インターフェイスです。 IPMIの主要な機能は、監視、管理機能の復元、ロギング、およびインベントリです。これらは、プロセッサ、BIOS、およびオペレーティングシステムに関係なく使用できます。 プラットフォーム管理機能は、システムがオフになっていても利用できる場合があります。 (ウィキペディア)

「彼らはそれを拒否しました」-標準のipmitoolユーティリティとlibOpenIPMIライブラリを使用した開発の両方で接続しようとすると、接続がタイムアウトエラーで終了しました。

OpenIPMIは、サーバー上のすべてのIPMI情報へのフルアクセスを許可するフル機能IPMIシステムを作成し、使いやすいレベルに抽象化する取り組みです。 ソースコードについては、SourceForgeページを参照してください。

(OpenIPMI)
最初の解決策はすぐに見つかりました。



ipmitool -I lanplus -H 192.168.14.5 -U ADMIN -P ADMIN mc info
      
      





ここでは、標準のIPMI接続の詳細に加えて、RMCP +プロトコル(IPMI 2.0仕様に含まれる)を使用する必要性が明確に示されています。



OpenIPMIライブラリを使用すると、すべてがシンプルになります。



このライブラリのドキュメントは非常に複雑ですが、「 A Gentle Introduction to IPMI 」と呼ばれる大きな本(はい、PDF形式の本)がドキュメントとして提供されています。 つまり、短いHowToやReadmeを読んだり、例を見てコードを書き始めたり、参照のために定期的にドックをちらっと見たりすることはできませんが、それより悪いことです:IPMIアーキテクチャとライブラリ関数の詳細な説明にもかかわらず、このマニュアルにはいくつかの基本的なものが欠けています。 たとえば、RMCP +を使用して接続する方法。



ライブラリヘッダーをひと目で確認すると、定義で必要なものが見つかり、ipmi_ip_setup_con()で置き換えられます。



 IPMI_AUTHTYPE_MD5  IPMI_AUTHTYPE_RMCP_PLUS
      
      





そして、ここで次の問題が待っています:タイムアウトエラーは実際に消えましたが、接続関数は不正な引数エラーをスローし始めました。



このエラーが何を意味するかについての詳細はありません。ドキュメントブックにもデバッグメッセージにも、どこにもありません。 誰か(ライブラリ関数自体またはリモートデバイスのいずれか)が何らかの議論を誓うことは明らかですが、どちらをどの段階で、一般的にどの段階で見つけるのかを見つけることは不可能です。 ソースをざっと見てみると、接続中にさまざまな理由で、誤った引数(EINVAL定数)が返される可能性があることが示唆されています(多くの分岐と条件があります)。



2つの方法が思い浮かびます:



  1. ライブラリのデバッグアセンブリを作成し、デバッガーで何を、どこで、いつステップごとに学ぶ
  2. 最初に外部から発生するすべてを見て、クライアント(私のアプリケーション)とサーバー(鉄)の間のパケット交換を見て、実装とipmitoolの違いを比較してから、コードにクロールします。


直感と冒険への欲求が2番目の選択肢に押し込まれ、誤解されませんでした。



Wiresharkを起動し、フィルターを構成して、調査を開始します。



画像



クライアントとサーバーが要求と応答を交換し、ipmitoolを使用する場合、交換は正常に続行され、libOpenIPMIを使用するとすべてがシャットダウンすることがわかります。



質問:ライブラリの腸内のどこかで不正な引数イベントが発生しますか、それともデバイス自体が気に入らないものですか?



鉄片からの回答を比較します。



画像

(ipmitoolを使用した場合の成功した応答)



画像

(私たちのアプリケーションを使用するとき、あまり成功していない答え)



ご覧のとおり、デバイスからの応答はまったく異なります。エラーが発生した場合、データブロックの長さはわずか7バイトです。



このデータに何がどのようにエンコードされているかを理解するために、RMCP +プロトコルの通常の説明をWebで検索しようとしましたが、決定的ではありませんでした。



次の質問が発生しました。サーバーに送信されるリクエストの違いは何ですか、1つのケースでは正常に応答し、2つ目のケースでは問題が発生しますか?



画像



画像



送信されているパケットをよく見ると、違いが見つかりましたが、これらの異なるバイトが何を意味するのかを見つけるだけです。



send_rmcpp_open_sessionで、接続確立の機能のソースコードを調べた

パッケージビルドアルゴリズムが見つかりました:



 if ((int) lan->cparm.auth == IPMI_LANP_AUTHENTICATION_ALGORITHM_BMCPICK) data[11] = 0; /* Let the BMC pick */ else { data[11] = 8; data[12] = lan->cparm.auth; } data[16] = 1; /* integrity algorithm */ if ((int) lan->cparm.integ == IPMI_LANP_INTEGRITY_ALGORITHM_BMCPICK) data[19] = 0; /* Let the BMC pick */ else { data[19] = 8; data[20] = lan->cparm.integ; } data[24] = 2; /* confidentiality algorithm */ if ((int) lan->cparm.conf == IPMI_LANP_CONFIDENTIALITY_ALGORITHM_BMCPICK) data[27] = 0; /* Let the BMC pick */ else { data[27] = 8; data[28] = lan->cparm.conf; }
      
      





すでに面白くなってきました。 パッケージ内のバイト0x08がはっきりと目を引き、「これだ」と言いました。



ソースコードには、さまざまな認証オプションなどの定義が見つかりました。



 #define IPMI_LANP_AUTHENTICATION_ALGORITHM_BMCPICK (~0) #define IPMI_LANP_AUTHENTICATION_ALGORITHM_RAKP_NONE 0 #define IPMI_LANP_AUTHENTICATION_ALGORITHM_RAKP_HMAC_SHA1 1 #define IPMI_LANP_AUTHENTICATION_ALGORITHM_RAKP_HMAC_MD5 2
      
      





これにより、ipmitoolがSHA-1認証との接続を開始し、何らかの理由でlibOpenIPMIとのアプリケーションが保護なしで接続を試み、無視応答を受け取ったという結論に至りました(明らかに、デバイスは安全でない接続を本当に嫌いました)。



ソースを少し掘り下げると、OpenIPMIがデフォルトで接続を確立するための最も安全なオプションを選択することが明らかになりましたが、私たちの場合、図書館の意見では、最も安全なオプションはまったく保護されていません。



ソースのさらなる調査により、認証オプションはグローバル配列auths []から取得され、ipmi_rmcpp_register_authentication()プロシージャによって追加されますが、プロシージャ自体は...どこで呼び出されますか? 私たちは検索して見つけます:



 #ifdef HAVE_OPENSSL ipmi_rmcpp_register_authentication (IPMI_LANP_AUTHENTICATION_ALGORITHM_RAKP_HMAC_MD5, NULL); ipmi_rmcpp_register_authentication (IPMI_LANP_AUTHENTICATION_ALGORITHM_RAKP_HMAC_SHA1, NULL); #endif
      
      





そこで彼は答えです。



UbuntuおよびDebianの標準libopenipmi0パッケージは、これらの機能に必要なOpenSSLサポートなしでコンパイルされます。 そして、少なくとも誰かがドキュメントでこのニュアンスについて一言書きます!



これを確認することで確認できます



 apt-get source libopenipmi0
      
      





そして、debian / rulesファイルを見て、非常に明確な行があります--without-openssl



解決策は、必要に応じてパッケージを再構築することです。



 sudo apt-get install devscripts build-essential fakeroot sudo apt-get build-dep libopenipmi0 apt-get source libopenipmi0 #   debian/rules: # --without-openssl => --with-openssl sudo dpkg-buildpackage debuild -us -uc
      
      





インストールして、すべてが正常に機能したことを確認します。



少し後に、親切な人がOpenSSLをサポートしてこのlibをUbuntu用に再構築するppaが見つかりました。



やったー ハッピーエンド。



All Articles