Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
78d658f
started process tree refactor process
afek854 Jun 24, 2025
e91c6e5
completed process tree creator
afek854 Jun 24, 2025
bde54eb
added tests
afek854 Jun 24, 2025
466d609
added proc fs feeder
afek854 Jun 25, 2025
8651d54
added exit process track
afek854 Jun 25, 2025
e51af88
fixed tests
afek854 Jun 25, 2025
7924e40
added process tree manager and container to main
afek854 Jun 25, 2025
b9668cb
added ebpf event feeder
afek854 Jun 25, 2025
2497c5f
added initial process manager to main
afek854 Jun 25, 2025
e5d807e
added logs and exec to report to feeder
afek854 Jun 25, 2025
facbe0d
replace old process tree
afek854 Jun 26, 2025
7d8778d
WIP: fixed lock
afek854 Jun 26, 2025
affb441
fixed tests
afek854 Jun 26, 2025
2625ef2
fixed container tree find
afek854 Jun 29, 2025
a53b6ed
handle parent bug
afek854 Jun 29, 2025
f5550b4
ensure efficiency and more test cases
afek854 Jun 30, 2025
5794655
return the correct node, use the correct shim pid
afek854 Jun 30, 2025
d0b7108
WIP: fork tracer
afek854 Jun 30, 2025
5a98196
WIP: fork tracer new hook
afek854 Jun 30, 2025
88f5653
WIP: dedup fork & exec
afek854 Jun 30, 2025
159630f
WIP: Handle runc ppid changes
afek854 Jul 1, 2025
a90054b
do retry until tree ready
afek854 Jul 1, 2025
0cd6c4b
added reparenting logic
afek854 Jul 2, 2025
9e1bf7f
WIP: Added exit strategy and tracer
afek854 Jul 2, 2025
4aef8e3
WIP: remove set creator
afek854 Jul 6, 2025
f6934be
WIP: added logs
afek854 Jul 7, 2025
c12f495
WIP: added strategies
afek854 Jul 7, 2025
872faaa
WIP: optimize parenting and inserting
afek854 Jul 7, 2025
ca38ec3
WIP: optimize walking and updating ppid
afek854 Jul 8, 2025
2c5e8b9
WIP: Optimize trees
afek854 Jul 8, 2025
e9fffe8
WIP: Added mutexes
afek854 Jul 8, 2025
120a2ab
WIP: tree process before rule manager
afek854 Jul 8, 2025
ecffc36
WIP: tree process before rule manager
afek854 Jul 8, 2025
cfed2df
WIP: added exit cleanup
afek854 Jul 8, 2025
af4d17b
WIP: fixed race conditions
afek854 Jul 8, 2025
05c75bc
WIP: fixed race conditions in exit, docker
afek854 Jul 8, 2025
72a8962
refactor container watcher
afek854 Jul 10, 2025
5ec2855
finished infrastructure
afek854 Jul 10, 2025
86a0f8b
added tests and tree enrichment
afek854 Jul 10, 2025
e8b8bcb
WIP: Process tree as a single thread
afek854 Jul 10, 2025
b485978
WIP: Use new container watcher
afek854 Jul 13, 2025
085ab17
WIP: fixed container watcher
afek854 Jul 13, 2025
3fa08f8
WIP: added procfs events
afek854 Jul 13, 2025
eb7f7e7
WIP: fixed feeders issues
afek854 Jul 13, 2025
3231066
WIP: enriched events
afek854 Jul 13, 2025
a88074d
WIP: enriched events
afek854 Jul 13, 2025
66ede31
WIP: simple reparenting
afek854 Jul 13, 2025
2fc0612
WIP: added event enricher
afek854 Jul 14, 2025
3fc5332
WIP: improved process tree
afek854 Jul 14, 2025
1d5f1b2
WIP: Simplified process tree
afek854 Jul 14, 2025
87a6e15
WIP: fixed sync issues
afek854 Jul 14, 2025
c1bd2ee
WIP: added exit delayed cleanup
afek854 Jul 15, 2025
b6076cb
WIP: extract tree branch
afek854 Jul 15, 2025
acefe6a
Merge branch 'main' of github.com:kubescape/node-agent into feature/r…
afek854 Jul 15, 2025
603d09d
WIP: remove v1 and fix v2 to new version
afek854 Jul 15, 2025
d312187
WIP: addd syscall numbers
afek854 Jul 15, 2025
ece2da8
WIP: report ap
afek854 Jul 15, 2025
0d371e8
WIP: fixed dns & rule policy
afek854 Jul 16, 2025
657b878
WIP: added ignore container
afek854 Jul 16, 2025
f835e13
fixed r0001
afek854 Jul 16, 2025
fb5985e
fallback process tree
afek854 Jul 16, 2025
6322cbe
fixed handler
afek854 Jul 16, 2025
81b2880
skip empty container name
afek854 Jul 16, 2025
ecbf6ee
added debug logs
afek854 Jul 17, 2025
6159fe7
added fallback to exec not under containerd-shim
afek854 Jul 17, 2025
3c35808
added syscall to rule_manager
afek854 Jul 17, 2025
3561b5a
added logs
afek854 Jul 17, 2025
81d5e57
fixed rule failure
afek854 Jul 17, 2025
e7e6d5f
fixed syscall
afek854 Jul 17, 2025
9978a94
fixed traces filters
afek854 Jul 20, 2025
2f0c0f3
added enrichment for events
afek854 Jul 20, 2025
4284de6
added get host pid
afek854 Jul 20, 2025
4e52156
handle kubernetes mode
afek854 Jul 20, 2025
0a9d333
modify enrichment interface
afek854 Jul 20, 2025
b795741
updated test image
afek854 Jul 21, 2025
815c30e
added component test
afek854 Jul 21, 2025
0b3c5b7
fixed naming
afek854 Jul 21, 2025
e7b3932
fixed naming and logs
afek854 Jul 21, 2025
5e4c2e4
added more workers and channels
afek854 Jul 21, 2025
70dd2ce
fixed test
afek854 Jul 21, 2025
f21e0ce
added logs
afek854 Jul 21, 2025
9ae1901
improved mutex and usage of process tree
afek854 Jul 22, 2025
f64c653
orgenized container watcher
afek854 Jul 22, 2025
2566c31
orgenized processtree
afek854 Jul 22, 2025
b00f372
added tests
afek854 Jul 22, 2025
6b27779
fixed ordered event queue
afek854 Jul 22, 2025
297e339
fixed timestamp
afek854 Jul 22, 2025
69547d2
fixed worker pool
afek854 Jul 22, 2025
3e7dc77
removed debug logs
afek854 Jul 22, 2025
0a4f1b3
added tree depth
afek854 Jul 22, 2025
42f1d16
fix test
afek854 Jul 22, 2025
8c7e923
use cache only for not update events
afek854 Jul 22, 2025
9b09400
removed types without manager
afek854 Jul 22, 2025
f7a6f7b
renaming due to cr
afek854 Jul 22, 2025
d08cbf6
fixed traces factory and naming
afek854 Jul 23, 2025
b45333a
fixed fork & exit tracers
afek854 Jul 23, 2025
74b9e97
removed event feeder
afek854 Jul 24, 2025
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
3 changes: 2 additions & 1 deletion .github/workflows/component-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ jobs:
Test_20_AlertOnPartialThenLearnProcessTest,
Test_21_AlertOnPartialThenLearnNetworkTest,
Test_22_AlertOnPartialNetworkProfileTest,
Test_23_RuleCooldownTest
Test_23_RuleCooldownTest,
Test_24_ProcessTreeDepthTest
]
steps:
- name: Checkout code
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ docker-build:
docker buildx build --platform linux/amd64 -t $(IMAGE):$(TAG) -f $(DOCKERFILE_PATH) --load .

