[旧情報] Sysdig Serverless Agentのマニュアルインストール（Orchestrator Agent使用版）

:::note warn
本手順はOrchestrator Agentを使用した古いデプロイ方法になります。最新のデプロイ方法については下記記事をご参照ください。
https://qiita.com/yotake/items/3b0f7b2d9e9cba4af55a
:::

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

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

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

https://qiita.com/yotake/items/c7a73e823a9017effdca

https://qiita.com/yotake/items/8a4fdd4a2e930410965b

# Orchestrator Agentのデプロイ
Sysdig Orchestrator AgentをTerraformもしくはCloudFormationを使用してインストールします。Orchestrator Agentは、サイドカーとして各タスクにデプロイするWorkload Agentからの通信を束ねて、Sysdig SaaSバックエンドと通信する役割を担います。本記事ではCloudFormationを使用したデプロイ手順をご紹介します。ドキュメントは以下をご参照ください。

https://docs.sysdig.com/en/docs/installation/sysdig-secure/install-agent-components/ecs-on-fargate/serverless-agents/cloudformation/

1. Orchestrator Agentをデプロイするための下記YAMLテンプレートファイルをダウンロードします。

https://download.sysdig.com/dependencies/serverless/fargate/orchestrator-agent.yaml

2\. AWSマネージメントコンソールからCloudFormationに移動し、__スタックの作成 > 新しいリソースを使用（標準）__ を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/af2770e3-3abf-f940-6bcb-cd196b704b31.png)

3\. __テンプレートファイルのアップロード__ で、先ほどダウンロードしたYAMLファイルをアップロードし、__次へ__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/b5e3f470-ca3e-df4a-a7ec-3b1891fdc102.png)

4\. ご自身に環境に応じた値を入力して（最低限入力が必要な項目を赤枠で囲っています）、__次へ__ をクリックします。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/80a5e0d1-0650-866c-da91-5c6c81c96040.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/b34e8b77-56e5-a2f4-77d6-a5a97af035e9.png)

5\. ご自身に環境に応じた値を入力して、__次へ__ をクリックします（特に希望がなければそのまま __次へ__ でも問題ありません）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/1967ebf6-7396-6dc6-9bea-86add0559f85.png)

6\. 確認画面が表示されるので、問題なければ承認チェックボックスにチェックして __送信__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/201b03fc-ed52-d1aa-4306-563c9d1b4970.png)

7\. Orachestrator Agentのデプロイが完了したら、__出力__ タブで、__OchestratroHost__ と __OrchestratorPort__ の値を確認します（後で使用します）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/b4f3b04f-e140-9ce0-25fc-6acce90d0593.png)

デプロイが完了すると、Orchestrator AgentをSysdig UI上で確認できます。
<b>Integrations > Data Sources > Sysdig Agents</b> に移動します。
Deployment Type が `fargate-orchestrator` のSysdig Agentが接続されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/a22c3231-5b39-2364-1a58-2dee4b48c9ff.png)

# 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`もしくは`command`を明示的に指定しないと、Agentをインストールできません。元のコンテナ定義の`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_ORCHESTRATOR`および`SYSDIG_ORCHESTRATOR_PORT`環境変数として、CloudFormationの出力タブで取得した値を設定します。
* `SYSDIG_PRIORITY`環境変数を設定します。値として、ワークロードの可用性を重視する`availability`か、ワークロードのセキュリティ保護を重視する`security`のどちらかを選択します。
* `SYSDIG_SIDECAR`環境変数を`auto`として設定します。
```diff_json
{
  ...
  "containerDefinitions": [
    ...
+   {
+     "name": "sysdigInstrumentation",
+     "image": "quay.io/sysdig/workload-agent:latest",
+     "environment": [
+       {
+           "name": "SYSDIG_ORCHESTRATOR",
+           "value": "orchestrator.example.com"
+       },
+       {
+           "name": "SYSDIG_ORCHESTRATOR_PORT",
+           "value": "6667"
+       },
+       {
+           "name": "SYSDIG_PRIORITY",
+           "value": "availability"
+       },
+       {
+           "name": "SYSDIG_SIDECAR",
+           "value": "auto"
+       }
+     ]
+   }
  ]
}

```
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",
+           "environment": [
+             {
+                 "name": "SYSDIG_ORCHESTRATOR",
+                 "value": "orchestrator.example.com"
+             },
+             {
+                 "name": "SYSDIG_ORCHESTRATOR_PORT",
+                 "value": "6667"
+             },
+             {
+                 "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-workload` のSysdig Agentが接続されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/48d5221a-000c-9258-dd1f-e3cdceb5b156.png)


# 脅威検知テスト
ワークロードコンテナとして`security-playground`イメージを使用した場合は、下記手順で脅威検知テストを実施可能です。脅威検知では、以下のような経路でSysdig UIに検知イベント結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/0a39458e-4943-d585-7f83-e55c7ad17a2b.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のマニュアルでのインストールが簡単に実行できることが確認できました。