本記事では、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を使用したデプロイ手順をご紹介します。ドキュメントは以下をご参照ください。
- Orchestrator Agentをデプロイするための下記YAMLテンプレートファイルをダウンロードします。
2. AWSマネージメントコンソールからCloudFormationに移動し、スタックの作成 > 新しいリソースを使用(標準) を選択します。
3. テンプレートファイルのアップロード で、先ほどダウンロードしたYAMLファイルをアップロードし、次へ をクリックします。
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/
5. ご自身に環境に応じた値を入力して、次へ をクリックします(特に希望がなければそのまま 次へ でも問題ありません)。
6. 確認画面が表示されるので、問題なければ承認チェックボックスにチェックして 送信 をクリックします。
7. Orachestrator Agentのデプロイが完了したら、出力 タブで、OchestratroHost と OrchestratorPort の値を確認します(後で使用します)。
デプロイが完了すると、Orchestrator AgentをSysdig UI上で確認できます。
Integrations > Data Sources > Sysdig Agents に移動します。
Deployment Type が fargate-orchestrator
のSysdig Agentが接続されていることを確認します。
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をインストールできません。元のコンテナ定義のentryPoint
とcommand
の値が両方とも空の場合(もしくは記載自体がない場合)は、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が接続されていることを確認します。
脅威検知テスト
ワークロードコンテナとしてsecurity-playground
イメージを使用した場合は、下記手順で脅威検知テストを実施可能です。脅威検知では、以下のような経路でSysdig UIに検知イベント結果が表示されます。
下記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'
Sysdig UIにログインし、Eventsに検知イベントが表示されていることを確認します。
まとめ
タスク定義を少し変更するだけで、Sysdig Serverless Agentのマニュアルでのインストールが簡単に実行できることが確認できました。