Google Cloudとコンテナの継続的なセキュリティ
本文の内容は、docs.sysdig.com上のAWS Fargate Serverless Agentsを元に日本語に翻訳・再構成した内容となっております。(2022年5月17日現在)
サーバーレスの環境やクラウドプラットフォームの進化に伴い、利便性と抽象度が同時に向上し、新しいエージェントモデルが求められています。
例えば、AmazonのECSやEKSでは、ユーザーは基盤となる仮想ホストマシンの管理を引き続き担当しています。しかし、Fargateのような環境では、ホストはクラウド事業者によって暗黙のうちに割り当てられており、ユーザーは、基盤となるコンピュートインフラの割り当てや設定、知識を持たずに、単にコンテナを実行するだけです。
この「サービスとしてのコンテナ」モデルは便利ですが、多くのユーザーがコンテナを放置し、コンテナ内のセキュリティイベントを監視しないため、シークレットの流出、ビジネスデータの漏洩、パフォーマンスへの影響、AWS/クラウドプロバイダーのコスト増などのリスクが発生します。また、ホストにアクセスできない環境では、標準的なエージェントをインストールすることができません。
このような理由から、Sysdigは、このようなコンテナベースのクラウド環境に導入可能な「サーバーレスエージェント」を新たに開発しました。
Sysdigのサーバーレスエージェントは、Falcoによるポリシーエンフォースメントでランタイム検知を行います。現時点では、サーバーレスエージェントはECS上のAWS Fargateで利用可能です。このエージェントは、オーケストレーター・エージェントと(複数の可能性のある)ワークロード・エージェントで構成されます。
Fargate ECSの場合、サーバーレスエージェントの2つのコンポーネントは別々にインストールされます。
ここでは、サービスが既存のCFT(CloudFormation Templates)を使用しており、CFT内のすべてのタスク定義を計測する自動プロセスを使用してワークロードエージェントをインストールすることを想定しています。
AWS側:
Sysdig側:
以下の手順は、Sysdig関連の重要なパートの概要です。
Stack name:self-defined
Sysdigの設定
ネットワーク設定
高度な設定
「Next」をクリックしてスタックの作成を完了し、デプロイメントが完了するのを待ちます(通常は10分以内です)。
「Output」では、「OrchestratorHost」と「OrchestratorPort」の値に注意してください。
備考:
./installer-linux-amd64 cfn-macro install -r us-east-1 MySysdigMacro $OrchestratorHost $OrchestratorPort
また、以下に説明するように、Terraformレジストリ上のSysdig Providerを使用してワークロードエージェントを デプロイすることもできます。
terraform {
required_providers {
sysdig = {
source = "sysdiglabs/sysdig"
version = ">= 0.4.0"
}
}
}
provider "sysdig" {
sysdig_secure_api_token = var.sysdig_access_key
}
data "sysdig_fargate_workload_agent" "instrumented" {
container_definitions = file("container-definitions/hello.json")
sysdig_access_key = var.sysdig_access_key
workload_agent_image = "quay.io/sysdig/workload-agent:latest"
orchestrator_host = module.sysdig_orchestrator_agent.orchestrator_host
orchestrator_port = module.sysdig_orchestrator_agent.orchestrator_port
}
resource "aws_ecs_task_definition" "fargate_task" {
...
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
container_definitions = "${data.sysdig_fargate_workload_agent.instrumented.output_container_definitions}"
}
最も一般的に使用される変数には、以下のものがあります。
場合によっては、KiltやTerraformのインストーラーを使用せず、次のいずれかを行うことをお勧めします。
CloudFormation タスク インストゥルメンテーションの前に `
TestApp:
Type: AWS::ECS::TaskDefinition
Properties:
NetworkMode: awsvpc
RequiresCompatibilities:
- FARGATE
Cpu: 2048
Memory: 8GB
ExecutionRoleArn: !Ref TestAppExecutionRole
TaskRoleArn: !Ref TestAppTaskRole
ContainerDefinitions:
- Name: App
Image: !Ref TestAppImage
EntryPoint:
- /bin/ping
- google.com
Tags:
- Key: application
Value: TestApp
TestApp:
Type: AWS::ECS::TaskDefinition
Properties:
NetworkMode: awsvpc
RequiresCompatibilities:
- FARGATE
Cpu: 2048
Memory: 8GB
ExecutionRoleArn: !Ref TestAppExecutionRole
TaskRoleArn: !Ref TestAppTaskRole
ContainerDefinitions:
- Name: App
Image: !Ref TestAppImage
EntryPoint:
### Added for manual instrumentation
- /opt/draios/bin/instrument
### End added propertis
- /bin/ping
- google.com
### Added for manual instrumentation
LinuxParameters:
Capabilities:
Add:
- SYS_PTRACE
VolumesFrom:
- SourceContainer: SysdigInstrumentation
ReadOnly: true
Environment:
- Name: SYSDIG_ORCHESTRATOR # Required
Value: <host orchestrator output, region dependent>
- Name: SYSDIG_ORCHESTRATOR_PORT # Required
Value: "6667"
- Name: SYSDIG_ACCESS_KEY
Value: ""
- Name: SYSDIG_COLLECTOR
Value: ""
- Name: SYSDIG_COLLECTOR_PORT
Value: ""
- Name: SYSDIG_LOGGING
Value: ""
- Name: SysdigInstrumentation
Image: !Ref WorkloadAgentImage
### End of added properties
Tags:
- Key: application
Value: TestApp
また、ビルド時にワークロードエージェントをコンテナに含めることもできます。そのためには、Dockerfileを更新して、必要なファイルをコピーします。
ARG sysdig_agent_version=latest
FROM quay.io/sysdig/workload-agent:$sysdig_agent_version AS workload-agent
FROM my-original-base
COPY --from=workload-agent /opt/draios /opt/draios
コンテナのエントリポイントに /opt/draios/bin/instrument コマンドをプレインストールします。
ENTRYPOINT ["/opt/draios/bin/instrument", "my", "original", "entry", "point"]
ワークロードログからインストルメンテーションログを分離するために、インストルメンテーションエントリポイントはログを localhost:32000 に送信しようとしますが、そこではワークロードログと混合されます。
こちらもご参照ください。サーバーレスエージェントのログを管理する
備考
サーバーレスエージェントをアップグレードするには、両方のコンポーネントの2つ目のバージョンをインストールしてから、実行中のタスクをすべて終了し、新しいバージョンで再起動します。その後、古いCloudFormationとKiltの残留物を削除してクリーンアップします。
./installer-linux-amd64 cfn-macro delete MySysdigMacro