LoginSignup
3
1

Cloud Formationを使ったSysdig Fargate Serverless Agent 4.0のインストール

Last updated at Posted at 2023-02-28

先日、Sysdig Fargate Serverless Agent 4.0がリリースされました。Sysdig Fargate Serverless Agentは、AWS Fargate on ECSのランタイム脅威検知が可能となるSysdigのAgentです。Sysdig Fargate Serverless Agentは以下の方法でインストールできます。

  • Terraformによるインストール
  • Cloud Formationによるインストール
  • 手動でのインストール

バージョン4.0ではCloud Formationによるインストール手順が変わったので、新しい手順をご紹介します。

参照ドキュメント

serverless-patcherの準備

serverless-patcherは、FargateタスクをデプロイするためのCloud Formationテンプレートを変更し、Sysdig Fargate Serverless Agentをサイドカーとしてデプロイするように書き換えてくれるツールです。
事前準備として、serverless-patcherイメージを、Fargateタスクをデプロイするのと同じリージョンのプライベートECRリポジトリにプッシュしておきます。

まず、serverless-patcherを手元にプルします。

docker pull quay.io/sysdig/serverless-patcher:latest

ECRにログインします。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <AWS_Account_ID>.dkr.ecr.ap-northeast-1.amazonaws.com

serverless-patcherのImage IDを確認します。

docker image ls

Imageにタグを付けます。

docker tag 571f363b1e9f <AWS_Account_ID>.dkr.ecr.ap-northeast-1.amazonaws.com/yo-repo:latest

ECRにプッシュします。

docker push <AWS_Account_ID>.dkr.ecr.ap-northeast-1.amazonaws.com/yo-repo:latest

Orchestrator Agentのデプロイ

Orchestrator Agentは、サイドカーとして各タスクにデプロイするWorkload Agentからの通信を束ねて、Sysdig SaaSバックエンドと通信する役割を担います。
下記 orchestrator-agent.yaml をCloud Formationテンプレートとして使用します。
https://download.sysdig.com/dependencies/serverless/fargate/orchestrator-agent.yaml

自身の環境に合わせて必要なパラメータを設定します(下記は私が設定したパラメータ一覧です)。
image.png

SysdigCollectorHostの値は利用しているSysdig SaaSリージョンにより異なります。下記ドキュメントをご参照ください。
https://docs.sysdig.com/en/docs/administration/saas-regions-and-ip-ranges/

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

Instrumentation Stackのデプロイ

Instrumentation Stackは、Fargateタスク用テンプレートに対してserverless-patcherを適用するための環境を用意します。
下記 instrumentation.yaml をCloud Formationテンプレートとして使用します。
https://download.sysdig.com/dependencies/serverless/fargate/instrumentation.yaml

自身の環境に合わせて必要なパラメータを設定します(下記は私が設定したパラメータ一覧です)。
image.png
"Orchestrator Agent Host"には、先ほどデプロイしたOrchestrator Agent Stackのoutputから値を貼り付けます。
"Sysdig Serverless Patcher Image"には、先ほどECRにプッシュしたServerless PatcherイメージのURIを入力します。

Fargateタスク + Workload Agentのデプロイ

下記 sysdig-serverless-sample-application.ymlをサンプルのCloud Formationテンプレートとして使用します。
このサンプルアプリケーションはSysdigの検知イベントを発生させるイベントジェネレーターです。
https://github.com/polar3130/sysdig-for-fargate-playground/blob/main/sysdig-serverless-sample-application.yml

以下の変換マクロをサンプルテンプレートのルートレベルに追加します。
変換マクロの名称(例:SysdigMacro)は先ほどデプロイしたInstrumentation Stackのoutput結果から確認できます。
Transform: ["SysdigMacro"]

既存の下記記述は削除します。

Transform: 
  - MySysdigMacro

Fargateタスクを配置するVPCでInternet Gatewayを使用している場合(=NAT Gatewayではない場合)には、AssignPublicIpENABLEDに変更してください。

AssignPublicIp: ENABLED

