mirror of https://github.com/k3s-io/k3s
Merge pull request #69685 from yue9944882/externalize-psp-admission-controller
Externalize PSP admission controllerpull/58/head
commit
753dfbe8fd
|
@ -17,7 +17,6 @@ go_library(
|
||||||
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy",
|
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
|
||||||
"//pkg/features:go_default_library",
|
"//pkg/features:go_default_library",
|
||||||
"//pkg/security/podsecuritypolicy/apparmor:go_default_library",
|
"//pkg/security/podsecuritypolicy/apparmor:go_default_library",
|
||||||
"//pkg/security/podsecuritypolicy/capabilities:go_default_library",
|
"//pkg/security/podsecuritypolicy/capabilities:go_default_library",
|
||||||
|
@ -28,6 +27,8 @@ go_library(
|
||||||
"//pkg/security/podsecuritypolicy/user:go_default_library",
|
"//pkg/security/podsecuritypolicy/user:go_default_library",
|
||||||
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
||||||
"//pkg/securitycontext:go_default_library",
|
"//pkg/securitycontext:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
|
@ -41,11 +42,11 @@ go_test(
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/core/v1:go_default_library",
|
"//pkg/apis/core/v1:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
|
||||||
"//pkg/security/apparmor:go_default_library",
|
"//pkg/security/apparmor:go_default_library",
|
||||||
"//pkg/security/podsecuritypolicy/seccomp:go_default_library",
|
"//pkg/security/podsecuritypolicy/seccomp:go_default_library",
|
||||||
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
|
|
|
@ -16,7 +16,8 @@ go_library(
|
||||||
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities",
|
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
],
|
],
|
||||||
|
@ -28,7 +29,8 @@ go_test(
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -19,10 +19,11 @@ package capabilities
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// defaultCapabilities implements the Strategy interface
|
// defaultCapabilities implements the Strategy interface
|
||||||
|
@ -36,11 +37,23 @@ var _ Strategy = &defaultCapabilities{}
|
||||||
|
|
||||||
// NewDefaultCapabilities creates a new defaultCapabilities strategy that will provide defaults and validation
|
// NewDefaultCapabilities creates a new defaultCapabilities strategy that will provide defaults and validation
|
||||||
// based on the configured initial caps and allowed caps.
|
// based on the configured initial caps and allowed caps.
|
||||||
func NewDefaultCapabilities(defaultAddCapabilities, requiredDropCapabilities, allowedCaps []api.Capability) (Strategy, error) {
|
func NewDefaultCapabilities(defaultAddCapabilities, requiredDropCapabilities, allowedCaps []corev1.Capability) (Strategy, error) {
|
||||||
|
internalDefaultAddCaps := make([]api.Capability, len(defaultAddCapabilities))
|
||||||
|
for i, capability := range defaultAddCapabilities {
|
||||||
|
internalDefaultAddCaps[i] = api.Capability(capability)
|
||||||
|
}
|
||||||
|
internalRequiredDropCaps := make([]api.Capability, len(requiredDropCapabilities))
|
||||||
|
for i, capability := range requiredDropCapabilities {
|
||||||
|
internalRequiredDropCaps[i] = api.Capability(capability)
|
||||||
|
}
|
||||||
|
internalAllowedCaps := make([]api.Capability, len(allowedCaps))
|
||||||
|
for i, capability := range allowedCaps {
|
||||||
|
internalAllowedCaps[i] = api.Capability(capability)
|
||||||
|
}
|
||||||
return &defaultCapabilities{
|
return &defaultCapabilities{
|
||||||
defaultAddCapabilities: defaultAddCapabilities,
|
defaultAddCapabilities: internalDefaultAddCaps,
|
||||||
requiredDropCapabilities: requiredDropCapabilities,
|
requiredDropCapabilities: internalRequiredDropCaps,
|
||||||
allowedCaps: allowedCaps,
|
allowedCaps: internalAllowedCaps,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,14 +20,15 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGenerateAdds(t *testing.T) {
|
func TestGenerateAdds(t *testing.T) {
|
||||||
tests := map[string]struct {
|
tests := map[string]struct {
|
||||||
defaultAddCaps []api.Capability
|
defaultAddCaps []corev1.Capability
|
||||||
containerCaps *api.Capabilities
|
containerCaps *api.Capabilities
|
||||||
expectedCaps *api.Capabilities
|
expectedCaps *api.Capabilities
|
||||||
}{
|
}{
|
||||||
|
@ -37,13 +38,13 @@ func TestGenerateAdds(t *testing.T) {
|
||||||
expectedCaps: &api.Capabilities{},
|
expectedCaps: &api.Capabilities{},
|
||||||
},
|
},
|
||||||
"required, no container requests": {
|
"required, no container requests": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
expectedCaps: &api.Capabilities{
|
expectedCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"foo"},
|
Add: []api.Capability{"foo"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"required, container requests add required": {
|
"required, container requests add required": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"foo"},
|
Add: []api.Capability{"foo"},
|
||||||
},
|
},
|
||||||
|
@ -52,7 +53,7 @@ func TestGenerateAdds(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"multiple required, container requests add required": {
|
"multiple required, container requests add required": {
|
||||||
defaultAddCaps: []api.Capability{"foo", "bar", "baz"},
|
defaultAddCaps: []corev1.Capability{"foo", "bar", "baz"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"foo"},
|
Add: []api.Capability{"foo"},
|
||||||
},
|
},
|
||||||
|
@ -61,7 +62,7 @@ func TestGenerateAdds(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"required, container requests add non-required": {
|
"required, container requests add non-required": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"bar"},
|
Add: []api.Capability{"bar"},
|
||||||
},
|
},
|
||||||
|
@ -70,7 +71,7 @@ func TestGenerateAdds(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"generation does not mutate unnecessarily": {
|
"generation does not mutate unnecessarily": {
|
||||||
defaultAddCaps: []api.Capability{"foo", "bar"},
|
defaultAddCaps: []corev1.Capability{"foo", "bar"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"foo", "foo", "bar", "baz"},
|
Add: []api.Capability{"foo", "foo", "bar", "baz"},
|
||||||
},
|
},
|
||||||
|
@ -79,7 +80,7 @@ func TestGenerateAdds(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"generation dedupes": {
|
"generation dedupes": {
|
||||||
defaultAddCaps: []api.Capability{"foo", "bar"},
|
defaultAddCaps: []corev1.Capability{"foo", "bar"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"foo", "baz"},
|
Add: []api.Capability{"foo", "baz"},
|
||||||
},
|
},
|
||||||
|
@ -88,7 +89,7 @@ func TestGenerateAdds(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"generation is case sensitive - will not dedupe": {
|
"generation is case sensitive - will not dedupe": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"FOO"},
|
Add: []api.Capability{"FOO"},
|
||||||
},
|
},
|
||||||
|
@ -127,8 +128,8 @@ func TestGenerateAdds(t *testing.T) {
|
||||||
|
|
||||||
func TestGenerateDrops(t *testing.T) {
|
func TestGenerateDrops(t *testing.T) {
|
||||||
tests := map[string]struct {
|
tests := map[string]struct {
|
||||||
defaultAddCaps []api.Capability
|
defaultAddCaps []corev1.Capability
|
||||||
requiredDropCaps []api.Capability
|
requiredDropCaps []corev1.Capability
|
||||||
containerCaps *api.Capabilities
|
containerCaps *api.Capabilities
|
||||||
expectedCaps *api.Capabilities
|
expectedCaps *api.Capabilities
|
||||||
}{
|
}{
|
||||||
|
@ -140,13 +141,13 @@ func TestGenerateDrops(t *testing.T) {
|
||||||
expectedCaps: &api.Capabilities{},
|
expectedCaps: &api.Capabilities{},
|
||||||
},
|
},
|
||||||
"required drops are defaulted": {
|
"required drops are defaulted": {
|
||||||
requiredDropCaps: []api.Capability{"foo"},
|
requiredDropCaps: []corev1.Capability{"foo"},
|
||||||
expectedCaps: &api.Capabilities{
|
expectedCaps: &api.Capabilities{
|
||||||
Drop: []api.Capability{"foo"},
|
Drop: []api.Capability{"foo"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"required drops are defaulted when making container requests": {
|
"required drops are defaulted when making container requests": {
|
||||||
requiredDropCaps: []api.Capability{"baz"},
|
requiredDropCaps: []corev1.Capability{"baz"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Drop: []api.Capability{"foo", "bar"},
|
Drop: []api.Capability{"foo", "bar"},
|
||||||
},
|
},
|
||||||
|
@ -155,7 +156,7 @@ func TestGenerateDrops(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"required drops do not mutate unnecessarily": {
|
"required drops do not mutate unnecessarily": {
|
||||||
requiredDropCaps: []api.Capability{"baz"},
|
requiredDropCaps: []corev1.Capability{"baz"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Drop: []api.Capability{"foo", "bar", "baz"},
|
Drop: []api.Capability{"foo", "bar", "baz"},
|
||||||
},
|
},
|
||||||
|
@ -164,7 +165,7 @@ func TestGenerateDrops(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"can drop a required add": {
|
"can drop a required add": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Drop: []api.Capability{"foo"},
|
Drop: []api.Capability{"foo"},
|
||||||
},
|
},
|
||||||
|
@ -173,7 +174,7 @@ func TestGenerateDrops(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"can drop non-required add": {
|
"can drop non-required add": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Drop: []api.Capability{"bar"},
|
Drop: []api.Capability{"bar"},
|
||||||
},
|
},
|
||||||
|
@ -183,8 +184,8 @@ func TestGenerateDrops(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"defaulting adds and drops, dropping a required add": {
|
"defaulting adds and drops, dropping a required add": {
|
||||||
defaultAddCaps: []api.Capability{"foo", "bar", "baz"},
|
defaultAddCaps: []corev1.Capability{"foo", "bar", "baz"},
|
||||||
requiredDropCaps: []api.Capability{"abc"},
|
requiredDropCaps: []corev1.Capability{"abc"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Drop: []api.Capability{"foo"},
|
Drop: []api.Capability{"foo"},
|
||||||
},
|
},
|
||||||
|
@ -194,7 +195,7 @@ func TestGenerateDrops(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"generation dedupes": {
|
"generation dedupes": {
|
||||||
requiredDropCaps: []api.Capability{"baz", "foo"},
|
requiredDropCaps: []corev1.Capability{"baz", "foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Drop: []api.Capability{"bar", "foo"},
|
Drop: []api.Capability{"bar", "foo"},
|
||||||
},
|
},
|
||||||
|
@ -203,7 +204,7 @@ func TestGenerateDrops(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"generation is case sensitive - will not dedupe": {
|
"generation is case sensitive - will not dedupe": {
|
||||||
requiredDropCaps: []api.Capability{"bar"},
|
requiredDropCaps: []corev1.Capability{"bar"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Drop: []api.Capability{"BAR"},
|
Drop: []api.Capability{"BAR"},
|
||||||
},
|
},
|
||||||
|
@ -241,30 +242,30 @@ func TestGenerateDrops(t *testing.T) {
|
||||||
|
|
||||||
func TestValidateAdds(t *testing.T) {
|
func TestValidateAdds(t *testing.T) {
|
||||||
tests := map[string]struct {
|
tests := map[string]struct {
|
||||||
defaultAddCaps []api.Capability
|
defaultAddCaps []corev1.Capability
|
||||||
allowedCaps []api.Capability
|
allowedCaps []corev1.Capability
|
||||||
containerCaps *api.Capabilities
|
containerCaps *api.Capabilities
|
||||||
expectedError string
|
expectedError string
|
||||||
}{
|
}{
|
||||||
// no container requests
|
// no container requests
|
||||||
"no required, no allowed, no container requests": {},
|
"no required, no allowed, no container requests": {},
|
||||||
"no required, allowed, no container requests": {
|
"no required, allowed, no container requests": {
|
||||||
allowedCaps: []api.Capability{"foo"},
|
allowedCaps: []corev1.Capability{"foo"},
|
||||||
},
|
},
|
||||||
"required, no allowed, no container requests": {
|
"required, no allowed, no container requests": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
expectedError: `capabilities: Invalid value: "null": required capabilities are not set on the securityContext`,
|
expectedError: `capabilities: Invalid value: "null": required capabilities are not set on the securityContext`,
|
||||||
},
|
},
|
||||||
|
|
||||||
// container requests match required
|
// container requests match required
|
||||||
"required, no allowed, container requests valid": {
|
"required, no allowed, container requests valid": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"foo"},
|
Add: []api.Capability{"foo"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"required, no allowed, container requests invalid": {
|
"required, no allowed, container requests invalid": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"bar"},
|
Add: []api.Capability{"bar"},
|
||||||
},
|
},
|
||||||
|
@ -273,19 +274,19 @@ func TestValidateAdds(t *testing.T) {
|
||||||
|
|
||||||
// container requests match allowed
|
// container requests match allowed
|
||||||
"no required, allowed, container requests valid": {
|
"no required, allowed, container requests valid": {
|
||||||
allowedCaps: []api.Capability{"foo"},
|
allowedCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"foo"},
|
Add: []api.Capability{"foo"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"no required, all allowed, container requests valid": {
|
"no required, all allowed, container requests valid": {
|
||||||
allowedCaps: []api.Capability{policy.AllowAllCapabilities},
|
allowedCaps: []corev1.Capability{policy.AllowAllCapabilities},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"foo"},
|
Add: []api.Capability{"foo"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"no required, allowed, container requests invalid": {
|
"no required, allowed, container requests invalid": {
|
||||||
allowedCaps: []api.Capability{"foo"},
|
allowedCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"bar"},
|
Add: []api.Capability{"bar"},
|
||||||
},
|
},
|
||||||
|
@ -294,29 +295,29 @@ func TestValidateAdds(t *testing.T) {
|
||||||
|
|
||||||
// required and allowed
|
// required and allowed
|
||||||
"required, allowed, container requests valid required": {
|
"required, allowed, container requests valid required": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
allowedCaps: []api.Capability{"bar"},
|
allowedCaps: []corev1.Capability{"bar"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"foo"},
|
Add: []api.Capability{"foo"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"required, allowed, container requests valid allowed": {
|
"required, allowed, container requests valid allowed": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
allowedCaps: []api.Capability{"bar"},
|
allowedCaps: []corev1.Capability{"bar"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"bar"},
|
Add: []api.Capability{"bar"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"required, allowed, container requests invalid": {
|
"required, allowed, container requests invalid": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
allowedCaps: []api.Capability{"bar"},
|
allowedCaps: []corev1.Capability{"bar"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"baz"},
|
Add: []api.Capability{"baz"},
|
||||||
},
|
},
|
||||||
expectedError: `capabilities.add: Invalid value: "baz": capability may not be added`,
|
expectedError: `capabilities.add: Invalid value: "baz": capability may not be added`,
|
||||||
},
|
},
|
||||||
"validation is case sensitive": {
|
"validation is case sensitive": {
|
||||||
defaultAddCaps: []api.Capability{"foo"},
|
defaultAddCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Add: []api.Capability{"FOO"},
|
Add: []api.Capability{"FOO"},
|
||||||
},
|
},
|
||||||
|
@ -351,33 +352,33 @@ func TestValidateAdds(t *testing.T) {
|
||||||
|
|
||||||
func TestValidateDrops(t *testing.T) {
|
func TestValidateDrops(t *testing.T) {
|
||||||
tests := map[string]struct {
|
tests := map[string]struct {
|
||||||
requiredDropCaps []api.Capability
|
requiredDropCaps []corev1.Capability
|
||||||
containerCaps *api.Capabilities
|
containerCaps *api.Capabilities
|
||||||
expectedError string
|
expectedError string
|
||||||
}{
|
}{
|
||||||
// no container requests
|
// no container requests
|
||||||
"no required, no container requests": {},
|
"no required, no container requests": {},
|
||||||
"required, no container requests": {
|
"required, no container requests": {
|
||||||
requiredDropCaps: []api.Capability{"foo"},
|
requiredDropCaps: []corev1.Capability{"foo"},
|
||||||
expectedError: `capabilities: Invalid value: "null": required capabilities are not set on the securityContext`,
|
expectedError: `capabilities: Invalid value: "null": required capabilities are not set on the securityContext`,
|
||||||
},
|
},
|
||||||
|
|
||||||
// container requests match required
|
// container requests match required
|
||||||
"required, container requests valid": {
|
"required, container requests valid": {
|
||||||
requiredDropCaps: []api.Capability{"foo"},
|
requiredDropCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Drop: []api.Capability{"foo"},
|
Drop: []api.Capability{"foo"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"required, container requests invalid": {
|
"required, container requests invalid": {
|
||||||
requiredDropCaps: []api.Capability{"foo"},
|
requiredDropCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Drop: []api.Capability{"bar"},
|
Drop: []api.Capability{"bar"},
|
||||||
},
|
},
|
||||||
expectedError: `capabilities.drop: Invalid value: []core.Capability{"bar"}: foo is required to be dropped but was not found`,
|
expectedError: `capabilities.drop: Invalid value: []core.Capability{"bar"}: foo is required to be dropped but was not found`,
|
||||||
},
|
},
|
||||||
"validation is case sensitive": {
|
"validation is case sensitive": {
|
||||||
requiredDropCaps: []api.Capability{"foo"},
|
requiredDropCaps: []corev1.Capability{"foo"},
|
||||||
containerCaps: &api.Capabilities{
|
containerCaps: &api.Capabilities{
|
||||||
Drop: []api.Capability{"FOO"},
|
Drop: []api.Capability{"FOO"},
|
||||||
},
|
},
|
||||||
|
|
|
@ -22,9 +22,9 @@ import (
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
|
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/errors"
|
"k8s.io/apimachinery/pkg/util/errors"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/apparmor"
|
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/apparmor"
|
||||||
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities"
|
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities"
|
||||||
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/group"
|
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/group"
|
||||||
|
@ -191,7 +191,7 @@ func createSupplementalGroupStrategy(opts *policy.SupplementalGroupsStrategyOpti
|
||||||
}
|
}
|
||||||
|
|
||||||
// createCapabilitiesStrategy creates a new capabilities strategy.
|
// createCapabilitiesStrategy creates a new capabilities strategy.
|
||||||
func createCapabilitiesStrategy(defaultAddCaps, requiredDropCaps, allowedCaps []api.Capability) (capabilities.Strategy, error) {
|
func createCapabilitiesStrategy(defaultAddCaps, requiredDropCaps, allowedCaps []corev1.Capability) (capabilities.Strategy, error) {
|
||||||
return capabilities.NewDefaultCapabilities(defaultAddCaps, requiredDropCaps, allowedCaps)
|
return capabilities.NewDefaultCapabilities(defaultAddCaps, requiredDropCaps, allowedCaps)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@ go_library(
|
||||||
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/group",
|
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/group",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
|
||||||
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -34,7 +34,7 @@ go_test(
|
||||||
],
|
],
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/policy:go_default_library",
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -19,8 +19,8 @@ package group
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
psputil "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
psputil "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -19,9 +19,9 @@ package group
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// mayRunAs implements the GroupStrategy interface.
|
// mayRunAs implements the GroupStrategy interface.
|
||||||
|
|
|
@ -21,8 +21,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMayRunAsOptions(t *testing.T) {
|
func TestMayRunAsOptions(t *testing.T) {
|
||||||
|
|
|
@ -19,9 +19,9 @@ package group
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// mustRunAs implements the GroupStrategy interface
|
// mustRunAs implements the GroupStrategy interface
|
||||||
|
|
|
@ -20,8 +20,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMustRunAsOptions(t *testing.T) {
|
func TestMustRunAsOptions(t *testing.T) {
|
||||||
|
|
|
@ -20,10 +20,11 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
psputil "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
psputil "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
||||||
"k8s.io/kubernetes/pkg/securitycontext"
|
"k8s.io/kubernetes/pkg/securitycontext"
|
||||||
|
@ -174,9 +175,9 @@ func (s *simpleProvider) DefaultContainerSecurityContext(pod *api.Pod, container
|
||||||
sc.SetAllowPrivilegeEscalation(s.psp.Spec.DefaultAllowPrivilegeEscalation)
|
sc.SetAllowPrivilegeEscalation(s.psp.Spec.DefaultAllowPrivilegeEscalation)
|
||||||
}
|
}
|
||||||
|
|
||||||
// if the PSP sets psp.AllowPrivilegeEscalation to false set that as the default
|
// if the PSP sets psp.AllowPrivilegeEscalation to false, set that as the default
|
||||||
if !s.psp.Spec.AllowPrivilegeEscalation && sc.AllowPrivilegeEscalation() == nil {
|
if !*s.psp.Spec.AllowPrivilegeEscalation && sc.AllowPrivilegeEscalation() == nil {
|
||||||
sc.SetAllowPrivilegeEscalation(&s.psp.Spec.AllowPrivilegeEscalation)
|
sc.SetAllowPrivilegeEscalation(s.psp.Spec.AllowPrivilegeEscalation)
|
||||||
}
|
}
|
||||||
|
|
||||||
pod.Annotations = annotations
|
pod.Annotations = annotations
|
||||||
|
@ -313,14 +314,15 @@ func (s *simpleProvider) ValidateContainer(pod *api.Pod, container *api.Containe
|
||||||
procMount := sc.ProcMount()
|
procMount := sc.ProcMount()
|
||||||
allowedProcMounts := s.psp.Spec.AllowedProcMountTypes
|
allowedProcMounts := s.psp.Spec.AllowedProcMountTypes
|
||||||
if len(allowedProcMounts) == 0 {
|
if len(allowedProcMounts) == 0 {
|
||||||
allowedProcMounts = []api.ProcMountType{api.DefaultProcMount}
|
allowedProcMounts = []corev1.ProcMountType{corev1.DefaultProcMount}
|
||||||
}
|
}
|
||||||
foundProcMountType := false
|
foundProcMountType := false
|
||||||
for _, pm := range allowedProcMounts {
|
for _, pm := range allowedProcMounts {
|
||||||
if pm == procMount {
|
if string(pm) == string(procMount) {
|
||||||
foundProcMountType = true
|
foundProcMountType = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !foundProcMountType {
|
if !foundProcMountType {
|
||||||
allErrs = append(allErrs, field.Invalid(scPath.Child("procMount"), procMount, "ProcMountType is not allowed"))
|
allErrs = append(allErrs, field.Invalid(scPath.Child("procMount"), procMount, "ProcMountType is not allowed"))
|
||||||
}
|
}
|
||||||
|
@ -339,14 +341,10 @@ func (s *simpleProvider) ValidateContainer(pod *api.Pod, container *api.Containe
|
||||||
}
|
}
|
||||||
|
|
||||||
allowEscalation := sc.AllowPrivilegeEscalation()
|
allowEscalation := sc.AllowPrivilegeEscalation()
|
||||||
if !s.psp.Spec.AllowPrivilegeEscalation && allowEscalation == nil {
|
if !*s.psp.Spec.AllowPrivilegeEscalation && (allowEscalation == nil || *allowEscalation) {
|
||||||
allErrs = append(allErrs, field.Invalid(scPath.Child("allowPrivilegeEscalation"), allowEscalation, "Allowing privilege escalation for containers is not allowed"))
|
allErrs = append(allErrs, field.Invalid(scPath.Child("allowPrivilegeEscalation"), allowEscalation, "Allowing privilege escalation for containers is not allowed"))
|
||||||
}
|
}
|
||||||
|
|
||||||
if !s.psp.Spec.AllowPrivilegeEscalation && allowEscalation != nil && *allowEscalation {
|
|
||||||
allErrs = append(allErrs, field.Invalid(scPath.Child("allowPrivilegeEscalation"), *allowEscalation, "Allowing privilege escalation for containers is not allowed"))
|
|
||||||
}
|
|
||||||
|
|
||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,12 +28,12 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/diff"
|
"k8s.io/apimachinery/pkg/util/diff"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
"k8s.io/kubernetes/pkg/security/apparmor"
|
"k8s.io/kubernetes/pkg/security/apparmor"
|
||||||
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp"
|
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp"
|
||||||
psputil "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
psputil "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
||||||
|
@ -52,6 +52,7 @@ func TestDefaultPodSecurityContextNonmutating(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a PSP with strategies that will populate a blank psc
|
// Create a PSP with strategies that will populate a blank psc
|
||||||
|
allowPrivilegeEscalation := true
|
||||||
createPSP := func() *policy.PodSecurityPolicy {
|
createPSP := func() *policy.PodSecurityPolicy {
|
||||||
return &policy.PodSecurityPolicy{
|
return &policy.PodSecurityPolicy{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
@ -61,7 +62,7 @@ func TestDefaultPodSecurityContextNonmutating(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Spec: policy.PodSecurityPolicySpec{
|
Spec: policy.PodSecurityPolicySpec{
|
||||||
AllowPrivilegeEscalation: true,
|
AllowPrivilegeEscalation: &allowPrivilegeEscalation,
|
||||||
RunAsUser: policy.RunAsUserStrategyOptions{
|
RunAsUser: policy.RunAsUserStrategyOptions{
|
||||||
Rule: policy.RunAsUserStrategyRunAsAny,
|
Rule: policy.RunAsUserStrategyRunAsAny,
|
||||||
},
|
},
|
||||||
|
@ -126,6 +127,7 @@ func TestDefaultContainerSecurityContextNonmutating(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a PSP with strategies that will populate a blank security context
|
// Create a PSP with strategies that will populate a blank security context
|
||||||
|
allowPrivilegeEscalation := true
|
||||||
createPSP := func() *policy.PodSecurityPolicy {
|
createPSP := func() *policy.PodSecurityPolicy {
|
||||||
return &policy.PodSecurityPolicy{
|
return &policy.PodSecurityPolicy{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
@ -136,7 +138,7 @@ func TestDefaultContainerSecurityContextNonmutating(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Spec: policy.PodSecurityPolicySpec{
|
Spec: policy.PodSecurityPolicySpec{
|
||||||
AllowPrivilegeEscalation: true,
|
AllowPrivilegeEscalation: &allowPrivilegeEscalation,
|
||||||
RunAsUser: policy.RunAsUserStrategyOptions{
|
RunAsUser: policy.RunAsUserStrategyOptions{
|
||||||
Rule: policy.RunAsUserStrategyRunAsAny,
|
Rule: policy.RunAsUserStrategyRunAsAny,
|
||||||
},
|
},
|
||||||
|
@ -231,7 +233,7 @@ func TestValidatePodSecurityContextFailures(t *testing.T) {
|
||||||
failNilSELinuxPod := defaultPod()
|
failNilSELinuxPod := defaultPod()
|
||||||
failSELinuxPSP := defaultPSP()
|
failSELinuxPSP := defaultPSP()
|
||||||
failSELinuxPSP.Spec.SELinux.Rule = policy.SELinuxStrategyMustRunAs
|
failSELinuxPSP.Spec.SELinux.Rule = policy.SELinuxStrategyMustRunAs
|
||||||
failSELinuxPSP.Spec.SELinux.SELinuxOptions = &api.SELinuxOptions{
|
failSELinuxPSP.Spec.SELinux.SELinuxOptions = &v1.SELinuxOptions{
|
||||||
Level: "foo",
|
Level: "foo",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -497,7 +499,7 @@ func TestValidateContainerFailures(t *testing.T) {
|
||||||
failSELinuxPSP := defaultPSP()
|
failSELinuxPSP := defaultPSP()
|
||||||
failSELinuxPSP.Spec.SELinux = policy.SELinuxStrategyOptions{
|
failSELinuxPSP.Spec.SELinux = policy.SELinuxStrategyOptions{
|
||||||
Rule: policy.SELinuxStrategyMustRunAs,
|
Rule: policy.SELinuxStrategyMustRunAs,
|
||||||
SELinuxOptions: &api.SELinuxOptions{
|
SELinuxOptions: &v1.SELinuxOptions{
|
||||||
Level: "foo",
|
Level: "foo",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -693,7 +695,7 @@ func TestValidatePodSecurityContextSuccess(t *testing.T) {
|
||||||
}
|
}
|
||||||
seLinuxPSP := defaultPSP()
|
seLinuxPSP := defaultPSP()
|
||||||
seLinuxPSP.Spec.SELinux.Rule = policy.SELinuxStrategyMustRunAs
|
seLinuxPSP.Spec.SELinux.Rule = policy.SELinuxStrategyMustRunAs
|
||||||
seLinuxPSP.Spec.SELinux.SELinuxOptions = &api.SELinuxOptions{
|
seLinuxPSP.Spec.SELinux.SELinuxOptions = &v1.SELinuxOptions{
|
||||||
User: "user",
|
User: "user",
|
||||||
Role: "role",
|
Role: "role",
|
||||||
Type: "type",
|
Type: "type",
|
||||||
|
@ -934,7 +936,7 @@ func TestValidateContainerSuccess(t *testing.T) {
|
||||||
seLinuxPSP := defaultPSP()
|
seLinuxPSP := defaultPSP()
|
||||||
seLinuxPSP.Spec.SELinux = policy.SELinuxStrategyOptions{
|
seLinuxPSP.Spec.SELinux = policy.SELinuxStrategyOptions{
|
||||||
Rule: policy.SELinuxStrategyMustRunAs,
|
Rule: policy.SELinuxStrategyMustRunAs,
|
||||||
SELinuxOptions: &api.SELinuxOptions{
|
SELinuxOptions: &v1.SELinuxOptions{
|
||||||
Level: "foo",
|
Level: "foo",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -959,7 +961,7 @@ func TestValidateContainerSuccess(t *testing.T) {
|
||||||
privPod.Spec.Containers[0].SecurityContext.Privileged = &priv
|
privPod.Spec.Containers[0].SecurityContext.Privileged = &priv
|
||||||
|
|
||||||
capsPSP := defaultPSP()
|
capsPSP := defaultPSP()
|
||||||
capsPSP.Spec.AllowedCapabilities = []api.Capability{"foo"}
|
capsPSP.Spec.AllowedCapabilities = []v1.Capability{"foo"}
|
||||||
capsPod := defaultPod()
|
capsPod := defaultPod()
|
||||||
capsPod.Spec.Containers[0].SecurityContext.Capabilities = &api.Capabilities{
|
capsPod.Spec.Containers[0].SecurityContext.Capabilities = &api.Capabilities{
|
||||||
Add: []api.Capability{"foo"},
|
Add: []api.Capability{"foo"},
|
||||||
|
@ -967,7 +969,7 @@ func TestValidateContainerSuccess(t *testing.T) {
|
||||||
|
|
||||||
// pod should be able to request caps that are in the required set even if not specified in the allowed set
|
// pod should be able to request caps that are in the required set even if not specified in the allowed set
|
||||||
requiredCapsPSP := defaultPSP()
|
requiredCapsPSP := defaultPSP()
|
||||||
requiredCapsPSP.Spec.DefaultAddCapabilities = []api.Capability{"foo"}
|
requiredCapsPSP.Spec.DefaultAddCapabilities = []v1.Capability{"foo"}
|
||||||
requiredCapsPod := defaultPod()
|
requiredCapsPod := defaultPod()
|
||||||
requiredCapsPod.Spec.Containers[0].SecurityContext.Capabilities = &api.Capabilities{
|
requiredCapsPod.Spec.Containers[0].SecurityContext.Capabilities = &api.Capabilities{
|
||||||
Add: []api.Capability{"foo"},
|
Add: []api.Capability{"foo"},
|
||||||
|
@ -1165,6 +1167,7 @@ func TestGenerateContainerSecurityContextReadOnlyRootFS(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultPSP() *policy.PodSecurityPolicy {
|
func defaultPSP() *policy.PodSecurityPolicy {
|
||||||
|
allowPrivilegeEscalation := true
|
||||||
return &policy.PodSecurityPolicy{
|
return &policy.PodSecurityPolicy{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "psp-sa",
|
Name: "psp-sa",
|
||||||
|
@ -1186,7 +1189,7 @@ func defaultPSP() *policy.PodSecurityPolicy {
|
||||||
SupplementalGroups: policy.SupplementalGroupsStrategyOptions{
|
SupplementalGroups: policy.SupplementalGroupsStrategyOptions{
|
||||||
Rule: policy.SupplementalGroupsStrategyRunAsAny,
|
Rule: policy.SupplementalGroupsStrategyRunAsAny,
|
||||||
},
|
},
|
||||||
AllowPrivilegeEscalation: true,
|
AllowPrivilegeEscalation: &allowPrivilegeEscalation,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1342,7 +1345,7 @@ func TestAllowPrivilegeEscalation(t *testing.T) {
|
||||||
pod.Spec.Containers[0].SecurityContext.AllowPrivilegeEscalation = test.podAPE
|
pod.Spec.Containers[0].SecurityContext.AllowPrivilegeEscalation = test.podAPE
|
||||||
|
|
||||||
psp := defaultPSP()
|
psp := defaultPSP()
|
||||||
psp.Spec.AllowPrivilegeEscalation = test.pspAPE
|
psp.Spec.AllowPrivilegeEscalation = &test.pspAPE
|
||||||
psp.Spec.DefaultAllowPrivilegeEscalation = test.pspDAPE
|
psp.Spec.DefaultAllowPrivilegeEscalation = test.pspDAPE
|
||||||
|
|
||||||
provider, err := NewSimpleProvider(psp, "namespace", NewSimpleStrategyFactory())
|
provider, err := NewSimpleProvider(psp, "namespace", NewSimpleStrategyFactory())
|
||||||
|
|
|
@ -17,8 +17,9 @@ go_library(
|
||||||
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/selinux",
|
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/selinux",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
"//pkg/apis/core/v1:go_default_library",
|
||||||
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -32,7 +33,9 @@ go_test(
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
"//pkg/apis/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -21,14 +21,15 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
"k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type mustRunAs struct {
|
type mustRunAs struct {
|
||||||
opts *policy.SELinuxStrategyOptions
|
opts *api.SELinuxOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ SELinuxStrategy = &mustRunAs{}
|
var _ SELinuxStrategy = &mustRunAs{}
|
||||||
|
@ -40,14 +41,19 @@ func NewMustRunAs(options *policy.SELinuxStrategyOptions) (SELinuxStrategy, erro
|
||||||
if options.SELinuxOptions == nil {
|
if options.SELinuxOptions == nil {
|
||||||
return nil, fmt.Errorf("MustRunAs requires SELinuxOptions")
|
return nil, fmt.Errorf("MustRunAs requires SELinuxOptions")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internalSELinuxOptions := &api.SELinuxOptions{}
|
||||||
|
if err := v1.Convert_v1_SELinuxOptions_To_core_SELinuxOptions(options.SELinuxOptions, internalSELinuxOptions, nil); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return &mustRunAs{
|
return &mustRunAs{
|
||||||
opts: options,
|
opts: internalSELinuxOptions,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate creates the SELinuxOptions based on constraint rules.
|
// Generate creates the SELinuxOptions based on constraint rules.
|
||||||
func (s *mustRunAs) Generate(_ *api.Pod, _ *api.Container) (*api.SELinuxOptions, error) {
|
func (s *mustRunAs) Generate(_ *api.Pod, _ *api.Container) (*api.SELinuxOptions, error) {
|
||||||
return s.opts.SELinuxOptions, nil
|
return s.opts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate ensures that the specified values fall within the range of the strategy.
|
// Validate ensures that the specified values fall within the range of the strategy.
|
||||||
|
@ -58,20 +64,20 @@ func (s *mustRunAs) Validate(fldPath *field.Path, _ *api.Pod, _ *api.Container,
|
||||||
allErrs = append(allErrs, field.Required(fldPath, ""))
|
allErrs = append(allErrs, field.Required(fldPath, ""))
|
||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
if !equalLevels(s.opts.SELinuxOptions.Level, seLinux.Level) {
|
if !equalLevels(s.opts.Level, seLinux.Level) {
|
||||||
detail := fmt.Sprintf("must be %s", s.opts.SELinuxOptions.Level)
|
detail := fmt.Sprintf("must be %s", s.opts.Level)
|
||||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("level"), seLinux.Level, detail))
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("level"), seLinux.Level, detail))
|
||||||
}
|
}
|
||||||
if seLinux.Role != s.opts.SELinuxOptions.Role {
|
if seLinux.Role != s.opts.Role {
|
||||||
detail := fmt.Sprintf("must be %s", s.opts.SELinuxOptions.Role)
|
detail := fmt.Sprintf("must be %s", s.opts.Role)
|
||||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("role"), seLinux.Role, detail))
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("role"), seLinux.Role, detail))
|
||||||
}
|
}
|
||||||
if seLinux.Type != s.opts.SELinuxOptions.Type {
|
if seLinux.Type != s.opts.Type {
|
||||||
detail := fmt.Sprintf("must be %s", s.opts.SELinuxOptions.Type)
|
detail := fmt.Sprintf("must be %s", s.opts.Type)
|
||||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("type"), seLinux.Type, detail))
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("type"), seLinux.Type, detail))
|
||||||
}
|
}
|
||||||
if seLinux.User != s.opts.SELinuxOptions.User {
|
if seLinux.User != s.opts.User {
|
||||||
detail := fmt.Sprintf("must be %s", s.opts.SELinuxOptions.User)
|
detail := fmt.Sprintf("must be %s", s.opts.User)
|
||||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("user"), seLinux.User, detail))
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("user"), seLinux.User, detail))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,10 @@ limitations under the License.
|
||||||
package selinux
|
package selinux
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
"k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -38,7 +40,7 @@ func TestMustRunAsOptions(t *testing.T) {
|
||||||
pass: false,
|
pass: false,
|
||||||
},
|
},
|
||||||
"valid opts": {
|
"valid opts": {
|
||||||
opts: &policy.SELinuxStrategyOptions{SELinuxOptions: &api.SELinuxOptions{}},
|
opts: &policy.SELinuxStrategyOptions{SELinuxOptions: &corev1.SELinuxOptions{}},
|
||||||
pass: true,
|
pass: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -55,7 +57,7 @@ func TestMustRunAsOptions(t *testing.T) {
|
||||||
|
|
||||||
func TestMustRunAsGenerate(t *testing.T) {
|
func TestMustRunAsGenerate(t *testing.T) {
|
||||||
opts := &policy.SELinuxStrategyOptions{
|
opts := &policy.SELinuxStrategyOptions{
|
||||||
SELinuxOptions: &api.SELinuxOptions{
|
SELinuxOptions: &corev1.SELinuxOptions{
|
||||||
User: "user",
|
User: "user",
|
||||||
Role: "role",
|
Role: "role",
|
||||||
Type: "type",
|
Type: "type",
|
||||||
|
@ -70,14 +72,16 @@ func TestMustRunAsGenerate(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected error generating selinux %v", err)
|
t.Fatalf("unexpected error generating selinux %v", err)
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(generated, opts.SELinuxOptions) {
|
internalSELinuxOptions := &api.SELinuxOptions{}
|
||||||
|
v1.Convert_v1_SELinuxOptions_To_core_SELinuxOptions(opts.SELinuxOptions, internalSELinuxOptions, nil)
|
||||||
|
if !reflect.DeepEqual(generated, internalSELinuxOptions) {
|
||||||
t.Errorf("generated selinux does not equal configured selinux")
|
t.Errorf("generated selinux does not equal configured selinux")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMustRunAsValidate(t *testing.T) {
|
func TestMustRunAsValidate(t *testing.T) {
|
||||||
newValidOpts := func() *api.SELinuxOptions {
|
newValidOpts := func() *corev1.SELinuxOptions {
|
||||||
return &api.SELinuxOptions{
|
return &corev1.SELinuxOptions{
|
||||||
User: "user",
|
User: "user",
|
||||||
Role: "role",
|
Role: "role",
|
||||||
Level: "s0:c0,c6",
|
Level: "s0:c0,c6",
|
||||||
|
@ -85,7 +89,7 @@ func TestMustRunAsValidate(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
newValidOptsWithLevel := func(level string) *api.SELinuxOptions {
|
newValidOptsWithLevel := func(level string) *corev1.SELinuxOptions {
|
||||||
opts := newValidOpts()
|
opts := newValidOpts()
|
||||||
opts.Level = level
|
opts.Level = level
|
||||||
return opts
|
return opts
|
||||||
|
@ -103,8 +107,8 @@ func TestMustRunAsValidate(t *testing.T) {
|
||||||
validOpts := newValidOpts()
|
validOpts := newValidOpts()
|
||||||
|
|
||||||
tests := map[string]struct {
|
tests := map[string]struct {
|
||||||
podSeLinux *api.SELinuxOptions
|
podSeLinux *corev1.SELinuxOptions
|
||||||
pspSeLinux *api.SELinuxOptions
|
pspSeLinux *corev1.SELinuxOptions
|
||||||
expectedMsg string
|
expectedMsg string
|
||||||
}{
|
}{
|
||||||
"invalid role": {
|
"invalid role": {
|
||||||
|
@ -154,7 +158,9 @@ func TestMustRunAsValidate(t *testing.T) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
errs := mustRunAs.Validate(nil, nil, nil, tc.podSeLinux)
|
internalSELinuxOptions := api.SELinuxOptions{}
|
||||||
|
v1.Convert_v1_SELinuxOptions_To_core_SELinuxOptions(tc.podSeLinux, &internalSELinuxOptions, nil)
|
||||||
|
errs := mustRunAs.Validate(nil, nil, nil, &internalSELinuxOptions)
|
||||||
//should've passed but didn't
|
//should've passed but didn't
|
||||||
if len(tc.expectedMsg) == 0 && len(errs) > 0 {
|
if len(tc.expectedMsg) == 0 && len(errs) > 0 {
|
||||||
t.Errorf("%s expected no errors but received %v", name, errs)
|
t.Errorf("%s expected no errors but received %v", name, errs)
|
||||||
|
|
|
@ -17,9 +17,9 @@ limitations under the License.
|
||||||
package selinux
|
package selinux
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// runAsAny implements the SELinuxStrategy interface.
|
// runAsAny implements the SELinuxStrategy interface.
|
||||||
|
|
|
@ -17,8 +17,8 @@ limitations under the License.
|
||||||
package selinux
|
package selinux
|
||||||
|
|
||||||
import (
|
import (
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ func TestRunAsAnyGenerate(t *testing.T) {
|
||||||
|
|
||||||
func TestRunAsAnyValidate(t *testing.T) {
|
func TestRunAsAnyValidate(t *testing.T) {
|
||||||
s, err := NewRunAsAny(&policy.SELinuxStrategyOptions{
|
s, err := NewRunAsAny(&policy.SELinuxStrategyOptions{
|
||||||
SELinuxOptions: &api.SELinuxOptions{
|
SELinuxOptions: &corev1.SELinuxOptions{
|
||||||
Level: "foo",
|
Level: "foo",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -17,9 +17,9 @@ limitations under the License.
|
||||||
package podsecuritypolicy
|
package podsecuritypolicy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/apparmor"
|
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/apparmor"
|
||||||
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities"
|
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities"
|
||||||
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/group"
|
"k8s.io/kubernetes/pkg/security/podsecuritypolicy/group"
|
||||||
|
|
|
@ -18,8 +18,8 @@ go_library(
|
||||||
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/user",
|
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/user",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
|
||||||
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -34,7 +34,8 @@ go_test(
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -19,9 +19,9 @@ package user
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
psputil "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
psputil "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,8 @@ limitations under the License.
|
||||||
package user
|
package user
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
|
@ -17,9 +17,9 @@ limitations under the License.
|
||||||
package user
|
package user
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type nonRoot struct{}
|
type nonRoot struct{}
|
||||||
|
|
|
@ -17,8 +17,8 @@ limitations under the License.
|
||||||
package user
|
package user
|
||||||
|
|
||||||
import (
|
import (
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/api/core/v1"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,9 @@ limitations under the License.
|
||||||
package user
|
package user
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// runAsAny implements the interface RunAsUserStrategy.
|
// runAsAny implements the interface RunAsUserStrategy.
|
||||||
|
|
|
@ -19,7 +19,7 @@ package user
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestRunAsAnyOptions(t *testing.T) {
|
func TestRunAsAnyOptions(t *testing.T) {
|
||||||
|
|
|
@ -15,7 +15,7 @@ go_library(
|
||||||
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util",
|
importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -26,7 +26,7 @@ go_test(
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -20,9 +20,9 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -20,8 +20,8 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// TestVolumeSourceFSTypeDrift ensures that for every known type of volume source (by the fields on
|
// TestVolumeSourceFSTypeDrift ensures that for every known type of volume source (by the fields on
|
||||||
|
|
|
@ -14,13 +14,11 @@ go_library(
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/extensions:go_default_library",
|
"//pkg/apis/extensions:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
"//pkg/apis/policy:go_default_library",
|
||||||
"//pkg/client/informers/informers_generated/internalversion:go_default_library",
|
|
||||||
"//pkg/client/listers/policy/internalversion:go_default_library",
|
|
||||||
"//pkg/kubeapiserver/admission:go_default_library",
|
|
||||||
"//pkg/registry/rbac:go_default_library",
|
"//pkg/registry/rbac:go_default_library",
|
||||||
"//pkg/security/podsecuritypolicy:go_default_library",
|
"//pkg/security/podsecuritypolicy:go_default_library",
|
||||||
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
||||||
"//pkg/serviceaccount:go_default_library",
|
"//pkg/serviceaccount:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
|
@ -28,6 +26,8 @@ go_library(
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/listers/policy/v1beta1:go_default_library",
|
||||||
"//vendor/github.com/golang/glog:go_default_library",
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -39,14 +39,14 @@ go_test(
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/api/legacyscheme:go_default_library",
|
"//pkg/api/legacyscheme:go_default_library",
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
"//pkg/apis/core/v1:go_default_library",
|
||||||
"//pkg/client/informers/informers_generated/internalversion:go_default_library",
|
|
||||||
"//pkg/controller:go_default_library",
|
"//pkg/controller:go_default_library",
|
||||||
"//pkg/security/apparmor:go_default_library",
|
"//pkg/security/apparmor:go_default_library",
|
||||||
"//pkg/security/podsecuritypolicy:go_default_library",
|
"//pkg/security/podsecuritypolicy:go_default_library",
|
||||||
"//pkg/security/podsecuritypolicy/seccomp:go_default_library",
|
"//pkg/security/podsecuritypolicy/seccomp:go_default_library",
|
||||||
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
"//pkg/security/podsecuritypolicy/util:go_default_library",
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library",
|
||||||
|
@ -55,6 +55,7 @@ go_test(
|
||||||
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
"//vendor/k8s.io/utils/pointer:go_default_library",
|
"//vendor/k8s.io/utils/pointer:go_default_library",
|
||||||
],
|
],
|
||||||
|
|
|
@ -24,6 +24,7 @@ import (
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
|
|
||||||
|
policyv1beta1 "k8s.io/api/policy/v1beta1"
|
||||||
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
|
@ -31,12 +32,11 @@ import (
|
||||||
genericadmissioninit "k8s.io/apiserver/pkg/admission/initializer"
|
genericadmissioninit "k8s.io/apiserver/pkg/admission/initializer"
|
||||||
"k8s.io/apiserver/pkg/authentication/user"
|
"k8s.io/apiserver/pkg/authentication/user"
|
||||||
"k8s.io/apiserver/pkg/authorization/authorizer"
|
"k8s.io/apiserver/pkg/authorization/authorizer"
|
||||||
|
"k8s.io/client-go/informers"
|
||||||
|
policylisters "k8s.io/client-go/listers/policy/v1beta1"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
"k8s.io/kubernetes/pkg/apis/policy"
|
||||||
informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion"
|
|
||||||
policylisters "k8s.io/kubernetes/pkg/client/listers/policy/internalversion"
|
|
||||||
kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission"
|
|
||||||
rbacregistry "k8s.io/kubernetes/pkg/registry/rbac"
|
rbacregistry "k8s.io/kubernetes/pkg/registry/rbac"
|
||||||
psp "k8s.io/kubernetes/pkg/security/podsecuritypolicy"
|
psp "k8s.io/kubernetes/pkg/security/podsecuritypolicy"
|
||||||
psputil "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
psputil "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util"
|
||||||
|
@ -83,7 +83,7 @@ func (plugin *PodSecurityPolicyPlugin) ValidateInitialization() error {
|
||||||
var _ admission.MutationInterface = &PodSecurityPolicyPlugin{}
|
var _ admission.MutationInterface = &PodSecurityPolicyPlugin{}
|
||||||
var _ admission.ValidationInterface = &PodSecurityPolicyPlugin{}
|
var _ admission.ValidationInterface = &PodSecurityPolicyPlugin{}
|
||||||
var _ genericadmissioninit.WantsAuthorizer = &PodSecurityPolicyPlugin{}
|
var _ genericadmissioninit.WantsAuthorizer = &PodSecurityPolicyPlugin{}
|
||||||
var _ kubeapiserveradmission.WantsInternalKubeInformerFactory = &PodSecurityPolicyPlugin{}
|
var _ genericadmissioninit.WantsExternalKubeInformerFactory = &PodSecurityPolicyPlugin{}
|
||||||
var auditKeyPrefix = strings.ToLower(PluginName) + "." + policy.GroupName + ".k8s.io"
|
var auditKeyPrefix = strings.ToLower(PluginName) + "." + policy.GroupName + ".k8s.io"
|
||||||
|
|
||||||
// newPlugin creates a new PSP admission plugin.
|
// newPlugin creates a new PSP admission plugin.
|
||||||
|
@ -95,8 +95,8 @@ func newPlugin(strategyFactory psp.StrategyFactory, failOnNoPolicies bool) *PodS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *PodSecurityPolicyPlugin) SetInternalKubeInformerFactory(f informers.SharedInformerFactory) {
|
func (a *PodSecurityPolicyPlugin) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) {
|
||||||
podSecurityPolicyInformer := f.Policy().InternalVersion().PodSecurityPolicies()
|
podSecurityPolicyInformer := f.Policy().V1beta1().PodSecurityPolicies()
|
||||||
a.lister = podSecurityPolicyInformer.Lister()
|
a.lister = podSecurityPolicyInformer.Lister()
|
||||||
a.SetReadyFunc(podSecurityPolicyInformer.Informer().HasSynced)
|
a.SetReadyFunc(podSecurityPolicyInformer.Informer().HasSynced)
|
||||||
}
|
}
|
||||||
|
@ -338,7 +338,7 @@ func assignSecurityContext(provider psp.Provider, pod *api.Pod) field.ErrorList
|
||||||
}
|
}
|
||||||
|
|
||||||
// createProvidersFromPolicies creates providers from the constraints supplied.
|
// createProvidersFromPolicies creates providers from the constraints supplied.
|
||||||
func (c *PodSecurityPolicyPlugin) createProvidersFromPolicies(psps []*policy.PodSecurityPolicy, namespace string) ([]psp.Provider, []error) {
|
func (c *PodSecurityPolicyPlugin) createProvidersFromPolicies(psps []*policyv1beta1.PodSecurityPolicy, namespace string) ([]psp.Provider, []error) {
|
||||||
var (
|
var (
|
||||||
// collected providers
|
// collected providers
|
||||||
providers []psp.Provider
|
providers []psp.Provider
|
||||||
|
|
|
@ -25,6 +25,7 @@ import (
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
|
policy "k8s.io/api/policy/v1beta1"
|
||||||
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/diff"
|
"k8s.io/apimachinery/pkg/util/diff"
|
||||||
|
@ -33,10 +34,10 @@ import (
|
||||||
"k8s.io/apiserver/pkg/authentication/user"
|
"k8s.io/apiserver/pkg/authentication/user"
|
||||||
"k8s.io/apiserver/pkg/authorization/authorizer"
|
"k8s.io/apiserver/pkg/authorization/authorizer"
|
||||||
"k8s.io/apiserver/pkg/authorization/authorizerfactory"
|
"k8s.io/apiserver/pkg/authorization/authorizerfactory"
|
||||||
|
"k8s.io/client-go/informers"
|
||||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||||
kapi "k8s.io/kubernetes/pkg/apis/core"
|
kapi "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
informers "k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion"
|
|
||||||
"k8s.io/kubernetes/pkg/controller"
|
"k8s.io/kubernetes/pkg/controller"
|
||||||
"k8s.io/kubernetes/pkg/security/apparmor"
|
"k8s.io/kubernetes/pkg/security/apparmor"
|
||||||
kpsp "k8s.io/kubernetes/pkg/security/podsecuritypolicy"
|
kpsp "k8s.io/kubernetes/pkg/security/podsecuritypolicy"
|
||||||
|
@ -50,11 +51,11 @@ const defaultContainerName = "test-c"
|
||||||
// NewTestAdmission provides an admission plugin with test implementations of internal structs.
|
// NewTestAdmission provides an admission plugin with test implementations of internal structs.
|
||||||
func NewTestAdmission(psps []*policy.PodSecurityPolicy, authz authorizer.Authorizer) *PodSecurityPolicyPlugin {
|
func NewTestAdmission(psps []*policy.PodSecurityPolicy, authz authorizer.Authorizer) *PodSecurityPolicyPlugin {
|
||||||
informerFactory := informers.NewSharedInformerFactory(nil, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(nil, controller.NoResyncPeriodFunc())
|
||||||
store := informerFactory.Policy().InternalVersion().PodSecurityPolicies().Informer().GetStore()
|
store := informerFactory.Policy().V1beta1().PodSecurityPolicies().Informer().GetStore()
|
||||||
for _, psp := range psps {
|
for _, psp := range psps {
|
||||||
store.Add(psp)
|
store.Add(psp)
|
||||||
}
|
}
|
||||||
lister := informerFactory.Policy().InternalVersion().PodSecurityPolicies().Lister()
|
lister := informerFactory.Policy().V1beta1().PodSecurityPolicies().Lister()
|
||||||
if authz == nil {
|
if authz == nil {
|
||||||
authz = &TestAuthorizer{}
|
authz = &TestAuthorizer{}
|
||||||
}
|
}
|
||||||
|
@ -502,19 +503,19 @@ func TestAdmitCaps(t *testing.T) {
|
||||||
|
|
||||||
allowsFooInAllowed := restrictivePSP()
|
allowsFooInAllowed := restrictivePSP()
|
||||||
allowsFooInAllowed.Name = "allowCapInAllowed"
|
allowsFooInAllowed.Name = "allowCapInAllowed"
|
||||||
allowsFooInAllowed.Spec.AllowedCapabilities = []kapi.Capability{"foo"}
|
allowsFooInAllowed.Spec.AllowedCapabilities = []v1.Capability{"foo"}
|
||||||
|
|
||||||
allowsFooInRequired := restrictivePSP()
|
allowsFooInRequired := restrictivePSP()
|
||||||
allowsFooInRequired.Name = "allowCapInRequired"
|
allowsFooInRequired.Name = "allowCapInRequired"
|
||||||
allowsFooInRequired.Spec.DefaultAddCapabilities = []kapi.Capability{"foo"}
|
allowsFooInRequired.Spec.DefaultAddCapabilities = []v1.Capability{"foo"}
|
||||||
|
|
||||||
requiresFooToBeDropped := restrictivePSP()
|
requiresFooToBeDropped := restrictivePSP()
|
||||||
requiresFooToBeDropped.Name = "requireDrop"
|
requiresFooToBeDropped.Name = "requireDrop"
|
||||||
requiresFooToBeDropped.Spec.RequiredDropCapabilities = []kapi.Capability{"foo"}
|
requiresFooToBeDropped.Spec.RequiredDropCapabilities = []v1.Capability{"foo"}
|
||||||
|
|
||||||
allowAllInAllowed := restrictivePSP()
|
allowAllInAllowed := restrictivePSP()
|
||||||
allowAllInAllowed.Name = "allowAllCapsInAllowed"
|
allowAllInAllowed.Name = "allowAllCapsInAllowed"
|
||||||
allowAllInAllowed.Spec.AllowedCapabilities = []kapi.Capability{policy.AllowAllCapabilities}
|
allowAllInAllowed.Spec.AllowedCapabilities = []v1.Capability{policy.AllowAllCapabilities}
|
||||||
|
|
||||||
tc := map[string]struct {
|
tc := map[string]struct {
|
||||||
pod *kapi.Pod
|
pod *kapi.Pod
|
||||||
|
@ -959,12 +960,18 @@ func TestAdmitSELinux(t *testing.T) {
|
||||||
mustRunAs := permissivePSP()
|
mustRunAs := permissivePSP()
|
||||||
mustRunAs.Name = "mustRunAs"
|
mustRunAs.Name = "mustRunAs"
|
||||||
mustRunAs.Spec.SELinux.Rule = policy.SELinuxStrategyMustRunAs
|
mustRunAs.Spec.SELinux.Rule = policy.SELinuxStrategyMustRunAs
|
||||||
mustRunAs.Spec.SELinux.SELinuxOptions = &kapi.SELinuxOptions{}
|
mustRunAs.Spec.SELinux.SELinuxOptions = &v1.SELinuxOptions{}
|
||||||
mustRunAs.Spec.SELinux.SELinuxOptions.Level = "level"
|
mustRunAs.Spec.SELinux.SELinuxOptions.Level = "level"
|
||||||
mustRunAs.Spec.SELinux.SELinuxOptions.Role = "role"
|
mustRunAs.Spec.SELinux.SELinuxOptions.Role = "role"
|
||||||
mustRunAs.Spec.SELinux.SELinuxOptions.Type = "type"
|
mustRunAs.Spec.SELinux.SELinuxOptions.Type = "type"
|
||||||
mustRunAs.Spec.SELinux.SELinuxOptions.User = "user"
|
mustRunAs.Spec.SELinux.SELinuxOptions.User = "user"
|
||||||
|
|
||||||
|
getInternalSEOptions := func(policy *policy.PodSecurityPolicy) *kapi.SELinuxOptions {
|
||||||
|
opt := kapi.SELinuxOptions{}
|
||||||
|
k8s_api_v1.Convert_v1_SELinuxOptions_To_core_SELinuxOptions(policy.Spec.SELinux.SELinuxOptions, &opt, nil)
|
||||||
|
return &opt
|
||||||
|
}
|
||||||
|
|
||||||
tests := map[string]struct {
|
tests := map[string]struct {
|
||||||
pod *kapi.Pod
|
pod *kapi.Pod
|
||||||
psps []*policy.PodSecurityPolicy
|
psps []*policy.PodSecurityPolicy
|
||||||
|
@ -1047,7 +1054,7 @@ func TestAdmitSELinux(t *testing.T) {
|
||||||
psps: []*policy.PodSecurityPolicy{mustRunAs},
|
psps: []*policy.PodSecurityPolicy{mustRunAs},
|
||||||
shouldPassAdmit: true,
|
shouldPassAdmit: true,
|
||||||
shouldPassValidate: true,
|
shouldPassValidate: true,
|
||||||
expectedPodSC: &kapi.PodSecurityContext{SELinuxOptions: mustRunAs.Spec.SELinux.SELinuxOptions},
|
expectedPodSC: &kapi.PodSecurityContext{SELinuxOptions: getInternalSEOptions(mustRunAs)},
|
||||||
expectedContainerSC: nil,
|
expectedContainerSC: nil,
|
||||||
expectedPSP: mustRunAs.Name,
|
expectedPSP: mustRunAs.Name,
|
||||||
},
|
},
|
||||||
|
@ -1059,7 +1066,7 @@ func TestAdmitSELinux(t *testing.T) {
|
||||||
psps: []*policy.PodSecurityPolicy{mustRunAs},
|
psps: []*policy.PodSecurityPolicy{mustRunAs},
|
||||||
shouldPassAdmit: true,
|
shouldPassAdmit: true,
|
||||||
shouldPassValidate: true,
|
shouldPassValidate: true,
|
||||||
expectedPodSC: &kapi.PodSecurityContext{SELinuxOptions: mustRunAs.Spec.SELinux.SELinuxOptions},
|
expectedPodSC: &kapi.PodSecurityContext{SELinuxOptions: getInternalSEOptions(mustRunAs)},
|
||||||
expectedContainerSC: nil,
|
expectedContainerSC: nil,
|
||||||
expectedPSP: mustRunAs.Name,
|
expectedPSP: mustRunAs.Name,
|
||||||
},
|
},
|
||||||
|
@ -1071,7 +1078,7 @@ func TestAdmitSELinux(t *testing.T) {
|
||||||
psps: []*policy.PodSecurityPolicy{mustRunAs},
|
psps: []*policy.PodSecurityPolicy{mustRunAs},
|
||||||
shouldPassAdmit: true,
|
shouldPassAdmit: true,
|
||||||
shouldPassValidate: true,
|
shouldPassValidate: true,
|
||||||
expectedPodSC: &kapi.PodSecurityContext{SELinuxOptions: mustRunAs.Spec.SELinux.SELinuxOptions},
|
expectedPodSC: &kapi.PodSecurityContext{SELinuxOptions: getInternalSEOptions(mustRunAs)},
|
||||||
expectedContainerSC: nil,
|
expectedContainerSC: nil,
|
||||||
expectedPSP: mustRunAs.Name,
|
expectedPSP: mustRunAs.Name,
|
||||||
},
|
},
|
||||||
|
@ -2337,12 +2344,14 @@ func TestPreferValidatedPSP(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func restrictivePSP() *policy.PodSecurityPolicy {
|
func restrictivePSP() *policy.PodSecurityPolicy {
|
||||||
|
allowPrivilegeEscalation := false
|
||||||
return &policy.PodSecurityPolicy{
|
return &policy.PodSecurityPolicy{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "restrictive",
|
Name: "restrictive",
|
||||||
Annotations: map[string]string{},
|
Annotations: map[string]string{},
|
||||||
},
|
},
|
||||||
Spec: policy.PodSecurityPolicySpec{
|
Spec: policy.PodSecurityPolicySpec{
|
||||||
|
AllowPrivilegeEscalation: &allowPrivilegeEscalation,
|
||||||
RunAsUser: policy.RunAsUserStrategyOptions{
|
RunAsUser: policy.RunAsUserStrategyOptions{
|
||||||
Rule: policy.RunAsUserStrategyMustRunAs,
|
Rule: policy.RunAsUserStrategyMustRunAs,
|
||||||
Ranges: []policy.IDRange{
|
Ranges: []policy.IDRange{
|
||||||
|
@ -2357,7 +2366,7 @@ func restrictivePSP() *policy.PodSecurityPolicy {
|
||||||
},
|
},
|
||||||
SELinux: policy.SELinuxStrategyOptions{
|
SELinux: policy.SELinuxStrategyOptions{
|
||||||
Rule: policy.SELinuxStrategyMustRunAs,
|
Rule: policy.SELinuxStrategyMustRunAs,
|
||||||
SELinuxOptions: &kapi.SELinuxOptions{
|
SELinuxOptions: &v1.SELinuxOptions{
|
||||||
Level: "s9:z0,z1",
|
Level: "s9:z0,z1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -2378,19 +2387,20 @@ func restrictivePSP() *policy.PodSecurityPolicy {
|
||||||
}
|
}
|
||||||
|
|
||||||
func permissivePSP() *policy.PodSecurityPolicy {
|
func permissivePSP() *policy.PodSecurityPolicy {
|
||||||
|
allowPrivilegeEscalation := true
|
||||||
return &policy.PodSecurityPolicy{
|
return &policy.PodSecurityPolicy{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "privileged",
|
Name: "privileged",
|
||||||
Annotations: map[string]string{},
|
Annotations: map[string]string{},
|
||||||
},
|
},
|
||||||
Spec: policy.PodSecurityPolicySpec{
|
Spec: policy.PodSecurityPolicySpec{
|
||||||
AllowPrivilegeEscalation: true,
|
AllowPrivilegeEscalation: &allowPrivilegeEscalation,
|
||||||
HostIPC: true,
|
HostIPC: true,
|
||||||
HostNetwork: true,
|
HostNetwork: true,
|
||||||
HostPID: true,
|
HostPID: true,
|
||||||
HostPorts: []policy.HostPortRange{{Min: 0, Max: 65536}},
|
HostPorts: []policy.HostPortRange{{Min: 0, Max: 65536}},
|
||||||
Volumes: []policy.FSType{policy.All},
|
Volumes: []policy.FSType{policy.All},
|
||||||
AllowedCapabilities: []kapi.Capability{policy.AllowAllCapabilities},
|
AllowedCapabilities: []v1.Capability{policy.AllowAllCapabilities},
|
||||||
RunAsUser: policy.RunAsUserStrategyOptions{
|
RunAsUser: policy.RunAsUserStrategyOptions{
|
||||||
Rule: policy.RunAsUserStrategyRunAsAny,
|
Rule: policy.RunAsUserStrategyRunAsAny,
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue