容器工作负载保护的工作原理

编辑

容器工作负载保护的工作原理

编辑

版本

1.2.6 (查看全部)

兼容的 Kibana 版本

8.11.0 或更高版本

支持的无服务器项目类型
这是什么?

安全性

订阅级别
这是什么?

企业版

支持级别
这是什么?

Elastic

CWP 由一个轻量级集成(用于容器的 Defend BETA)提供支持,该集成由 Elastic Agent 打包和配置。该代理以守护进程集的形式安装在支持的 Kubernetes 集群上,并且该集成使用 eBPF LSM 和跟踪点探针来生成系统事件。事件会针对 eBPF LSM 钩子点进行评估,从而可以在允许系统活动继续进行之前评估配置的策略。

该策略确定哪些系统行为(例如,进程执行、文件创建或删除等)将导致操作。操作很简单:将行为记录到 Elasticsearch、在 Elasticsearch 中创建警报或阻止该行为。

威胁检测

编辑

该系统附带一个默认配置的策略,其中包含两个选择器和响应。第一个选择器旨在将进程遥测事件流式传输到用户的 Elasticsearch 集群。该策略使用指定 fork 和 exec 操作的 allProcesses 选择器。此选择器映射到 allProcesses 响应,该响应指定日志操作。

生成的遥测数据被转换为 ECS 文档并流式传输回用户的 Elasticsearch 集群,其中 Elastic Security SIEM 评估该数据以检测恶意行为。

漂移检测和预防

编辑

第二个选择器用于检测容器中现有可执行文件的修改或新可执行文件的创建(这就是 Elastic 检测“容器漂移”的方式)。策略选择器名为 executableChanges,并映射到一个名为 executableChanges 的响应部分,该部分指定警报操作。

此策略配置为警报响应,这意味着当检测到漂移条件时,匹配的事件将被收集并作为警报写入用户的 Elasticsearch 集群。SIEM 中的预构建规则“升级规则”会监视这些警报文档,并在检测到漂移时在 SIEM 中引发警报。也可以修改此策略以通过将响应操作更改为阻止来阻止漂移操作。

策略

编辑

想要充分利用 CWP 优势的用户将受益于理解系统的策略语法,这使得可以构建细粒度的策略。可以构建策略以精确匹配预期的容器行为——禁止任何意外行为——从而大大加强容器工作负载的安全性态势。

策略由选择器和响应组成。给定策略必须至少包含一个选择器和一个响应。目前,系统支持两种类型的选择器和响应:文件和进程。选择器告诉服务要匹配哪些系统操作,并且具有多个可以组合在一起的条件(使用逻辑 AND 操作)以提供精确的控制。响应指示系统在系统操作与选择器匹配时要采取的操作。

部署

编辑

可以通过两种方式部署该服务:在独立模式下使用 Elastic Agent 以声明方式部署,或者通过 Fleet 作为托管 D4C 集成部署。使用前者,团队可以灵活地将其策略集成到 Git 中,以实现基础设施即代码 (IoC) 方法,从而简化部署过程并实现更轻松的管理。

您需要在 k8s yaml 中的 securityContext 下包含以下 capabilities,以便该服务正常工作。

securityContext:
    runAsUser: 0
    # The following capabilities are needed for 'Defend for containers' integration (cloud-defend)
    # If you are using this integration, please uncomment these lines before applying.
    capabilities:
      add:
        - BPF # (since Linux 5.8) allows loading of BPF programs, create most map types, load BTF, iterate programs and maps.
        - PERFMON # (since Linux 5.8) allows attaching of BPF programs used for performance metrics and observability operations.
        - SYS_RESOURCE # Allow use of special resources or raising of resource limits. Used by 'Defend for Containers' to modify 'rlimit_memlock'

策略示例

编辑

给定策略必须至少包含一个 selector(文件或进程)和一个 response

  process:
    selectors:
      - name: allProcesses
        operation: [fork, exec]
      - name: interactiveProcesses
        operation: [fork, exec]
        sessionLeaderInteractive: true
    responses:
      - match: [allProcesses]
        actions: [log]
      - match: [interactiveProcesses]
        actions: [alert]
  file:
    selectors:
      - name: executableChanges
        operation: [createExecutable, modifyExecutable]
    responses:
      - match: [executableChanges]
        actions: [alert]

由于 fileprocess 操作是异步发生的,因此必须将它们的 selectorsresponses 作为单独的实体进行管理。文件选择器不能用于触发进程响应,反之亦然。

选择器

编辑