docker-push:
docker push $(IMAGE):$(TAG)
docker push $(IMAGE):$(TAG)
37 changes: 25 additions & 12 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import (
"github.com/kubescape/node-agent/pkg/config"
"github.com/kubescape/node-agent/pkg/containerprofilemanager"
containerprofilemanagerv1 "github.com/kubescape/node-agent/pkg/containerprofilemanager/v1"
"github.com/kubescape/node-agent/pkg/containerwatcher/v1"
containerwatcherv2 "github.com/kubescape/node-agent/pkg/containerwatcher/v2"
"github.com/kubescape/node-agent/pkg/dnsmanager"
"github.com/kubescape/node-agent/pkg/exporters"
"github.com/kubescape/node-agent/pkg/healthmanager"
Expand All @@ -42,8 +42,9 @@ import (
"github.com/kubescape/node-agent/pkg/objectcache/k8scache"
"github.com/kubescape/node-agent/pkg/objectcache/networkneighborhoodcache"
objectcachev1 "github.com/kubescape/node-agent/pkg/objectcache/v1"
"github.com/kubescape/node-agent/pkg/processmanager"
processmanagerv1 "github.com/kubescape/node-agent/pkg/processmanager/v1"
processtree "github.com/kubescape/node-agent/pkg/processtree"
containerprocesstree "github.com/kubescape/node-agent/pkg/processtree/container"
processtreecreator "github.com/kubescape/node-agent/pkg/processtree/creator"
rulebinding "github.com/kubescape/node-agent/pkg/rulebindingmanager"
rulebindingcachev1 "github.com/kubescape/node-agent/pkg/rulebindingmanager/cache"
"github.com/kubescape/node-agent/pkg/rulemanager"
Expand Down Expand Up @@ -218,11 +219,27 @@ func main() {
}

var ruleManager rulemanager.RuleManagerClient
var processManager processmanager.ProcessManagerClient
var processTreeManager processtree.ProcessTreeManager
var objCache objectcache.ObjectCache
var ruleBindingNotify chan rulebinding.RuleBindingNotify
var cloudMetadata *apitypes.CloudMetadata

// Create the container process tree
containerProcessTree := containerprocesstree.NewContainerProcessTree()

// Create the process tree creator
processTreeCreator := processtreecreator.NewProcessTreeCreator(containerProcessTree, cfg)

// Create the process tree manager
processTreeManager = processtree.NewProcessTreeManager(
processTreeCreator,
containerProcessTree,
cfg,
)

// Start the process tree manager to activate the exit cleanup manager
processTreeManager.Start()

if cfg.EnableRuntimeDetection || cfg.EnableMalwareDetection {
cloudMetadata, err = cloudmetadata.GetCloudMetadata(ctx, k8sClient, cfg.NodeName)
if err != nil {
Expand All @@ -231,9 +248,6 @@ func main() {
}

if cfg.EnableRuntimeDetection {
// create the process manager
processManager = processmanagerv1.CreateProcessManager(ctx)

// create exporter
exporter := exporters.InitExporters(cfg.Exporters, clusterData.ClusterName, cfg.NodeName, cloudMetadata)
dWatcher.AddAdaptor(ruleBindingCache)
Expand All @@ -255,7 +269,7 @@ func main() {
ruleCooldown := rulecooldown.NewRuleCooldown(cfg.RuleCoolDown)

// create runtimeDetection managers
ruleManager, err = rulemanagerv1.CreateRuleManager(ctx, cfg, k8sClient, ruleBindingCache, objCache, exporter, prometheusExporter, cfg.NodeName, clusterData.ClusterName, processManager, dnsResolver, nil, ruleCooldown)
ruleManager, err = rulemanagerv1.CreateRuleManager(ctx, cfg, k8sClient, ruleBindingCache, objCache, exporter, prometheusExporter, cfg.NodeName, clusterData.ClusterName, processTreeManager, dnsResolver, nil, ruleCooldown)
if err != nil {
logger.L().Ctx(ctx).Fatal("error creating RuleManager", helpers.Error(err))
}
Expand All @@ -267,7 +281,6 @@ func main() {
dc := &objectcache.DnsCacheMock{}
objCache = objectcachev1.NewObjectCache(k8sObjectCache, apc, nnc, dc)
ruleBindingNotify = make(chan rulebinding.RuleBindingNotify, 1)
processManager = processmanager.CreateProcessManagerMock()
}

// Create the node profile manager
Expand All @@ -282,7 +295,7 @@ func main() {
// Create the network streaming manager
var networkStreamClient networkstream.NetworkStreamClient
if cfg.EnableNetworkStreaming {
networkStreamClient, err = networkstreamv1.NewNetworkStream(ctx, cfg, k8sObjectCache, dnsResolver, cfg.NodeName, nil, false, processManager)
networkStreamClient, err = networkstreamv1.NewNetworkStream(ctx, cfg, k8sObjectCache, dnsResolver, cfg.NodeName, nil, false, processTreeManager)
if err != nil {
logger.L().Ctx(ctx).Fatal("error creating NetworkManager", helpers.Error(err))
}
Expand Down Expand Up @@ -327,10 +340,10 @@ func main() {
}

// Create the container handler
mainHandler, err := containerwatcher.CreateIGContainerWatcher(cfg, containerProfileManager, k8sClient,
mainHandler, err := containerwatcherv2.CreateIGContainerWatcher(cfg, containerProfileManager, k8sClient,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why v2?

igK8sClient, dnsManagerClient, prometheusExporter, ruleManager,
malwareManager, sbomManager, &ruleBindingNotify, igK8sClient.RuntimeConfig, nil, nil,
processManager, clusterData.ClusterName, objCache, networkStreamClient)
processTreeManager, clusterData.ClusterName, objCache, networkStreamClient, containerProcessTree)
if err != nil {
logger.L().Ctx(ctx).Fatal("error creating the container watcher", helpers.Error(err))
}
Expand Down
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,7 @@ require (
github.com/ncw/directio v1.0.5 // indirect
github.com/nwaples/rardecode v1.1.3 // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/oleiade/lane/v2 v2.0.0 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/olvrng/ujson v1.1.0 // indirect
github.com/opencontainers/runtime-spec v1.2.1 // indirect
Expand Down Expand Up @@ -283,6 +284,7 @@ require (
github.com/spf13/cast v1.7.1 // indirect
github.com/spf13/cobra v1.9.1 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/stripe/stripe-go/v74 v74.30.0 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/sylabs/sif/v2 v2.21.1 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -835,6 +835,8 @@ github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9l
github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/oleiade/lane/v2 v2.0.0 h1:XW/ex/Inr+bPkLd3O240xrFOhUkTd4Wy176+Gv0E3Qw=
github.com/oleiade/lane/v2 v2.0.0/go.mod h1:i5FBPFAYSWCgLh58UkUGCChjcCzef/MI7PlQm2TKCeg=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/olvrng/ujson v1.1.0 h1:8xVUzVlqwdMVWh5d1UHBtLQ1D50nxoPuPEq9Wozs8oA=
Expand Down
6 changes: 5 additions & 1 deletion pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,13 @@ type Config struct {
KubernetesMode bool `mapstructure:"kubernetesMode"`
NetworkStreamingInterval time.Duration `mapstructure:"networkStreamingInterval"`
WorkerPoolSize int `mapstructure:"workerPoolSize"`
EventBatchSize int `mapstructure:"eventBatchSize"`
TestMode bool `mapstructure:"testMode"`
ExcludeJsonPaths []string `mapstructure:"excludeJsonPaths"`
ProfilesCacheRefreshRate time.Duration `mapstructure:"profilesCacheRefreshRate"`
RuleCoolDown rulecooldown.RuleCooldownConfig `mapstructure:"ruleCooldown"`
EnablePartialProfileGeneration bool `mapstructure:"partialProfileGenerationEnabled"`
ProcfsScanInterval time.Duration `mapstructure:"procfsScanInterval"`
}

// LoadConfig reads configuration from file or environment variables.
Expand All @@ -78,7 +80,8 @@ func LoadConfig(path string) (Config, error) {
viper.SetDefault("networkStreamingEnabled", false)
viper.SetDefault("kubernetesMode", true)
viper.SetDefault("networkStreamingInterval", 2*time.Minute)
viper.SetDefault("workerPoolSize", 10)
viper.SetDefault("workerPoolSize", 2000) // Increased from 50 to handle higher event volumes
viper.SetDefault("eventBatchSize", 1000)
viper.SetDefault("testMode", false)
viper.SetDefault("enableEmbeddedSBOMs", false)
viper.SetDefault("profilesCacheRefreshRate", 1*time.Minute)
Expand All @@ -87,6 +90,7 @@ func LoadConfig(path string) (Config, error) {
viper.SetDefault("ruleCooldown.ruleCooldownOnProfileFailure", true)
viper.SetDefault("ruleCooldown.ruleCooldownMaxSize", 10000)
viper.SetDefault("partialProfileGenerationEnabled", true)
viper.SetDefault("procfsScanInterval", 5*time.Second)
viper.AutomaticEnv()

err := viper.ReadInConfig()
Expand Down
1 change: 0 additions & 1 deletion pkg/containerprofilemanager/v1/event_reporting.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ func (cpm *ContainerProfileManager) ReportFileExec(containerID string, event eve
if data.execs == nil {
data.execs = &maps.SafeMap[string, []string]{}
}

path := event.Comm
if len(event.Args) > 0 {
path = event.Args[0]
Expand Down
9 changes: 7 additions & 2 deletions pkg/containerwatcher/container_watcher_interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@ import (
containercollection "github.com/inspektor-gadget/inspektor-gadget/pkg/container-collection"
"github.com/inspektor-gadget/inspektor-gadget/pkg/socketenricher"
tracercollection "github.com/inspektor-gadget/inspektor-gadget/pkg/tracer-collection"
"github.com/kubescape/node-agent/pkg/ebpf/events"
"github.com/kubescape/node-agent/pkg/utils"
)

type ResultCallback func(utils.EnrichEvent)
type ResultCallback func(utils.K8sEvent, string, uint32)

type ContainerWatcher interface {
Ready() bool
Expand All @@ -35,10 +36,14 @@ type EventReceiver interface {
ReportEvent(eventType utils.EventType, event utils.K8sEvent)
}

type EnrichedEventReceiver interface {
ReportEnrichedEvent(enrichedEvent *events.EnrichedEvent)
}

type ContainerReceiver interface {
ContainerCallback(notif containercollection.PubSubEvent)
}

type TaskBasedEnricher interface {
SubmitEnrichmentTask(event utils.EnrichEvent, syscalls []uint64, callback ResultCallback)
SubmitEnrichmentTask(event utils.EnrichEvent, syscalls []uint64, callback ResultCallback, containerID string, processID uint32)
}
12 changes: 12 additions & 0 deletions pkg/containerwatcher/tracer_factory_interface.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package containerwatcher

// TracerRegistrer defines the interface for registering tracers
type TracerRegistrer interface {
RegisterTracer(tracer TracerInterface)
}

// TracerFactoryInterface defines the interface for creating tracers
type TracerFactoryInterface interface {
CreateAllTracers(manager TracerRegistrer)
GetThirdPartyTracers() []CustomTracer
}
25 changes: 25 additions & 0 deletions pkg/containerwatcher/tracer_interface.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package containerwatcher

import (
"context"

"github.com/kubescape/node-agent/pkg/utils"
)

// TracerInterface defines the common interface for all eBPF tracers
type TracerInterface interface {
// Start initializes and starts the tracer
Start(ctx context.Context) error

// Stop gracefully stops the tracer
Stop() error

// GetName returns the unique name of the tracer
GetName() string

// GetEventType returns the event type this tracer produces
GetEventType() utils.EventType

// IsEnabled checks if this tracer should be enabled based on configuration
IsEnabled(cfg interface{}) bool
}
59 changes: 0 additions & 59 deletions pkg/containerwatcher/v1/capabilities.go

This file was deleted.

13 changes: 0 additions & 13 deletions pkg/containerwatcher/v1/common.go

This file was deleted.

Loading