Falcoをソースからビルドする

Falcoを自分で構築する方法に関するガイドへようこそ! あなたはとても勇敢です! あなたはすでに これらすべてを行うことで、あなたがコントリビュートしてくれる可能性が高いです! コントリビュートガイドをお読みください。

CentOS / RHEL

CentOS 7は、リリースアーティファクトのコンパイルに使用するリファレンスビルド環境です。

依存関係

CentOS 8 / RHEL 8

dnf install 'dnf-command(config-manager)'
dnf config-manager --set-enabled PowerTools # needed for libyaml-devel
dnf install gcc gcc-c++ git make cmake autoconf automake pkg-config patch
dnf install libcurl-devel zlib-devel libyaml-devel ncurses-devel libtool glibc-static libstdc++-static elfutils-libelf-devel -y

CentOS 7 / RHEL 7

yum install gcc gcc-c++ git make autoconf automake pkg-config patch
yum install libcurl-devel zlib-devel libyaml-devel ncurses-devel libtool glibc-static libstdc++-static elfutils-libelf-devel -y

You will also need cmake version 3.5.1 or higher which is not included in CentOS 7. You can follow the official guide or look at how that is done in the Falco builder Dockerfile. また、CentOS 7には含まれていないcmakeバージョン 3.5.1以降が必要です。公式ガイド に従うか、 Falco builder Dockerfile内でそれがどのように行われるかを確認できます。

Falcoのビルド

git clone https://github.com/falcosecurity/falco.git
cd falco
mkdir -p build
cd build
cmake -DUSE_BUNDLED_DEPS=ON ..
make falco

詳細は ここです。

カーネルモジュールドライバーのビルド

ビルドディレクトリで:

yum -y install kernel-devel-$(uname -r)
make driver

eBFPドライバーのビルド

カーネルモジュールドライバーを使用しない場合は、代わりに次のようにeBPFドライバーをビルドできます。

ビルドディレクトリで:

dnf install clang llvm
cmake -DBUILD_BPF=ON ..
make bpf

DEB/RPMパッケージのビルド

ビルドディレクトリで:

yum install rpm-build createrepo
make package

Debian / Ubuntu

依存関係

apt install git cmake build-essential

Falcoのビルド

apt install libssl-dev libyaml-dev libncurses-dev libc-ares-dev libprotobuf-dev protobuf-compiler libjq-dev libyaml-cpp-dev libgrpc++-dev protobuf-compiler-grpc libcurl4-openssl-dev libelf-dev
git clone https://github.com/falcosecurity/falco.git
cd falco
mkdir -p build
cd build
cmake ..
make falco

詳細は ここです。

カーネルモジュールドライバーのビルド

ドライバーをビルドするには、カーネルヘッダーが必要です。

apt install linux-headers-$(uname -r)

ビルドディレクトリで:

make driver

eBFPドライバーのビルド

カーネルモジュールドライバーを使用しない場合は、代わりに次のようにeBPFドライバーをビルドできます。

ビルドディレクトリで:

apt install llvm clang
cmake -DBUILD_BPF=ON ..
make bpf

Arch Linux

依存関係

pacman -S git cmake make gcc wget
pacman -S zlib jq ncurses yaml-cpp openssl curl c-ares protobuf grpc libyaml

Falcoのビルド

git clone https://github.com/falcosecurity/falco.git
cd falco
mkdir -p build
cd build
cmake ..
make falco

詳細は ここです。

カーネルモジュールドライバーのビルド

ビルドディレクトリで:

make driver

eBFPドライバーのビルド

カーネルモジュールドライバーを使用しない場合は、代わりに次のようにeBPFドライバーをビルドできます。

ビルドディレクトリで:

pacman -S llvm clang
cmake -DBUILD_BPF=ON ..
make bpf

依存関係

デフォルトでは、Falcoビルドはランタイム依存関係のほとんど動的にバンドルします。

これを確認すると、デフォルトでオプションUSE_BUNDLED_DEPSOFFになっています。つまり、該当するかどうかにかかわらず、Falcoビルドは、マシンに既に存在するライブラリに対してリンクしようとします。

そのようなオプションをONに変更すると、Falcoビルドはすべての依存関係を静的にバンドルします。

完全を期すために、これはFalcoの依存関係の完全なリストです:

  • b64
  • cares
  • curl
  • civetweb
  • grpc
  • jq
  • libyaml
  • lpeg
  • luajit
  • lyaml
  • ncurses
  • njson
  • openssl
  • protobuf
  • tbb
  • yamlcpp
  • zlib
  • libscap
  • libsinsp

