Skip to content

Commit 0de3361

Browse files
committed
Make reverse policy filter mapping optional
By adding a command line argument (and the appropriate configmap option). Signed-off-by: Anastasios Papagiannis <[email protected]>
1 parent cb0c618 commit 0de3361

File tree

14 files changed

+86
-33
lines changed

14 files changed

+86
-33
lines changed

cmd/tetra/debug/dump.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -200,18 +200,20 @@ func PolicyfilterState(fname string) {
200200
fmt.Printf("%d: %s\n", polId, strings.Join(ids, ","))
201201
}
202202

203-
fmt.Println("--- Reverse Map ---")
203+
if data.Reverse != nil {
204+
fmt.Println("--- Reverse Map ---")
204205

205-
if len(data.Reverse) == 0 {
206-
fmt.Printf("(empty)\n")
207-
}
206+
if len(data.Reverse) == 0 {
207+
fmt.Printf("(empty)\n")
208+
}
208209

209-
for cgIDs, polIds := range data.Reverse {
210-
ids := make([]string, 0, len(polIds))
211-
for id := range polIds {
212-
ids = append(ids, strconv.FormatUint(uint64(id), 10))
210+
for cgIDs, polIds := range data.Reverse {
211+
ids := make([]string, 0, len(polIds))
212+
for id := range polIds {
213+
ids = append(ids, strconv.FormatUint(uint64(id), 10))
214+
}
215+
fmt.Printf("%d: %s\n", cgIDs, strings.Join(ids, ","))
213216
}
214-
fmt.Printf("%d: %s\n", cgIDs, strings.Join(ids, ","))
215217
}
216218
}
217219

docs/content/en/docs/reference/helm-chart.md

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/data/tetragon_flags.yaml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

install/kubernetes/tetragon/README.md

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

install/kubernetes/tetragon/templates/tetragon_configmap.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ data:
5959
{{- if .Values.tetragon.enablePolicyFilter }}
6060
enable-policy-filter: "true"
6161
{{- end }}
62+
{{- if .Values.tetragon.enablePolicyFilterReverseMap }}
63+
enable-policy-filter-reverse-map: "true"
64+
{{- end }}
6265
{{- if .Values.tetragon.enablePolicyFilterDebug }}
6366
enable-policy-filter-debug: "true"
6467
{{- end }}

install/kubernetes/tetragon/values.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ tetragon:
193193
port: 6060
194194
# -- Enable policy filter. This is required for K8s namespace and pod-label filtering.
195195
enablePolicyFilter: True
196+
# -- Enable policy filter reverse map.
197+
enablePolicyFilterReverseMap: false
196198
# -- Enable policy filter debug messages.
197199
enablePolicyFilterDebug: false
198200
# -- Enable latency monitoring in message handling

pkg/option/config.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,9 @@ type config struct {
7777

7878
ReleasePinned bool
7979

80-
EnablePolicyFilter bool
81-
EnablePolicyFilterDebug bool
80+
EnablePolicyFilter bool
81+
EnablePolicyFilterReverseMap bool
82+
EnablePolicyFilterDebug bool
8283

8384
EnablePidSetFilter bool
8485

pkg/option/flags.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,9 @@ const (
8181

8282
KeyReleasePinnedBPF = "release-pinned-bpf"
8383

84-
KeyEnablePolicyFilter = "enable-policy-filter"
85-
KeyEnablePolicyFilterDebug = "enable-policy-filter-debug"
84+
KeyEnablePolicyFilter = "enable-policy-filter"
85+
KeyEnablePolicyFilterReverseMap = "enable-policy-filter-reverse-map"
86+
KeyEnablePolicyFilterDebug = "enable-policy-filter-debug"
8687

8788
KeyEnablePidSetFilter = "enable-pid-set-filter"
8889

@@ -202,6 +203,7 @@ func ReadAndSetFlags() error {
202203

203204
Config.ReleasePinned = viper.GetBool(KeyReleasePinnedBPF)
204205
Config.EnablePolicyFilter = viper.GetBool(KeyEnablePolicyFilter)
206+
Config.EnablePolicyFilterReverseMap = viper.GetBool(KeyEnablePolicyFilterReverseMap)
205207
Config.EnablePolicyFilterDebug = viper.GetBool(KeyEnablePolicyFilterDebug)
206208
Config.EnableMsgHandlingLatency = viper.GetBool(KeyEnableMsgHandlingLatency)
207209

@@ -378,6 +380,7 @@ func AddFlags(flags *pflag.FlagSet) {
378380
// Provide option to enable policy filtering. Because the code is new,
379381
// this is set to false by default.
380382
flags.Bool(KeyEnablePolicyFilter, false, "Enable policy filter code")
383+
flags.Bool(KeyEnablePolicyFilterReverseMap, false, "Enable reverse mappings for policy filter maps")
381384
flags.Bool(KeyEnablePolicyFilterDebug, false, "Enable policy filter debug messages")
382385

383386
// Provide option to enable the pidSet export filters.

pkg/policyfilter/k8s_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ func TestK8s(t *testing.T) {
739739

740740
// testState implements cgFinder
741741
ts := newTestState(client)
742-
st, err := newState(log, ts)
742+
st, err := newState(log, ts, true)
743743
if err != nil {
744744
t.Skipf("failed to initialize policy filter state: %s", err)
745745
}

pkg/policyfilter/map.go

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func openMap(spec *ebpf.CollectionSpec, mapName string, innerMaxEntries uint32)
5959
}
6060

6161
// newMap returns a new policy filter map.
62-
func newPfMap() (PfMap, error) {
62+
func newPfMap(enableReverseMap bool) (PfMap, error) {
6363
// use the generic kprobe program, to find the policy filter map spec
6464
objName, _ := kernels.GenericKprobeObjs()
6565
objPath := path.Join(option.Config.HubbleLib, objName)
@@ -72,13 +72,22 @@ func newPfMap() (PfMap, error) {
7272
if ret.dir, err = openMap(spec, MapName, polMapSize); err != nil {
7373
return PfMap{}, fmt.Errorf("opening map %s failed: %w", MapName, err)
7474
}
75-
if ret.rev, err = openMap(spec, RevMapName, polMaxPolicies); err != nil {
76-
return PfMap{}, fmt.Errorf("opening reverse map %s failed: %w", MapName, err)
75+
76+
if enableReverseMap {
77+
if ret.rev, err = openMap(spec, RevMapName, polMaxPolicies); err != nil {
78+
return PfMap{}, fmt.Errorf("opening reverse map %s failed: %w", MapName, err)
79+
}
7780
}
81+
7882
return ret, nil
7983
}
8084

8185
func releaseMap(m *ebpf.Map) error {
86+
// this may happen in the case where the reverse map is not enabled
87+
if m == nil {
88+
return nil
89+
}
90+
8291
if err := m.Close(); err != nil {
8392
return err
8493
}
@@ -114,6 +123,11 @@ func (m polMap) addCgroupIDsReverse(polID PolicyID, cgIDs []CgroupID) error {
114123
}
115124

116125
func addReverseMapping(m *ebpf.Map, polID PolicyID, cgID CgroupID) error {
126+
// reverse map does not exist, so nothing to do here
127+
if m == nil {
128+
return nil
129+
}
130+
117131
var id uint32
118132
err := m.Lookup(cgID, &id)
119133
if err == nil { // inner map exists
@@ -221,6 +235,11 @@ func getMapSize(m *ebpf.Map) (uint32, error) {
221235
}
222236

223237
func (m PfMap) deletePolicyIdInReverse(polID PolicyID) error {
238+
// reverse map does not exist, so nothing to do here
239+
if m.rev == nil {
240+
return nil
241+
}
242+
224243
var key CgroupID
225244
var id uint32
226245

@@ -318,9 +337,12 @@ func (m PfMap) readAll() (PfMapDump, error) {
318337
return PfMapDump{}, fmt.Errorf("error reading direct map: %w", err)
319338
}
320339

321-
r, err := readAll[CgroupID, PolicyID](m.rev)
322-
if err != nil {
323-
return PfMapDump{}, fmt.Errorf("error reading reverse map: %w", err)
340+
var r map[CgroupID]map[PolicyID]struct{}
341+
if m.rev != nil {
342+
r, err = readAll[CgroupID, PolicyID](m.rev)
343+
if err != nil {
344+
return PfMapDump{}, fmt.Errorf("error reading reverse map: %w", err)
345+
}
324346
}
325347

326348
return PfMapDump{Direct: d, Reverse: r}, nil
@@ -365,6 +387,11 @@ func (m polMap) addCgroupIDs(cgIDs []CgroupID) error {
365387
// delCgroupIDs delete cgroups ids from the policy map
366388
// todo: use batch operations when supported
367389
func (m polMap) delCgroupIDs(polID PolicyID, cgIDs []CgroupID) error {
390+
// reverse map does not exist, so nothing to do here
391+
if m.Reverse == nil {
392+
return nil
393+
}
394+
368395
rmRevCgIDs := []CgroupID{}
369396
for i, cgID := range cgIDs {
370397
if err := m.Inner.Delete(&cgID); err != nil {
@@ -428,21 +455,29 @@ func OpenMap(fname string) (PfMap, error) {
428455

429456
dir := filepath.Dir(fname)
430457
reverseMapPath := filepath.Join(dir, RevMapName)
431-
r, err := ebpf.LoadPinnedMap(reverseMapPath, &ebpf.LoadPinOptions{
432-
ReadOnly: true,
433-
})
434458

435-
if err != nil {
436-
d.Close()
437-
return PfMap{}, err
459+
// check if the reverse map exists
460+
// the reverse map may not exist in the case where
461+
// enable-policy-filter-reverse-map is false
462+
var r *ebpf.Map
463+
if _, err := os.Stat(reverseMapPath); err == nil {
464+
r, err = ebpf.LoadPinnedMap(reverseMapPath, &ebpf.LoadPinOptions{
465+
ReadOnly: true,
466+
})
467+
if err != nil {
468+
d.Close()
469+
return PfMap{}, err
470+
}
438471
}
439472

440473
return PfMap{dir: d, rev: r}, err
441474
}
442475

443476
func (m PfMap) Close() {
444477
m.dir.Close()
445-
m.rev.Close()
478+
if m.rev != nil {
479+
m.rev.Close()
480+
}
446481
}
447482

448483
func (m PfMap) Dump() (PfMapDump, error) {

0 commit comments

Comments
 (0)