Sysdig

SCSK株式会社

ブログ

HOME Developer Square ブログ 【SCSK技術者によるブログ】Falco初学者講座 - Exceptions編

【SCSK技術者によるブログ】Falco初学者講座 - Exceptions編

皆さんこんにちは。
第21回担当の渡邊です。
今回はFalcoのルールを構成する要素のうち、Exceptionsについて解説していきます。

Falcoって何?という方は以下の記事をご覧ください。
https://www.scsk.jp/sp/sysdig/blog/scsk/scskfalco_-_condition.html

Exceptionsとは何でしょうか

アラート通知の対象外にしたいふるまいのホワイトリスト」です。
例えば、開発環境はアラート通知の対象外にしたい場面があると思いますが、そのような場合に利用するのがExceptionsです。
※本記事では、以降「アラート通知の対象」を「検知対象」とも表記します。

and not との違いは?

Exceptionsを利用せずとも、condition内でand not条件を使用することで任意のふるまいを検知対象外にできます。

しかし、The Falco blogでの指摘どおり、and notの多用でconditionの可読性が低下する場合にはExceptionsの利用を考えてみてください。
Why Are Exceptions Useful?: https://falco.org/blog/falco-rules-now-support-exceptions/#why-are-exceptions-useful

また、exceptionsで実現できない条件はconditionにand notで記述する必要があります。

Exceptionsの実際の定義

実際の定義を見てみましょう。

yaml
- rule: Write below binary dir
  ...
  exceptions:
    - name: known_bin_writers
      fields: [proc.name, fd.name]
      comps: [=, contains]
	  values:
	   - [nginx, /usr/bin/nginx]
	   - [apache, /bin/apache]

参考: https://falco.org/blog/falco-rules-now-support-exceptions/

上記の Write below binary dir は /bin, /sbinといったディレクトリへの書き込みが検知対象のルールです。

このexceptionsの解釈は

(proc.name = nginx and fd.name contains /usr/bin/nginx) or 
(proc.name = apache and fd.name contains /bin/apache)

を含むふるまいを検知対象外とします。

戸惑いを感じた方もいらっしゃるかもしれませんが、exceptionsが躓きやすい理由の一つに、定義を見て直観的に効力を理解しづらい点が挙げられます。

そこで、本記事では読解に焦点を当て、基本的なパターンから一つづつ解説していきます。

Exceptionsを構成する4要素

読解の前に、まずはExceptions構成する項目 fields, comps, values, nameの説明をします。

1. fields

fieldsはシステムコールに付随する情報の項目名を格納し、RuleやMacroのconditionで用いるproc.name等フィールドを指定できます。
フィールド一覧は以下のドキュメントを参考にしてみてください。
Supported Fields for Conditions and Outputs - https://falco.org/docs/reference/rules/supported-fields/

2. comps

fieldsとvaluesの関係性を決める演算子を格納する項目で、=やin等の値を指定します。

3. values

fieldsとcompsの評価対象となる具体的な値を格納する項目です。
例えばプロセス名「sh」に合致するふるまいを検知対象外にする場合、valuesにはshを指定します。

4. name

例外に名前を付けます。
名称はexceptions配下で一意である必要があります。

Exceptionsの基本的な解釈

exceptionsの解釈は「 <fields> と <values> が <comps> のとき検知対象外とする」ですが、Falco Ruleと同じ構文に直すのであれば「 <fields> <comps> <values> 」の順番で並べます。 冒頭のWrite below binary dirは難しい例のため、最小構成で説明します。

- rule: test-rule
  ::
  exceptions:
    - name: exclusion_1
      fields: 
        - fd.name
      comps: 
        - '='
      values: 
        - [/etc]

上記はfd.name = /etcを含むふるまいを検知対象外にします。
解釈に当てはめると「fd.name と /etc が = の時」検知対象外となります。
これを<fields> <comps> <values> の順に並べ替えると「 fd.name = /etc 」という式になるので理解しやすくなります。

また、見方を変えて「fields, comps, valuesを上から縦に並べて見る」事も理解を助ける1つの方法です。
上記のexceptionsを見やすくしたものを画像で示します。(これは説明用に整形したため、実際には登録できない場合があります。)

20250306-1.png

矢印に沿って読むと fd.name = /etc となりますね。

以上がExceptionsの基本的な解釈です。

Exceptionsでorやandを表現する。

先ほどは一つの条件を登録しました。
しかし、「fieldsとcompsは同じだけど、異なるvaluesを複数指定したい」、「2つ以上のfieldsを組み合わせたい」場合もあるかと思います。
その様な場合について解説していきます。

