Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/cluster-agent/subcommands/start/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -517,7 +517,7 @@ func start(log log.Component,
go func() {
defer wg.Done()

if err := runCompliance(mainCtx, demultiplexer, wmeta, apiCl, compression, ipc, le.IsLeader); err != nil {
if err := runCompliance(mainCtx, demultiplexer, wmeta, filterStore, apiCl, compression, ipc, le.IsLeader); err != nil {
pkglog.Errorf("Error while running compliance agent: %v", err)
}
}()
Expand Down
9 changes: 5 additions & 4 deletions cmd/cluster-agent/subcommands/start/compliance.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"k8s.io/client-go/dynamic"

ipc "github.com/DataDog/datadog-agent/comp/core/ipc/def"
workloadfilter "github.com/DataDog/datadog-agent/comp/core/workloadfilter/def"
workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def"
logscompression "github.com/DataDog/datadog-agent/comp/serializer/logscompression/def"
"github.com/DataDog/datadog-agent/pkg/aggregator/sender"
Expand All @@ -26,9 +27,9 @@ import (
"github.com/DataDog/datadog-agent/pkg/util/startstop"
)

func runCompliance(ctx context.Context, senderManager sender.SenderManager, wmeta workloadmeta.Component, apiCl *apiserver.APIClient, compression logscompression.Component, ipc ipc.Component, isLeader func() bool) error {
func runCompliance(ctx context.Context, senderManager sender.SenderManager, wmeta workloadmeta.Component, filterStore workloadfilter.Component, apiCl *apiserver.APIClient, compression logscompression.Component, ipc ipc.Component, isLeader func() bool) error {
stopper := startstop.NewSerialStopper()
if err := startCompliance(senderManager, wmeta, stopper, apiCl, isLeader, compression, ipc); err != nil {
if err := startCompliance(senderManager, wmeta, filterStore, stopper, apiCl, isLeader, compression, ipc); err != nil {
return err
}

Expand All @@ -38,7 +39,7 @@ func runCompliance(ctx context.Context, senderManager sender.SenderManager, wmet
return nil
}

func startCompliance(senderManager sender.SenderManager, wmeta workloadmeta.Component, stopper startstop.Stopper, apiCl *apiserver.APIClient, isLeader func() bool, compression logscompression.Component, ipc ipc.Component) error {
func startCompliance(senderManager sender.SenderManager, wmeta workloadmeta.Component, filterStore workloadfilter.Component, stopper startstop.Stopper, apiCl *apiserver.APIClient, isLeader func() bool, compression logscompression.Component, ipc ipc.Component) error {
endpoints, ctx, err := seccommon.NewLogContextCompliance()
if err != nil {
log.Error(err)
Expand All @@ -59,7 +60,7 @@ func startCompliance(senderManager sender.SenderManager, wmeta workloadmeta.Comp
return err
}

agent := compliance.NewAgent(statsdClient, wmeta, ipc, compliance.AgentOptions{
agent := compliance.NewAgent(statsdClient, wmeta, ipc, filterStore, compliance.AgentOptions{
ConfigDir: configDir,
Reporter: reporter,
CheckInterval: checkInterval,
Expand Down
7 changes: 5 additions & 2 deletions cmd/security-agent/subcommands/start/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ import (
tagger "github.com/DataDog/datadog-agent/comp/core/tagger/def"
remoteTaggerfx "github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote"
"github.com/DataDog/datadog-agent/comp/core/telemetry"
workloadfilter "github.com/DataDog/datadog-agent/comp/core/workloadfilter/def"
remoteWorkloadfilterfx "github.com/DataDog/datadog-agent/comp/core/workloadfilter/fx-remote"
wmcatalog "github.com/DataDog/datadog-agent/comp/core/workloadmeta/collectors/catalog-remote"
workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def"
workloadmetafx "github.com/DataDog/datadog-agent/comp/core/workloadmeta/fx"
Expand Down Expand Up @@ -109,6 +111,7 @@ func Commands(globalParams *command.GlobalParams) []*cobra.Command {
workloadmetafx.Module(workloadmeta.Params{
AgentType: workloadmeta.Remote,
}),
remoteWorkloadfilterfx.Module(),
remoteTaggerfx.Module(tagger.NewRemoteParams()),
fx.Provide(func() startstop.Stopper {
return startstop.NewSerialStopper()
Expand All @@ -134,7 +137,7 @@ func Commands(globalParams *command.GlobalParams) []*cobra.Command {
// TODO - components: Do not remove runtimeAgent ref until "github.com/DataDog/datadog-agent/pkg/security/agent" is a component so they're not GCed
return status.NewInformationProvider(runtimeAgent.StatusProvider()), runtimeAgent, nil
}),
fx.Provide(func(stopper startstop.Stopper, log log.Component, config config.Component, statsdClient ddgostatsd.ClientInterface, sysprobeconfig sysprobeconfig.Component, wmeta workloadmeta.Component, compression logscompression.Component, ipc ipc.Component, hostname hostnameinterface.Component) (status.InformationProvider, *compliance.Agent, error) {
fx.Provide(func(stopper startstop.Stopper, log log.Component, config config.Component, statsdClient ddgostatsd.ClientInterface, sysprobeconfig sysprobeconfig.Component, wmeta workloadmeta.Component, filterStore workloadfilter.Component, compression logscompression.Component, ipc ipc.Component, hostname hostnameinterface.Component) (status.InformationProvider, *compliance.Agent, error) {
hostnameDetected, err := hostname.Get(context.TODO())
if err != nil {
return status.NewInformationProvider(nil), nil, err
Expand All @@ -146,7 +149,7 @@ func Commands(globalParams *command.GlobalParams) []*cobra.Command {
}

// start compliance security agent
complianceAgent, err := compliance.StartCompliance(log, config, hostnameDetected, stopper, statsdClient, wmeta, compression, ipc, sysProbeClient)
complianceAgent, err := compliance.StartCompliance(log, config, hostnameDetected, stopper, statsdClient, wmeta, filterStore, compression, ipc, sysProbeClient)
if err != nil {
return status.NewInformationProvider(nil), nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/system-probe/modules/eventmonitor.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ func createEventMonitorModule(_ *sysconfigtypes.Config, deps module.FactoryDepen
}

if secconfig.RuntimeSecurity.IsRuntimeEnabled() {
cws, err := secmodule.NewCWSConsumer(evm, secconfig.RuntimeSecurity, deps.WMeta, secmoduleOpts, deps.Compression, deps.Ipc)
cws, err := secmodule.NewCWSConsumer(evm, secconfig.RuntimeSecurity, deps.WMeta, deps.FilterStore, secmoduleOpts, deps.Compression, deps.Ipc)
if err != nil {
return nil, err
}
Expand Down
3 changes: 3 additions & 0 deletions cmd/system-probe/subcommands/run/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import (
remoteTaggerFx "github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote"
"github.com/DataDog/datadog-agent/comp/core/telemetry"
"github.com/DataDog/datadog-agent/comp/core/telemetry/telemetryimpl"
remoteWorkloadfilterfx "github.com/DataDog/datadog-agent/comp/core/workloadfilter/fx-remote"
wmcatalog "github.com/DataDog/datadog-agent/comp/core/workloadmeta/collectors/catalog-remote"
workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def"
workloadmetafx "github.com/DataDog/datadog-agent/comp/core/workloadmeta/fx"
Expand Down Expand Up @@ -129,6 +130,7 @@ func Commands(globalParams *command.GlobalParams) []*cobra.Command {
workloadmetafx.Module(workloadmeta.Params{
AgentType: workloadmeta.Remote,
}),
remoteWorkloadfilterfx.Module(),
ipcfx.ModuleReadWrite(),
// Provide tagger module
remoteTaggerFx.Module(tagger.NewRemoteParams()),
Expand Down Expand Up @@ -315,6 +317,7 @@ func runSystemProbe(ctxChan <-chan context.Context, errChan chan error) error {
workloadmetafx.Module(workloadmeta.Params{
AgentType: workloadmeta.Remote,
}),
remoteWorkloadfilterfx.Module(),
ipcfx.ModuleReadWrite(),
// Provide tagger module
remoteTaggerFx.Module(tagger.NewRemoteParams()),
Expand Down
7 changes: 5 additions & 2 deletions pkg/compliance/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"github.com/shirou/gopsutil/v4/process"

ipc "github.com/DataDog/datadog-agent/comp/core/ipc/def"
workloadfilter "github.com/DataDog/datadog-agent/comp/core/workloadfilter/def"
workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def"
"github.com/DataDog/datadog-agent/pkg/compliance/aptconfig"
"github.com/DataDog/datadog-agent/pkg/compliance/dbconfig"
Expand Down Expand Up @@ -113,6 +114,7 @@ const (
type Agent struct {
telemetrySender telemetry.SimpleTelemetrySender
wmeta workloadmeta.Component
filterStore workloadfilter.Component
ipc ipc.Component
opts AgentOptions

Expand Down Expand Up @@ -177,7 +179,7 @@ func MakeDefaultRuleFilter(ipc ipc.Component) RuleFilter {
}

// NewAgent returns a new compliance agent.
func NewAgent(telemetrySender telemetry.SimpleTelemetrySender, wmeta workloadmeta.Component, ipc ipc.Component, opts AgentOptions) *Agent {
func NewAgent(telemetrySender telemetry.SimpleTelemetrySender, wmeta workloadmeta.Component, ipc ipc.Component, filterStore workloadfilter.Component, opts AgentOptions) *Agent {
if opts.ConfigDir == "" {
panic("compliance: missing agent configuration directory")
}
Expand All @@ -202,6 +204,7 @@ func NewAgent(telemetrySender telemetry.SimpleTelemetrySender, wmeta workloadmet
return &Agent{
telemetrySender: telemetrySender,
wmeta: wmeta,
filterStore: filterStore,
ipc: ipc,
opts: opts,
statuses: make(map[string]*CheckStatus),
Expand All @@ -210,7 +213,7 @@ func NewAgent(telemetrySender telemetry.SimpleTelemetrySender, wmeta workloadmet

// Start starts the compliance agent.
func (a *Agent) Start() error {
telemetry, err := telemetry.NewContainersTelemetry(a.telemetrySender, a.wmeta, pkgconfigsetup.Datadog(), "compliance_config.")
telemetry, err := telemetry.NewContainersTelemetry(a.telemetrySender, a.wmeta, a.filterStore.GetContainerComplianceFilters())
if err != nil {
log.Errorf("could not start containers telemetry: %v", err)
return err
Expand Down
4 changes: 3 additions & 1 deletion pkg/compliance/compliance.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/DataDog/datadog-agent/comp/core/config"
ipc "github.com/DataDog/datadog-agent/comp/core/ipc/def"
log "github.com/DataDog/datadog-agent/comp/core/log/def"
workloadfilter "github.com/DataDog/datadog-agent/comp/core/workloadfilter/def"
workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def"
"github.com/DataDog/datadog-agent/comp/dogstatsd/constants"
compression "github.com/DataDog/datadog-agent/comp/serializer/logscompression/def"
Expand All @@ -35,6 +36,7 @@ func StartCompliance(log log.Component,
stopper startstop.Stopper,
statsdClient ddgostatsd.ClientInterface,
wmeta workloadmeta.Component,
filterStore workloadfilter.Component,
compression compression.Component,
ipc ipc.Component,
sysProbeClient SysProbeClient,
Expand Down Expand Up @@ -73,7 +75,7 @@ func StartCompliance(log log.Component,
reporter := NewLogReporter(hostname, "compliance-agent", "compliance", endpoints, context, compression)
telemetrySender := telemetry.NewSimpleTelemetrySenderFromStatsd(statsdClient)

agent := NewAgent(telemetrySender, wmeta, ipc, AgentOptions{
agent := NewAgent(telemetrySender, wmeta, ipc, filterStore, AgentOptions{
ResolverOptions: resolverOptions,
ConfigDir: configDir,
Reporter: reporter,
Expand Down
5 changes: 3 additions & 2 deletions pkg/security/module/cws.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/DataDog/datadog-go/v5/statsd"

ipc "github.com/DataDog/datadog-agent/comp/core/ipc/def"
workloadfilter "github.com/DataDog/datadog-agent/comp/core/workloadfilter/def"
workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def"
compression "github.com/DataDog/datadog-agent/comp/serializer/logscompression/def"
"github.com/DataDog/datadog-agent/pkg/eventmonitor"
Expand Down Expand Up @@ -72,12 +73,12 @@ type CWSConsumer struct {
}

// NewCWSConsumer initializes the module with options
func NewCWSConsumer(evm *eventmonitor.EventMonitor, cfg *config.RuntimeSecurityConfig, wmeta workloadmeta.Component, opts Opts, compression compression.Component, ipc ipc.Component) (*CWSConsumer, error) {
func NewCWSConsumer(evm *eventmonitor.EventMonitor, cfg *config.RuntimeSecurityConfig, wmeta workloadmeta.Component, filterStore workloadfilter.Component, opts Opts, compression compression.Component, ipc ipc.Component) (*CWSConsumer, error) {
crtelemcfg := telemetry.ContainersRunningTelemetryConfig{
RuntimeEnabled: cfg.RuntimeEnabled,
FIMEnabled: cfg.FIMEnabled,
}
crtelemetry, err := telemetry.NewContainersRunningTelemetry(crtelemcfg, evm.StatsdClient, wmeta)
crtelemetry, err := telemetry.NewContainersRunningTelemetry(crtelemcfg, evm.StatsdClient, wmeta, filterStore)
if err != nil {
return nil, err
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import (
"os"
"time"

workloadfilter "github.com/DataDog/datadog-agent/comp/core/workloadfilter/def"
workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def"
pkgconfigsetup "github.com/DataDog/datadog-agent/pkg/config/setup"
"github.com/DataDog/datadog-agent/pkg/security/metrics"
"github.com/DataDog/datadog-agent/pkg/util/log"

Expand All @@ -25,9 +25,9 @@ type ContainersRunningTelemetry struct {
}

// NewContainersRunningTelemetry creates a new ContainersRunningTelemetry instance
func NewContainersRunningTelemetry(cfg ContainersRunningTelemetryConfig, statsdClient statsd.ClientInterface, wmeta workloadmeta.Component) (*ContainersRunningTelemetry, error) {
func NewContainersRunningTelemetry(cfg ContainersRunningTelemetryConfig, statsdClient statsd.ClientInterface, wmeta workloadmeta.Component, filterStore workloadfilter.Component) (*ContainersRunningTelemetry, error) {
telemetrySender := NewSimpleTelemetrySenderFromStatsd(statsdClient)
containersTelemetry, err := NewContainersTelemetry(telemetrySender, wmeta, pkgconfigsetup.SystemProbe(), "runtime_security_config.")
containersTelemetry, err := NewContainersTelemetry(telemetrySender, wmeta, filterStore.GetContainerRuntimeSecurityFilters())
if err != nil {
return nil, err
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,17 @@ package telemetry
import (
"context"

workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def"
"github.com/DataDog/datadog-go/v5/statsd"

workloadfilter "github.com/DataDog/datadog-agent/comp/core/workloadfilter/def"
workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def"
)

// ContainersRunningTelemetry reports environment information (e.g containers running) when the runtime security component is running
type ContainersRunningTelemetry struct{}

// NewContainersRunningTelemetry creates a new ContainersRunningTelemetry instance (not supported on non-linux platforms)
func NewContainersRunningTelemetry(_ ContainersRunningTelemetryConfig, _ statsd.ClientInterface, _ workloadmeta.Component) (*ContainersRunningTelemetry, error) {
func NewContainersRunningTelemetry(_ ContainersRunningTelemetryConfig, _ statsd.ClientInterface, _ workloadmeta.Component, _ workloadfilter.Component) (*ContainersRunningTelemetry, error) {
return nil, nil
}

Expand Down
30 changes: 14 additions & 16 deletions pkg/security/telemetry/telemetry.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,30 @@
package telemetry

import (
"errors"
"strings"

"github.com/DataDog/datadog-go/v5/statsd"

workloadfilter "github.com/DataDog/datadog-agent/comp/core/workloadfilter/def"
workloadmetafilter "github.com/DataDog/datadog-agent/comp/core/workloadfilter/util/workloadmeta"
workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def"
"github.com/DataDog/datadog-agent/comp/dogstatsd/constants"
"github.com/DataDog/datadog-agent/pkg/config/model"
"github.com/DataDog/datadog-agent/pkg/security/common"
"github.com/DataDog/datadog-agent/pkg/util/containers"
"github.com/DataDog/datadog-agent/pkg/util/log"
"github.com/DataDog/datadog-go/v5/statsd"
)

// ContainersTelemetry represents the objects necessary to send metrics listing containers
type ContainersTelemetry struct {
TelemetrySender SimpleTelemetrySender
MetadataStore workloadmeta.Component
containerFilter *containers.Filter
containerFilter workloadfilter.FilterBundle
}

// NewContainersTelemetry returns a new ContainersTelemetry based on default/global objects
func NewContainersTelemetry(telemetrySender SimpleTelemetrySender, wmeta workloadmeta.Component, cfg model.Config, prefix string) (*ContainersTelemetry, error) {
containerFilter, err := common.NewContainerFilter(cfg, prefix)
if err != nil {
return nil, err
func NewContainersTelemetry(telemetrySender SimpleTelemetrySender, wmeta workloadmeta.Component, containerFilter workloadfilter.FilterBundle) (*ContainersTelemetry, error) {
errs := containerFilter.GetErrors()
if errs != nil {
return nil, errors.Join(errs...)
}

return &ContainersTelemetry{
Expand All @@ -54,15 +55,12 @@ func (c *ContainersTelemetry) ReportContainers(metricName string) {
value := container.EnvVars["DOCKER_DD_AGENT"]
value = strings.ToLower(value)

var podNamespace string
var podAnnotations map[string]string
if pod, err := c.MetadataStore.GetKubernetesPodForContainer(container.ID); err == nil {
podNamespace = pod.Namespace
podAnnotations = pod.Annotations
}
pod, _ := c.MetadataStore.GetKubernetesPodForContainer(container.ID)
filterablePod := workloadmetafilter.CreatePod(pod)
filterableContainer := workloadmetafilter.CreateContainer(container, filterablePod)

if (value == "yes" || value == "true") ||
c.containerFilter.IsExcluded(podAnnotations, container.Name, container.Image.Name, podNamespace) {
c.containerFilter.IsExcluded(filterableContainer) {
log.Debugf("ignoring container: name=%s id=%s image_id=%s", container.Name, container.ID, container.Image.ID)
continue
}
Expand Down
5 changes: 4 additions & 1 deletion pkg/security/tests/module_tester_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import (
"golang.org/x/sys/unix"

ipcmock "github.com/DataDog/datadog-agent/comp/core/ipc/mock"
workloadfilterfxmock "github.com/DataDog/datadog-agent/comp/core/workloadfilter/fx-mock"
logscompression "github.com/DataDog/datadog-agent/comp/serializer/logscompression/impl"
ebpftelemetry "github.com/DataDog/datadog-agent/pkg/ebpf/telemetry"
"github.com/DataDog/datadog-agent/pkg/eventmonitor"
Expand Down Expand Up @@ -803,6 +804,8 @@ func newTestModule(t testing.TB, macroDefs []*rules.MacroDefinition, ruleDefs []

ipcComp := ipcmock.New(t)

mockFilterStore := workloadfilterfxmock.SetupMockFilter(t)

testMod.eventMonitor, err = eventmonitor.NewEventMonitor(emconfig, secconfig, ipcComp, emopts)
if err != nil {
return nil, err
Expand All @@ -814,7 +817,7 @@ func newTestModule(t testing.TB, macroDefs []*rules.MacroDefinition, ruleDefs []
msgSender := newFakeMsgSender(testMod)

compression := logscompression.NewComponent()
cws, err := module.NewCWSConsumer(testMod.eventMonitor, secconfig.RuntimeSecurity, nil, module.Opts{EventSender: testMod, MsgSender: msgSender}, compression, ipcComp)
cws, err := module.NewCWSConsumer(testMod.eventMonitor, secconfig.RuntimeSecurity, nil, mockFilterStore, module.Opts{EventSender: testMod, MsgSender: msgSender}, compression, ipcComp)
if err != nil {
return nil, fmt.Errorf("failed to create module: %w", err)
}
Expand Down
5 changes: 4 additions & 1 deletion pkg/security/tests/module_tester_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/hashicorp/go-multierror"

ipcmock "github.com/DataDog/datadog-agent/comp/core/ipc/mock"
workloadfilterfxmock "github.com/DataDog/datadog-agent/comp/core/workloadfilter/fx-mock"
logscompression "github.com/DataDog/datadog-agent/comp/serializer/logscompression/impl"
"github.com/DataDog/datadog-agent/pkg/eventmonitor"
secconfig "github.com/DataDog/datadog-agent/pkg/security/config"
Expand Down Expand Up @@ -168,6 +169,8 @@ func newTestModule(t testing.TB, macroDefs []*rules.MacroDefinition, ruleDefs []

ipcComp := ipcmock.New(t)

mockFilterStore := workloadfilterfxmock.SetupMockFilter(t)

testMod.eventMonitor, err = eventmonitor.NewEventMonitor(emconfig, secconfig, ipcComp, emopts)
if err != nil {
return nil, err
Expand All @@ -177,7 +180,7 @@ func newTestModule(t testing.TB, macroDefs []*rules.MacroDefinition, ruleDefs []
var ruleSetloadedErr *multierror.Error
if !opts.staticOpts.disableRuntimeSecurity {
compression := logscompression.NewComponent()
cws, err := module.NewCWSConsumer(testMod.eventMonitor, secconfig.RuntimeSecurity, nil, module.Opts{EventSender: testMod}, compression, ipcComp)
cws, err := module.NewCWSConsumer(testMod.eventMonitor, secconfig.RuntimeSecurity, nil, mockFilterStore, module.Opts{EventSender: testMod}, compression, ipcComp)
if err != nil {
return nil, fmt.Errorf("failed to create module: %w", err)
}
Expand Down
Loading