Skip to content

Commit a7bff86

Browse files
authored
Merge pull request #452 from jaideepr97/add-podsecurity-fix-1.8
fix: add security context for kam and cluster pods
2 parents 0415405 + e38031d commit a7bff86

4 files changed

Lines changed: 118 additions & 0 deletions

File tree

controllers/gitopsservice_controller.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,9 @@ func (r *ReconcileGitopsService) reconcileBackend(gitopsserviceNamespacedName ty
563563
{
564564
deploymentObj := newBackendDeployment(gitopsserviceNamespacedName)
565565

566+
// Add SeccompProfile based on cluster version
567+
util.AddSeccompProfileForOpenShift(r.Client, &deploymentObj.Spec.Template.Spec)
568+
566569
deploymentObj.Spec.Template.Spec.NodeSelector = argocommon.DefaultNodeSelector()
567570
// Set GitopsService instance as the owner and controller
568571
if err := controllerutil.SetControllerReference(instance, deploymentObj, r.Scheme); err != nil {
@@ -720,6 +723,18 @@ func newBackendDeployment(ns types.NamespacedName) *appsv1.Deployment {
720723
corev1.ResourceCPU: resourcev1.MustParse("500m"),
721724
},
722725
},
726+
SecurityContext: &corev1.SecurityContext{
727+
AllowPrivilegeEscalation: util.BoolPtr(false),
728+
Capabilities: &corev1.Capabilities{
729+
Drop: []corev1.Capability{
730+
"ALL",
731+
},
732+
},
733+
RunAsNonRoot: util.BoolPtr(true),
734+
SeccompProfile: &corev1.SeccompProfile{
735+
Type: corev1.SeccompProfileTypeRuntimeDefault,
736+
},
737+
},
723738
},
724739
},
725740
Volumes: []corev1.Volume{

controllers/gitopsservice_controller_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,71 @@ func TestReconcile_BackendResourceLimits(t *testing.T) {
403403
assert.Equal(t, resources.Limits[corev1.ResourceMemory], resourcev1.MustParse("256Mi"))
404404
}
405405

406+
func TestReconcile_BackendSecurityContext(t *testing.T) {
407+
logf.SetLogger(argocd.ZapLogger(true))
408+
s := scheme.Scheme
409+
addKnownTypesToScheme(s)
410+
411+
fakeClient := fake.NewFakeClientWithScheme(s, util.NewClusterVersion("4.12.1"), newGitopsService())
412+
reconciler := newReconcileGitOpsService(fakeClient, s)
413+
414+
_, err := reconciler.Reconcile(context.TODO(), newRequest("test", "test"))
415+
assertNoError(t, err)
416+
417+
deployment := appsv1.Deployment{}
418+
err = fakeClient.Get(context.TODO(), types.NamespacedName{Name: serviceName, Namespace: serviceNamespace}, &deployment)
419+
assertNoError(t, err)
420+
421+
securityContext := deployment.Spec.Template.Spec.Containers[0].SecurityContext
422+
want := &corev1.SecurityContext{
423+
AllowPrivilegeEscalation: util.BoolPtr(false),
424+
Capabilities: &corev1.Capabilities{
425+
Drop: []corev1.Capability{
426+
"ALL",
427+
},
428+
},
429+
RunAsNonRoot: util.BoolPtr(true),
430+
SeccompProfile: &corev1.SeccompProfile{
431+
Type: corev1.SeccompProfileTypeRuntimeDefault,
432+
},
433+
}
434+
assert.DeepEqual(t, securityContext, want)
435+
}
436+
437+
func TestReconcile_KamSecurityContext(t *testing.T) {
438+
logf.SetLogger(argocd.ZapLogger(true))
439+
s := scheme.Scheme
440+
addKnownTypesToScheme(s)
441+
442+
util.SetConsoleAPIFound(true)
443+
defer util.SetConsoleAPIFound(false)
444+
445+
fakeClient := fake.NewFakeClientWithScheme(s, util.NewClusterVersion("4.12.1"), newGitopsService())
446+
reconciler := newReconcileGitOpsService(fakeClient, s)
447+
448+
_, err := reconciler.Reconcile(context.TODO(), newRequest("test", "test"))
449+
assertNoError(t, err)
450+
451+
deployment := appsv1.Deployment{}
452+
err = fakeClient.Get(context.TODO(), types.NamespacedName{Name: cliName, Namespace: serviceNamespace}, &deployment)
453+
assertNoError(t, err)
454+
455+
securityContext := deployment.Spec.Template.Spec.Containers[0].SecurityContext
456+
want := &corev1.SecurityContext{
457+
AllowPrivilegeEscalation: util.BoolPtr(false),
458+
Capabilities: &corev1.Capabilities{
459+
Drop: []corev1.Capability{
460+
"ALL",
461+
},
462+
},
463+
RunAsNonRoot: util.BoolPtr(true),
464+
SeccompProfile: &corev1.SeccompProfile{
465+
Type: corev1.SeccompProfileTypeRuntimeDefault,
466+
},
467+
}
468+
assert.DeepEqual(t, securityContext, want)
469+
}
470+
406471
func TestReconcile_testArgoCDForOperatorUpgrade(t *testing.T) {
407472
logf.SetLogger(argocd.ZapLogger(true))
408473
s := scheme.Scheme

controllers/kam.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,18 @@ func newDeploymentForCLI() *appsv1.Deployment {
7474
corev1.ResourceCPU: resourcev1.MustParse("500m"),
7575
},
7676
},
77+
SecurityContext: &corev1.SecurityContext{
78+
AllowPrivilegeEscalation: util.BoolPtr(false),
79+
Capabilities: &corev1.Capabilities{
80+
Drop: []corev1.Capability{
81+
"ALL",
82+
},
83+
},
84+
RunAsNonRoot: util.BoolPtr(true),
85+
SeccompProfile: &corev1.SeccompProfile{
86+
Type: corev1.SeccompProfileTypeRuntimeDefault,
87+
},
88+
},
7789
},
7890
},
7991
}
@@ -184,6 +196,9 @@ func (r *ReconcileGitopsService) reconcileCLIServer(cr *pipelinesv1alpha1.Gitops
184196

185197
deploymentObj := newDeploymentForCLI()
186198

199+
// Add SeccompProfile based on cluster version
200+
util.AddSeccompProfileForOpenShift(r.Client, &deploymentObj.Spec.Template.Spec)
201+
187202
deploymentObj.Spec.Template.Spec.NodeSelector = argocommon.DefaultNodeSelector()
188203

189204
if err := controllerutil.SetControllerReference(cr, deploymentObj, r.Scheme); err != nil {

controllers/util/util.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ package util
1818

1919
import (
2020
"context"
21+
"fmt"
2122
"os"
2223
"strings"
2324

2425
"github.com/argoproj-labs/argocd-operator/controllers/argoutil"
2526
configv1 "github.com/openshift/api/config/v1"
2627
console "github.com/openshift/api/console/v1"
28+
"golang.org/x/mod/semver"
2729
corev1 "k8s.io/api/core/v1"
2830
"k8s.io/apimachinery/pkg/api/errors"
2931
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -116,3 +118,24 @@ func caseInsensitiveGetenv(s string) (string, string) {
116118
}
117119
return "", ""
118120
}
121+
122+
// BoolPtr returns a pointer to val
123+
func BoolPtr(val bool) *bool {
124+
return &val
125+
}
126+
127+
func AddSeccompProfileForOpenShift(client client.Client, podspec *corev1.PodSpec) {
128+
129+
version, _ := GetClusterVersion(client)
130+
if version == "" || semver.Compare(fmt.Sprintf("v%s", version), "v4.10.999") > 0 {
131+
if podspec.SecurityContext == nil {
132+
podspec.SecurityContext = &corev1.PodSecurityContext{}
133+
}
134+
if podspec.SecurityContext.SeccompProfile == nil {
135+
podspec.SecurityContext.SeccompProfile = &corev1.SeccompProfile{}
136+
}
137+
if len(podspec.SecurityContext.SeccompProfile.Type) == 0 {
138+
podspec.SecurityContext.SeccompProfile.Type = corev1.SeccompProfileTypeRuntimeDefault
139+
}
140+
}
141+
}

0 commit comments

Comments
 (0)