blogトップへ戻る

Kubernetes上に展開したFalcoで、ホストOS側のファイル整合性監視を行う

2021.4.7

スリーシェイク大阪オフィスのSREの堤です。今回もFalcoネタです。

Falcoは、Kubernetesのコンテナ環境における振る舞い検知型のセキュリティツール。今回はFalcoにおける「ファイル整合性監視(File Integrity Monitoring)」に関して解説していこうと思う。

なぜファイル整合性監視が必要なのか

ファイル整合性監視は、監視するためのセキュリティ機能。特にPCI-DSSなど、セキュリティコンプライアンスに準拠するためには、この機能が必須となる。設定ファイル、バイナリー、ログファイルなどの不正な書き換えを検出することを目的としている。

これはコンテナ自身だけでなく、Kubernetesが稼働しているノードに対しても行う必要がある。GKEで使われているCOS(Container Optimize OS)やAmazonが開発したBottlerokectのようなリードオンリーなファイルシステムを採用しているものである場合はホスト側は意識する必要性はないが、UbuntuやRHELベースで動いているものに関してはファイル整合性監視が必要である。

Falcoでファイル整合性監視をするには

手段としては2つある。

  • ホストOSにFalcoをインストールする
  • PodとしてFalcoをデプロイする(Helmなどで)

Falco開発コミュニティとしては、前者のホストOS側にインストールすることを推奨されている。

FalcoはKubernetesランタイムセキュリティに使用できます。 Falcoを実行する最も安全な方法は、ホストシステムにFalcoを直接インストールすることです。これにより、侵害された場合にFalcoがKubernetesから分離されます。 その後、Falcoアラートは、Kubernetesで実行されている読み取り専用エージェントを介して使用できます。

分離が問題にならない場合は、FalcoをKubernetesで直接実行することもできます。 Kind、Minikube、Helmなどのツールを使用してKubernetesで直接Falcoを実行する場合は、サードパーティ統合をご覧ください。

https://falco.org/ja/docs/getting-started/installation/

ただし、ノードに直接インストールするとなると、独自でOSイメージの作成、Falcoをインストールすることで必要なパッケージの追加インストールなどなど、ノードOSがピュアにならないデメリットもある。あと、kubernetesやhelmの運用に慣れている組織なら、helmでインストールしたほうが楽ということもあるので、一長一短だと個人的には考えている。

今回は、helmでfalcoをインストールする際に、ホスト側のアクティビティを検出できるようにインストールする方法を解説する。

インストール/設定方法

インストール手順は以下ページをご参考に入れてください。

falcosecurity/charts

PodとしてデプロイしたFalcoで、ホスト側のアクティビティを検出するには、ホスト側のファイルシステムをマウントさせて、priviledgedコンテナとしてデプロイする必要がある。そのための、設定ファイルが以下です。

securityContext:
  privileged: true
volumeMounts:
  - mountPath: /host/proc
    name: proc-fs
    readOnly: true
  - mountPath: /host/boot
    name: boot-fs
    readOnly: true
  - mountPath: /host/lib/modules
    name: lib-modules
  - mountPath: /host/usr
    name: usr-fs
    readOnly: true
  - mountPath: /host/etc
    name: etc-fs
    readOnly: true

そして、以下のコマンドでfalcoをデプロイする。

helm install -n falco falco falcosecurity/falco -f falco-value.yaml

この状態で、ホストOSにSSHでログインして、例えば「touch /etc/hoge.conf」で「/etc」配下に何らかの設定ファイルを追加する。すると、PodとしてデプロイしたFalcoがこのアクティビティを検出する。ホストで検出したイベントの場合、「container_id=host」としてログが記録される。これで、コンテナ側のイベントなのか、それともホスト側のイベントなのか区別することが可能だ。

Mar 29 18:58:40 ip-10-0-30-240 falco: 18:58:40.119645790: Error File below /etc opened for writing (user=root user_loginuid=-1 command=touch hoge.conf parent=bash pcmdline=bash file=/etc/hoge.conf program=touch gparent=su ggparent=sudo gggparent=sh container_id=host image=<NA>)

なお、上記イベントはFalcoの標準ルールで検出可能。ルールをカスタマイズしたい場合は、以下で掲載されているカスタムルールを参考に追加してみると良いだろう。

Cloud Native Security Hub

以上