Sysdig Serverless Agentのマニュアルインストール

:::note info
本手順は、Orchestrator Agentが不要になったServerless Agent **5.3.1**以上を対象とした手順になります。
:::

本記事では、AWS ECS Fargateのランタイム脅威検知を実現する、Sysdig Serverless Agentバージョン5.3.1のマニュアルでのインストール方法をご紹介します。ドキュメントは下記になります。

https://docs.sysdig.com/en/sysdig-secure/install-agent-components/install-agent-components/linux-on-serverless/ecs-fargate/manual/

Terraformを使用した手順は下記記事をご参照ください。

https://qiita.com/yotake/items/6e5963e3e6e08ea9f64f

# Workload Agentのデプロイ
マニュアルでのインストール手順では、ワークロードコンテナをデプロイするために使用しているタスク定義ファイルを書き換えます。
例として、元のタスク定義ファイルは以下になります（書き換え後のタスク定義ファイルは最後に掲載しています）。

:::note warn 
後ほどの脅威検知テストのため、本手順では外部からcurlコマンドを介してコンテナ上で任意のコマンド実行が可能なsecurity-playgroundイメージを使用しています。自己責任でご利用ください。
:::

https://github.com/sysdiglabs/security-playground

```json
{
    "family": "securitiy-playground",
    "containerDefinitions": [
        {
            "name": "securitiy-playground",
            "image": "sysdiglabs/security-playground",
            "cpu": 0,
            "portMappings": [
                {
                    "name": "securitiy-playground-8080-tcp",
                    "containerPort": 8080,
                    "hostPort": 8080,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "entryPoint": [
                "gunicorn",
                "-b",
                ":8080",
                "--workers",
                "2",
                "--threads",
                "4",
                "--worker-class",
                "gthread",
                "--access-logfile",
                "-",
                "--error-logfile",
                "-",
                "app:app"
            ],
            "environment": [],
            "mountPoints": [],
            "volumesFrom": []
        }
    ],
    "taskRoleArn": "arn:aws:iam::XXXXXXXX:role/ecsTaskExecutionRole",
    "executionRoleArn": "arn:aws:iam::XXXXXXXX:role/ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "1024",
    "memory": "2048",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    }
}
```
1\. pidモードとして`task`を設定します（行頭の+マークは不要です）。
```diff_json
{
   "containerDefinitions": [...],
+  "pidMode": "task"
}
```

2\. ワークロードコンテナのコンテナ定義の記述を編集し、`sysdigInstrumentation`コンテナからワークロードコンテナにボリュームマウントする記述を追加します。
```json
          "volumesFrom": [
              {
                "sourceContainer": "SysdigInstrumentation",
                "readOnly": true
              }
            ],
```

3\. ワークロードコンテナに`SYS_PTRACE`機能を追加するため、コンテナ定義に以下を追加します。
```json
"linuxParameters": {
  "capabilities": {
    "add": ["SYS_PTRACE"]
  }
}
```

4\. ワークロードコンテナの`entryPoint`の先頭に`/opt/draios/bin/instrument`を追加します。たとえば、元のentryPointが `["my", "original", "entrypoint"]` の場合、`["/opt/draios/bin/instrument", "my", "original", "entrypoint"]` になります。

:::note warn
`entryPoint`に`["/opt/draios/bin/instrument"]`だけを記載して、`command`の記載がない場合はコンテナが起動しません。上記例のようにコンテナ定義の`entryPoint`もしくは`command`にワークロードコンテナが起動時に実行するコマンドを明示的に記載してください。元のコンテナ定義の`entryPoint`と`command`の値が両方とも空の場合（もしくは記載自体がない場合）は、docker inspectコマンド等でコンテナイメージの`Entrypoint`もしくは`CMD`の記述を確認し、明示的に記載してください。
:::

5\. ワークロードコンテナの環境変数として、`SYSDIG_SIDECAR`環境変数を`auto`として設定します。
```diff_json
      "environment": [
        ...
+       {
+         "name": "SYSDIG_SIDECAR",
+         "value": "auto"
+       }
      ]
```
6\. Workload Agentとなる新しいコンテナを既存のタスク定義に追加します。`sysdigInstrumentation`などの名前を付けます。このコンテナでは`quay.io/sysdig/workload-agent:latest`イメージを使用します。
* `SYSDIG_COLLECTOR`および`SYSDIG_COLLECTOR_PORT`環境変数を設定します。
* `SYSDIG_ACCESS_KEY`環境変数を設定します。
* `SYSDIG_PRIORITY`環境変数を設定します。値として、ワークロードの可用性を重視する`availability`か、ワークロードのセキュリティ保護を重視する`security`のどちらかを選択します。
* `SYSDIG_SIDECAR`環境変数を`auto`として設定します。
```diff_json
{
  ...
  "containerDefinitions": [
    ...
+   {
+     "name": "sysdigInstrumentation",
+     "image": "quay.io/sysdig/workload-agent:latest",
+     "essential": false,
+     "environment": [
+       {
+           "name": "SYSDIG_COLLECTOR",
+           "value": "ingest-us2.app.sysdig.com"
+       },
+       {
+           "name": "SYSDIG_COLLECTOR_PORT",
+           "value": "6443"
+       },
+       {
+           "name": "SYSDIG_ACCESS_KEY",
+           "value": "0123456789abcdef"
+       },
+       {
+           "name": "SYSDIG_PRIORITY",
+           "value": "availability"
+       },
+       {
+           "name": "SYSDIG_SIDECAR",
+           "value": "auto"
+       }
+     ]
+   }
  ]
}

```

