diff --git a/controllers/glanceapi_controller.go b/controllers/glanceapi_controller.go index 2ddd41e2..e6b72a71 100644 --- a/controllers/glanceapi_controller.go +++ b/controllers/glanceapi_controller.go @@ -802,6 +802,8 @@ func (r *GlanceAPIReconciler) reconcileNormal( // This is currently required because cleaner and pruner cronJobs // mount the same pvc to clean data present in /var/lib/glance/image-cache + // TODO (fpantano) reference a Glance spec/proposal to move to a different + // approach if len(instance.Spec.ImageCache.Size) > 0 { privileged = true } diff --git a/pkg/glance/funcs.go b/pkg/glance/funcs.go index 78767150..81dae067 100644 --- a/pkg/glance/funcs.go +++ b/pkg/glance/funcs.go @@ -2,6 +2,7 @@ package glance import ( corev1 "k8s.io/api/core/v1" + "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -20,12 +21,10 @@ func GetOwningGlanceName(instance client.Object) string { // dbSyncSecurityContext - currently used to make sure we don't run db-sync as // root user func dbSyncSecurityContext() *corev1.SecurityContext { - runAsUser := int64(GlanceUID) - runAsGroup := int64(GlanceGID) return &corev1.SecurityContext{ - RunAsUser: &runAsUser, - RunAsGroup: &runAsGroup, + RunAsUser: ptr.To(GlanceUID), + RunAsGroup: ptr.To(GlanceGID), Capabilities: &corev1.Capabilities{ Drop: []corev1.Capability{ "MKNOD", @@ -40,16 +39,12 @@ func dbSyncSecurityContext() *corev1.SecurityContext { // BaseSecurityContext - currently used to make sure we don't run cronJob and Log // Pods as root user, and we drop privileges and Capabilities we don't need func BaseSecurityContext() *corev1.SecurityContext { - falseVal := false - trueVal := true - runAsUser := int64(GlanceUID) - runAsGroup := int64(GlanceGID) return &corev1.SecurityContext{ - RunAsUser: &runAsUser, - RunAsGroup: &runAsGroup, - RunAsNonRoot: &trueVal, - AllowPrivilegeEscalation: &falseVal, + RunAsUser: ptr.To(GlanceUID), + RunAsGroup: ptr.To(GlanceGID), + RunAsNonRoot: ptr.To(true), + AllowPrivilegeEscalation: ptr.To(false), Capabilities: &corev1.Capabilities{ Drop: []corev1.Capability{ "ALL", @@ -63,11 +58,10 @@ func BaseSecurityContext() *corev1.SecurityContext { // APISecurityContext - func APISecurityContext(userID int64, privileged bool) *corev1.SecurityContext { - runAsUser := int64(userID) - trueVal := true + return &corev1.SecurityContext{ - AllowPrivilegeEscalation: &trueVal, - RunAsUser: &runAsUser, + AllowPrivilegeEscalation: ptr.To(true), + RunAsUser: ptr.To(userID), Privileged: &privileged, SeccompProfile: &corev1.SeccompProfile{ Type: corev1.SeccompProfileTypeRuntimeDefault, @@ -77,16 +71,15 @@ func APISecurityContext(userID int64, privileged bool) *corev1.SecurityContext { // HttpdSecurityContext - func HttpdSecurityContext() *corev1.SecurityContext { - runAsUser := int64(0) - falseVal := false + return &corev1.SecurityContext{ - AllowPrivilegeEscalation: &falseVal, Capabilities: &corev1.Capabilities{ Drop: []corev1.Capability{ - "ALL", + "MKNOD", }, }, - RunAsUser: &runAsUser, + RunAsUser: ptr.To(GlanceUID), + RunAsGroup: ptr.To(GlanceGID), SeccompProfile: &corev1.SeccompProfile{ Type: corev1.SeccompProfileTypeRuntimeDefault, }, diff --git a/pkg/glanceapi/cachejob.go b/pkg/glanceapi/cachejob.go index 2f421d83..eee87b85 100644 --- a/pkg/glanceapi/cachejob.go +++ b/pkg/glanceapi/cachejob.go @@ -31,7 +31,7 @@ func ImageCacheJob( instance *glancev1.GlanceAPI, cronSpec glance.CronJobSpec, ) *batchv1.CronJob { - runAsUser := int64(0) + userID := glance.GlanceUID var config0644AccessMode int32 = 0644 cronCommand := fmt.Sprintf( @@ -100,6 +100,9 @@ func ImageCacheJob( Completions: &completions, Template: corev1.PodTemplateSpec{ Spec: corev1.PodSpec{ + SecurityContext: &corev1.PodSecurityContext{ + FSGroup: &userID, + }, Affinity: GetGlanceAPIPodAffinity(instance), Containers: []corev1.Container{ { @@ -108,11 +111,9 @@ func ImageCacheJob( Command: []string{ "/bin/bash", }, - Args: args, - VolumeMounts: cronJobVolumeMounts, - SecurityContext: &corev1.SecurityContext{ - RunAsUser: &runAsUser, - }, + Args: args, + VolumeMounts: cronJobVolumeMounts, + SecurityContext: glance.BaseSecurityContext(), }, }, Volumes: cronJobVolume, diff --git a/pkg/glanceapi/statefulset.go b/pkg/glanceapi/statefulset.go index 63f00063..e050b3e2 100644 --- a/pkg/glanceapi/statefulset.go +++ b/pkg/glanceapi/statefulset.go @@ -179,6 +179,9 @@ func StatefulSet( Labels: labels, }, Spec: corev1.PodSpec{ + SecurityContext: &corev1.PodSecurityContext{ + FSGroup: &userID, + }, ServiceAccountName: instance.Spec.ServiceAccount, // When using Cinder we run as privileged, but also some // commands need to be run on the host using nsenter (eg: