コンテンツにスキップ

wolfSentry -- wolfSSL組み込みファイアウォール/IDPS

説明

wolfSentryは、wolfSSL組み込みIDPS(侵入検知・防止システム)です。 つまり、wolfSentryは組み込みファイアウォールエンジン(静的および完全動的の両方)であり、インターフェース、アドレスファミリー、プロトコル、ポート、その他のトラフィックパラメータによって修飾された既知のホスト/ネットブロックのプレフィックスベースおよびワイルドカード対応検索機能を提供します。 さらに、wolfSentryは動的に設定可能なロジックハブとして使用でき、ユーザー定義のイベントをユーザー定義のアクションと任意に関連付け、接続属性によってコンテキスト化します。 これにより、クライアント/サーバーの関係を詳細に追跡し、期待されるパターンに一致するトラフィックを自由に通過させる一方で、悪意の込められたトラフィックを効率的に拒否できます。

wolfSentryは、ソースツリーのlwip/サブディレクトリ内のパッチセットを通じてlwIPスタックと完全に統合されています。 また、インバウンドおよびアウトバウンド接続のアプリケーションレベルフィルタリングのため、wolfSSLライブラリとも統合されています。

wolfSentryエンジンは、API経由でプログラム的に、またはエンジンに提供されるJSONのテキスト入力ファイルから、あるいはJSONフラグメントで動的かつ段階的に、またはこれらの方法の任意の組み合わせで動的に設定できます。 再設定はトランザクションセマンティクスによって保護され、スレッド化されたターゲット上の高度な内部ロックにより、アトミックなポリシー移行でシームレスなサービス可用性を保証します。 またコールバックを用いることで、MQTT、syslog、DDSメッセージバスなどを通じた、トランスポートプロトコルに依存しないリモートログ記録が可能です。

wolfSentryはリソース制約のある、ベアメタル/RTOS環境で適切に機能するよう設計されました。 指定された最大メモリフットプリント内に留まり、決定論的スループットを維持するアルゴリズムを持っています。 これにより、FreeRTOS、Nucleus、NUTTX、Zephyr、VxWorks、Green Hills Integrityなどの組み込みターゲット、およびARMやその他の一般的な組み込みCPUおよびMCU上で完全なファイアウォールとIDPS機能を実現できます。 動的ファイアウォール機能を持つwolfSentryを実行するのに必要なリソースは非常に小さく、コードフットプリントに64k、揮発性状態フットプリントに32kです。 アプリケーションと関連ライブラリが有する、既存のロジックと状態を完全に活用できます。

ドキュメント

完全なAPIリファレンスマニュアルのHTML版は、wolfSentryソースツリーのトップからmake doc-htmlで生成できます。 事前にdoxygenのインストールが必要です。

なおAPIリファレンスマニュアルのPDF版は事前生成されており、ソース配布物のdoc/サブディレクトリにdoc/wolfSentry_refman.pdfとして含まれています。 最新版は常にGitHubで入手可能です。 まもなく、日本語版もご提供できる予定です。

依存関係

デフォルトビルドでは、wolfSentryはPOSIXランタイム、特にヒープアロケータ、clock_gettime、stdio、セマフォ、pthreads、文字列APIに依存しています。 しかし、これらの依存関係は様々なビルド時オプションで回避できます。 例えば次のコマンドでは、基本的な文字列関数のいくつかとinet_ntop()ライブラリ関数(POSIX.1-2001から、lwIPでも実装されています)のみに依存するlibwolfsentry.aをビルドします。

make STATIC=1 SINGLETHREADED=1 NO_STDIO=1 EXTRA_CFLAGS="-DWOLFSENTRY_NO_CLOCK_BUILTIN -DWOLFSENTRY_NO_MALLOC_BUILTIN"

その後、アロケータと時間のコールバックをwolfsentry_init()に提供されるstruct wolfsentry_host_platform_interfaceに設定する必要があります。

wolfSentry Makefileは、現代的な(v4.0+)Gnu makeに依存しています。 ライブラリ自体はユーザー設定マクロファイルを作成し、WOLFSENTRY_USER_SETTINGS_FILEマクロでコンパイラにそのパスを渡すことで、make外の別のプロジェクト/フレームワーク内でビルドできます。

ビルド

wolfSentryは移植性を意識して設計しており、非POSIX・C89ターゲットでも動作します。 例えば、すべての依存関係はFreeRTOS/newlib-nano/lwIPランタイムで充足します。 wolfSentryのビルド時に問題がある場合はサポートフォーラムを通じてサポートを求めるか、support@wolfssl.comへ直接ご連絡ください。

現在のwolfSentryリリースはwolfSSLウェブサイトからZIPファイルとしてダウンロードできます。 リリース履歴を閲覧したり、最新のプレリリース更新のためにwolfSentry Gitリポジトリをクローンしたりすることもできます。

makeでは、環境に応じたフラグを渡すことでビルドパラメータを制御できます。 ビルド時に使用したフラグは、ビルドツリーのwolfsentry/wolfsentry_options.hに保存します。

なおmakeを使用しない場合は、設定を含むファイルへのパスにCマクロWOLFSENTRY_USER_SETTINGS_FILEを定義する必要があります。 wolfSentryをビルドするときとアプリケーションをビルドするときの両方で必要ですので、お気をつけください。

wolfSentryがサポートしているオプション一覧を以下に示します。 bool値のフラグ(LWIPNO_STDIONO_JSONなど)はデフォルトで未定義であり、定義することで有効化されます。 マクロはEXTRA_CFLAGSオプションを使用するか、USER_SETTINGS_FILEに配置することで有効化できます。 マクロのより詳細なドキュメントは、リファレンスマニュアルの「起動/設定/シャットダウンサブシステム」節をご覧ください。

makeオプション マクロオプション 説明
SHELL bashへの明示的/代替パスを提供
AWK Gnu awkへの明示的/代替パスを提供
V 詳細なmake出力
例:make V=1 -j test
USER_MAKE_CONF メインMakefileの先頭に含めるユーザー定義make節
例:make -j USER_MAKE_CONF=Makefile.settings
EXTRA_CFLAGS コンパイラに逐語的に渡される追加引数
EXTRA_LDFLAGS リンカに逐語的に渡される追加引数
SRC_TOP ソースコードのトップレベルディレクトリ(デフォルトpwd -P
BUILD_TOP 代替場所(ソースツリーの外部またはサブディレクトリ)でアーティファクトを使用してビルド
例:make BUILD_TOP=./build -j test
DEBUG 使用するコンパイラデバッグフラグ(デフォルト-ggdb
OPTIM 使用するオプティマイザフラグ(デフォルト-O3
HOST クロスコンパイル用のターゲットホストタプル(デフォルト未設定、つまりネイティブターゲティング)
RUNTIME ターゲットランタイムエコシステム -- デフォルト未設定、FreeRTOS-lwIPLinux-lwIPが認識されます
C_WARNFLAGS 使用する警告フラグ(一般的に適用可能なデフォルトをオーバーライド)
STATIC 静的リンクされた単体テストをビルド
STRIPPED バイナリからデバッグシンボルを取り除く
FUNCTION_SECTIONS 未使用のオブジェクトコード(関数粒度)を削除して総サイズを最小化
BUILD_DYNAMIC 動的リンクされたライブラリをビルド
VERY_QUIET ビルド中のすべての非エラー出力を抑制
TAR make dist用のGNU tarバイナリへのパス、macOSではgtarに設定すべき
VERSION make dist用にパッケージするバージョン
LWIP WOLFSENTRY_LWIP 真偽値 -- lwIP用の適切なビルド設定を有効化
NO_STDIO_STREAMS WOLFSENTRY_NO_STDIO_STREAMS stdioストリームI/Oに依存する機能を省略するよう定義
WOLFSENTRY_NO_STDIO_H stdio.hのインクルードを抑制するよう定義
NO_ADDR_BITMASK_MATCHING WOLFSENTRY_NO_ADDR_BITMASK_MATCHING アドレスのビットマスクマッチングサポートを省略し、プレフィックスマッチングのみをサポートするよう定義
NO_IPV6 WOLFSENTRY_NO_IPV6 IPv6アドレスファミリーのサポートを省略するよう定義
NO_JSON WOLFSENTRY_NO_JSON JSON設定サポートを省略するよう定義
NO_JSON_DOM WOLFSENTRY_NO_JSON_DOM JSON DOM APIを省略するよう定義
CALL_TRACE WOLFSENTRY_DEBUG_CALL_TRACE ランタイムコールスタックログ記録を有効化するよう定義(非常に詳細)
USER_SETTINGS_FILE WOLFSENTRY_USER_SETTINGS_FILE 自動生成されたwolfsentry_settings.hを置き換える代替設定ファイル
SINGLETHREADED WOLFSENTRY_SINGLETHREADED スレッドセーフティロジックを省略し、スレッドセーフティ関数とマクロをno-opマクロに置き換えるよう定義
WOLFSENTRY_NO_PROTOCOL_NAMES 定義されている場合、エラーコードとソースコードファイルを人間が読める形式でレンダリングするAPIを省略。数値的にレンダリングされます。
WOLFSENTRY_NO_GETPROTOBY プロトコルとサービスの名前による検索とレンダリングを無効にするよう定義
WOLFSENTRY_NO_ERROR_STRINGS 定義されている場合、エラーコードとソースコードファイルを人間が読める形式でレンダリングするAPIを省略。数値的にレンダリングされます。
WOLFSENTRY_NO_MALLOC_BUILTINS 定義されている場合、組み込みヒープアロケータプリミティブを省略します;wolfSentry APIに提供されるwolfsentry_host_platform_interfaceには、struct wolfsentry_allocator内のすべての関数の実装が含まれている必要があります。
WOLFSENTRY_HAVE_NONGNU_ATOMICS gnu様式のアトミック組み込み関数が利用できない場合に定義。組み込み関数用のWOLFSENTRY_ATOMIC_*()マクロ定義をWOLFSENTRY_USER_SETTINGS_FILEで提供する必要があります(wolfsentry_util.hを参照)。
WOLFSENTRY_NO_CLOCK_BUILTIN 定義されている場合、組み込み時間プリミティブを省略します;wolfSentry APIに提供されるwolfsentry_host_platform_interfaceには、struct wolfsentry_timecbs内のすべての関数の実装が含まれている必要があります。
WOLFSENTRY_NO_SEM_BUILTIN 定義されている場合、組み込みセマフォプリミティブを省略します;wolfSentry APIに提供されるwolfsentry_host_platform_interfaceには、struct wolfsentry_semcbs内のすべての関数の実装が含まれている必要があります。
WOLFSENTRY_USE_NONPOSIX_SEMAPHORES POSIXセマフォAPIが利用できない場合に定義。wolfsentry_util.cに非POSIX組み込み実装が存在しない場合は、#WOLFSENTRY_NO_SEM_BUILTINを設定する必要があり、wolfSentry APIに提供されるwolfsentry_host_platform_interfacewolfsentry_semcbsスロットに完全なセマフォ実装(shimセット)を含める必要があります。
WOLFSENTRY_SEMAPHORE_INCLUDE セマフォAPIを宣言するヘッダーファイルのパスに定義
WOLFSENTRY_USE_NONPOSIX_THREADS POSIXスレッドAPIが利用できない場合に定義。WOLFSENTRY_THREAD_INCLUDEWOLFSENTRY_THREAD_ID_TWOLFSENTRY_THREAD_GET_ID_HANDLERを定義する必要があります。
WOLFSENTRY_THREAD_INCLUDE スレッディングAPIを宣言するヘッダーファイルのパスに定義
WOLFSENTRY_THREAD_ID_T POSIX pthread_tに類似した適切な型に定義
WOLFSENTRY_THREAD_GET_ID_HANDLER POSIX pthread_selfに類似した、WOLFSENTRY_THREAD_ID_T型の値を返すvoid関数の名前に定義
FREERTOS FreeRTOS用にビルド

ビルドとセルフテストのコマンド例

Linux上でlibwolfsentry.aをビルドしてテスト

make -j test

詳細ビルド

make V=1 -j test

代替場所(ソースツリーの外部またはサブディレクトリ)でアーティファクトを使用してビルド

make BUILD_TOP=./build -j test

代替ビルド場所から非標準の宛先にインストール

make BUILD_TOP=./build INSTALL_DIR=/usr INSTALL_LIBDIR=/usr/lib64 install

libwolfsentry.aをビルドして様々な設定でテスト

make -j check

マルチスレッドサポートなしでlibwolfsentry.aをビルドしてテスト

make -j SINGLETHREADED=1 test

他の利用可能なmakeフラグはSTATIC=1STRIPPED=1NO_JSON=1NO_JSON_DOM=1であり、DEBUGOPTIMC_WARNFLAGSのデフォルト値もオーバーライドできます。

デフォルトをオーバーライドするためにユーザー提供のmakefileプリアンブルでビルド

make -j USER_MAKE_CONF=Makefile.settings

Makefile.settingsOPTIM := -Osのような単純な設定や、追加のルールと依存関係メカニズムを含む詳細なmakefileコードを含むことができます。

最小構成でビルド

make -j SINGLETHREADED=1 NO_STDIO=1 DEBUG= OPTIM=-Os EXTRA_CFLAGS="-DWOLFSENTRY_NO_CLOCK_BUILTIN -DWOLFSENTRY_NO_MALLOC_BUILTIN -DWOLFSENTRY_NO_ERROR_STRINGS -Wno-error=inline -Wno-inline"

ユーザー設定でビルドしてテスト

make -j USER_SETTINGS_FILE=user_settings.h test

FreeRTOSとlwIPソースツリーが図示のように配置されていると仮定して、ARM32上のFreeRTOS用にビルド

make -j HOST=arm-none-eabi RUNTIME=FreeRTOS-lwIP FREERTOS_TOP=../third/FreeRTOSv202212.00 LWIP_TOP=../third/lwip EXTRA_CFLAGS=-mcpu=cortex-m7

プロジェクト例

wolfsentry/examples/サブディレクトリに、一連のサンプルポートとアプリケーションを配置しています。 具体的には、Linux D-Bus機能と統合した、TLS対応組み込みWebサーバーを実装するデモポップアップ通知システムなどがあります。

APIの使用法に関するより包括的な例はtests/unittests.c、特にtest_static_routes()test_dynamic_rules()test_json()tests/test-config*.jsonのJSON設定ファイルにあります。

wolfSSLリポジトリでは、WOLFSSL_WOLFSENTRY_HOOKSで保護されたwolfssl/test.h内のコードをご参照ください。 これにはwolfsentry_store_endpoints()wolfSentry_NetworkFilterCallback()wolfsentry_setup()tcp_connect_with_wolfSentry()が含まれます。 また、WOLFSSL_WOLFSENTRY_HOOKSで保護されたexamples/server/server.cexamples/client/client.c内のコードもお役に立つかもしれません。

wolfSSL統合でビルドするには--enable-wolfsentryでwolfSSLを設定し、wolfSentryが非標準の場所にインストールされている場合は--with-wolfsentry=/インストールパスを使用してください。 wolfSSLテストクライアント/サーバーは、--wolfsentry-config <file>を使用して、コマンドラインからユーザー提供のwolfSentry JSON設定をロードできます。