Skip to content

Commit 8fb0d09

Browse files
committed
Run GlanceAPI with GlanceUID user
When the backend is not Cinder (Cinder still has to be fully tested), GlanceAPI can reduce the permissions required for glance-api container, and run as GlanceUID/GlanceGID. This patch introduces scc for both glanceAPI and Httpd. Signed-off-by: Francesco Pantano <[email protected]>
1 parent b19cd99 commit 8fb0d09

File tree

4 files changed

+61
-24
lines changed

4 files changed

+61
-24
lines changed

controllers/glanceapi_controller.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,12 @@ func (r *GlanceAPIReconciler) reconcileNormal(
800800
// we can mark the ServiceConfigReady as True and rollout the new pods
801801
instance.Status.Conditions.MarkTrue(condition.ServiceConfigReadyCondition, condition.ServiceConfigReadyMessage)
802802

803+
// This is currently required because cleaner and pruner cronJobs
804+
// mount the same pvc to clean data present in /var/lib/glance/image-cache
805+
if len(instance.Spec.ImageCache.Size) > 0 {
806+
privileged = true
807+
}
808+
803809
// Define a new StatefuleSet object
804810
deplDef, err := glanceapi.StatefulSet(instance,
805811
inputHash,

pkg/glance/funcs.go

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,15 @@ func dbSyncSecurityContext() *corev1.SecurityContext {
4040
// BaseSecurityContext - currently used to make sure we don't run cronJob and Log
4141
// Pods as root user, and we drop privileges and Capabilities we don't need
4242
func BaseSecurityContext() *corev1.SecurityContext {
43-
falseVal := true
43+
falseVal := false
44+
trueVal := true
4445
runAsUser := int64(GlanceUID)
46+
runAsGroup := int64(GlanceGID)
4547

4648
return &corev1.SecurityContext{
4749
RunAsUser: &runAsUser,
50+
RunAsGroup: &runAsGroup,
51+
RunAsNonRoot: &trueVal,
4852
AllowPrivilegeEscalation: &falseVal,
4953
Capabilities: &corev1.Capabilities{
5054
Drop: []corev1.Capability{
@@ -57,11 +61,34 @@ func BaseSecurityContext() *corev1.SecurityContext {
5761
}
5862
}
5963

64+
// APISecurityContext -
65+
func APISecurityContext(userID int64, privileged bool) *corev1.SecurityContext {
66+
runAsUser := int64(userID)
67+
trueVal := true
68+
return &corev1.SecurityContext{
69+
AllowPrivilegeEscalation: &trueVal,
70+
RunAsUser: &runAsUser,
71+
Privileged: &privileged,
72+
SeccompProfile: &corev1.SeccompProfile{
73+
Type: corev1.SeccompProfileTypeRuntimeDefault,
74+
},
75+
}
76+
}
77+
6078
// HttpdSecurityContext -
6179
func HttpdSecurityContext() *corev1.SecurityContext {
62-
63-
runAsUser := int64(GlanceUID)
80+
runAsUser := int64(0)
81+
falseVal := false
6482
return &corev1.SecurityContext{
83+
AllowPrivilegeEscalation: &falseVal,
84+
Capabilities: &corev1.Capabilities{
85+
Drop: []corev1.Capability{
86+
"ALL",
87+
},
88+
},
6589
RunAsUser: &runAsUser,
90+
SeccompProfile: &corev1.SeccompProfile{
91+
Type: corev1.SeccompProfileTypeRuntimeDefault,
92+
},
6693
}
6794
}

pkg/glanceapi/statefulset.go

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ func StatefulSet(
5050
annotations map[string]string,
5151
privileged bool,
5252
) (*appsv1.StatefulSet, error) {
53-
runAsUser := int64(0)
54-
53+
userID := glance.GlanceUID
5554
startupProbe := &corev1.Probe{
5655
FailureThreshold: 6,
5756
PeriodSeconds: 10,
@@ -220,16 +219,14 @@ func StatefulSet(
220219
"-c",
221220
string(GlanceServiceCommand),
222221
},
223-
Image: instance.Spec.ContainerImage,
224-
SecurityContext: &corev1.SecurityContext{
225-
RunAsUser: &runAsUser,
226-
},
227-
Env: env.MergeEnvs([]corev1.EnvVar{}, envVars),
228-
VolumeMounts: httpdVolumeMount,
229-
Resources: instance.Spec.Resources,
230-
StartupProbe: startupProbe,
231-
ReadinessProbe: readinessProbe,
232-
LivenessProbe: livenessProbe,
222+
Image: instance.Spec.ContainerImage,
223+
SecurityContext: glance.HttpdSecurityContext(),
224+
Env: env.MergeEnvs([]corev1.EnvVar{}, envVars),
225+
VolumeMounts: httpdVolumeMount,
226+
Resources: instance.Spec.Resources,
227+
StartupProbe: startupProbe,
228+
ReadinessProbe: readinessProbe,
229+
LivenessProbe: livenessProbe,
233230
},
234231
{
235232
Name: glance.ServiceName + "-api",
@@ -243,12 +240,9 @@ func StatefulSet(
243240
"-c",
244241
string(GlanceServiceCommand),
245242
},
246-
Image: instance.Spec.ContainerImage,
247-
SecurityContext: &corev1.SecurityContext{
248-
RunAsUser: &runAsUser,
249-
Privileged: &privileged,
250-
},
251-
Env: env.MergeEnvs([]corev1.EnvVar{}, envVars),
243+
Image: instance.Spec.ContainerImage,
244+
SecurityContext: glance.APISecurityContext(userID, privileged),
245+
Env: env.MergeEnvs([]corev1.EnvVar{}, envVars),
252246
VolumeMounts: append(glance.GetVolumeMounts(
253247
instance.Spec.CustomServiceConfigSecrets,
254248
privileged,

templates/glanceapi/config/glance-api-config.json

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44
{
55
"source": "/var/lib/config-data/default/00-config.conf",
66
"dest": "/etc/glance/glance.conf.d/00-config.conf",
7-
"owner": "glance",
7+
"owner": "glance:glance",
88
"perm": "0600"
99
},
1010
{
1111
"source": "/var/lib/config-data/default/02-config.conf",
1212
"dest": "/etc/glance/glance.conf.d/02-config.conf",
13-
"owner": "glance",
13+
"owner": "glance:glance",
1414
"perm": "0600",
1515
"optional": true
1616
},
1717
{
1818
"source": "/var/lib/config-data/default/03-config.conf",
1919
"dest": "/etc/glance/glance.conf.d/03-config.conf",
20-
"owner": "glance",
20+
"owner": "glance:glance",
2121
"perm": "0640",
2222
"optional": true
2323
},
@@ -68,6 +68,16 @@
6868
"path": "/var/log/glance",
6969
"owner": "glance:glance",
7070
"recurse": true
71+
},
72+
{
73+
"path": "/var/lib/glance",
74+
"owner": "glance:glance",
75+
"recurse": true
76+
},
77+
{
78+
"path": "/etc/glance/glance.conf.d",
79+
"owner": "glance:glance",
80+
"recurse": true
7181
}
7282
]
7383
}

0 commit comments

Comments
 (0)