orの実装例1 - 1つの例外に複数の値を持たせたい場合

valuesに配列と値を追加します。

- rule: test-rule
  ::
  exceptions:
    - name: exclusion_2
      fields: 
        - proc.cmdline
      comps: 
        - contains
      values: 
        - [sh]
        - [bash]

これにより

proc.cmdline contains sh or proc.cmdline contains bash 

を含むふるまいが検知対象外となります。

orの実装例2 - 2つ目の例外を追加したい場合

複数の条件を持たせたい場合、exceptionsの直下にname, fields, comps, valuesを新たに設けます。

- rule: test-rule
  ::
  exceptions:
    - name: exclusion_2
      fields: 
        - proc.cmdline
      comps: 
        - contains
      values: 
        - [sh]
    - name: exclusion_3
      fields: 
        - fd.name
      comps: 
        - startswith
      values: 
        - [/bin]

これにより

proc.cmdline contains sh or fd.name startswith /bin 

を含むふるまいが検知対象外となります。

andの実装例 - 1つの例外の中で、2つ以上の条件を指定したい場合

exceptionsで特に難しいのがandの表現です。
結論から言うと「同じindexにあるfields, comps, valuesで式を作り、各indexで作られる式をAndで結ぶ」なのですが、文字で書くとわかりづらいため、冒頭のWrite below binary dirの内容を少し簡単にし、図を交えて説明します。
※indexとは、配列の位置(0番目、1番目...)を指します。

yaml
- rule: Write below binary dir
  ...
  exceptions:
    - name: known_bin_writers
      fields: [proc.name, fd.name]
      comps: [=, contains]
values:
	   - [nginx, /usr/bin/nginx]

冒頭でも説明したとおり、このexceptionsは

proc.name = nginx and fd.name contains /usr/bin/nginx 

を含むふるまいを検知対象外とします。

記述内容を結論に当てはめてみましょう。

1. 「同じindexにあるfields, comps, valuesで式を作り」は、次の表の「式」部分が完成系です。

20250306-2.png

exceptionsは <fields> <comps> <values> の順に配置すると式が成り立つため、これに従うと index 0の群では 「proc.name = nginx」、index 1の群では 「fd.name contains /usr/bin/nginx」という式が出来上がります。

2. 「各indexで作られる式をandで結ぶ」なので、index 0群と index 1群の式をandで結ぶと

proc.name = nginx and fd.name contains /usr/bin/nginx 

となります。

理解度クイズ

Exceptionsの理解を深めていただけたでしょうか。
最後に理解度を確認する問題を出します。よく考えてみてくださいね。

問題

1. proc.exepath が /bin/sh または /bin/bash のふるまいを検知対象外とするexceptionsを作成してください。
2. 次のexceptionsはどのようなふるまいを検知対象外にしますか。

  exceptions:
    - name: q2_question
      fields: [proc.name, evt.res]
      comps: [in, !=]
      values:
        - [[sh, bash], 0]

回答

1. 回答例2つ:

  exceptions:
    - name: q1_answer
      fields: [proc.exepath]
      comps: [=]
      values:
        - [/bin/sh]
        - [/bin/bash]

---
  exceptions:
    - name: q1_answer
      fields: [proc.exepath]
      comps: [in]
      values:
        - [[/bin/sh, /bin/bash]]

2. proc.name in (sh, bash) and evt.res != 0 のふるまい

最後に

今回はExceptionsの解釈に焦点をあて解説しました。初めてFalcoに触れる方の学習の一助になれば幸いです。
Falcoはカスタマイズ性が非常に高いため、自分でカスタマイズできるようになると、今まであきらめていたセキュリティ要件を実現するなど、ワンランク上のSysdig活用術を身につけることができます。

今後もFalco Ruleに関する情報をご紹介できればと思います。

担当者紹介

SCSK 渡邊
担当者名
渡邊
コメント
コード好き。アニメやドラマにターミナルの画面が出てくると、その内容がどのぐらい正確か必ずチェックします。
保有資格
Certified Kubernetes Administrator
Certified Kubernetes Application Developer

SCSK技術者ブログ

【Sysdig技術者によるブログ】Serverless AgentがAzure Container Appsに対応しました

【Sysdig技術者によるブログ】Serverless AgentがAzure Container Appsに対応しました

【Sysdig技術者によるブログ】システムコール分析における生成AIの活用

【Sysdig技術者によるブログ】システムコール分析における生成AIの活用

