Skip to content

Commit d2c90eb

Browse files
authored
Merge branch 'main' into feature/cloud-services
Signed-off-by: Amit Schendel <[email protected]>
2 parents a5e2465 + 6259246 commit d2c90eb

22 files changed

+1668
-176
lines changed

go.mod

Lines changed: 92 additions & 9 deletions
Large diffs are not rendered by default.

go.sum

Lines changed: 267 additions & 4 deletions
Large diffs are not rendered by default.

main.go

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,16 @@ import (
1111
"syscall"
1212

1313
apitypes "github.com/armosec/armoapi-go/armotypes"
14+
utilsmetadata "github.com/armosec/utils-k8s-go/armometadata"
15+
mapset "github.com/deckarep/golang-set/v2"
16+
containercollection "github.com/inspektor-gadget/inspektor-gadget/pkg/container-collection"
17+
beUtils "github.com/kubescape/backend/pkg/utils"
18+
"github.com/kubescape/go-logger"
19+
"github.com/kubescape/go-logger/helpers"
20+
"github.com/kubescape/k8s-interface/k8sinterface"
1421
"github.com/kubescape/node-agent/pkg/applicationprofilemanager"
1522
applicationprofilemanagerv1 "github.com/kubescape/node-agent/pkg/applicationprofilemanager/v1"
16-
cloudmetadata "github.com/kubescape/node-agent/pkg/cloudmetadata"
23+
"github.com/kubescape/node-agent/pkg/cloudmetadata"
1724
"github.com/kubescape/node-agent/pkg/config"
1825
"github.com/kubescape/node-agent/pkg/containerwatcher/v1"
1926
"github.com/kubescape/node-agent/pkg/dnsmanager"
@@ -43,21 +50,15 @@ import (
4350
"github.com/kubescape/node-agent/pkg/rulemanager"
4451
rulemanagerv1 "github.com/kubescape/node-agent/pkg/rulemanager/v1"
4552
"github.com/kubescape/node-agent/pkg/sbomhandler/syfthandler"
53+
"github.com/kubescape/node-agent/pkg/sbommanager"
54+
sbommanagerv1 "github.com/kubescape/node-agent/pkg/sbommanager/v1"
4655
"github.com/kubescape/node-agent/pkg/seccompmanager"
4756
seccompmanagerv1 "github.com/kubescape/node-agent/pkg/seccompmanager/v1"
4857
"github.com/kubescape/node-agent/pkg/storage/v1"
4958
"github.com/kubescape/node-agent/pkg/utils"
5059
"github.com/kubescape/node-agent/pkg/validator"
5160
"github.com/kubescape/node-agent/pkg/watcher/dynamicwatcher"
5261
"github.com/kubescape/node-agent/pkg/watcher/seccompprofilewatcher"
53-
54-
utilsmetadata "github.com/armosec/utils-k8s-go/armometadata"
55-
mapset "github.com/deckarep/golang-set/v2"
56-
57-
beUtils "github.com/kubescape/backend/pkg/utils"
58-
"github.com/kubescape/go-logger"
59-
"github.com/kubescape/go-logger/helpers"
60-
"github.com/kubescape/k8s-interface/k8sinterface"
6162
)
6263

6364
func main() {
@@ -130,10 +131,8 @@ func main() {
130131
prometheusExporter = metricsmanager.NewMetricsMock()
131132
}
132133

133-
nodeName := os.Getenv(config.NodeNameEnvVar)
134-
135134
// Detect the container containerRuntime of the node
136-
containerRuntime, err := utils.DetectContainerRuntimeViaK8sAPI(ctx, k8sClient, nodeName)
135+
containerRuntime, err := utils.DetectContainerRuntimeViaK8sAPI(ctx, k8sClient, cfg.NodeName)
137136
if err != nil {
138137
logger.L().Ctx(ctx).Fatal("error detecting the container runtime", helpers.Error(err))
139138
}
@@ -143,7 +142,7 @@ func main() {
143142
// Create watchers
144143
dWatcher := dynamicwatcher.NewWatchHandler(k8sClient, storageClient.StorageClient, cfg.SkipNamespace)
145144
// create k8sObject cache
146-
k8sObjectCache, err := k8scache.NewK8sObjectCache(nodeName, k8sClient)
145+
k8sObjectCache, err := k8scache.NewK8sObjectCache(cfg.NodeName, k8sClient)
147146
if err != nil {
148147
logger.L().Ctx(ctx).Fatal("error creating K8sObjectCache", helpers.Error(err))
149148
}
@@ -216,7 +215,7 @@ func main() {
216215
var cloudMetadata *apitypes.CloudMetadata
217216

218217
if cfg.EnableRuntimeDetection || cfg.EnableMalwareDetection {
219-
cloudMetadata, err = cloudmetadata.GetCloudMetadata(ctx, k8sClient, nodeName)
218+
cloudMetadata, err = cloudmetadata.GetCloudMetadata(ctx, k8sClient, cfg.NodeName)
220219
if err != nil {
221220
logger.L().Ctx(ctx).Error("error getting cloud metadata", helpers.Error(err))
222221
}
@@ -227,16 +226,16 @@ func main() {
227226
processManager = processmanagerv1.CreateProcessManager(ctx)
228227

229228
// create ruleBinding cache
230-
ruleBindingCache := rulebindingcachev1.NewCache(nodeName, k8sClient)
229+
ruleBindingCache := rulebindingcachev1.NewCache(cfg.NodeName, k8sClient)
231230
dWatcher.AddAdaptor(ruleBindingCache)
232231

233232
ruleBindingNotify = make(chan rulebinding.RuleBindingNotify, 100)
234233
ruleBindingCache.AddNotifier(&ruleBindingNotify)
235234

236-
apc := applicationprofilecache.NewApplicationProfileCache(nodeName, storageClient.StorageClient, cfg.MaxDelaySeconds)
235+
apc := applicationprofilecache.NewApplicationProfileCache(cfg.NodeName, storageClient.StorageClient, cfg.MaxDelaySeconds)
237236
dWatcher.AddAdaptor(apc)
238237

239-
nnc := networkneighborhoodcache.NewNetworkNeighborhoodCache(nodeName, storageClient.StorageClient, cfg.MaxDelaySeconds)
238+
nnc := networkneighborhoodcache.NewNetworkNeighborhoodCache(cfg.NodeName, storageClient.StorageClient, cfg.MaxDelaySeconds)
240239
dWatcher.AddAdaptor(nnc)
241240

242241
dc := dnscache.NewDnsCache(dnsResolver)
@@ -245,7 +244,7 @@ func main() {
245244
objCache = objectcachev1.NewObjectCache(k8sObjectCache, apc, nnc, dc)
246245

247246
// create exporter
248-
exporter := exporters.InitExporters(cfg.Exporters, clusterData.ClusterName, nodeName, cloudMetadata)
247+
exporter := exporters.InitExporters(cfg.Exporters, clusterData.ClusterName, cfg.NodeName, cloudMetadata)
249248

250249
// create runtimeDetection managers
251250
ruleManager, err = rulemanagerv1.CreateRuleManager(ctx, cfg, k8sClient, ruleBindingCache, objCache, exporter, prometheusExporter, nodeName, clusterData.ClusterName, processManager, dnsResolver)
@@ -264,7 +263,7 @@ func main() {
264263
var profileManager nodeprofilemanager.NodeProfileManagerClient
265264
if cfg.EnableNodeProfile {
266265
// FIXME validate the HTTPExporterConfig before we use it ?
267-
profileManager = nodeprofilemanagerv1.NewNodeProfileManager(cfg, *clusterData, nodeName, k8sObjectCache, relevancyManager, ruleManager)
266+
profileManager = nodeprofilemanagerv1.NewNodeProfileManager(cfg, *clusterData, cfg.NodeName, k8sObjectCache, relevancyManager, ruleManager)
268267
} else {
269268
profileManager = nodeprofilemanager.NewNodeProfileManagerMock()
270269
}
@@ -273,17 +272,36 @@ func main() {
273272
var malwareManager malwaremanager.MalwareManagerClient
274273
if cfg.EnableMalwareDetection {
275274
// create exporter
276-
exporter := exporters.InitExporters(cfg.Exporters, clusterData.ClusterName, nodeName, cloudMetadata)
277-
malwareManager, err = malwaremanagerv1.CreateMalwareManager(cfg, k8sClient, nodeName, clusterData.ClusterName, exporter, prometheusExporter)
275+
exporter := exporters.InitExporters(cfg.Exporters, clusterData.ClusterName, cfg.NodeName, cloudMetadata)
276+
malwareManager, err = malwaremanagerv1.CreateMalwareManager(cfg, k8sClient, cfg.NodeName, clusterData.ClusterName, exporter, prometheusExporter)
278277
if err != nil {
279278
logger.L().Ctx(ctx).Fatal("error creating MalwareManager", helpers.Error(err))
280279
}
281280
} else {
282281
malwareManager = malwaremanager.CreateMalwareManagerMock()
283282
}
284283

284+
// Create the IG k8sClient
285+
igK8sClient, err := containercollection.NewK8sClient(cfg.NodeName)
286+
if err != nil {
287+
logger.L().Fatal("error creating IG Kubernetes client", helpers.Error(err))
288+
}
289+
defer igK8sClient.Close()
290+
logger.L().Info("IG Kubernetes client created", helpers.Interface("client", igK8sClient))
291+
292+
// Create the SBOM manager
293+
var sbomManager sbommanager.SbomManagerClient
294+
if cfg.EnableSbomGeneration {
295+
sbomManager, err = sbommanagerv1.CreateSbomManager(ctx, cfg, igK8sClient.SocketPath, storageClient)
296+
if err != nil {
297+
logger.L().Ctx(ctx).Fatal("error creating SbomManager", helpers.Error(err))
298+
}
299+
} else {
300+
sbomManager = sbommanager.CreateSbomManagerMock()
301+
}
302+
285303
// Create the container handler
286-
mainHandler, err := containerwatcher.CreateIGContainerWatcher(cfg, applicationProfileManager, k8sClient, relevancyManager, networkManagerClient, dnsManagerClient, prometheusExporter, ruleManager, malwareManager, preRunningContainersIDs, &ruleBindingNotify, containerRuntime, nil, processManager)
304+
mainHandler, err := containerwatcher.CreateIGContainerWatcher(cfg, applicationProfileManager, k8sClient, igK8sClient, relevancyManager, networkManagerClient, dnsManagerClient, prometheusExporter, ruleManager, malwareManager, sbomManager, preRunningContainersIDs, &ruleBindingNotify, containerRuntime, nil, processManager)
287305
if err != nil {
288306
logger.L().Ctx(ctx).Fatal("error creating the container watcher", helpers.Error(err))
289307
}

pkg/config/config.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package config
22

33
import (
4+
"os"
45
"slices"
56
"time"
67

@@ -19,6 +20,8 @@ type Config struct {
1920
UpdateDataPeriod time.Duration `mapstructure:"updateDataPeriod"`
2021
MaxDelaySeconds int `mapstructure:"maxDelaySeconds"`
2122
MaxJitterPercentage int `mapstructure:"maxJitterPercentage"`
23+
MaxImageSize int64 `mapstructure:"maxImageSize"`
24+
MaxSBOMSize int `mapstructure:"maxSBOMSize"`
2225
EnableFullPathTracing bool `mapstructure:"fullPathTracingEnabled"`
2326
EnableApplicationProfile bool `mapstructure:"applicationProfileServiceEnabled"`
2427
EnableMalwareDetection bool `mapstructure:"malwareDetectionEnabled"`
@@ -32,6 +35,10 @@ type Config struct {
3235
EnableSeccomp bool `mapstructure:"seccompServiceEnabled"`
3336
ExcludeNamespaces []string `mapstructure:"excludeNamespaces"`
3437
IncludeNamespaces []string `mapstructure:"includeNamespaces"`
38+
EnableSbomGeneration bool `mapstructure:"sbomGenerationEnabled"`
39+
NamespaceName string `mapstructure:"namespaceName"`
40+
NodeName string `mapstructure:"nodeName"`
41+
PodName string `mapstructure:"podName"`
3542
}
3643

3744
// LoadConfig reads configuration from file or environment variables.
@@ -45,6 +52,11 @@ func LoadConfig(path string) (Config, error) {
4552
viper.SetDefault("nodeProfileInterval", 10*time.Minute)
4653
viper.SetDefault("maxDelaySeconds", 30)
4754
viper.SetDefault("maxJitterPercentage", 5)
55+
viper.SetDefault("maxImageSize", 5*1024*1024*1024)
56+
viper.SetDefault("maxSBOMSize", 20*1024*1024)
57+
viper.SetDefault("namespaceName", os.Getenv(NamespaceEnvVar))
58+
viper.SetDefault("nodeName", os.Getenv(NodeNameEnvVar))
59+
viper.SetDefault("podName", os.Getenv(PodNameEnvVar))
4860

4961
viper.AutomaticEnv()
5062

pkg/config/config_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ func TestLoadConfig(t *testing.T) {
3333
NodeProfileInterval: 1 * time.Minute,
3434
MaxDelaySeconds: 30,
3535
MaxJitterPercentage: 5,
36+
MaxImageSize: 5368709120,
37+
MaxSBOMSize: 20971520,
3638
EnablePrometheusExporter: true,
3739
EnableRuntimeDetection: true,
3840
EnableSeccomp: true,

pkg/containerwatcher/v1/container_watcher.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package containerwatcher
33
import (
44
"context"
55
"fmt"
6-
"os"
76

87
mapset "github.com/deckarep/golang-set/v2"
98
"github.com/goradd/maps"
@@ -50,6 +49,7 @@ import (
5049
"github.com/kubescape/node-agent/pkg/relevancymanager"
5150
rulebinding "github.com/kubescape/node-agent/pkg/rulebindingmanager"
5251
"github.com/kubescape/node-agent/pkg/rulemanager"
52+
"github.com/kubescape/node-agent/pkg/sbommanager"
5353
"github.com/kubescape/node-agent/pkg/utils"
5454
"github.com/panjf2000/ants/v2"
5555
)
@@ -85,18 +85,19 @@ type IGContainerWatcher struct {
8585
cfg config.Config
8686
containerSelector containercollection.ContainerSelector
8787
ctx context.Context
88-
nodeName string
8988
podName string
9089
namespace string
9190

9291
// Clients
9392
applicationProfileManager applicationprofilemanager.ApplicationProfileManagerClient
93+
igK8sClient *containercollection.K8sClient
9494
k8sClient *k8sinterface.KubernetesApi
9595
relevancyManager relevancymanager.RelevancyManagerClient
9696
networkManager networkmanager.NetworkManagerClient
9797
dnsManager dnsmanager.DNSManagerClient
9898
ruleManager rulemanager.RuleManagerClient
9999
malwareManager malwaremanager.MalwareManagerClient
100+
sbomManager sbommanager.SbomManagerClient
100101
// IG Collections
101102
containerCollection *containercollection.ContainerCollection
102103
tracerCollection *tracercollection.TracerCollection
@@ -160,7 +161,7 @@ type IGContainerWatcher struct {
160161

161162
var _ containerwatcher.ContainerWatcher = (*IGContainerWatcher)(nil)
162163

163-
func CreateIGContainerWatcher(cfg config.Config, applicationProfileManager applicationprofilemanager.ApplicationProfileManagerClient, k8sClient *k8sinterface.KubernetesApi, relevancyManager relevancymanager.RelevancyManagerClient, networkManagerClient networkmanager.NetworkManagerClient, dnsManagerClient dnsmanager.DNSManagerClient, metrics metricsmanager.MetricsManager, ruleManager rulemanager.RuleManagerClient, malwareManager malwaremanager.MalwareManagerClient, preRunningContainers mapset.Set[string], ruleBindingPodNotify *chan rulebinding.RuleBindingNotify, runtime *containerutilsTypes.RuntimeConfig, thirdPartyEventReceivers *maps.SafeMap[utils.EventType, mapset.Set[containerwatcher.EventReceiver]], processManager processmanager.ProcessManagerClient) (*IGContainerWatcher, error) {
164+
func CreateIGContainerWatcher(cfg config.Config, applicationProfileManager applicationprofilemanager.ApplicationProfileManagerClient, k8sClient *k8sinterface.KubernetesApi, igK8sClient *containercollection.K8sClient, relevancyManager relevancymanager.RelevancyManagerClient, networkManagerClient networkmanager.NetworkManagerClient, dnsManagerClient dnsmanager.DNSManagerClient, metrics metricsmanager.MetricsManager, ruleManager rulemanager.RuleManagerClient, malwareManager malwaremanager.MalwareManagerClient, sbomManager sbommanager.SbomManagerClient, preRunningContainers mapset.Set[string], ruleBindingPodNotify *chan rulebinding.RuleBindingNotify, runtime *containerutilsTypes.RuntimeConfig, thirdPartyEventReceivers *maps.SafeMap[utils.EventType, mapset.Set[containerwatcher.EventReceiver]], processManager processmanager.ProcessManagerClient) (*IGContainerWatcher, error) {
164165
// Use container collection to get notified for new containers
165166
containerCollection := &containercollection.ContainerCollection{}
166167
// Create a tracer collection instance
@@ -421,18 +422,17 @@ func CreateIGContainerWatcher(cfg config.Config, applicationProfileManager appli
421422
// Configuration
422423
cfg: cfg,
423424
containerSelector: containercollection.ContainerSelector{}, // Empty selector to get all containers
424-
nodeName: os.Getenv(config.NodeNameEnvVar),
425-
podName: os.Getenv(config.PodNameEnvVar),
426-
namespace: os.Getenv(config.NamespaceEnvVar),
427425

428426
// Clients
429427
applicationProfileManager: applicationProfileManager,
428+
igK8sClient: igK8sClient,
430429
k8sClient: k8sClient,
431430
relevancyManager: relevancyManager,
432431
networkManager: networkManagerClient,
433432
dnsManager: dnsManagerClient,
434433
ruleManager: ruleManager,
435434
malwareManager: malwareManager,
435+
sbomManager: sbomManager,
436436
// IG Collections
437437
containerCollection: containerCollection,
438438
tracerCollection: tracerCollection,

pkg/containerwatcher/v1/container_watcher_private.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ func (ch *IGContainerWatcher) startContainerCollection(ctx context.Context) erro
9090
ch.networkManager.ContainerCallback,
9191
ch.malwareManager.ContainerCallback,
9292
ch.ruleManager.ContainerCallback,
93+
ch.sbomManager.ContainerCallback,
9394
ch.processManager.ContainerCallback,
9495
ch.dnsManager.ContainerCallback,
9596
}
@@ -121,7 +122,7 @@ func (ch *IGContainerWatcher) startContainerCollection(ctx context.Context) erro
121122
containercollection.WithTracerCollection(ch.tracerCollection),
122123

123124
// Enrich those containers with data from the Kubernetes API
124-
containercollection.WithKubernetesEnrichment(ch.nodeName, ch.k8sClient.K8SConfig),
125+
containercollection.WithKubernetesEnrichment(ch.cfg.NodeName, ch.k8sClient.K8SConfig),
125126
}
126127

127128
// Initialize the container collection
@@ -136,13 +137,8 @@ func (ch *IGContainerWatcher) startContainerCollection(ctx context.Context) erro
136137
}
137138

138139
func (ch *IGContainerWatcher) startRunningContainers() {
139-
k8sClient, err := containercollection.NewK8sClient(ch.nodeName)
140-
if err != nil {
141-
logger.L().Fatal("creating IG Kubernetes client", helpers.Error(err))
142-
}
143-
defer k8sClient.Close()
144140
for n := range *ch.ruleBindingPodNotify {
145-
ch.addRunningContainers(k8sClient, &n)
141+
ch.addRunningContainers(ch.igK8sClient, &n)
146142
}
147143
}
148144

pkg/containerwatcher/v1/open_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ import (
44
"context"
55
"testing"
66

7+
traceropentype "github.com/inspektor-gadget/inspektor-gadget/pkg/gadgets/trace/open/types"
8+
"github.com/inspektor-gadget/inspektor-gadget/pkg/types"
79
"github.com/kubescape/node-agent/pkg/config"
810
"github.com/kubescape/node-agent/pkg/filehandler/v1"
911
"github.com/kubescape/node-agent/pkg/metricsmanager"
1012
"github.com/kubescape/node-agent/pkg/relevancymanager/v1"
11-
12-
traceropentype "github.com/inspektor-gadget/inspektor-gadget/pkg/gadgets/trace/open/types"
13-
"github.com/inspektor-gadget/inspektor-gadget/pkg/types"
1413
"github.com/stretchr/testify/assert"
1514
)
1615

@@ -23,7 +22,7 @@ func BenchmarkIGContainerWatcher_openEventCallback(b *testing.B) {
2322
assert.NoError(b, err)
2423
mockExporter := metricsmanager.NewMetricsMock()
2524

26-
mainHandler, err := CreateIGContainerWatcher(cfg, nil, nil, relevancyManager, nil, nil, mockExporter, nil, nil, nil, nil, nil, nil, nil)
25+
mainHandler, err := CreateIGContainerWatcher(cfg, nil, nil, nil, relevancyManager, nil, nil, mockExporter, nil, nil, nil, nil, nil, nil, nil, nil)
2726
assert.NoError(b, err)
2827
event := &traceropentype.Event{
2928
Event: types.Event{

pkg/filehandler/v1/inmemory.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"fmt"
55
"sync"
66

7+
"github.com/kubescape/go-logger"
8+
"github.com/kubescape/go-logger/helpers"
79
"github.com/kubescape/node-agent/pkg/filehandler"
810
)
911

@@ -45,6 +47,7 @@ func (s *InMemoryFileHandler) AddFile(bucket, file string) {
4547
files: make(map[string]bool, initFileListLength),
4648
}
4749
s.buckets[bucket] = bucketFiles
50+
logger.L().Debug("Created new bucket", helpers.String("bucket", bucket))
4851
}
4952
s.mutex.Unlock()
5053
}
@@ -109,6 +112,7 @@ func (s *InMemoryFileHandler) AddFiles(bucket string, files map[string]bool) err
109112
files: make(map[string]bool, initFileListLength),
110113
}
111114
s.buckets[bucket] = bucketFiles
115+
logger.L().Debug("Created new bucket", helpers.String("bucket", bucket))
112116
}
113117
s.mutex.Unlock()
114118
}

0 commit comments

Comments
 (0)