Sysdig Secure の Drift Controlを使ってみた

# Sysdig Secure の Drift Controlを使ってみた

**どんな機能か？**
この機能は、コンテナはimutableである特性を活かし、本番環境で**変更されないはずのファイルシステムが変更され、実行されたことを検知**できます。コンテナのベストプラクティスを実装し、Sysdigを追加することで、攻撃の検知に役立てます。

**何を検出できるのか？(検出できるパターン)**

[Sysdigの公式ブログ](https://sysdig.jp/blog/preventing-runtime-attacks-drift-control/)と設定画面から、以下の3つのパターンで検知することができます。

A. Sysdigの設定画面から、指定されたプログラムの実行
B. パーミッション/アトリビュートが実行可能に変更されたファイルの実行
C. パッケージマネージャでダウンロードまたは更新されたパッケージの実行

それぞれ、A. B. C. と試してみました。

## 準備と前提

以下の事前準備をしました。

- Kuberentes Clusterが動いている
- Sysdig Secureのアカウントがある
- Sysdig Agentが対象のKubernetesにインストールされている
- Container Drift機能が使える状態である(Sysdigに連絡し有効化してもらう）

## やってみた

### 設定
まずは、Continer Driftを選択し、新しいRuntime Policyを作成しました。
テストとして、**Always Deny** に `/usr/bin/curl` を追加しました。

1/ Drift Controlの作成
![Screen Shot 2022-08-26 at 15.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1232/33aa21c0-1eec-84f8-f95e-2ea0dd3eae16.png)

2/ 設定でEnableにし、設定値を追加
![Screen Shot 2022-08-26 at 15.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1232/776546af-2377-7713-bfcc-ced7811bcbac.png)


### 検出テスト
Kubernetesにて、Nginxのpodを走らせました。

```
kubectl run drift-test --image=nginx
pod/drift-test created
```

その上で、コンテナにsshします。
```
kubectl exec -it drift-test -- /bin/bash
root@drift-test:/#
```

このpodで、以下のパターンを試します。
　　A/ curl (= 指定したbinary)
　　B/ downlad & chmod 
　　C/ パッケージインストール


 **A. curl でkubectlをインストールしてみます**

実行:
```
root@drift-test:/# curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   138  100   138    0     0   3209      0 --:--:-- --:--:-- --:--:--  3209
100 42.9M  100 42.9M    0     0   133M      0 --:--:-- --:--:-- --:--:--  133M
root@drift-test:/#
```

結果:

Sysdig UIを確認すると、イベントページにて検出され多ことを確認できました。
検出されたイベントを見ると、`match_type: deny_list`　となっています。
![Screen Shot 2022-08-26 at 16.11.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1232/6e47a258-319e-27ad-556e-f08cbcaca5c3.png)

**B. ダウンロードした、kubectlを叩いてみました**

先ほどDownloadした、kubectlに実行権限をつけます。Always Denyに入れていませんが、実行権限をつけたら、Sysdig Agentが自動的に deny listに入れてくれるという仕組みです。


実行:
```
root@drift-test:/# chmod +x kubectl
root@drift-test:/# ./kubectl help
kubectl controls the Kubernetes cluster manager.
```

結果:
イベントが検出されました。イベントの詳細を見ると`match_type dynamic_list`となっています。

![Screen Shot 2022-08-26 at 16.12.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1232/95f4b10f-24c8-4b79-f101-c946c504275c.png)



**C.apt でgitをインストールして叩いてみました**

実行:
```
root@drift-test:/# apt update
root@drift-test:/# apt install git --yes
root@drift-test:/# git help
```

結果:
イベントが検出されました。イベントの詳細を見ると `match_type dynamic_list`となっています。
![Screen Shot 2022-08-26 at 16.49.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1232/c24a885f-7e4c-4186-1894-3a38439e45d2.png)



## 使ってみた感想

設定が簡単で、コンテナの利点を活かしながら、セキュリティも担保できるため良い機能に感じられる。最初からマイクロサービスとして設計されていない既存のシステムの場合、誤検知が生じると考えられるため、scopeを絞って導入していくのがよさそうです。

今回は試していないが、該当のプログラムを阻止することもできる。しばらくモニターした後、おコラなことを確認したら、悪意のあるプログラムとして、阻止してしまう選択肢も取れる。
![Screen Shot 2022-08-29 at 11.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1232/9b27c9b9-4984-e7f1-6313-26e693db5cf8.png)