Falcoのイベント検知Ruleから特定の条件を除外設定をする

以下の自分のブログ記事で書いているように、FalcoをEKSに入れてます。

[Falcoとaws-for-fluent-bitを使ってCloudWatchにEKSノード上の危険なシステムコール情報を収集する(Proxy環境）](https://yomon.hatenablog.com/entry/2020/12/falco_fluentbit_cloudwatch)

この記事では、デフォルトで定義されているルールから、特定のイベント検知を除外したい場合の例を書きます。



# 除外対象の例

例えば以下のようなイベントをFalcoが検知したとします。
>02:05:21.813285480: Warning Sensitive file opened for reading by non-trusted program (user=root user_loginuid=-1 program=awsagent command=awsagent file=/etc/pam.d/config-util parent=systemd gparent=<NA> ggparent=<NA> gggparent=<NA> container_id=host image=<NA>) k8s.ns=<NA> k8s.pod=<NA> container=host k8s.ns=<NA> k8s.pod=<NA> container=host

このAWS Agentの処理を例外として設定したいとします。

# 除外設定

## ルールの確認
まずは自身のインストールしているFalcoのバージョンのRuleを確認します。この記事では `falco-1.5.7`として書き進めます。

Githubなら以下のリンクです。

https://github.com/falcosecurity/charts/blob/falco-1.5.7/falco/rules/falco_rules.yaml

## 該当ルールの検索
`Sensitive file opened for reading by non-trusted program` で検索すると以下の部分が当てはまります。

```yaml
- rule: Read sensitive file untrusted
  desc: >
    an attempt to read any sensitive file (e.g. files containing user/password/authentication
    information). Exceptions are made for known trusted programs.
  condition: >
    sensitive_files and open_read
    and proc_name_exists
    and not proc.name in (user_mgmt_binaries, userexec_binaries, package_mgmt_binaries,
     cron_binaries, read_sensitive_file_binaries, shell_binaries, hids_binaries,
     vpn_binaries, mail_config_binaries, nomachine_binaries, sshkit_script_binaries,
     in.proftpd, mandb, salt-minion, postgres_mgmt_binaries,
     google_oslogin_
     )
    and not cmp_cp_by_passwd
    and not ansible_running_python
    and not proc.cmdline contains /usr/bin/mandb
    and not run_by_qualys
    and not run_by_chef
    and not run_by_google_accounts_daemon
    and not user_read_sensitive_file_conditions
    and not perl_running_plesk
    and not perl_running_updmap
    and not veritas_driver_script
    and not perl_running_centrifydc
    and not runuser_reading_pam
    and not linux_bench_reading_etc_shadow
    and not user_known_read_sensitive_files_activities
    and not user_read_sensitive_file_containers
  output: >
    Sensitive file opened for reading by non-trusted program (user=%user.name user_loginuid=%user.loginuid program=%proc.name
    command=%proc.cmdline file=%fd.name parent=%proc.pname gparent=%proc.aname[2] ggparent=%proc.aname[3] gggparent=%proc.aname[4] container_id=%container.id image=%container.image.repository)
  priority: WARNING
  tags: [filesystem, mitre_credential_access, mitre_discovery]
```


注目するのは以下の部分です。Falcoのデフォルトのルールにはこういった除外対象を指定する部分があらかじめ準備されているものが多くあります。（無くても簡単に自分で足すことも可能です）

```yaml
    and not user_known_read_sensitive_files_activities
    and not user_read_sensitive_file_containers
```

例えば `user_known_read_sensitive_files_activities` で検索してみると以下のマクロに行き当たります。 `never_true` と設定されてますが、ここに条件を書くことで除外対象とできます。

```yaml
- macro: user_known_read_sensitive_files_activities
  condition: (never_true)
```
https://github.com/falcosecurity/charts/blob/falco-1.5.7/falco/rules/falco_rules.yaml#L1444-L1445


## 除外条件の記述
検索対象の例で挙げた `program=awsagent` で除外を設定したいと思います。

以下のoutputの項目を見るとprogramが `proc.name` で定義されているとわかります。

```yaml
  output: >
    Sensitive file opened for reading by non-trusted program (user=%user.name user_loginuid=%user.loginuid program=%proc.name
    command=%proc.cmdline file=%fd.name parent=%proc.pname gparent=%proc.aname[2] ggparent=%proc.aname[3] gggparent=%proc.aname[4] container_id=%container.id image=%container.image.repository)
```

ということで、先程挙げた `user_known_read_sensitive_files_activities` の `never_true` となっていた部分に以下のように `proc.name = awsagent` と置き換えてデプロイすれば、このルールからawsagentの処理が除外されます。

シンプルにするためにプログラムを指定しましたが、ANDやOR条件を並べることもできるので、もし対象のファイル等も特定できるならファイルとかも指定して除外範囲を狭めると更に良いと思います。

```yaml
- macro: user_known_read_sensitive_files_activities
  condition: (proc.name = awsagent)
```