mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-10-21 22:49:31 +00:00
support flexvlome in psp
This commit is contained in:
@@ -233,9 +233,24 @@ func (s *simpleProvider) ValidatePodSecurityContext(pod *api.Pod, fldPath *field
|
||||
fmt.Sprintf("is not allowed to be used")))
|
||||
}
|
||||
}
|
||||
|
||||
if fsType == extensions.FlexVolume && len(s.psp.Spec.AllowedFlexVolumes) > 0 {
|
||||
found := false
|
||||
driver := v.FlexVolume.Driver
|
||||
for _, allowedFlexVolume := range s.psp.Spec.AllowedFlexVolumes {
|
||||
if driver == allowedFlexVolume.Driver {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
allErrs = append(allErrs,
|
||||
field.Invalid(fldPath.Child("volumes").Index(i).Child("driver"), driver,
|
||||
"Flexvolume driver is not allowed to be used"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return allErrs
|
||||
}
|
||||
|
||||
|
@@ -256,6 +256,18 @@ func TestValidatePodSecurityContextFailures(t *testing.T) {
|
||||
failSeccompProfilePod := defaultPod()
|
||||
failSeccompProfilePod.Annotations = map[string]string{api.SeccompPodAnnotationKey: "foo"}
|
||||
|
||||
podWithInvalidFlexVolumeDriver := defaultPod()
|
||||
podWithInvalidFlexVolumeDriver.Spec.Volumes = []api.Volume{
|
||||
{
|
||||
Name: "flex-volume",
|
||||
VolumeSource: api.VolumeSource{
|
||||
FlexVolume: &api.FlexVolumeSource{
|
||||
Driver: "example/unknown",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
errorCases := map[string]struct {
|
||||
pod *api.Pod
|
||||
psp *extensions.PodSecurityPolicy
|
||||
@@ -341,6 +353,16 @@ func TestValidatePodSecurityContextFailures(t *testing.T) {
|
||||
psp: defaultPSP(),
|
||||
expectedError: "Forbidden: seccomp may not be set",
|
||||
},
|
||||
"fail pod with disallowed flexVolume when flex volumes are allowed": {
|
||||
pod: podWithInvalidFlexVolumeDriver,
|
||||
psp: allowFlexVolumesPSP(false, false),
|
||||
expectedError: "Flexvolume driver is not allowed to be used",
|
||||
},
|
||||
"fail pod with disallowed flexVolume when all volumes are allowed": {
|
||||
pod: podWithInvalidFlexVolumeDriver,
|
||||
psp: allowFlexVolumesPSP(false, true),
|
||||
expectedError: "Flexvolume driver is not allowed to be used",
|
||||
},
|
||||
}
|
||||
for k, v := range errorCases {
|
||||
provider, err := NewSimpleProvider(v.psp, "namespace", NewSimpleStrategyFactory())
|
||||
@@ -358,6 +380,28 @@ func TestValidatePodSecurityContextFailures(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func allowFlexVolumesPSP(allowAllFlexVolumes, allowAllVolumes bool) *extensions.PodSecurityPolicy {
|
||||
psp := defaultPSP()
|
||||
|
||||
allowedVolumes := []extensions.AllowedFlexVolume{
|
||||
{Driver: "example/foo"},
|
||||
{Driver: "example/bar"},
|
||||
}
|
||||
if allowAllFlexVolumes {
|
||||
allowedVolumes = []extensions.AllowedFlexVolume{}
|
||||
}
|
||||
|
||||
allowedVolumeType := extensions.FlexVolume
|
||||
if allowAllVolumes {
|
||||
allowedVolumeType = extensions.All
|
||||
}
|
||||
|
||||
psp.Spec.AllowedFlexVolumes = allowedVolumes
|
||||
psp.Spec.Volumes = []extensions.FSType{allowedVolumeType}
|
||||
|
||||
return psp
|
||||
}
|
||||
|
||||
func TestValidateContainerSecurityContextFailures(t *testing.T) {
|
||||
// fail user strat
|
||||
failUserPSP := defaultPSP()
|
||||
@@ -597,6 +641,18 @@ func TestValidatePodSecurityContextSuccess(t *testing.T) {
|
||||
api.SeccompPodAnnotationKey: "foo",
|
||||
}
|
||||
|
||||
flexVolumePod := defaultPod()
|
||||
flexVolumePod.Spec.Volumes = []api.Volume{
|
||||
{
|
||||
Name: "flex-volume",
|
||||
VolumeSource: api.VolumeSource{
|
||||
FlexVolume: &api.FlexVolumeSource{
|
||||
Driver: "example/bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
successCases := map[string]struct {
|
||||
pod *api.Pod
|
||||
psp *extensions.PodSecurityPolicy
|
||||
@@ -653,6 +709,22 @@ func TestValidatePodSecurityContextSuccess(t *testing.T) {
|
||||
pod: seccompPod,
|
||||
psp: seccompPSP,
|
||||
},
|
||||
"flex volume driver in a whitelist (all volumes are allowed)": {
|
||||
pod: flexVolumePod,
|
||||
psp: allowFlexVolumesPSP(false, true),
|
||||
},
|
||||
"flex volume driver with empty whitelist (all volumes are allowed)": {
|
||||
pod: flexVolumePod,
|
||||
psp: allowFlexVolumesPSP(true, true),
|
||||
},
|
||||
"flex volume driver in a whitelist (only flex volumes are allowed)": {
|
||||
pod: flexVolumePod,
|
||||
psp: allowFlexVolumesPSP(false, false),
|
||||
},
|
||||
"flex volume driver with empty whitelist (only flex volumes volumes are allowed)": {
|
||||
pod: flexVolumePod,
|
||||
psp: allowFlexVolumesPSP(true, false),
|
||||
},
|
||||
}
|
||||
|
||||
for k, v := range successCases {
|
||||
|
Reference in New Issue
Block a user