Falcoの仕組みとユースケース

## はじめに
この記事はCyberAgent Group SRE Advent Calendar 2023の24日目の記事です。

## Falcoとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618703/f0644754-ad2c-fe71-bc95-75de073f108c.png)

Falcoは、クラウドネイティブ環境に特化した**ランタイムセキュリティチェック**を行うツールです。事前にNGとなるルールを定義し、意図しない挙動を検知することが可能です。コンテナへの侵入が発生した場合でも、どのような操作が行われたかを追跡できるため、フォレンジックに役立ちます。

このツールは[Sysdig社](https://sysdig.com/)によって開発されました。

### Falcoができること

Falcoには、侵入や改ざんを検知するためのデフォルトルールが豊富に用意されています。デフォルトルールやカスタムルールを利用することで、要件に合わせて細かい対応が可能になります。

Falcoの主な機能は以下の通りです。

1. **システムコールの監視**: Linuxカーネルからのシステムコールを監視し、異常な挙動を検出します。これにはファイルアクセス、ネットワークアクティビティ、プロセス生成などが含まれます。
2. **異常行動の検出**: 不正アクセス、攻撃、システムの不正利用などをリアルタイムで検出します。
3. **カスタマイズ可能なルール**: ユーザは自分の環境に合わせてルールをカスタマイズし、特定の行動やイベントに対する警告を設定できます。例えば、以下のような機能が実現可能です。
    - [TORネットワークへのトラフィック検知](https://sysdig.com/blog/detect-tor-network-connection-falco/)
    - [DoS類似のDNSトラフィック検知](https://sysdig.com/blog/denial-of-service-kubernetes-calico-falco/)
    - [EKS Audit Log分析](https://faun.pub/analyze-aws-eks-audit-logs-with-falco-95202167f2e)
    - [AWS CloudTrail Log分析](https://sysdig.com/blog/amazon-s3-security-cloudtrail-falco/)
4. **多様なOutput連携方式**: 現時点で、以下の[連携方式](https://falco.org/docs/outputs/forwarding/)が可能です。
    - チャットツール(Slack/Teams)
    - メトリクス(Datadog/Prometheus/Dynatrace)
    - アラート(PagerDuty/AlertManager)
    - ログ(Elasticsearch/CloudWatch/Syslog)
    - ファイル(S3)
    - イベント(Lambda/Argo Workflow)
    - メッセージ(SQS/SNS/Kafka)
    - メール
    - Webhook

### Falcoができないこと

Falcoはあくまで動作中のコンテナの侵入・改ざん検知ツールであり、以下の機能は提供していません。

1. **脅威の自動処理**: FalcoのイベントやメッセージなどのOutputを利用し、他のパイプラインに組み込む必要があります。
2. **全てのセキュリティリスクのカバー**: 特定のセキュリティリスクや脆弱性の種類（特にアプリケーションレベルのもの）はFalcoの監視範囲外です。
3. **コンテナイメージの脆弱性診断**: コンテナイメージの各レイヤーに対する脆弱性診断はFalcoの監視範囲外です。
4. **ウイルスの検知**: 定義された動作検知以外に動くウイルスもあるため、FalcoはClamAVなどのソフトウェアの代替にはなりません。
5. **ポリシーとしての使用**: Falco RuleはPolicyのための汎用言語ではないため、プログラミング言語の表現力を持っていません。L7のネットワークトラフィックを詳細に検証するポリシーを使用したい場合、OPAがおすすめです。
6. **情報収集目的の使用**: Falcoはアラートのみを指定の場所へ送るため、Logやイベントの監視として使用するのはできません。代わりにモニタリングツールの使用がおすすめです。


### デフォルトRuleのCoverage
|カテゴリ|項目|説明| 
|---|---|---|
| **コンテナ監視**| 特権コンテナの使用| コンテナ内での特権のエスカレーションを検出します。特権コンテナの使用を監視して、セキュリティリスクを識別します。 | 
| **システム環境** | ネームスペースの変更| setns のようなツールを使用したネームスペースの変更を検出します。システムの分離を回避する試みを追跡します。 
|| Linux coreutils の変異        | Linuxのコアユーティリティプログラムの変異を検出します。システムツールの改ざんや置き換えを監視します。| 
| **ファイルシステム** | 重要ディレクトリへのアクセス| /etc, /usr/bin, /usr/sbin などのディレクトリへの不正な読み書きを検出します。システムファイルの改ざんや機密データの漏洩を防ぎます。| 
|| シンボリックリンクの作成 | ファイルのシンボリックリンク作成の変更を監視します。ファイルシステムのセキュリティ侵害を検出します。| 
|| 所有権とモードの変更 | ファイルの所有権・モードの変更を監視します。ファイルシステムのセキュリティ侵害を検出します。| 
|| ログイン関連バイナリの変異| ログインバイナリやshadowutil, passwd などの実行ファイルの変異を検出します。ユーザ認証システムのセキュリティ侵害を警戒します。|
| **ネットワーク** | 予期しないネットワーク接続やソケットの変異 | 通常予期されないネットワーク接続やソケットの変異を検出します。外部攻撃や内部からのデータ漏洩を警戒します。| 
| **プロセス管理**    | 異常なプロセスの生成 | execve を使って生成された予期しないプロセスを検出します。システム内での不正な活動を追跡します。 | 
|| シェルバイナリとSSHバイナリの実行| sh, bash, csh, zsh などのシェルバイナリやssh, scp, sftp などのSSHバイナリの実行を検出します。システム管理外のコマンド実行を警戒します。| 

## Falcoの仕組み

Linuxカーネルでは、ファイルの修正、作成、削除が行われる際にシステムコールが発行されます。コンテナはLinuxノード上で隔離されて動作するプロセスであるため、コンテナ内のディレクトリが改ざんされた際にもシステムコールが発行されます。Falcoは、LinuxカーネルのeBPF（extended Berkeley Packet Filter）機能を利用してこれらのシステムコールをキャプチャし、キャプチャしたシステムコールを基にアラートを送信する仕組みを持っています。Falcoは事前に定義された「**通常行われないような操作**」を検知し、条件に応じてアラートを発します。

Falcoは、以下のコンポーネントによって構成されています。

1. Falco Library(Kernelspace & Userspace)
1. Falco Plugin(Userspace)
1. Falco Program(Userspace)


### Falco Library

UserspaceのFalco Libraryは、`libscap`と`libsinsp`という二つのライブラリで構成されます。イベントの処理、プラグインデータの処理、OSの状態収集などの機能を提供し、Falco Programで使用されます。

KernelspaceのFalco Libraryは主にFalco Driverのことを指し、システムコールのキャプチャとその情報の伝送を担当します。Userspaceのメモリ空間の一部を共有し、`libscap`と迅速に連携する特徴があります。

- `libscap`: `library for system capture`の略称です。全体のフローにおいて情報伝達の役割を担っています。
- `libsinsp`: `library for system inspection`の略称です。`libscap`によって生成されたデータストリームにアクセスし、データを解析する役割を担っています。

Falco Driverは以下の2種類から一つを選びます。**両方のドライバは同じ機能を提供し、相互に排他的にデプロイされます。**
- Kernel Module
    全てのLinuxバージョンに対応し、やや多くのシステムリソースを消費します。
- eBPF probe
    Linux Kernel 4.11以降のみ対応し、Kernel Moduleよりも安全に実行されます(現時点でのパブリッククラウドではeBPFが主に使用されます)。

### Falco Plugin

Falco Pluginは、`libscap`を介して他のデータをFalcoに送信するサードパーティアプリケーションです。主にコミュニティによってメンテナンスされ、AWS、Kubernetes、Linuxなどの特定情報をFalcoに送信するためのプラグインが多数存在します。

### Falco Program

Falcoの各機能を統合的に利用するプログラムです。`Rule Engine`やデフォルト機能（出力の出力、本家のKubernetes監査ログ受信機能など）が含まれます。`Rule Engine`以外に足りない機能があれば、Falco Pluginと補い合います。

`Rule Engine`は、主に以下の機能を持っています。
- Falcoルールファイルの読み込みと解析
- ルールのコンパイル(libsinsp使用)
- ルールのトリガー時の適切なアクションの実行と結果の出力

### 全体像

![Falco構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618703/ff86364d-beeb-96e5-1254-386ecd96f5cf.png)


## Falcoのユースケース

### 基本ケース: `falco + falcosidekick + slack/datadog/grafana`

Falcoの最も基本的なユースケースです。

![base.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618703/2cc66703-6829-a024-d8d7-8bd2f9dbd2e7.png)



### イベント駆動: `falco + falcosidekick + eventbus` 

`ArgoCD`プロジェクトの`Argo Events`と`Argo Workflow`機能を利用して、Falcoからの警告に応じて特定のPodを削除するフローの例です。侵入検知の場合、Podを削除するとフォレンジック調査ができなくなる可能性があるため、この方法はお勧めしません。ここでの削除はあくまで一例としての使用です。

また、Eventに対応しているものであれば同じく利用可能です。
- [Tekton](https://falco.org/blog/falcosidekick-response-engine-part-4-tekton/)
- [Cloud Functions](https://falco.org/blog/falcosidekick-response-engine-part-7-cloud-functions/)
- [Knative](https://falco.org/blog/falcosidekick-response-engine-part-3-knative/)


![falco-event-argo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618703/6fa34f64-cdf1-eefa-0fd4-424c2b12162a.png)

### CloudTrail分析: `AWS CloudTrail + CloudTrail Plugin + falco`

CloudTrailのJSONファイルを定期的に分析するフローの例です。検知例としては以下のようなものがあります。

検知の例は以下となります。
- RootユーザーのMFAが無効化された場合
- 新しいIAMユーザーやIAM Identity Centerユーザーが作成された場合
- 機密性の高いS3オブジェクトがダウンロードされた場合
- CloudTrailログ機能が無効化された場合
- S3バケットのポリシーが変更された場合
- 許可されていないリージョンでEC2インスタンスが起動された場合

![falco-s3-cloudtrail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618703/04f1843f-777c-0283-23c0-b5d2287b173a.png)


## さいごに

次回はFalco Rulesの紹介を行う予定です。


## 参考文献

[Extend Falco outputs with falcosidekick](https://falco.org/blog/extend-falco-outputs-with-falcosidekick/)
[falco Github](https://github.com/falcosecurity/falco)
[Falco Glossary](https://falco.org/docs/reference/glossary/?all=true)
[Practical Cloud Native Security with Falco - Loris Degioanni & Leonardo Grasso](https://www.oreilly.com/library/view/practical-cloud-native/9781098118563/)