Skip to content

Commit 098d160

Browse files
committed
SecurityContextConstraints: pass effective capabilities to validation interface.
1 parent 1b41ef7 commit 098d160

File tree

4 files changed

+10
-29
lines changed

4 files changed

+10
-29
lines changed

pkg/security/securitycontextconstraints/capabilities/mustrunas.go

+6-13
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,10 @@ func (s *defaultCapabilities) Generate(pod *api.Pod, container *api.Container) (
6666
}
6767

6868
// Validate ensures that the specified values fall within the range of the strategy.
69-
func (s *defaultCapabilities) Validate(pod *api.Pod, container *api.Container) field.ErrorList {
69+
func (s *defaultCapabilities) Validate(pod *api.Pod, container *api.Container, capabilities *api.Capabilities) field.ErrorList {
7070
allErrs := field.ErrorList{}
7171

72-
// if the security context isn't set then we haven't generated correctly. Shouldn't get here
73-
// if using the provider correctly
74-
if container.SecurityContext == nil {
75-
allErrs = append(allErrs, field.Invalid(field.NewPath("securityContext"), container.SecurityContext, "no security context is set"))
76-
return allErrs
77-
}
78-
79-
if container.SecurityContext.Capabilities == nil {
72+
if capabilities == nil {
8073
// if container.SC.Caps is nil then nothing was defaulted by the strat or requested by the pod author
8174
// if there are no required caps on the strategy and nothing is requested on the pod
8275
// then we can safely return here without further validation.
@@ -86,7 +79,7 @@ func (s *defaultCapabilities) Validate(pod *api.Pod, container *api.Container) f
8679

8780
// container has no requested caps but we have required caps. We should have something in
8881
// at least the drops on the container.
89-
allErrs = append(allErrs, field.Invalid(field.NewPath("capabilities"), container.SecurityContext.Capabilities,
82+
allErrs = append(allErrs, field.Invalid(field.NewPath("capabilities"), capabilities,
9083
"required capabilities are not set on the securityContext"))
9184
return allErrs
9285
}
@@ -101,20 +94,20 @@ func (s *defaultCapabilities) Validate(pod *api.Pod, container *api.Container) f
10194
// validate that anything being added is in the default or allowed sets
10295
defaultAdd := makeCapSet(s.defaultAddCapabilities)
10396

104-
for _, cap := range container.SecurityContext.Capabilities.Add {
97+
for _, cap := range capabilities.Add {
10598
sCap := string(cap)
10699
if !defaultAdd.Has(sCap) && !allowedAdd.Has(sCap) {
107100
allErrs = append(allErrs, field.Invalid(field.NewPath("capabilities", "add"), sCap, "capability may not be added"))
108101
}
109102
}
110103

111104
// validate that anything that is required to be dropped is in the drop set
112-
containerDrops := makeCapSet(container.SecurityContext.Capabilities.Drop)
105+
containerDrops := makeCapSet(capabilities.Drop)
113106

114107
for _, requiredDrop := range s.requiredDropCapabilities {
115108
sDrop := string(requiredDrop)
116109
if !containerDrops.Has(sDrop) {
117-
allErrs = append(allErrs, field.Invalid(field.NewPath("capabilities", "drop"), container.SecurityContext.Capabilities.Drop,
110+
allErrs = append(allErrs, field.Invalid(field.NewPath("capabilities", "drop"), capabilities.Drop,
118111
fmt.Sprintf("%s is required to be dropped but was not found", sDrop)))
119112
}
120113
}

pkg/security/securitycontextconstraints/capabilities/mustrunas_test.go

+2-14
Original file line numberDiff line numberDiff line change
@@ -321,18 +321,12 @@ func TestValidateAdds(t *testing.T) {
321321
}
322322

323323
for k, v := range tests {
324-
container := &api.Container{
325-
SecurityContext: &api.SecurityContext{
326-
Capabilities: v.containerCaps,
327-
},
328-
}
329-
330324
strategy, err := NewDefaultCapabilities(v.defaultAddCaps, v.requiredDropCaps, v.allowedCaps)
331325
if err != nil {
332326
t.Errorf("%s failed: %v", k, err)
333327
continue
334328
}
335-
errs := strategy.Validate(nil, container)
329+
errs := strategy.Validate(nil, nil, v.containerCaps)
336330
if v.shouldPass && len(errs) > 0 {
337331
t.Errorf("%s should have passed but had errors %v", k, errs)
338332
continue
@@ -384,18 +378,12 @@ func TestValidateDrops(t *testing.T) {
384378
}
385379

386380
for k, v := range tests {
387-
container := &api.Container{
388-
SecurityContext: &api.SecurityContext{
389-
Capabilities: v.containerCaps,
390-
},
391-
}
392-
393381
strategy, err := NewDefaultCapabilities(v.defaultAddCaps, v.requiredDropCaps, nil)
394382
if err != nil {
395383
t.Errorf("%s failed: %v", k, err)
396384
continue
397385
}
398-
errs := strategy.Validate(nil, container)
386+
errs := strategy.Validate(nil, nil, v.containerCaps)
399387
if v.shouldPass && len(errs) > 0 {
400388
t.Errorf("%s should have passed but had errors %v", k, errs)
401389
continue

pkg/security/securitycontextconstraints/capabilities/types.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ type CapabilitiesSecurityContextConstraintsStrategy interface {
1010
// Generate creates the capabilities based on policy rules.
1111
Generate(pod *api.Pod, container *api.Container) (*api.Capabilities, error)
1212
// Validate ensures that the specified values fall within the range of the strategy.
13-
Validate(pod *api.Pod, container *api.Container) field.ErrorList
13+
Validate(pod *api.Pod, container *api.Container, capabilities *api.Capabilities) field.ErrorList
1414
}

pkg/security/securitycontextconstraints/provider.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ func (s *simpleProvider) ValidateContainerSecurityContext(pod *api.Pod, containe
324324
allErrs = append(allErrs, field.Invalid(fldPath.Child("privileged"), *sc.Privileged, "Privileged containers are not allowed"))
325325
}
326326

327-
allErrs = append(allErrs, s.capabilitiesStrategy.Validate(pod, container)...)
327+
allErrs = append(allErrs, s.capabilitiesStrategy.Validate(pod, container, sc.Capabilities)...)
328328

329329
if !s.scc.AllowHostNetwork && pod.Spec.SecurityContext.HostNetwork {
330330
allErrs = append(allErrs, field.Invalid(fldPath.Child("hostNetwork"), pod.Spec.SecurityContext.HostNetwork, "Host network is not allowed to be used"))

0 commit comments

Comments
 (0)