Falcoのビルド

Falcoをビルドするには、2つの方法がサポートされています

ホストで直接ビルド

Falcoをビルドするには、buildディレクトリを作成する必要があります。 Falcoの作業コピー自体にbuildディレクトリを置くのが一般的ですが、ファイルシステムのどこにあってもかまいません。

Falcoをコンパイルする3つの主要なステップがあります。

  1. ビルドディレクトリを作成して入力します
  2. ビルドディレクトリのcmakeを使用して、Falcoのビルドファイルを作成します。ソースディレクトリが現在のディレクトリの親であるため、..が使用されました。代わりに、Falcoソースコードの絶対パスを使用することもできます
  3. makeを使用してビルドする

すべてビルド

mkdir build
cd build
cmake ..
make

特定のターゲットのみをビルドすることもできます:

Falcoだけをビルド

ビルドフォルダーとcmakeセットアップを実行してから、:

make falco

Falcoエンジンのみをビルド

ビルドフォルダーとcmakeセットアップを実行してから、:

make falco_engine

libscapだけをビルド

ビルドフォルダーとcmakeセットアップを実行してから、:

make scap

libsinspだけをビルド

ビルドフォルダーとcmakeセットアップを実行してから、:

make sinsp

probe / kernel ドライバーだけをビルド

ビルドフォルダーとcmakeセットアップを実行してから、:

make driver

結果をビルド

Falcoがビルドされると、buildフォルダーにある3つの興味深いものは次のとおりです:

  • userspace/falco/falco: 実際のFalcoバイナリ
  • driver/src/falco-probe.ko: Falcoカーネルドライバー
  • driver/bpf/probe.o: BPF support でFalcoをビルドした場合

