本手順はOrchestrator Agentを使用した古いデプロイ方法になります。最新のデプロイ方法についてはTerraform版の下記記事をご参照ください。
https://qiita.com/yotake/items/6e5963e3e6e08ea9f64f
先日、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
自身の環境に合わせて必要なパラメータを設定します(下記は私が設定したパラメータ一覧です)。
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 Type
が fargate のSysdig Agentが接続されていることを確認します。
Instrumentation Stackのデプロイ
Instrumentation Stackは、Fargateタスク用テンプレートに対してserverless-patcherを適用するための環境を用意します。
下記 instrumentation.yaml
をCloud Formationテンプレートとして使用します。
https://download.sysdig.com/dependencies/serverless/fargate/instrumentation.yaml
自身の環境に合わせて必要なパラメータを設定します(下記は私が設定したパラメータ一覧です)。
"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ではない場合)には、AssignPublicIp
をENABLEDに変更してください。
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タスク上で発生したイベントが記録されていることを確認します。
まとめ
Cloud Formationとserverless-patcherを使用することで、ワークロードのタスク定義を手動で書き換えることなく、Sysdig Fargate Serverless Agentをサイドカーとしてデプロイできることが確認できました。