はじめに
これまではFalcoの仕組み、Falco Ruleの詳細について紹介しました。
本記事では、Helm や Kustomize を使用して Falco をインストールする方法について解説します。特に GitOps でFalcoをデプロイする際に、Falcoの大規模な ConfigMap を適切に管理できる Kustomize の Base/Overlay 構成について紹介します。
Helmコマンドによるインストール
Helmを使用すると、簡単にFalcoをKubernetes環境へ導入できます。
基本的には公式ドキュメントの手順に従います。
Helmリポジトリの追加
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
Falcoのインストール
helm install --create-namespace falco falcosecurity/falco -n falco
カスタム設定の適用
values.yaml を編集し、カスタマイズした設定を適用できます。
helm upgrade --install falco falcosecurity/falco -n falco -f values.yaml
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 つとなります。
もし Base/Overlay 構成を利用したい場合は、HelmChartInflationGenerator
を使用するのが最適です。
HelmChartInflationGeneratorの使用
HelmChartInflationGenerator
は kustomization.yaml
に記述できる helmCharts 項目のことです。
Falco Helm Values の内容を直接 Kustomization
に記述するのではなく、まず HelmChartInflationGenerator
を通して Base/Overlay 構成を構築し、最終的に Kustomization.yaml
で Generator
設定をインポートします。
ファイル構成は以下となります。
.
├── 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クラスター名)を設定します。
# 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の上書きが可能です。
# 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の方は以下の設定が必要です
# 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
の内容が読み込まれます。
Custom Ruleの設定プラクティス
前回の記事では、Custom Ruleの適用方法について紹介しました。
今回は追加でCustom Ruleの各環境での置き換えのプラクティスについて紹介します。
1. 共通となる部分はgeneratorのbaseに置く
ファイル名は<rule_name>_common_override.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用ファイルを作成し、環境固有のルールを定義できます。
# 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の周辺ツールについて紹介します。