Skip to content

Commit faa143a

Browse files
authored
chore(WorkloadFilter): Setup CWS and CPSM Filters (#44258)
### What does this PR do? Initializes container runtime security and container compliance filters within the WorkloadFilter component ### Motivation Centralize workload filtering definitions across the Agent ### Describe how you validated your changes Unit Tests ### Additional Notes N/A Co-authored-by: gabe.dossantos <[email protected]>
1 parent fd8e469 commit faa143a

File tree

7 files changed

+124
-36
lines changed

7 files changed

+124
-36
lines changed

comp/core/workloadfilter/baseimpl/base.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ func NewBaseFilterStore(cfg config.Component, logger logcomp.Component, telemetr
9595
baseFilter.RegisterFactory(workloadfilter.ContainerLegacyACExclude, legacyACExcludePrgFactory)
9696
baseFilter.RegisterFactory(workloadfilter.ContainerLegacyGlobal, legacyGlobalPrgFactory)
9797
baseFilter.RegisterFactory(workloadfilter.ContainerLegacySBOM, catalog.LegacyContainerSBOMProgram)
98+
baseFilter.RegisterFactory(workloadfilter.ContainerLegacyRuntimeSecurity, catalog.ContainerLegacyRuntimeSecurityProgram)
99+
baseFilter.RegisterFactory(workloadfilter.ContainerLegacyCompliance, catalog.ContainerLegacyComplianceProgram)
98100

99101
baseFilter.RegisterFactory(workloadfilter.ContainerADAnnotations, genericADProgramFactory)
100102
baseFilter.RegisterFactory(workloadfilter.ContainerADAnnotationsMetrics, genericADMetricsProgramFactory)
@@ -177,22 +179,32 @@ func (f *BaseFilterStore) GetEndpointAutodiscoveryFilters(filterScope workloadfi
177179

178180
// GetContainerSharedMetricFilters returns the pre-computed container shared metric filters
179181
func (f *BaseFilterStore) GetContainerSharedMetricFilters() workloadfilter.FilterBundle {
180-
return f.GetContainerFilters(f.selection.GetContainerSharedMetricFilters())
182+
return f.GetContainerFilters(f.selection.containerSharedMetric)
181183
}
182184

183185
// GetContainerPausedFilters returns the pre-computed container paused filters
184186
func (f *BaseFilterStore) GetContainerPausedFilters() workloadfilter.FilterBundle {
185-
return f.GetContainerFilters(f.selection.GetContainerPausedFilters())
187+
return f.GetContainerFilters(f.selection.containerPaused)
186188
}
187189

188190
// GetPodSharedMetricFilters returns the pre-computed pod shared metric filters
189191
func (f *BaseFilterStore) GetPodSharedMetricFilters() workloadfilter.FilterBundle {
190-
return f.GetPodFilters(f.selection.GetPodSharedMetricFilters())
192+
return f.GetPodFilters(f.selection.podSharedMetric)
191193
}
192194

193195
// GetContainerSBOMFilters returns the pre-computed container SBOM filters
194196
func (f *BaseFilterStore) GetContainerSBOMFilters() workloadfilter.FilterBundle {
195-
return f.GetContainerFilters(f.selection.GetContainerSBOMFilters())
197+
return f.GetContainerFilters(f.selection.containerSBOM)
198+
}
199+
200+
// GetContainerRuntimeSecurityFilters returns the pre-computed container runtime security filters
201+
func (f *BaseFilterStore) GetContainerRuntimeSecurityFilters() workloadfilter.FilterBundle {
202+
return f.GetContainerFilters(f.selection.containerRuntimeSecurity)
203+
}
204+
205+
// GetContainerComplianceFilters returns the pre-computed container compliance filters
206+
func (f *BaseFilterStore) GetContainerComplianceFilters() workloadfilter.FilterBundle {
207+
return f.GetContainerFilters(f.selection.containerCompliance)
196208
}
197209

198210
// GetContainerFilters returns the filter bundle for the given container filters

comp/core/workloadfilter/baseimpl/filter_utils.go

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package baseimpl
99
import (
1010
"github.com/DataDog/datadog-agent/comp/core/config"
1111
workloadfilter "github.com/DataDog/datadog-agent/comp/core/workloadfilter/def"
12+
pkgconfigsetup "github.com/DataDog/datadog-agent/pkg/config/setup" //nolint:pkgconfigusage
1213
)
1314

1415
// filterSelection stores pre-computed filter lists to avoid recalculating them on every call
@@ -21,6 +22,8 @@ type filterSelection struct {
2122
containerSharedMetric [][]workloadfilter.ContainerFilter
2223
containerPaused [][]workloadfilter.ContainerFilter
2324
containerSBOM [][]workloadfilter.ContainerFilter
25+
containerCompliance [][]workloadfilter.ContainerFilter
26+
containerRuntimeSecurity [][]workloadfilter.ContainerFilter
2427

2528
// Pod filters
2629
podSharedMetric [][]workloadfilter.PodFilter
@@ -50,6 +53,9 @@ func (pf *filterSelection) initializeSelections(cfg config.Component) {
5053
pf.containerAutodiscoveryLogs = pf.computeContainerAutodiscoveryFilters(cfg, workloadfilter.LogsFilter)
5154
pf.containerSharedMetric = pf.computeContainerSharedMetricFilters(cfg)
5255

56+
pf.containerCompliance = pf.computeContainerComplianceFilters(cfg)
57+
pf.containerRuntimeSecurity = pf.computeContainerRuntimeSecurityFilters(pkgconfigsetup.SystemProbe())
58+
5359
// Initialize container paused and SBOM filters
5460
pf.containerPaused = pf.computeContainerPausedFilters(cfg)
5561
pf.containerSBOM = pf.computeContainerSBOMFilters(cfg)
@@ -80,26 +86,6 @@ func (pf *filterSelection) GetContainerAutodiscoveryFilters(filterScope workload
8086
}
8187
}
8288

83-
// GetContainerSharedMetricFilters returns pre-computed container shared metric filters
84-
func (pf *filterSelection) GetContainerSharedMetricFilters() [][]workloadfilter.ContainerFilter {
85-
return pf.containerSharedMetric
86-
}
87-
88-
// GetContainerPausedFilters returns pre-computed container paused filters
89-
func (pf *filterSelection) GetContainerPausedFilters() [][]workloadfilter.ContainerFilter {
90-
return pf.containerPaused
91-
}
92-
93-
// GetContainerSBOMFilters returns pre-computed container SBOM filters
94-
func (pf *filterSelection) GetContainerSBOMFilters() [][]workloadfilter.ContainerFilter {
95-
return pf.containerSBOM
96-
}
97-
98-
// GetPodSharedMetricFilters returns pre-computed pod shared metric filters
99-
func (pf *filterSelection) GetPodSharedMetricFilters() [][]workloadfilter.PodFilter {
100-
return pf.podSharedMetric
101-
}
102-
10389
// GetServiceAutodiscoveryFilters returns pre-computed service autodiscovery filters
10490
func (pf *filterSelection) GetServiceAutodiscoveryFilters(filterScope workloadfilter.Scope) [][]workloadfilter.ServiceFilter {
10591
switch filterScope {
@@ -246,3 +232,21 @@ func (pf *filterSelection) computeEndpointAutodiscoveryFilters(_ config.Componen
246232

247233
return flist
248234
}
235+
236+
// computeContainerComplianceFilters computes container compliance filters
237+
func (pf *filterSelection) computeContainerComplianceFilters(cfg config.Component) [][]workloadfilter.ContainerFilter {
238+
flist := []workloadfilter.ContainerFilter{workloadfilter.ContainerLegacyCompliance}
239+
if cfg.GetBool("compliance_config.exclude_pause_containers") {
240+
flist = append(flist, workloadfilter.ContainerPaused)
241+
}
242+
return [][]workloadfilter.ContainerFilter{flist}
243+
}
244+
245+
// computeContainerRuntimeSecurityFilters computes container runtime security filters
246+
func (pf *filterSelection) computeContainerRuntimeSecurityFilters(cfg config.Component) [][]workloadfilter.ContainerFilter {
247+
flist := []workloadfilter.ContainerFilter{workloadfilter.ContainerLegacyRuntimeSecurity}
248+
if cfg.GetBool("runtime_security_config.exclude_pause_containers") {
249+
flist = append(flist, workloadfilter.ContainerPaused)
250+
}
251+
return [][]workloadfilter.ContainerFilter{flist}
252+
}

comp/core/workloadfilter/catalog/container.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,13 @@ func ContainerCELGlobalProgram(filterConfig *FilterConfig, logger log.Component)
4141
rule := filterConfig.GetCELRulesForProduct(workloadfilter.ProductGlobal, workloadfilter.ContainerType)
4242
return createCELExcludeProgram(string(workloadfilter.ContainerCELGlobal), rule, workloadfilter.ContainerType, logger)
4343
}
44+
45+
// ContainerLegacyRuntimeSecurityProgram creates a program for filtering containers for runtime security
46+
func ContainerLegacyRuntimeSecurityProgram(filterConfig *FilterConfig, logger log.Component) program.FilterProgram {
47+
return createLegacyContainerProgram(string(workloadfilter.ContainerLegacyRuntimeSecurity), filterConfig.ContainerRuntimeSecurityInclude, filterConfig.ContainerRuntimeSecurityExclude, logger)
48+
}
49+
50+
// ContainerLegacyComplianceProgram creates a program for filtering containers for compliance
51+
func ContainerLegacyComplianceProgram(filterConfig *FilterConfig, logger log.Component) program.FilterProgram {
52+
return createLegacyContainerProgram(string(workloadfilter.ContainerLegacyCompliance), filterConfig.ContainerComplianceInclude, filterConfig.ContainerComplianceExclude, logger)
53+
}

comp/core/workloadfilter/catalog/filter_config.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/DataDog/datadog-agent/comp/core/config"
1919
workloadfilter "github.com/DataDog/datadog-agent/comp/core/workloadfilter/def"
2020
"github.com/DataDog/datadog-agent/comp/core/workloadfilter/impl/parse"
21+
pkgconfigsetup "github.com/DataDog/datadog-agent/pkg/config/setup" //nolint:pkgconfigusage
2122
"github.com/DataDog/datadog-agent/pkg/config/structure"
2223
"github.com/DataDog/datadog-agent/pkg/util/log"
2324
)
@@ -32,6 +33,11 @@ type FilterConfig struct {
3233
ContainerIncludeLogs []string `json:"container_include_logs"`
3334
ContainerExcludeLogs []string `json:"container_exclude_logs"`
3435

36+
ContainerRuntimeSecurityInclude []string
37+
ContainerRuntimeSecurityExclude []string
38+
ContainerComplianceInclude []string
39+
ContainerComplianceExclude []string
40+
3541
// Legacy AC filters
3642
ACInclude []string `json:"ac_include"`
3743
ACExclude []string `json:"ac_exclude"`
@@ -68,6 +74,8 @@ func NewFilterConfig(cfg config.Component) (*FilterConfig, error) {
6874
processBlacklistPatterns = cfg.GetStringSlice("process_config.blacklist_patterns")
6975
}
7076

77+
systemProbeCfg := pkgconfigsetup.SystemProbe()
78+
7179
return &FilterConfig{
7280
// Legacy container filters
7381
ContainerInclude: cfg.GetStringSlice("container_include"),
@@ -77,6 +85,12 @@ func NewFilterConfig(cfg config.Component) (*FilterConfig, error) {
7785
ContainerIncludeLogs: cfg.GetStringSlice("container_include_logs"),
7886
ContainerExcludeLogs: cfg.GetStringSlice("container_exclude_logs"),
7987

88+
ContainerComplianceInclude: cfg.GetStringSlice("compliance_config.container_include"),
89+
ContainerComplianceExclude: cfg.GetStringSlice("compliance_config.container_exclude"),
90+
91+
ContainerRuntimeSecurityInclude: systemProbeCfg.GetStringSlice("runtime_security_config.container_include"),
92+
ContainerRuntimeSecurityExclude: systemProbeCfg.GetStringSlice("runtime_security_config.container_exclude"),
93+
8094
// Legacy AC filters
8195
ACInclude: cfg.GetStringSlice("ac_include"),
8296
ACExclude: cfg.GetStringSlice("ac_exclude"),

comp/core/workloadfilter/def/component.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,19 @@ type Component interface {
3232
// GetEndpointAutodiscoveryFilters retrieves the endpoint AD FilterBundle
3333
GetEndpointAutodiscoveryFilters(filterScope Scope) FilterBundle
3434

35-
// GetContainerSharedMetricFilters retrieves the container shared metric FilterBundle
36-
GetContainerSharedMetricFilters() FilterBundle
3735
// GetContainerPausedFilters retrieves the container paused FilterBundle
3836
GetContainerPausedFilters() FilterBundle
37+
// GetContainerSharedMetricFilters retrieves the container shared metric FilterBundle
38+
GetContainerSharedMetricFilters() FilterBundle
3939
// GetPodSharedMetricFilters retrieves the pod shared metric FilterBundle
4040
GetPodSharedMetricFilters() FilterBundle
4141

4242
// GetContainerSBOMFilters retrieves the container SBOM FilterBundle
4343
GetContainerSBOMFilters() FilterBundle
44+
// GetContainerRuntimeSecurityFilters retrieves the container RuntimeSecurity FilterBundle
45+
GetContainerRuntimeSecurityFilters() FilterBundle
46+
// GetContainerComplianceFilters retrieves the container Compliance FilterBundle
47+
GetContainerComplianceFilters() FilterBundle
4448

4549
// String returns a string representation of the workloadfilter configuration
4650
// If useColor is true, the output will include ANSI color codes.

comp/core/workloadfilter/def/types.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -276,16 +276,18 @@ func (f ContainerFilter) GetFilterName() string {
276276

277277
// Defined Container filter kinds
278278
const (
279-
ContainerLegacyMetrics ContainerFilter = "container-legacy-metrics"
280-
ContainerLegacyLogs ContainerFilter = "container-legacy-logs"
281-
ContainerLegacyGlobal ContainerFilter = "container-legacy-global"
282-
ContainerLegacyACInclude ContainerFilter = "container-legacy-ac-include"
283-
ContainerLegacyACExclude ContainerFilter = "container-legacy-ac-exclude"
284-
ContainerLegacySBOM ContainerFilter = "container-legacy-sbom"
285-
ContainerADAnnotationsMetrics ContainerFilter = "container-ad-annotations-metrics"
286-
ContainerADAnnotationsLogs ContainerFilter = "container-ad-annotations-logs"
287-
ContainerADAnnotations ContainerFilter = "container-ad-annotations"
288-
ContainerPaused ContainerFilter = "container-paused"
279+
ContainerLegacyMetrics ContainerFilter = "container-legacy-metrics"
280+
ContainerLegacyLogs ContainerFilter = "container-legacy-logs"
281+
ContainerLegacyGlobal ContainerFilter = "container-legacy-global"
282+
ContainerLegacyACInclude ContainerFilter = "container-legacy-ac-include"
283+
ContainerLegacyACExclude ContainerFilter = "container-legacy-ac-exclude"
284+
ContainerLegacySBOM ContainerFilter = "container-legacy-sbom"
285+
ContainerLegacyRuntimeSecurity ContainerFilter = "container-legacy-runtime-security"
286+
ContainerLegacyCompliance ContainerFilter = "container-legacy-compliance"
287+
ContainerADAnnotationsMetrics ContainerFilter = "container-ad-annotations-metrics"
288+
ContainerADAnnotationsLogs ContainerFilter = "container-ad-annotations-logs"
289+
ContainerADAnnotations ContainerFilter = "container-ad-annotations"
290+
ContainerPaused ContainerFilter = "container-paused"
289291
// CEL-based filters
290292
ContainerCELMetrics ContainerFilter = "container-cel-metrics"
291293
ContainerCELLogs ContainerFilter = "container-cel-logs"

comp/core/workloadfilter/impl/filter_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,3 +1337,45 @@ cel_workload_exclude:
13371337
assert.Equal(t, workloadfilter.Excluded, filterBundle.GetResult(process))
13381338
})
13391339
}
1340+
1341+
func TestContainerRuntimeSecurityAndComplianceFilters(t *testing.T) {
1342+
mockConfig := configmock.New(t)
1343+
mockSystemProbe := configmock.NewSystemProbe(t)
1344+
1345+
// Setup Compliance Config
1346+
mockConfig.SetWithoutSource("compliance_config.container_include", []string{"image:compliance-agent"})
1347+
mockConfig.SetWithoutSource("compliance_config.container_exclude", []string{"image:malicious"})
1348+
1349+
// Setup Runtime Security Config
1350+
mockSystemProbe.SetWithoutSource("runtime_security_config.container_include", []string{"image:security-agent"})
1351+
mockSystemProbe.SetWithoutSource("runtime_security_config.container_exclude", []string{"image:suspicious"})
1352+
1353+
filterStore := newFilterStoreObject(t, mockConfig)
1354+
1355+
// Test Compliance Filter
1356+
t.Run("Compliance Filter", func(t *testing.T) {
1357+
includedContainer := workloadfilter.CreateContainerImage("compliance-agent")
1358+
excludedContainer := workloadfilter.CreateContainerImage("malicious")
1359+
unknownContainer := workloadfilter.CreateContainerImage("security-agent")
1360+
1361+
filterBundle := filterStore.GetContainerComplianceFilters()
1362+
1363+
assert.Equal(t, workloadfilter.Included, filterBundle.GetResult(includedContainer))
1364+
assert.Equal(t, workloadfilter.Excluded, filterBundle.GetResult(excludedContainer))
1365+
assert.Equal(t, workloadfilter.Unknown, filterBundle.GetResult(unknownContainer))
1366+
})
1367+
1368+
// Test Runtime Security Filter
1369+
t.Run("Runtime Security Filter", func(t *testing.T) {
1370+
includedContainer := workloadfilter.CreateContainerImage("security-agent")
1371+
excludedContainer := workloadfilter.CreateContainerImage("suspicious")
1372+
unknownContainer := workloadfilter.CreateContainerImage("malicious")
1373+
1374+
filterBundle := filterStore.GetContainerRuntimeSecurityFilters()
1375+
1376+
assert.Equal(t, workloadfilter.Included, filterBundle.GetResult(includedContainer))
1377+
assert.Equal(t, workloadfilter.Excluded, filterBundle.GetResult(excludedContainer))
1378+
assert.Equal(t, workloadfilter.Unknown, filterBundle.GetResult(unknownContainer))
1379+
})
1380+
1381+
}

0 commit comments

Comments
 (0)