デバッグバージョンをビルドする場合は、代わりにcmakeをcmake -DCMAKE_BUILD_TYPE=Debug ..として実行します。詳細なカスタマイズについては、[CMake オプション](#CMake オプション) セクションを参照してください。

CMake オプション

cmakeコマンドを実行するとき、ビルドファイルの動作を変更するために追加のパラメーターを渡すことができます。

以下にいくつかの例を示します。常に、buildフォルダーがFalco作業コピー内にあると想定しています。

verbose makefilesを生成する

-DCMAKE_VERBOSE_MAKEFILE=On

CおよびCXXコンパイラを指定する

-DCMAKE_C_COMPILER=$(which gcc) -DCMAKE_CXX_COMPILER=$(which g++)

バンドルされた依存関係を適用する

-DUSE_BUNDLED_DEPS=True

Falcoの依存関係の詳細については、こちらをご覧ください。

警告をエラーとして扱う

-DBUILD_WARNINGS_AS_ERRORS=True

ビルドタイプを指定する

デバッグビルドタイプ

-DCMAKE_BUILD_TYPE=Debug

リリースビルドタイプ

-DCMAKE_BUILD_TYPE=Release

この変数は大文字と小文字を区別せず、デフォルトでリリースされることに注意してください。

Falcoのバージョンを指定する

オプションで、ユーザーはFalcoのバージョンを指定できます。 例えば、

 -DFALCO_VERSION=0.29.0-dirty

明示的に指定しない場合、ビルドシステムはgit履歴からFALCO_VERSION値を計算します。

現在のgitリビジョンにgitタグがある場合、Falcoバージョンはそれと同じになります(先頭の「v」文字なし)。それ以外の場合、Falcoのバージョンは 0.<commit hash>[.dirty]の形式になります。

Enable BPF support

-DBUILD_BPF=True

これを有効にすると、次の後にbpfターゲットを作成できます:

make bpf

falco-builderコンテナを使用してビルド

Falcoをビルドする別の方法は、falco-builderコンテナを実行することです。 パッケージのビルドに使用できるリファレンスツールチェーンが含まれており、すべての依存関係はすでに満たされています。

イメージは次のパラメーターに依存します:

  • BUILD_TYPE:デバッグまたはリリース(大文字と小文字を区別せず、デフォルトはリリース)
  • BUILD_DRIVER:ビルド時にカーネルモジュールをビルドするかどうか。カーネルモジュールはホストではなく、centosイメージ内のファイル用に構築されるため、これは通常オフにする必要があります。
  • BUILD_BPF BUILD_DRIVERに似ていますが、ebpfプログラム用です。
  • BUILD_WARNINGS_AS_ERRORS:すべてのビルド警告を致命的と見なします
  • MAKE_JOBS:makeの-j引数に渡されます

このビルダーを実行する一般的な方法は次のとおりです。FalcoとSysdigを/home/user/srcの下のディレクトリにチェックアウトしていて、/home/user/build/ falcoのビルドディレクトリを使用したい場合は、次のコマンドを実行します。

docker run --user $(id -u):$(id -g) -v /etc/passwd:/etc/passwd:ro -it -v /home/user/src:/source -v /home/user/build/falco:/build falcosecurity/falco-builder cmake
docker run --user $(id -u):$(id -g) -v /etc/passwd:/etc/passwd:ro -it -v /home/user/src:/source -v /home/user/build/falco:/build falcosecurity/falco-builder package

ビルドされたパッケージのバージョンとして使用するために、FALCO_VERSION環境変数を明示的に提供することも可能です。

それ以外の場合、DockerイメージはデフォルトのFALCO_VERSIONを使用します。

最新のfalco-probeカーネルモジュールをロードする

Falcoのバイナリバージョンがインストールされている場合、古いFalcoカーネルモジュールがすでにロードされている可能性があります。最新バージョンを使用していることを確認するには、既存のFalcoカーネルモジュールをアンロードし、ローカルでビルドされたバージョンをロードする必要があります。

次の方法で既存のカーネルモジュールをアンロードします:

rmmod falco_probe

ローカルでビルドされたバージョンをロードするには、buildディレクトリにいると仮定して、以下を使用します:

insmod driver/falco-probe.ko
rmmod falco_probe

ローカルでビルドされたバージョンをロードするには、buildディレクトリにいると仮定して、以下を使用します:

insmod driver/falco-probe.ko

falcoを実行

Falcoがビルドされてカーネルモジュールが読み込まれると、buildディレクトリにいると想定して、次のようにfalcoを実行できます:

sudo ./userspace/falco/falco -c ../falco.yaml -r ../rules/falco_rules.yaml

デフォルトでは、falcoはイベントを標準エラーに記録します。

回帰テストを実行する

ホストで直接テスト

回帰テストを実行するには、Falcoをビルドした後、Falcoルートディレクトリでtest/run_regression_tests.shスクリプトを実行する必要があります。

依存関係

回帰テストフレームワークが機能するには、次の依存関係が必要です。

Avocadoとそのプラグインをインストールするには、pipを使用できます:

pip install avocado-framework==69.0 avocado-framework-plugin-varianter-yaml-to-mux==69.0
テストを実行する

$PWD/buildが異なる場合はFalcoを組み込んだディレクトリに変更します。

./test/run_regression_tests.sh -d $PWD/build

falco-testerコンテナを使用してテストする

ビルドに対して回帰テストスイートを実行する場合は、falco-testerコンテナを使用できます。ビルダーイメージのように、回帰テストを実行するために必要な環境が含まれていますが、イメージにマウントされているソースディレクトリとビルドディレクトリに依存しています。コンパイラーを必要とせず、テストランナーフレームワークavocadoを含めるには別のベースイメージが必要なため、これはfalco-builderとは異なるイメージです。

新しいコンテナイメージfalcosecurity/falco:test (ソースはFalco GitHubリポジトリのdocker/localディレクトリにあります)をビルドして、ビルドステップ中にビルドされたFalcoパッケージでコンテナーをビルドして実行するプロセスをテストします。

イメージは次のパラメーターに依存します:

  • FALCO_VERSION:テストコンテナイメージに含めるFalcoパッケージのバージョン。ビルドされたパッケージのバージョンと一致する必要があります。

このビルダーを実行する一般的な方法は次のとおりです。FalcoとSysdigを/home/user/srcの下のディレクトリにチェックアウトしていて、/home/user/build/falcoのビルドディレクトリを使用したい場合は、次のコマンドを実行します:

docker run --user $(id -u):$(id -g) -v $HOME:$HOME:ro -v /boot:/boot:ro -v /var/run/docker.sock:/var/run/docker.sock -v /etc/passwd:/etc/passwd:ro -e FALCO_VERSION=${FALCO_VERSION} -v /home/user/src:/source -v /home/user/build/falco:/build falcosecurity/falco-tester

$HOMEをマウントすると、テスト実行フレームワークを実行できます。$(id -g)を、Dockerソケットへのアクセスを許可されているグループ(多くの場合 dockerグループ)の正しいgidに置き換える必要がある場合があります。