:::note
**Sysdig Collector**の値はご利用のSysdig SaaSリージョンにより異なります。下記ドキュメントをご参照ください。一般的なUS West(Oregon)リージョンであれば __ingest-us2.app.sysdig.com__ になります。
https://docs.sysdig.com/en/docs/administration/saas-regions-and-ip-ranges/
:::

7\. 更新したタスク定義を保存し、ECSクラスターにデプロイします。
更新後のタスク定義は以下のようになります（行頭の+マークは不要です）。


```diff_json
{
    "family": "securitiy-playground",
    "containerDefinitions": [
        {
            "name": "securitiy-playground",
            "image": "sysdiglabs/security-playground",
            "cpu": 0,
+           "linuxParameters": {
+               "capabilities": {
+                 "add": ["SYS_PTRACE"]
+               }
+           },
            "portMappings": [
                {
                    "name": "securitiy-playground-8080-tcp",
                    "containerPort": 8080,
                    "hostPort": 8080,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "entryPoint": [
+               "/opt/draios/bin/instrument",
                "gunicorn",
                "-b",
                ":8080",
                "--workers",
                "2",
                "--threads",
                "4",
                "--worker-class",
                "gthread",
                "--access-logfile",
                "-",
                "--error-logfile",
                "-",
                "app:app"
            ],
            "environment": [
+               {
+                   "name": "SYSDIG_SIDECAR",
+                   "value": "auto"
+               }
              ],
            "mountPoints": [],
+           "volumesFrom": [
+               {
+                 "sourceContainer": "SysdigInstrumentation",
+                 "readOnly": true
+               }
+           ]
        },
+       {
+           "name" : "SysdigInstrumentation",
+           "image" : "quay.io/sysdig/workload-agent:latest",
+           "essential": false,
+           "environment": [
+             {
+                 "name": "SYSDIG_COLLECTOR",
+                 "value": "ingest-us2.app.sysdig.com"
+             },
+             {
+                 "name": "SYSDIG_COLLECTOR_PORT",
+                 "value": "6443"
+             },
+             {
+                 "name": "SYSDIG_ACCESS_KEY",
+                 "value": "0123456789abcdef"
+             },
+             {
+                 "name": "SYSDIG_PRIORITY",
+                 "value": "availability"
+             },
+             {
+                 "name": "SYSDIG_SIDECAR",
+                 "value": "auto"
+             }
+           ]
+       }
    ],
+   "pidMode": "task",
    "taskRoleArn": "arn:aws:iam::XXXXXXXX:role/ecsTaskExecutionRole",
    "executionRoleArn": "arn:aws:iam::XXXXXXXX:role/ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "1024",
    "memory": "2048",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    }
}
```
上記のタスク定義からデプロイすると、サイドカーコンテナとしてのWorkload Agentが一緒に起動します。Sysdig UIの<b>Integrations > Data Sources > Sysdig Agents</b> に移動し、
Deployment Type が `fargate` のSysdig Agentが接続されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/339db588-5ce0-3a2a-0805-823dc99fe53b.png)



# 脅威検知テスト
ワークロードコンテナとして`security-playground`イメージを使用した場合は、下記手順で脅威検知テストを実施可能です。脅威検知では、以下のような経路でSysdig UIに検知イベント結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/017bd4c5-0a99-e314-8cca-c1a2fcf01e7b.png)

下記curlコマンドの引数にワークロードタスクのPublicもしくはPrivate IPアドレスを指定します

:::note
curlを実行する端末からワークロードタスクに対するInboundのポート8080接続を、AWSのSecurity Groupで許可する必要があります。
:::
 
<b>攻撃例1：shadowファイルの読み込み</b>
```
curl IPアドレス:8080/etc/shadow
```
※FalcoルールでException指定されている`cat /etc/shadow`ではないので検知します

<b>攻撃例2：/dev配下へのファイル書き込み</b>
```
curl -X POST IPアドレス:8080/exec -d 'command=touch /dev/bbb'
```

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/91a5a4a5-340a-b332-0951-c08f2b549601.png)

Sysdig UIにログインし、**Events**に検知イベントが表示されていることを確認します。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/754c7da8-180b-45bb-d418-88d9de02b945.png)

 
# まとめ
タスク定義を少し変更するだけで、Sysdig Serverless Agentのマニュアルでのインストールが簡単に実行できることが確認できました。