本シリーズでは、ランタイム脅威検知のデファクトスタンダードであるFalcoの検知Ruleを、1つの記事で1つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方はこちらのブログ記事をご参照ください。
今回ご紹介する検知Ruleは「Create Sensitive Mount Pod」です。
Rule記述
- rule: Create Sensitive Mount Pod
desc: >
Detect an attempt to start a pod with a volume from a sensitive host directory (i.e. /proc).
Exceptions are made for known trusted images.
condition: kevt and pod and kcreate and sensitive_vol_mount and not ka.req.pod.containers.image.repository in (falco_sensitive_mount_images)
output: Pod started with sensitive mount (user=%ka.user.name pod=%ka.resp.name ns=%ka.target.namespace resource=%ka.target.resource images=%ka.req.pod.containers.image volumes=%jevt.value[/requestObject/spec/volumes])
priority: WARNING
source: k8s_audit
tags: [k8s]
Rule概要
Kubernetes Audit Events Pluginプラグインをインストールすることで使用可能になるルールです。
Kubernetes のセキュリティ課題のほとんどが、クラスター (その制御プレーンと API、基盤となるノードと Linux カーネル、およびネットワーク) を複数のテナント間で共有することに起因します。
コンテナがホストのファイルシステムにアクセスできるということは、ホスト自体の制御権を得ることであり、他のコンテナに関連するデータが含まれている可能性のあるホストデータにもアクセスできるということです。これにより、悪意のあるユーザーがホスト環境を操作し、そのファイルシステム内のデータにアクセス、改ざん、削除できる可能性があります。つまり、コンテナのエスケープやクラスターの他の部分への攻撃に利用される可能性があります。
そのため、コンテナとホストとの分離境界を維持することが重要です。このルールを使うことでPodがホスト上の機微なディレクトリ(/procなど)をマウントしたことを検知できます。
Condition(条件)
kevt and pod and kcreate and
Podが作成され、
sensitive_vol_mount and
ホスト上の機微なディレクトリがマウントされ、
not ka.req.pod.containers.image.repository in (falco_sensitive_mount_images)
コンテナイメージが、機微ディレクトリのマウントを許可したイメージではない場合
sensitive_vol_mount
マクロの内容は以下となります。
- macro: sensitive_vol_mount
condition: >
(ka.req.pod.volumes.hostpath intersects (/proc, /var/run/docker.sock, /, /etc, /root, /var/run/crio/crio.sock, /run/containerd/containerd.sock, /home/admin, /var/lib/kubelet, /var/lib/kubelet/pki, /etc/kubernetes, /etc/kubernetes/manifests))
PodのボリュームのホストPathが次のディレクトリのどれかに該当する場合
(/proc, /var/run/docker.sock, /, /etc, /root, /var/run/crio/crio.sock, /run/containerd/containerd.sock, /home/admin, /var/lib/kubelet, /var/lib/kubelet/pki, /etc/kubernetes, /etc/kubernetes/manifests)
Output(出力)
機微ディレクトリをマウントしたPodが起動しました。
%ka.user.name
K8sユーザー名
%ka.resp.name
K8sレスポンスオブジェクト名
%ka.target.namespace
K8sターゲットネームスペース名
%ka.req.pod.containers.image
K8s Podコンテナイメージ名
%jevt.value[/requestObject/spec/volumes]
ボリューム名