マイクロソフト、LinuxのeBPFをWindows 10などに移植するプロジェクトを発足

news

マイクロソフトは、Linuxで実装されたeBPF(Extended Berkeley Packet Filter)をWindowsに追加することを目的とした新しいオープンソースプロジェクトを立ち上げました。

eBPF(Extended Berkeley Packet Filter)は、ネットワークのパフォーマンスやセキュリティ、イベントの分析や観測などさまざまな便利な機能が搭載されています。

eBPFは、ユーザーが提供するプログラムを特定のイベント、システムコールのようなフックポイント、関数のEntry/Exit、カーネルのトレースポイント、ネットワークイベントの際OSのカーネル内部で隔離(サンドボックス化)して実行することが可能です。

事前に定義されたフックに接続され、eBPFプログラムは悪意のある活動によって変更されていないデータをリアルタイムに検査することができます。

そのため、eBPFはネットワークやセキュリティの分野で応用されるフィルタリング、モニタリング、および分析のタスクに特に有効です。

またeBPFプログラムはカーネルのデータ構造にアクセスすることができ、実行するためにカーネルを再コンパイルする必要がないため稼働中のシステムのデバッグ目的にも適しています。

eBPFの開発にWindowsの章を追加

マイクロソフトの取り組みは、eBPFコミュニティの活動をベースに既存のeBPFオープンソースプロジェクトをWindows 10やWindows Server 2016以降で動作可能なモジュールとして搭載できる互換性レイヤーを追加することを目的としています。

eBPFは、特にOSのカーネルを拡張する際に、DoS対策やオブザーバビリティなどのユースケースにおいてプログラマビリティとアジリティを提供する技術として知られています。本プロジェクトはLinuxのエコシステムで親しまれている既存のeBPFのツールチェーンやAPIをWindowsの上で利用できるようにするためのプログラムです。つまりこのプロジェクトは既存のeBPFプロジェクトをサブモジュールとし、その間にWindows上で動作させるためのレイヤーを追加するものです。

https://github.com/Microsoft/ebpf-for-windows

eBPFプログラムはツールチェーンを使ってさまざまな言語でeBPFバイトコードを生成できるため、どんなアプリケーションでも利用でき、共有ライブラリを呼び出して、Windows Netshコマンドラインツールにも投入することができます。

マイクロソフト社はユーザーモードの保護されたプロセスでホストされているPREVAIL eBPF verifierとカーネルモードの実行コンテキストで実行されているIO VisorのuBPFを使用して生成されたバイトコードの正当性をチェック、Windowsの上でeBPFプログラムを実行しています。

マイクロソフトは「カーネルモードの実行コンテキストにインストールされたeBPFプログラムは、イベントを処理するためのさまざまなフックにアタッチしたり、パブリックなWindowsカーネルAPIを内部的にラップしているeBPF SIMが公開しているさまざまなヘルパーAPIを呼び出したりすることができ、既存のバージョンのWindows上でeBPFを使用することができます。」と説明しています。

現在、利用可能なフックはXDPとソケットバインドの2つのみで、いずれもネットワークに関するものです。しかし、マイクロソフト社では今後さらに追加され、他の分野もカバーしていくことを予定しています。

今回のプロジェクトでマイクロソフト社はLinux用に書かれたフックやヘルパーのうち、Windowsに応用できるものを自社のOSに「移植」したいと考えているようです。

同じくeBPF for Windowsプロジェクトでは、eBPFプログラムとコミュニケーションするアプリケーションのためにソースコードの互換性を提供するLibbpf APIを公開している

ebpf-for-windowsプロジェクトはまだ始まったばかりで、長期的な目的としては「eBPFの優位点をWindowsユーザーに提供する」こととその開発の指針ともなる大きなeBPFコミュニティの一員になることです。

eBPFプログラムをオーサリングしてWindows上で動作させる方法のチュートリアルはこちらから参照することができます。

https://github.com/microsoft/ebpf-for-windows/blob/master/docs/tutorial.md

Comments

Copied title and URL