サンプルのCloud Formationテンプレート例:

AWSTemplateFormatVersion: '2010-09-09'


Transform: ["SysdigMacro"]


Parameters:
VpcId:
  Type: AWS::EC2::VPC::Id
ProtectedSubnets:
  Type: List<AWS::EC2::Subnet::Id>
TaskCpu:
  Type: Number
  Default: 256
TaskMemory:
  Type: Number
  Default: 512
DesiredCount:
  Type: Number
  Default: 1


Resources:
SecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupName: event-generator
    GroupDescription: Security group for the service
    VpcId: !Ref VpcId


SecurityGroupIngress:
  Type: AWS::EC2::SecurityGroupIngress
  Properties:
    GroupId: !Ref SecurityGroup
    IpProtocol: -1
    SourceSecurityGroupId: !Ref SecurityGroup


Cluster:
  Type: AWS::ECS::Cluster
  Properties:
    ClusterName: sysdig-event-generator


LogGroup:
  Type: AWS::Logs::LogGroup
  Properties:
    LogGroupName: /ecs/event-generator


EcsTaskRole:
  Type: AWS::IAM::Role
  Properties:
    AssumeRolePolicyDocument:
      Version: 2012-10-17
      Statement:
        - Effect: Allow
          Principal:
            Service:
              - ecs-tasks.amazonaws.com
              - events.amazonaws.com
          Action:
            - sts:AssumeRole
    ManagedPolicyArns:
      - arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceEventsRole
    RoleName: task-role-for-event-generator


EcsTaskRolePolicy:
  Type: AWS::IAM::Policy
  Properties:
    PolicyName: task-role-policy-for-event-generator
    PolicyDocument:
      Version: 2012-10-17
      Statement:
        - Effect: Allow
          Action:
            - ssmmessages:CreateControlChannel
            - ssmmessages:CreateDataChannel
            - ssmmessages:OpenControlChannel
            - ssmmessages:OpenDataChannel
          Resource: '*'
    Roles:
      - Ref: EcsTaskRole


TaskDefinition:
  Type: AWS::ECS::TaskDefinition
  Properties:
    Family: event-generator
    RequiresCompatibilities:
      - FARGATE
    Cpu: !Ref TaskCpu
    Memory: !Ref TaskMemory
    NetworkMode: awsvpc
    ExecutionRoleArn: ecsTaskExecutionRole
    TaskRoleArn: !GetAtt EcsTaskRole.Arn
    ContainerDefinitions:
      - Name: event-generator
        Image: falcosecurity/event-generator:latest
        EntryPoint:
          - "/bin/event-generator"
        Command:
          - "run"
          - "syscall"
          - "--loop"
        LogConfiguration:
          LogDriver: awslogs
          Options:
            awslogs-region: !Ref 'AWS::Region'
            awslogs-group: !Ref LogGroup
            awslogs-stream-prefix: app
        Essential: true


Service:
  Type: AWS::ECS::Service
  Properties:
    Cluster: !Ref Cluster
    EnableExecuteCommand: true
    DeploymentConfiguration:
      MaximumPercent: 200
      MinimumHealthyPercent: 100
    DesiredCount: !Ref DesiredCount
    LaunchType: FARGATE
    NetworkConfiguration:
      AwsvpcConfiguration:
        AssignPublicIp: ENABLED
        SecurityGroups:
          - !Ref SecurityGroup
        Subnets: !Ref ProtectedSubnets
    ServiceName: event-generator-service
    TaskDefinition: !Ref TaskDefinition

ECSタスク定義の確認

AWSマネージメントコンソールから、ECSのタスク定義を確認します。
serverless-patcherによる変換後のタスク定義は以下になります。

Sysdig Fargate Serverless Agentをサイドカーとしてデプロイするために必要な記述(例:entryPointの"/opt/draios/bin/instrument"や環境変数など)が追加されていることが確認できます。

