Falcoのインストール(helm)

## はじめに

これまではFalcoの仕組み、Falco Ruleの詳細について紹介しました。

https://qiita.com/kumo-rn5s/items/6e96d2386ab2366641ef

https://qiita.com/kumo-rn5s/items/7e2970ec7ebb50cc98ab

本記事では、Helm や Kustomize を使用して Falco をインストールする方法について解説します。特に GitOps でFalcoをデプロイする際に、Falcoの大規模な ConfigMap を適切に管理できる Kustomize の Base/Overlay 構成について紹介します。



## Helmコマンドによるインストール

Helmを使用すると、簡単にFalcoをKubernetes環境へ導入できます。

基本的には公式ドキュメントの手順に従います。

https://falco.org/docs/setup/kubernetes/

### Helmリポジトリの追加

```sh
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
```

### Falcoのインストール

```sh
helm install --create-namespace falco falcosecurity/falco -n falco
```

### カスタム設定の適用

values.yaml を編集し、カスタマイズした設定を適用できます。

```sh
helm upgrade --install falco falcosecurity/falco -n falco -f values.yaml
```

values.yamlのフォーマットはこちらです

https://github.com/falcosecurity/charts/blob/master/charts/falco/values.yaml


## Kustomize/GitOpsによるインストール

ArgoCD などの GitOps ツールを用いて Falco のデプロイを管理している場合、Kustomize を利用するケースが多いでしょう。

しかし、Kustomize + Helm を用いて Base/Overlay 構成で Falco を管理するのは困難です。
Helm Values をそのまま Base/Overlay 方式で置き換えようとすると、以下のエラーが発生する可能性があります。

```
merging from generator ... exists; behavior must be merge or replace
```

また、Kustomize Patch などのツールで replace を指定して修正することもできません。
その理由は、Falco の Helm Values の大半が ConfigMap 内の falco.yaml に格納されているためです。
この ConfigMap の特定の行だけを `op: replace` で変更するのは非常に難しいです。

そこで、Base を利用しない Kustomize の構成が解決策の 1 つとなります。

https://www.aimhighergg.com/kustomize-helmcharts/

もし Base/Overlay 構成を利用したい場合は、`HelmChartInflationGenerator` を使用するのが最適です。

### HelmChartInflationGeneratorの使用

`HelmChartInflationGenerator` は `kustomization.yaml` に記述できる helmCharts 項目のことです。
Falco Helm Values の内容を直接 `Kustomization` に記述するのではなく、まず `HelmChartInflationGenerator` を通して Base/Overlay 構成を構築し、最終的に `Kustomization.yaml` で `Generator` 設定をインポートします。


ファイル構成は以下となります。

```bash
.
├── base
│   └── falco
│       ├── generator
│       │   ├── falco.yaml
│       │   └── kustomization.yaml
│       └── kustomization.yaml
├── overlay
│   ├── dev
│   │   └── falco
│   │       ├── generator
│   │       │   ├── falco.yaml
│   │       │   └── kustomization.yaml
│   │       └── kustomization.yaml
│   └── prd
│       └── falco
│           ├── generator
│           │   ├── falco.yaml
│           │   └── kustomization.yaml
│           └── kustomization.yaml

```

### Generatorの中身

`base/falco/generator` 以下の falco.yaml では、Falco の `ServiceAccount` の `Annotation` や `k8saudit-eks` プラグインのパラメータ（EKSクラスター名）を設定します。


```yaml
# base/falco/generator/falco.yaml
apiVersion: builtin
kind: HelmChartInflationGenerator
metadata:
  name: falco
releaseName: falco
name: falco
version: 4.19.0
repo: https://falcosecurity.github.io/charts
valuesInline:
  podPriorityClassName: system-cluster-critical
  serviceAccount:
    create: true
    annotations:
      eks.amazonaws.com/role-arn: "example-arn" # ここ
  falco:
    rules_files:
    - /etc/falco/falco_rules.yaml
    - /etc/falco/k8s_audit_rules.yaml
    - /etc/falco/rules.d
    load_plugins: [ k8saudit-eks, json ]
    plugins:
    - name: k8saudit-eks
      library_path: libk8saudit-eks.so
      init_config:
        shift: 10
        polling_interval: 10
        use_async: false
        buffer_size: 500
      open_params: "example_eks_cluster_name" # ここ
    - name: json
      library_path: libjson.so
      init_config: ""
  falcosidekick:
  # ...
---
# base/falco/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- falco.yaml
```