【SCSK技術者によるブログ】Sysdig情報アップデート~AWS連携にS3オプションが追加されました~

【SCSK技術者によるブログ】Sysdig情報アップデート~AWS連携にS3オプションが追加されました~

【SCSK技術者によるブログ】Falco初学者講座 - Exceptions編

【SCSK技術者によるブログ】Falco初学者講座 - Exceptions編

【SCSK技術者によるブログ】Falco初学者講座 - List/Macro編

【SCSK技術者によるブログ】Falco初学者講座 - List/Macro編

【SCSK技術者によるブログ】コンテナの電力消費をSysdig Monitorで監視してみよう

【SCSK技術者によるブログ】コンテナの電力消費をSysdig Monitorで監視してみよう

【SCSK技術者によるブログ】Sysdigの脅威検知はFalcoだけじゃない ~Contianer Drift編~

【SCSK技術者によるブログ】Sysdigの脅威検知はFalcoだけじゃない ~Contianer Drift編~

【SCSK技術者によるブログ】~Falco初学者に送る~ Sysdig SageでFalcoを勉強してみよう②

【SCSK技術者によるブログ】~Falco初学者に送る~ Sysdig SageでFalcoを勉強してみよう②

【SCSK技術者によるブログ】~Falco初学者に送る~ Sysdig SageでFalcoを勉強してみよう①

【SCSK技術者によるブログ】~Falco初学者に送る~ Sysdig SageでFalcoを勉強してみよう①

【 SCSK技術者によるブログ】Sysdigの設定をTerraformで管理してみた(Monitor編)

【 SCSK技術者によるブログ】Sysdigの設定をTerraformで管理してみた(Monitor編)

【SCSK技術者によるブログ】Falco初学者講座 - condition編

【SCSK技術者によるブログ】Falco初学者講座 - condition編

【SCSK技術者によるブログ】Sysdig Sageを使ってみた

【SCSK技術者によるブログ】Sysdig Sageを使ってみた

【SCSK技術者によるブログ】Sysdigと組み合わせて効果的なソリューションのご紹介 ~ポリシーエンジン編②~

【SCSK技術者によるブログ】Sysdigと組み合わせて効果的なソリューションのご紹介 ~ポリシーエンジン編②~

【SCSK技術者によるブログ】Sysdigをセキュアに使おう~IP Allowlist編~

【SCSK技術者によるブログ】Sysdigをセキュアに使おう~IP Allowlist編~

【SCSK技術者によるブログ】Node ExporterをSysdig Monitorに連携してみた

【SCSK技術者によるブログ】Node ExporterをSysdig Monitorに連携してみた

【SCSK技術者によるブログ】Sysdigの設定をTerraformで管理してみた

【SCSK技術者によるブログ】Sysdigの設定をTerraformで管理してみた

【SCSK技術者によるブログ】CNAPPの理解とSysdigのカバレッジ

【SCSK技術者によるブログ】CNAPPの理解とSysdigのカバレッジ

【SCSK技術者によるブログ】Sysdigの脅威検知はFalcoだけじゃない ~マルウェア検知編~

【SCSK技術者によるブログ】Sysdigの脅威検知はFalcoだけじゃない ~マルウェア検知編~

【SCSK技術者によるブログ】Sysdigのライセンス体系

【SCSK技術者によるブログ】Sysdigのライセンス体系

【SCSK技術者によるブログ】Sysdig とMicrosoft Entra ID間でSAML認証設定を試してみた

【SCSK技術者によるブログ】Sysdig とMicrosoft Entra ID間でSAML認証設定を試してみた

【SCSK技術者によるブログ】Sysdigと組み合わせて効果的なソリューションのご紹介 ~ポリシーエンジン編~

【SCSK技術者によるブログ】Sysdigと組み合わせて効果的なソリューションのご紹介 ~ポリシーエンジン編~

【SCSK技術者によるブログ】Sysdigの脅威検知はFalcoだけじゃない ~AWSサインインなりすまし検知編~

【SCSK技術者によるブログ】Sysdigの脅威検知はFalcoだけじゃない ~AWSサインインなりすまし検知編~

【SCSK技術者によるブログ】Sysdig SecureのRisks機能を試してみた

【SCSK技術者によるブログ】Sysdig SecureのRisks機能を試してみた

【SCSK技術者によるブログ】Sysdigの防御機能Kill Processを試してみた

【SCSK技術者によるブログ】Sysdigの防御機能Kill Processを試してみた

ページトップへ