选择器告诉服务要匹配哪些系统操作,并且具有多个可以组合在一起的条件(使用逻辑 AND 操作)以提供精确的控制。

  - name: exampleFileSelector
    operation: [createExecutable, modifyExecutable]
    containerImageName: [nginx]
    containerImageTag: [latest]
    targetFilePath: [/usr/bin/**]
    kubernetesClusterId: [cluster1]
    kubernetesClusterName: [stagingCluster]
    kubernetesNamespace: [default]
    kubernetesPodLabel: [‘production:*’]
    kubernetesPodName: [‘nginx-pod-*’]
    ignoreVolumeMounts: true

选择器必须包含一个名称和以下条件中的至少一个。

通用条件(适用于文件和进程选择器)

编辑
名称 描述

containerImageFullName

要匹配的容器完整镜像名称列表。例如,“docker.io/nginx”。

containerImageName

要匹配的容器镜像名称列表。例如,nginx

containerImageTag

要匹配的容器镜像标签列表。例如,latest

kubernetesClusterId

要匹配的 kubernetes 集群 ID 列表。为了与 KSPM 保持一致,kube-system 命名空间 uid 用作集群 ID。

kubernetesClusterName

要匹配的 kubernetes 集群名称列表。

kubernetesNamespace

要匹配的 kubernetes 命名空间列表。

kubernetesPodName

要匹配的 kubernetes Pod 名称列表。支持尾随通配符。

kubernetesPodLabel

资源标签列表。支持尾随通配符(仅限值)。例如 key1:val*

 

例如,以下选择器将匹配在任何容器中的文件系统的任何部分创建可执行文件的尝试,只要其 Pod 具有标签 environment:productionservice:auth*

- name:
  operation: [createExecutable]
  kubernetesPodLabel: [environment:production, service:auth*]

文件特定条件

编辑
名称 描述

操作

要匹配的系统操作列表。选项包括 createExecutablemodifyExecutablecreateFilemodifyFiledeleteFile

ignoreVolumeMounts

如果设置,则忽略所有卷挂载上的文件操作。

ignoreVolumeFiles

如果设置,则仅忽略文件挂载上的操作。例如,已挂载的文件、configMap、机密等...

targetFilePath

要包含的文件路径列表。路径是绝对路径,并支持通配符。

 

考虑以下选择器示例

- name:
  targetFilePath: [/usr/bin/echo, /usr/sbin/*, /usr/local/**]

在此示例中,

  • /usr/bin/echo 将匹配 echo 二进制文件,并且仅匹配此二进制文件
  • /usr/local/** 将匹配 /usr/local/ 下的所有递归内容,包括 /usr/local/bin/something
  • /usr/sbin/* 包括 /usr/sbin 的所有直接子项

进程特定条件

编辑
名称 描述

操作

要匹配的系统操作列表。选项包括 forkexec

processExecutable

要匹配的可执行文件(包括完整路径)列表。例如,/usr/bin/cat。通配符支持与上面的 targetFilePath 相同。

processName

要匹配的进程名称(可执行文件基本名称)列表。例如,bashvicat 等...

sessionLeaderInteractive

如果设置为 true,则只会匹配交互式会话(即,具有控制 TTY 的会话)

响应

编辑

响应指示系统在系统操作与 selectors 匹配时要采取的 actions

策略可以包含一个或多个响应。每个响应都由以下内容组成

responses:
  - match: [allProcesses]
    exclude: [excludeSystemDServices]
    actions: [log]
  - match: [nefariousActivity]
    actions: [alert, block]
响应字段 描述

match

相同类型(fileprocess)的一个或多个选择器的数组。

exclude

一个可选的选择器数组,用于排除 match 中的所有内容

actions

要执行的操作数组(如果至少有一个 match,并且没有 exclude 选择器匹配)。选项包括 logalertblock

 

操作 描述

log

将事件发送到 file 响应的 logs-cloud_defend.file-* 数据流和 process 响应的 logs-cloud_defend.process-* 数据流。

alert

将事件(文件或进程)写入 logs-cloud_defend.alerts-* 数据流。

block

阻止系统操作继续进行。此阻止操作发生在事件执行之前。如果启用了 block,则必须设置 alert 操作。

示例

编辑

考虑以下 yaml。

file:
  selectors:
    - name: binDirExeMods
      operation:
        - createExecutable
        - modifyExecutable
      targetFilePath:
        - /usr/bin/**
    - name: etcFileChanges
      operation:
        - createFile
        - modifyFile
        - deleteFile
      targetFilePath:
        - /etc/**
    - name: nginx
      containerImageName:
        - nginx

  responses:
    - match:
        - binDirExeMods
        - etcFileChanges
      exclude:
        - nginx
      actions:
        - alert
        - block

我们有三个 file 选择器。两个用于匹配(逻辑 OR 运算),一个用于排除。

这可以理解为:如果在 /usr/bin 下创建或修改可执行文件,或者在 /etc 下创建、修改或删除文件,则阻止并创建一个警报,只要它不是 nginx 容器。

例如:

如果 (binDirExeModsetcFileChanges) 且非 nginx = 运行操作 alertblock

进程事件

编辑

以下字段会填充到所有 event.category: process 的事件中

字段 示例

@timestamp

2023-03-20T16:03:59.520Z

agent.id

7829f26d-c2d1-4eaf-a1ac-cd9cb9e12f75

agent.type

cloud-defend

agent.version

8.8.0

cloud.account.id

1234567abc

cloud.account.name

elastic-dev

cloud.availability_zone

us-east-1c

cloud.instance.name

webapp-node

cloud.project.id

123456abc

cloud.project.name

staging

cloud.provider

aws

cloud.region

us-east-1

cloud_defend.matched_selectors

[interactiveSessions]

cloud_defend.package_policy_id

4c9cbba0-c812-11ed-a8dd-91ec403e4f03

cloud_defend.package_policy_revision

2

cloud_defend.hook_point

[tracepointsched_process_fork,tracepointsched_process_exec, kprobe__taskstats_exit]

container.id

nginx_1

container.image.name

nginx

container.image.tag

latest

data_stream.dataset

cloud_defend.process

data_stream.namespace

default

data_stream.type

logs

ecs.version

8.7.0

event.action

forkexecend

event.agent_id_status

verified

event.category

process

event.created

2023-03-20T16:03:59.520Z

event.dataset

cloud_defend.process

event.id

3ee85eee-72d9-4e9d-934f-3787952ca830

event.ingested

2023-03-20T16:04:12Z

event.kind

eventalert

event.module

cloud_defend

event.type

startenddenied

group.id

0

host.architecture

amd64

host.boot.id

815a760f-8153-49e1-9d0b-da0d3b2a468c

host.id

1bb9e6a948dfb1c3cd38d1fdc8de4481

host.ip

[127.0.0.1, 172.20.0.2, 172.18.0.6]

host.hostname

kibana-node

host.mac

[32:a9:cc:26:4c:e5, 7a:ec:f0:3e:29:ee]

host.name

kibana-node.myapp.co

host.os.family

ubuntu

host.os.full

Ubuntu 20.04.5

host.os.kernel

5.10.161+ #1 SMP Thu Jan 5 22:49:42 UTC 2023

host.os.name

'Linux

host.os.platform

ubuntu

host.os.type

linux

host.os.version

20.04.5

host.pid_ns_ino

4026531836

orchestrator.cluster.id

12345

orchestrator.cluster.name

website

orchestrator.namespace

default

orchestrator.resource.ip

172.18.0.6

orchestrator.resource.annotation

[note:testing]

orchestrator.resource.label

[service:webapp]

orchestrator.resource.name

webapp-proxy

orchestrator.resource.parent.type

DaemonSetReplicaSet 等...

orchestrator.resource.type

pod

process.args

[ls--color=auto]

process.end

2023-03-20T16:04:12Z

process.entity_id

NzgyOWYyNmQtYzJkMS00ZWFmLWExYWMtY2Q5Y2I5ZTEyZjc1LTE5MTU1MzUtMTY3OTMyODIzOQ==

process.entry_leader.args

[bash]

process.entry_leader.entity_id

NzgyOWYyNmQtYzJkMS00ZWFmLWExYWMtY2Q5Y2I5ZTEyZjc1LTE5MTU1MzUtMTY3OTMyODIzOQ==

process.entry_leader.entry_meta.type

container

process.entry_leader.executable

/bin/bash

process.entry_leader.group.id

0

process.entry_leader.interactive

true

process.entry_leader.name

bash

process.entry_leader.pid

1915529

process.entry_leader.same_as_process

false

process.entry_leader.start

2023-03-20T16:03:59.520Z

process.entry_leader.user.id

0

process.entry_leader.working_directory

/usr/share/elastic-agent

process.executable

/usr/bin/ls

process.group_leader.args

[ls--color=auto]

process.group_leader.entity_id

NzgyOWYyNmQtYzJkMS00ZWFmLWExYWMtY2Q5Y2I5ZTEyZjc1LTE5MTU1MzUtMTY3OTMyODIzOQ==

process.group_leader.executable

/usr/bin/ls

process.group_leader.group.id

0

process.group_leader.interactive

true

process.group_leader.name

ls

process.group_leader.pid

1915529

process.group_leader.same_as_process

true

process.group_leader.start

2023-03-20T16:03:59.520Z

process.group_leader.user.id

0

process.group_leader.working_directory

/usr/share/elastic-agent

process.interactive

true

process.name

ls

process.parent.args

[bash]

process.parent.entity_id

NzgyOWYyNmQtYzJkMS00ZWFmLWExYWMtY2Q5Y2I5ZTEyZjc1LTE5MTU1MzUtMTY3OTMyODIzOQ==

process.parent.executable

/bin/bash

process.parent.group.id

0

process.parent.interactive

true

process.parent.name

bash

process.parent.pid

1915529

process.parent.same_as_process

false

process.parent.start

2023-03-20T16:03:59.520Z

process.parent.user.id

0

process.parent.working_directory

/usr/share/elastic-agent

process.pid

1916234

process.previous

[{ args: [bash], executable: /bin/bash}]

process.previous.args

[bash]

process.previous.executable

/bin/bash

process.session_leader.args

[bash]

process.session_leader.entity_id

NzgyOWYyNmQtYzJkMS00ZWFmLWExYWMtY2Q5Y2I5ZTEyZjc1LTE5MTU1MzUtMTY3OTMyODIzOQ==

process.session_leader.executable

/bin/bash

process.session_leader.group.id

0

process.session_leader.interactive

true

process.session_leader.name

bash

process.session_leader.pid

1915529

process.session_leader.same_as_process

false

process.session_leader.start

2023-03-20T16:03:59.520Z

process.session_leader.user.id

0

process.session_leader.working_directory

/usr/share/elastic-agent

process.start

2023-03-20T16:03:59.520Z

process.working_directory

/usr/share/elastic-agent

user.id

0

文件事件

编辑

以下字段适用于所有 event.category: file 的事件

字段 示例

@timestamp

2023-03-20T16:03:59.520Z

agent.id

7829f26d-c2d1-4eaf-a1ac-cd9cb9e12f75

agent.type

cloud-defend

agent.version

8.8.0

cloud.account.id

1234567abc

cloud.account.name

elastic-dev

cloud.availability_zone

us-east-1c

cloud.project.id

123456abc

cloud.project.name

staging

cloud.provider

aws

cloud.region

us-east-1

cloud_defend.matched_selectors

[binModifications]

cloud_defend.package_policy_id

4c9cbba0-c812-11ed-a8dd-91ec403e4f03

cloud_defend.package_policy_revision

2

cloud_defend.hook_point

以下之一:lsmpath_chmod、lsmpath_mknod、lsmfile_open、lsmpath_truncate、lsmpath_rename、lsmpath_link、lsm__path_unlink

container.id

nginx_1

container.image.name

nginx

container.image.tag

latest

data_stream.dataset

cloud_defend.process

data_stream.namespace

default

data_stream.type

logs

ecs.version

8.7.0

event.action

以下之一:creation (创建), modification (修改), deletion (删除), rename (重命名), link (链接), open (打开)

event.agent_id_status

verified

event.category

process

event.created

2023-03-20T16:03:59.520Z

event.dataset

cloud_defend.process

event.id

3ee85eee-72d9-4e9d-934f-3787952ca830

event.ingested

2023-03-20T16:04:12Z

event.kind

以下之一:event (事件), alert (警报)

event.module

cloud_defend

event.type

以下之一:start (开始), end (结束), denied (拒绝)

file.extension

ts

file.name

script.ts

file.path

/home/workspace/project/script.ts

group.id

0

host.architecture

amd64

host.boot.id

815a760f-8153-49e1-9d0b-da0d3b2a468c

host.id

1bb9e6a948dfb1c3cd38d1fdc8de4481

host.ip

[127.0.0.1, 172.20.0.2, 172.18.0.6]

host.hostname

kibana-node

host.mac

[32:a9:cc:26:4c:e5, 7a:ec:f0:3e:29:ee]

host.name

kibana-node.myapp.co

host.os.family

ubuntu

host.os.full

Ubuntu 20.04.5

host.os.kernel

5.10.161+ #1 SMP Thu Jan 5 22:49:42 UTC 2023

host.os.name

'Linux

host.os.platform

ubuntu

host.os.type

linux

host.os.version

20.04.5

host.pid_ns_ino

4026531836

orchestrator.cluster.id

12345

orchestrator.cluster.name

website

orchestrator.namespace

default

orchestrator.resource.ip

172.18.0.6

orchestrator.resource.annotation

[note:testing]

orchestrator.resource.label

[service:webapp]

orchestrator.resource.name

webapp-proxy

orchestrator.resource.parent.type

…​

orchestrator.resource.type

pod

process.entity_id

NzgyOWYyNmQtYzJkMS00ZWFmLWExYWMtY2Q5Y2I5ZTEyZjc1LTE5MTU1MzUtMTY3OTMyODIzOQ==

process.entry_leader.entity_id

NzgyOWYyNmQtYzJkMS00ZWFmLWExYWMtY2Q5Y2I5ZTEyZjc1LTE5MTU1MzUtMTY3OTMyODIzOQ==

process.executable

/usr/bin/vi

process.group_leader.entity_id

NzgyOWYyNmQtYzJkMS00ZWFmLWExYWMtY2Q5Y2I5ZTEyZjc1LTE5MTU1MzUtMTY3OTMyODIzOQ==

process.interactive

true

process.name

vi

process.parent.entity_id

NzgyOWYyNmQtYzJkMS00ZWFmLWExYWMtY2Q5Y2I5ZTEyZjc1LTE5MTU1MzUtMTY3OTMyODIzOQ==

process.pid

1916234

process.session_leader.entity_id

NzgyOWYyNmQtYzJkMS00ZWFmLWExYWMtY2Q5Y2I5ZTEyZjc1LTE5MTU1MzUtMTY3OTMyODIzOQ==

process.user.id

0

user.id

0

支持矩阵

编辑
  EKS 1.24-1.27 (AL2022) GKE 1.24-1.27 (COS)

进程事件导出

文件事件导出

漂移预防

挂载点感知

进程阻止

网络事件导出

即将推出

即将推出

网络阻止

即将推出

即将推出

变更日志

编辑
变更日志
版本 详细信息 Kibana 版本

1.2.6

Bug 修复 (查看拉取请求)
在引用 Ingest 管道中的变量时,使用三花括号 Mustache 模板。

8.11.0 或更高版本

1.2.5

增强 (查看拉取请求)
更新集成支持矩阵

8.11.0 或更高版本

1.2.4

增强 (查看拉取请求)
修复集成订阅层

8.11.0 或更高版本

1.2.3

增强 (查看拉取请求)
已更改所有者

8.11.0 或更高版本

1.2.2

增强 (查看拉取请求)
添加安全功能

8.11.0 或更高版本

1.2.1

增强 (查看拉取请求)
更新 ECS 参考

8.11.0 或更高版本

1.2.1-preview2

增强 (查看拉取请求)
将清单格式版本更新为 3.0.0。已添加 lifecycle.yml 文件。

1.2.1-preview

增强 (查看拉取请求)
添加 metrics-cloud_defend.heartbeat 索引

1.2.0

增强 (查看拉取请求)
发布 - 更新文档以支持新的进程阻止功能。

8.8.0 或更高版本

1.2.0-preview

增强 (查看拉取请求)
更新文档以支持新的进程阻止功能。

1.1.0

增强 (查看拉取请求)
确保为管道错误正确设置 event.kind。

8.8.0 或更高版本

1.0.7

增强 (查看拉取请求)
文档修复。

8.8.0 或更高版本

1.0.6

增强 (查看拉取请求)
文档更新。删除了 kubernetesPodId。

8.8.0 或更高版本

1.0.5

增强 (查看拉取请求)
文档更新。

8.8.0 或更高版本

1.0.4

增强 (查看拉取请求)
更新了 orchestrator.resource.label 和 annotation 以使用关键字类型。

1.0.3

增强 (查看拉取请求)
添加了 kubernetes 作为类别。将 trace_point 重命名为 hook_point

1.0.2

增强 (查看拉取请求)
为 cloud_defend.trace_point 添加了映射。修复了 host.name 和 host.hostname 示例,并在 README 中的字段列表中添加了 cloud.instance.name。

1.0.1

增强 (查看拉取请求)
默认策略已更新为包括新的文件/进程选择器架构。

1.0.0

增强 (查看拉取请求)
添加了用于跟踪遥测的进程和文件数据流。

0.1.1

增强 (查看拉取请求)
此版本现在可以与 cloud-defend 服务进行端到端工作。

0.1.0

增强 (查看拉取请求)
软件包的初始草案