`overlay/dev/falco/generator`では、環境に応じたHelm Valuesの上書きが可能です。

```yaml
# overlay/dev/falco/generator/falco.yaml
apiVersion: builtin
kind: HelmChartInflationGenerator
metadata:
  name: falco
valuesInline:
  serviceAccount:
    create: true
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::123456789012:role/dev-falco-role" # 置き換え
  falco:
    plugins:
      - name: k8saudit-eks # List一部のみの置き換えはできないため、残りの部分も書く必要があります
        library_path: libk8saudit-eks.so
        init_config:
          shift: 10
          polling_interval: 10
          use_async: false
          buffer_size: 500
        open_params: dev-eks-cluster # 置き換え
      - name: json # List一部のみの置き換えはできないため、残りの部分も書く必要があります
        library_path: libjson.so
        init_config: ""
---
# overlay/dev/falco/generator/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: falco

resources:
- ../../../../base/falco/generator

patchesStrategicMerge:
  - falco.yaml
```

### Generatorの利用

`base/falco/kustomization.yaml`は、generatorをインポートする必要がありません。
通常のk8sリソースを追加すればいいです。

overlayの方は以下の設定が必要です

```yaml
# overlay/dev/falco/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: falco

resources:
- ../../../base/falco

generators: # ここ
  - generator # 上記HelmChartInflationGeneratorの所在ディレクトリ名
```

GeneratorのディレクトリはOverlayの中のものを利用しているので、インポートする際に、`base/falco/generator`の内容が読み込まれます。


![Falco Helm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618703/553ef61f-fa50-4665-a550-beace216669a.png)



## Custom Ruleの設定プラクティス

前回の記事では、Custom Ruleの適用方法について紹介しました。
今回は追加でCustom Ruleの各環境での置き換えのプラクティスについて紹介します。

**1. 共通となる部分はgeneratorのbaseに置く**

ファイル名は`<rule_name>_common_override.yaml`

```yaml
# base/falco/generator/falco.yaml
apiVersion: builtin
kind: HelmChartInflationGenerator
metadata:
  name: falco
releaseName: falco
name: falco
version: 4.19.0
repo: https://falcosecurity.github.io/charts
valuesInline:
  # ...
  customRules:
    k8s_audit_rules_common_override.yaml: |-
      - rule: ****
        # ...
        override:
          condition: append
    falco_stable_common_override.yaml: |-
      - rule: ****
        # ...
        override:
          condition: append
```

**2. 各環境で新規ファイルを作成する**

ファイル名は`<rule_name>_<env>_override.yaml`
環境ごとにoverride用ファイルを作成し、環境固有のルールを定義できます。

```yaml
# overlay/dev/falco/generator/falco.yaml
apiVersion: builtin
kind: HelmChartInflationGenerator
metadata:
  name: falco
valuesInline:
  customRules:
    k8s_audit_rules_dev_override.yaml: |-
      - rule: ****
        # ...
        override:
          condition: replace
    falco_stable_dev_override.yaml: |-
      - rule: ****
        # ...
        override:
          condition: replace
```

## まとめ

本記事では、Helm と Kustomize を使用して Falco をインストールする方法を紹介しました。
特に GitOps で Falco を運用する場合、HelmChartInflationGenerator を活用することで、Base/Overlay 構成を維持しつつ Helm Values を柔軟に管理できます。環境ごとに異なるルールを適用する方法としても有効なので、ぜひ活用してみてください。

次回はFalcoの周辺ツールについて紹介します。