こちらの投稿は vExperts Advent Calendar 2023 の 19 日目になります。
最新機能とかではなく、昔からあるテクノロジーのお話で拙い文章ですがお付き合いください。
adventar.org
一番好きな vSphere の機能って何ですか?
vSphere 触っている人が集うと稀に出てくるこの話。
- 無停止で仮想マシンを別ホストにマイグレーションできる vMotion
- リソース状況に応じて柔軟に仮想マシンを移動させる DRS
- インフラ基盤レイヤーで仮想マシンの冗長性を高められる vSphere HA
- etcetc...
魅力的な機能は多々ありますが、個人的に一番好きな機能はこの Backdoor です。
Backdoor …物騒な名前ですねぇ…
名前だけ聞くとセキュリティ脆弱性っぽい名前ですが、その類とは全く関係ありません。
Backdoor は ESXi ホストと仮想マシンとの間で情報をやりとりするコミュニケーションインターフェースとなります。
例えば vSphere Client や Host Client で仮想マシンのホスト名や IP アドレスが見える件。
VMware Tools が情報を取得して送っているといえばそうなのですが、仮想マシンから vCenter や ESXi ホストへのネットワーク接続性が無い場合でも vSphere Client / Host Client で情報が見えるのは、 VMware Tools がこの Backdoor インターフェースを利用して情報を ESXi ホストに渡し、vCenter でも見えるようになっているというワケです。
逆方向として例えば仮想マシンコンソールで外部から仮想マシンに対してコピー&ペーストでクリップボード内容を渡したり、OVF Environment として外部から仮想マシンにメタデータを渡したり*、Invoke-VMScript で仮想マシン内でスクリプトを実行させたり etcetc と、ネットワークに依存せずに仮想マシン内に対して情報を持って行ったり処理をコールしたりでもこの Backdoor インターフェースを介して行われます。
* OVF Env は vmtoolsd なり vmware-rpctool なりで仮想マシン側がトリガーになって ESXi ホスト側を呼び出し、レスポンスとして設定された OVF Env 受け取っているっぽいので逆方向ではないですね…(12/25 追記)
前述の通り TCP/IP ネットワークに依存しないので、仮想マシンと vCenter や ESXi ホストの管理ネットワークとの接続性は関係なく、ESXi ホスト内でホストと仮想マシンの間で何らかのインターフェースでやりとりを行っています。
Backdoor…とは一体何なのか
その正体を確かめるため、我々調査隊は open-vm-tools レポジトリの奥地へ向かった―― github.com
ジャングルレポジトリの奥地、我々調査隊がそこで見たものは!?
Backdoor の実体とは、仮想 CPU として実装されている x86 の IN/OUT 命令をジャックしたものとなります。 例えば以下。
MOV EAX, 564D5868h /* マジックナンバー */ MOV EBX, コマンド特有のパラメータ MOV CX, バックドアコマンド番号 MOV DX, 5658h /* VMware I/O ポート */ IN EAX, DX
通常であれば CPU は CPU の I/O ポートを経由することで I/O デバイスとやりとりを行います(※ Port Mapped I/O、他に Memory Mapped I/O がある)
この I/O ポートについて、上記のアセンブラのように EAX, EBX, CX レジスタに Backdoor 用マジックナンバー、コマンドパラメータ(option)、コマンド番号 を格納し、DX レジスタに I/O ポート番号を指定して IN 命令を呼び出すことで I/O ポートの先に Backdoor が存在し、Backdoor を経由して ESXi ホストとやりとりが可能となります。
Open VM Tools の実装では C言語のインラインアセンブラにてレジスタ値や IN/OUT 命令をコントロールすることで Backdoor を制御しています。
また、Open VM Tools 自体は CPU の IN/OUT 命令を呼び出して Backdoor を利用しているだけなので、Open VM Tools や VMware Tools がインストールされていなくてもこれらの命令を制御できれば仮想マシン⇔ ESXi ホスト間でのやりとり自体は可能となっています。
RPCI と TCLO
仮想マシン⇔ ESXi ホスト間のやりとりとしては Backdoor インターフェースを用いますが、もう少し高度な機能実装のためのメッセージ交換として RPCI と TCLO と呼ばれる 2つのメッセージチャネルがあります。
使い分けとしては以下らしい。
特に TCLO の方は define している header ファイルをのぞくとそれらしい定義が色々書かれている。一方、RPCI の方は header ファイルが見当たらず個々のコマンドやメッセージが定義されているものではなさそう。 github.com github.com
参考文献
- Backdoor!! vmware-tools と 統合サービスに見るハイパーバイザの呼び出し方
- 大義のために:趣味と実益のためのVMware RPCインターフェースの活用 by アブドゥル・アジズ・ハリリ, ジャシエル・スペルマン, ブライアン・ゴーレンク
- OS dev - VMware Tools
- VMWare GuestRPC mechanism
- Mechanisms to determine if software is running in a VMware virtual machine (1009458)
古くからあるが故に一周してドキュメントが埋もれてしまいがちのような…
vSphere の根幹技術であるため、今回サルベージ・再拡散の想いもあって取り上げさせてもらいました。