LoginSignup
4
1

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

Last updated at Posted at 2023-11-14

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

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

Orchestrator Agentのデプロイ

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

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

2. AWSマネージメントコンソールからCloudFormationに移動し、スタックの作成 > 新しいリソースを使用(標準) を選択します。
image.png

3. テンプレートファイルのアップロード で、先ほどダウンロードしたYAMLファイルをアップロードし、次へ をクリックします。
image.png

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

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
image.png

5. ご自身に環境に応じた値を入力して、次へ をクリックします(特に希望がなければそのまま 次へ でも問題ありません)。
image.png

6. 確認画面が表示されるので、問題なければ承認チェックボックスにチェックして 送信 をクリックします。
image.png

7. Orachestrator Agentのデプロイが完了したら、出力 タブで、OchestratroHostOrchestratorPort の値を確認します(後で使用します)。
image.png

デプロイが完了すると、Orchestrator AgentをSysdig UI上で確認できます。
Integrations > Data Sources > Sysdig Agents に移動します。
Deployment Type が fargate-orchestrator のSysdig Agentが接続されていることを確認します。
image.png

Workload Agentのデプロイ

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

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

{
    "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を設定します(行頭の+マークは不要です)。

{
   "containerDefinitions": [...],
+  "pidMode": "task"
}

2. ワークロードコンテナのコンテナ定義の記述を編集し、sysdigInstrumentationコンテナからワークロードコンテナにボリュームマウントする記述を追加します。

          "volumesFrom": [
              {
                "sourceContainer": "SysdigInstrumentation",
                "readOnly": true
              }
            ],

3. ワークロードコンテナにSYS_PTRACE機能を追加するため、コンテナ定義に以下を追加します。

"linuxParameters": {
  "capabilities": {
    "add": ["SYS_PTRACE"]
  }
}

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

プライベート レジストリから取得したイメージの場合は、コンテナ定義でentryPointもしくはcommandを明示的に指定しないと、Agentをインストールできません。元のコンテナ定義のentryPointcommandの値が両方とも空の場合(もしくは記載自体がない場合)は、docker inspectコマンド等でコンテナイメージのEntrypointもしくはCMDの記述を確認し、明示的に記載してください。

5. ワークロードコンテナの環境変数として、SYSDIG_SIDECAR環境変数をautoとして設定します。

      "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として設定します。
{
  ...
  "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クラスターにデプロイします。
更新後のタスク定義は以下のようになります(行頭の+マークは不要です)。

{
    "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のIntegrations > Data Sources > Sysdig Agents に移動し、
Deployment Type が fargate-workload のSysdig Agentが接続されていることを確認します。
image.png

脅威検知テスト

ワークロードコンテナとしてsecurity-playgroundイメージを使用した場合は、下記手順で脅威検知テストを実施可能です。脅威検知では、以下のような経路でSysdig UIに検知イベント結果が表示されます。
image.png

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

curlを実行する端末からワークロードタスクに対するInboundのポート8080接続を、AWSのSecurity Groupで許可する必要があります。

攻撃例1:shadowファイルの読み込み

curl IPアドレス::8080/etc/shadow

※FalcoルールでException指定されているcat /etc/shadowではないので検知します

攻撃例2:/dev配下へのファイル書き込み

curl -X POST IPアドレス:8080/exec -d 'command=touch /dev/bbb'

名称未設定.png

Sysdig UIにログインし、Eventsに検知イベントが表示されていることを確認します。
図1.png

まとめ

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

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1