Skip to content

Commit 3ede569

Browse files
will-isovalentmichi-covalent
authored andcommitted
filters: implement in_init_tree filter
Implement a new export filter for the process.in_init_tree field. Signed-off-by: William Findlay <[email protected]>
1 parent ab1990b commit 3ede569

File tree

11 files changed

+741
-582
lines changed

11 files changed

+741
-582
lines changed

api/v1/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.

api/v1/tetragon/events.pb.go

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

api/v1/tetragon/events.proto

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ message Filter {
6969
// Filter by the container ID in the process.docker field using RE2 regular expression syntax:
7070
// https://github.com/google/re2/wiki/Syntax
7171
repeated string container_id = 15;
72+
// Filter containerized processes based on whether they are descendants of
73+
// the container's init process. This can be used, for example, to watch
74+
// for processes injected into a container via docker exec, kubectl exec, or
75+
// similar mechanisms.
76+
google.protobuf.BoolValue in_init_tree = 16;
7277
}
7378

7479
// Filter over a set of Linux process capabilities. See `message Capabilities`

contrib/tetragon-rthooks/vendor/github.com/cilium/tetragon/api/v1/tetragon/events.pb.go

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

contrib/tetragon-rthooks/vendor/github.com/cilium/tetragon/api/v1/tetragon/events.proto

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

docs/content/en/docs/reference/grpc-api.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.

pkg/filters/container.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,25 @@ func (f *ContainerIDFilter) OnBuildFilter(_ context.Context, ff *tetragon.Filter
5050
}
5151
return fs, nil
5252
}
53+
54+
func filterByInInitTree(inInitTree bool) hubbleFilters.FilterFunc {
55+
return func(ev *v1.Event) bool {
56+
process := GetProcess(ev)
57+
// We want to be safe and assume false if process.InInitTree is missing somehow
58+
inInitTreeVal := false
59+
if process.InInitTree != nil {
60+
inInitTreeVal = process.InInitTree.Value
61+
}
62+
return inInitTreeVal == inInitTree
63+
}
64+
}
65+
66+
type InInitTreeFilter struct{}
67+
68+
func (f *InInitTreeFilter) OnBuildFilter(_ context.Context, ff *tetragon.Filter) ([]hubbleFilters.FilterFunc, error) {
69+
var fs []hubbleFilters.FilterFunc
70+
if ff.InInitTree != nil {
71+
fs = append(fs, filterByInInitTree(ff.InInitTree.Value))
72+
}
73+
return fs, nil
74+
}

pkg/filters/container_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// Copyright Authors of Tetragon
3+
4+
package filters
5+
6+
import (
7+
"context"
8+
"testing"
9+
10+
v1 "github.com/cilium/cilium/pkg/hubble/api/v1"
11+
"github.com/cilium/tetragon/api/v1/tetragon"
12+
"github.com/stretchr/testify/assert"
13+
"google.golang.org/protobuf/types/known/wrapperspb"
14+
)
15+
16+
func TestContainerID(t *testing.T) {
17+
f := []*tetragon.Filter{{ContainerId: []string{
18+
"^2f00a73446e0",
19+
}}}
20+
fl, err := BuildFilterList(context.Background(), f, []OnBuildFilter{&ContainerIDFilter{}})
21+
assert.NoError(t, err)
22+
process := tetragon.Process{Docker: "2f00a73446e0"}
23+
ev := v1.Event{
24+
Event: &tetragon.GetEventsResponse{
25+
Event: &tetragon.GetEventsResponse_ProcessExec{
26+
ProcessExec: &tetragon.ProcessExec{
27+
Process: &process,
28+
},
29+
},
30+
},
31+
}
32+
assert.True(t, fl.MatchOne(&ev))
33+
process.Docker = "foo"
34+
assert.False(t, fl.MatchOne(&ev))
35+
}
36+
37+
func TestInInitTree(t *testing.T) {
38+
f := []*tetragon.Filter{{InInitTree: &wrapperspb.BoolValue{Value: true}}}
39+
fl, err := BuildFilterList(context.Background(), f, []OnBuildFilter{&InInitTreeFilter{}})
40+
assert.NoError(t, err)
41+
process := tetragon.Process{}
42+
ev := v1.Event{
43+
Event: &tetragon.GetEventsResponse{
44+
Event: &tetragon.GetEventsResponse_ProcessExec{
45+
ProcessExec: &tetragon.ProcessExec{
46+
Process: &process,
47+
},
48+
},
49+
},
50+
}
51+
process.InInitTree = &wrapperspb.BoolValue{Value: true}
52+
assert.True(t, fl.MatchOne(&ev))
53+
process.InInitTree = &wrapperspb.BoolValue{Value: false}
54+
assert.False(t, fl.MatchOne(&ev))
55+
process.InInitTree = nil
56+
assert.False(t, fl.MatchOne(&ev))
57+
58+
f = []*tetragon.Filter{{InInitTree: &wrapperspb.BoolValue{Value: false}}}
59+
fl, err = BuildFilterList(context.Background(), f, []OnBuildFilter{&InInitTreeFilter{}})
60+
assert.NoError(t, err)
61+
62+
process.InInitTree = &wrapperspb.BoolValue{Value: true}
63+
assert.False(t, fl.MatchOne(&ev))
64+
process.InInitTree = &wrapperspb.BoolValue{Value: false}
65+
assert.True(t, fl.MatchOne(&ev))
66+
process.InInitTree = nil
67+
assert.True(t, fl.MatchOne(&ev))
68+
}

pkg/filters/filters.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ var Filters = []OnBuildFilter{
9797
&PolicyNamesFilter{},
9898
&CapsFilter{},
9999
&ContainerIDFilter{},
100+
&InInitTreeFilter{},
100101
}
101102

102103
func GetProcess(event *v1.Event) *tetragon.Process {

0 commit comments

Comments
 (0)