Skip to content

Commit 65dd146

Browse files
authored
run as non-root by default (#294)
* run as non-root by default * fix CI * fix format * fix * set cap_fowner * more logs * more logs * fix user in runner * enable tmate to debug * apply tmate for debug * fix UID & GID * cleanup * cleanup
1 parent 5cc081a commit 65dd146

10 files changed

Lines changed: 40 additions & 11 deletions

File tree

.ci/helm.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ function ci::verify_function_mesh() {
138138
WC=$(${KUBECTL} get pods -lname=${FUNCTION_NAME} --field-selector=status.phase=Running | wc -l)
139139
done
140140
${KUBECTL} describe pod -lname=${FUNCTION_NAME}
141+
${KUBECTL} logs -lname=${FUNCTION_NAME} --all-containers=true
141142
}
142143

143144
function ci::verify_hpa() {

controllers/spec/common.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ const (
5757

5858
EnvGoFunctionConfigs = "GO_FUNCTION_CONF"
5959

60-
DefaultRunnerUserID = "10001"
61-
DefaultRunnerUser = "pulsar"
62-
DefaultRunnerGroupID = "10000"
63-
DefaultRunnerGroup = "pulsar"
60+
DefaultRunnerUserID int64 = 10000
61+
DefaultRunnerUser = "pulsar"
62+
DefaultRunnerGroupID int64 = 10001
63+
DefaultRunnerGroup = "pulsar"
6464
)
6565

6666
var GRPCPort = corev1.ContainerPort{
@@ -136,6 +136,10 @@ func MakeStatefulSetSpec(replicas *int32, container *corev1.Container,
136136

137137
func MakePodTemplate(container *corev1.Container, volumes []corev1.Volume,
138138
labels map[string]string, policy v1alpha1.PodPolicy) *corev1.PodTemplateSpec {
139+
podSecurityContext := getDefaultRunnerPodSecurityContext(DefaultRunnerUserID, DefaultRunnerGroupID, false)
140+
if policy.SecurityContext != nil {
141+
podSecurityContext = policy.SecurityContext
142+
}
139143
return &corev1.PodTemplateSpec{
140144
ObjectMeta: metav1.ObjectMeta{
141145
Labels: mergeLabels(labels, policy.Labels),
@@ -149,7 +153,7 @@ func MakePodTemplate(container *corev1.Container, volumes []corev1.Volume,
149153
NodeSelector: policy.NodeSelector,
150154
Affinity: policy.Affinity,
151155
Tolerations: policy.Tolerations,
152-
SecurityContext: policy.SecurityContext,
156+
SecurityContext: podSecurityContext,
153157
ImagePullSecrets: policy.ImagePullSecrets,
154158
ServiceAccountName: policy.ServiceAccountName,
155159
},
@@ -382,6 +386,9 @@ func getProcessGoRuntimeArgs(goExecFilePath string, function *v1alpha1.Function)
382386
"&&",
383387
"echo goFunctionConfigs=\"'${goFunctionConfigs}'\"",
384388
"&&",
389+
"ls -l",
390+
goExecFilePath,
391+
"&&",
385392
"chmod +x",
386393
goExecFilePath,
387394
"&&",
@@ -655,6 +662,16 @@ func getSourceRunnerImage(spec *v1alpha1.SourceSpec) string {
655662
return DefaultRunnerImage
656663
}
657664

665+
// getDefaultRunnerPodSecurityContext returns a default PodSecurityContext that runs as non-root
666+
func getDefaultRunnerPodSecurityContext(uid, gid int64, nonRoot bool) *corev1.PodSecurityContext {
667+
return &corev1.PodSecurityContext{
668+
RunAsUser: &uid,
669+
RunAsGroup: &gid,
670+
RunAsNonRoot: &nonRoot,
671+
FSGroup: &gid,
672+
}
673+
}
674+
658675
func getJavaSecretProviderArgs(secretMaps map[string]v1alpha1.SecretRef) []string {
659676
var ret []string
660677
if len(secretMaps) > 0 {

controllers/spec/common_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,9 @@ func TestMakeGoFunctionCommand(t *testing.T) {
186186
assert.True(t, strings.HasPrefix(innerCommands[2], " GO_FUNCTION_CONF"))
187187
assert.Equal(t, innerCommands[3], " goFunctionConfigs=${GO_FUNCTION_CONF} ")
188188
assert.Equal(t, innerCommands[4], " echo goFunctionConfigs=\"'${goFunctionConfigs}'\" ")
189-
assert.Equal(t, innerCommands[5], " chmod +x /pulsar/go-func ")
190-
assert.Equal(t, innerCommands[6], " exec /pulsar/go-func -instance-conf ${goFunctionConfigs}")
189+
assert.Equal(t, innerCommands[5], " ls -l /pulsar/go-func ")
190+
assert.Equal(t, innerCommands[6], " chmod +x /pulsar/go-func ")
191+
assert.Equal(t, innerCommands[7], " exec /pulsar/go-func -instance-conf ${goFunctionConfigs}")
191192
}
192193

193194
const TestClusterName string = "test-pulsar"

controllers/spec/function.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ func MakeFunctionContainer(function *v1alpha1.Function) *corev1.Container {
9696
ImagePullPolicy: imagePullPolicy,
9797
EnvFrom: generateContainerEnvFrom(function.Spec.Pulsar.PulsarConfig, function.Spec.Pulsar.AuthSecret, function.Spec.Pulsar.TLSSecret),
9898
VolumeMounts: makeFunctionVolumeMounts(function),
99+
SecurityContext: &corev1.SecurityContext{
100+
Capabilities: &corev1.Capabilities{Add: []corev1.Capability{"CAP_FOWNER"}},
101+
},
99102
}
100103
}
101104

controllers/spec/sink.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ func MakeSinkContainer(sink *v1alpha1.Sink) *corev1.Container {
8585
ImagePullPolicy: imagePullPolicy,
8686
EnvFrom: generateContainerEnvFrom(sink.Spec.Pulsar.PulsarConfig, sink.Spec.Pulsar.AuthSecret, sink.Spec.Pulsar.TLSSecret),
8787
VolumeMounts: makeSinkVolumeMounts(sink),
88+
SecurityContext: &corev1.SecurityContext{
89+
Capabilities: &corev1.Capabilities{Add: []corev1.Capability{"CAP_FOWNER"}},
90+
},
8891
}
8992
}
9093

controllers/spec/source.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ func MakeSourceContainer(source *v1alpha1.Source) *corev1.Container {
8080
ImagePullPolicy: imagePullPolicy,
8181
EnvFrom: generateContainerEnvFrom(source.Spec.Pulsar.PulsarConfig, source.Spec.Pulsar.AuthSecret, source.Spec.Pulsar.TLSSecret),
8282
VolumeMounts: makeSourceVolumeMounts(source),
83+
SecurityContext: &corev1.SecurityContext{
84+
Capabilities: &corev1.Capabilities{Add: []corev1.Capability{"CAP_FOWNER"}},
85+
},
8386
}
8487
}
8588

images/pulsar-functions-base-runner/Dockerfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ FROM ubuntu:20.04 as functions-runner
55

66
ENV GID=10001
77
ENV UID=10000
8+
ENV USER=pulsar
89
RUN groupadd -g $GID pulsar
9-
RUN adduser -u $UID --gid $GID --disabled-login --disabled-password --gecos '' pulsar
10+
RUN adduser -u $UID --gid $GID --disabled-login --disabled-password --gecos '' $USER
1011

1112
RUN mkdir -p /pulsar/bin/ \
1213
&& mkdir -p /pulsar/lib/ \

images/pulsar-functions-go-runner/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ FROM pulsar-functions-runner-base:latest
22

33
WORKDIR /pulsar
44

5-
USER $UID
5+
USER $USER

images/pulsar-functions-java-runner/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ COPY --from=pulsar --chown=$UID:$GID /pulsar/instances/deps /pulsar/instances/de
88

99
WORKDIR /pulsar
1010

11-
USER $UID
11+
USER $USER

images/pulsar-functions-python-runner/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@ WORKDIR /pulsar
3434
RUN if [ -f "/pulsar/bin/install-pulsar-client-37.sh" ]; then /pulsar/bin/install-pulsar-client-37.sh ; fi
3535
RUN if [ -f "/pulsar/bin/install-pulsar-client.sh" ]; then /pulsar/bin/install-pulsar-client.sh ; fi
3636

37-
USER $UID
37+
USER $USER

0 commit comments

Comments
 (0)