{
    "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:487433680518:task-definition/event-generator:9",
    "containerDefinitions": [
        {
            "name": "event-generator",
            "image": "falcosecurity/event-generator:latest",
            "cpu": 0,
            "links": [],
            "portMappings": [],
            "essential": true,
            "entryPoint": [
                "/opt/draios/bin/instrument"
            ],
            "command": [
                "/bin/event-generator",
                "run",
                "syscall",
                "--loop"
            ],
            "environment": [
                {
                    "name": "SYSDIG_COLLECTOR",
                    "value": ""
                },
                {
                    "name": "SYSDIG_ORCHESTRATOR",
                    "value": "Orche-Sysdi-A89XQ9PRFHLY-23a7d72187ecdbe7.elb.ap-northeast-1.amazonaws.com"
                },
                {
                    "name": "SYSDIG_ORCHESTRATOR_PORT",
                    "value": "6667"
                },
                {
                    "name": "SYSDIG_COLLECTOR_PORT",
                    "value": ""
                },
                {
                    "name": "SYSDIG_LOGGING",
                    "value": "info"
                },
                {
                    "name": "SYSDIG_ACCESS_KEY",
                    "value": ""
                }
            ],
            "environmentFiles": [],
            "mountPoints": [],
            "volumesFrom": [
                {
                    "sourceContainer": "SysdigInstrumentation",
                    "readOnly": true
                }
            ],
            "linuxParameters": {
                "capabilities": {
                    "add": [
                        "SYS_PTRACE"
                    ],
                    "drop": []
                },
                "devices": [],
                "tmpfs": []
            },
            "secrets": [],
            "dnsServers": [],
            "dnsSearchDomains": [],
            "extraHosts": [],
            "dockerSecurityOptions": [],
            "dockerLabels": {},
            "ulimits": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/event-generator",
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "app"
                },
                "secretOptions": []
            },
            "systemControls": []
        },
        {
            "name": "SysdigInstrumentation",
            "image": "quay.io/sysdig/workload-agent:4.0.0",
            "cpu": 0,
            "links": [],
            "portMappings": [],
            "essential": true,
            "entryPoint": [
                "/opt/draios/bin/logwriter"
            ],
            "command": [],
            "environment": [],
            "environmentFiles": [],
            "mountPoints": [],
            "volumesFrom": [],
            "secrets": [],
            "dnsServers": [],
            "dnsSearchDomains": [],
            "extraHosts": [],
            "dockerSecurityOptions": [],
            "dockerLabels": {},
            "ulimits": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "Instrumentation-stack-SysdigLogGroup-sB1nGtxsOTzE",
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "TaskDefinition"
                },
                "secretOptions": []
            },
            "systemControls": []
        }
    ],
    "family": "event-generator",
    "taskRoleArn": "arn:aws:iam::487433680518:role/task-role-for-event-generator",
    "executionRoleArn": "arn:aws:iam::487433680518:role/ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "revision": 9,
    "volumes": [],
    "status": "ACTIVE",
    "requiresAttributes": [
        {
            "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
        },
        {
            "name": "ecs.capability.execution-role-awslogs"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.17"
        },
        {
            "name": "com.amazonaws.ecs.capability.task-iam-role"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.22"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
        },
        {
            "name": "ecs.capability.task-eni"
        }
    ],
    "placementConstraints": [],
    "compatibilities": [
        "EC2",
        "FARGATE"
    ],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "256",
    "memory": "512",
    "registeredAt": "2023-02-25T08:32:36.790Z",
    "registeredBy": "arn:aws:iam::487433680518:user/bobo3977",
    "tags": []
}

Sysdig Fargate Serverless Agentの稼働確認

Fargateタスクとして稼働しているイベントジェネレータによって発生したイベントをSysdig Fargate Serverless Agentで検知できていることを確認します。

Sysdig UIにログインします。
Eventsに移動します。
Fargateタスク上で発生したイベントが記録されていることを確認します。
image.png

まとめ

Cloud Formationとserverless-patcherを使用することで、ワークロードのタスク定義を手動で書き換えることなく、Sysdig Fargate Serverless Agentをサイドカーとしてデプロイできることが確認できました。

3
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
3
1