2015-10-15 13:45:16 -04:00
/ *
2016-06-02 20:25:58 -04:00
Copyright 2015 The Kubernetes Authors .
2015-10-15 13:45:16 -04:00
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
/ * This test check that SecurityContext parameters specified at the
* pod or the container level work as intended . These tests cannot be
2016-10-13 17:29:50 -04:00
* run when the ' SecurityContextDeny ' admission controller is not used
2015-10-15 13:45:16 -04:00
* so they are skipped by default .
* /
2017-07-13 18:18:52 -04:00
package node
2015-10-15 13:45:16 -04:00
import (
2020-02-07 21:16:47 -05:00
"context"
2015-10-20 14:03:32 -04:00
"fmt"
2020-02-13 22:10:25 -05:00
v1 "k8s.io/api/core/v1"
2017-01-11 09:09:48 -05:00
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2017-01-24 09:35:22 -05:00
"k8s.io/apimachinery/pkg/util/uuid"
2016-04-07 13:21:31 -04:00
"k8s.io/kubernetes/test/e2e/framework"
2019-11-21 22:32:00 -05:00
e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl"
2019-05-07 20:09:50 -04:00
e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2e: adapt to moved code
This is the result of automatically editing source files like this:
go install golang.org/x/tools/cmd/goimports@latest
find ./test/e2e* -name "*.go" | xargs env PATH=$GOPATH/bin:$PATH ./e2e-framework-sed.sh
with e2e-framework-sed.sh containing this:
sed -i \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecCommandInContainer(/e2epod.ExecCommandInContainer(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecCommandInContainerWithFullOutput(/e2epod.ExecCommandInContainerWithFullOutput(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecShellInContainer(/e2epod.ExecShellInContainer(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecShellInPod(/e2epod.ExecShellInPod(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecShellInPodWithFullOutput(/e2epod.ExecShellInPodWithFullOutput(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecWithOptions(/e2epod.ExecWithOptions(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.MatchContainerOutput(/e2eoutput.MatchContainerOutput(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.PodClient(/e2epod.NewPodClient(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.PodClientNS(/e2epod.PodClientNS(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.TestContainerOutput(/e2eoutput.TestContainerOutput(\1, /" \
-e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.TestContainerOutputRegexp(/e2eoutput.TestContainerOutputRegexp(\1, /" \
-e "s/framework.AddOrUpdateLabelOnNode\b/e2enode.AddOrUpdateLabelOnNode/" \
-e "s/framework.AllNodes\b/e2edebug.AllNodes/" \
-e "s/framework.AllNodesReady\b/e2enode.AllNodesReady/" \
-e "s/framework.ContainerResourceGatherer\b/e2edebug.ContainerResourceGatherer/" \
-e "s/framework.ContainerResourceUsage\b/e2edebug.ContainerResourceUsage/" \
-e "s/framework.CreateEmptyFileOnPod\b/e2eoutput.CreateEmptyFileOnPod/" \
-e "s/framework.DefaultPodDeletionTimeout\b/e2epod.DefaultPodDeletionTimeout/" \
-e "s/framework.DumpAllNamespaceInfo\b/e2edebug.DumpAllNamespaceInfo/" \
-e "s/framework.DumpDebugInfo\b/e2eoutput.DumpDebugInfo/" \
-e "s/framework.DumpNodeDebugInfo\b/e2edebug.DumpNodeDebugInfo/" \
-e "s/framework.EtcdUpgrade\b/e2eproviders.EtcdUpgrade/" \
-e "s/framework.EventsLister\b/e2edebug.EventsLister/" \
-e "s/framework.ExecOptions\b/e2epod.ExecOptions/" \
-e "s/framework.ExpectNodeHasLabel\b/e2enode.ExpectNodeHasLabel/" \
-e "s/framework.ExpectNodeHasTaint\b/e2enode.ExpectNodeHasTaint/" \
-e "s/framework.GCEUpgradeScript\b/e2eproviders.GCEUpgradeScript/" \
-e "s/framework.ImagePrePullList\b/e2epod.ImagePrePullList/" \
-e "s/framework.KubectlBuilder\b/e2ekubectl.KubectlBuilder/" \
-e "s/framework.LocationParamGKE\b/e2eproviders.LocationParamGKE/" \
-e "s/framework.LogSizeDataTimeseries\b/e2edebug.LogSizeDataTimeseries/" \
-e "s/framework.LogSizeGatherer\b/e2edebug.LogSizeGatherer/" \
-e "s/framework.LogsSizeData\b/e2edebug.LogsSizeData/" \
-e "s/framework.LogsSizeDataSummary\b/e2edebug.LogsSizeDataSummary/" \
-e "s/framework.LogsSizeVerifier\b/e2edebug.LogsSizeVerifier/" \
-e "s/framework.LookForStringInLog\b/e2eoutput.LookForStringInLog/" \
-e "s/framework.LookForStringInPodExec\b/e2eoutput.LookForStringInPodExec/" \
-e "s/framework.LookForStringInPodExecToContainer\b/e2eoutput.LookForStringInPodExecToContainer/" \
-e "s/framework.MasterAndDNSNodes\b/e2edebug.MasterAndDNSNodes/" \
-e "s/framework.MasterNodes\b/e2edebug.MasterNodes/" \
-e "s/framework.MasterUpgradeGKE\b/e2eproviders.MasterUpgradeGKE/" \
-e "s/framework.NewKubectlCommand\b/e2ekubectl.NewKubectlCommand/" \
-e "s/framework.NewLogsVerifier\b/e2edebug.NewLogsVerifier/" \
-e "s/framework.NewNodeKiller\b/e2enode.NewNodeKiller/" \
-e "s/framework.NewResourceUsageGatherer\b/e2edebug.NewResourceUsageGatherer/" \
-e "s/framework.NodeHasTaint\b/e2enode.NodeHasTaint/" \
-e "s/framework.NodeKiller\b/e2enode.NodeKiller/" \
-e "s/framework.NodesSet\b/e2edebug.NodesSet/" \
-e "s/framework.PodClient\b/e2epod.PodClient/" \
-e "s/framework.RemoveLabelOffNode\b/e2enode.RemoveLabelOffNode/" \
-e "s/framework.ResourceConstraint\b/e2edebug.ResourceConstraint/" \
-e "s/framework.ResourceGathererOptions\b/e2edebug.ResourceGathererOptions/" \
-e "s/framework.ResourceUsagePerContainer\b/e2edebug.ResourceUsagePerContainer/" \
-e "s/framework.ResourceUsageSummary\b/e2edebug.ResourceUsageSummary/" \
-e "s/framework.RunHostCmd\b/e2eoutput.RunHostCmd/" \
-e "s/framework.RunHostCmdOrDie\b/e2eoutput.RunHostCmdOrDie/" \
-e "s/framework.RunHostCmdWithFullOutput\b/e2eoutput.RunHostCmdWithFullOutput/" \
-e "s/framework.RunHostCmdWithRetries\b/e2eoutput.RunHostCmdWithRetries/" \
-e "s/framework.RunKubectl\b/e2ekubectl.RunKubectl/" \
-e "s/framework.RunKubectlInput\b/e2ekubectl.RunKubectlInput/" \
-e "s/framework.RunKubectlOrDie\b/e2ekubectl.RunKubectlOrDie/" \
-e "s/framework.RunKubectlOrDieInput\b/e2ekubectl.RunKubectlOrDieInput/" \
-e "s/framework.RunKubectlWithFullOutput\b/e2ekubectl.RunKubectlWithFullOutput/" \
-e "s/framework.RunKubemciCmd\b/e2ekubectl.RunKubemciCmd/" \
-e "s/framework.RunKubemciWithKubeconfig\b/e2ekubectl.RunKubemciWithKubeconfig/" \
-e "s/framework.SingleContainerSummary\b/e2edebug.SingleContainerSummary/" \
-e "s/framework.SingleLogSummary\b/e2edebug.SingleLogSummary/" \
-e "s/framework.TimestampedSize\b/e2edebug.TimestampedSize/" \
-e "s/framework.WaitForAllNodesSchedulable\b/e2enode.WaitForAllNodesSchedulable/" \
-e "s/framework.WaitForSSHTunnels\b/e2enode.WaitForSSHTunnels/" \
-e "s/framework.WorkItem\b/e2edebug.WorkItem/" \
"$@"
for i in "$@"; do
# Import all sub packages and let goimports figure out which of those
# are redundant (= already imported) or not needed.
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2edebug "k8s.io/kubernetes/test/e2e/framework/debug"' "$i"
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl"' "$i"
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2enode "k8s.io/kubernetes/test/e2e/framework/node"' "$i"
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2eoutput "k8s.io/kubernetes/test/e2e/framework/pod/output"' "$i"
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2epod "k8s.io/kubernetes/test/e2e/framework/pod"' "$i"
sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2eproviders "k8s.io/kubernetes/test/e2e/framework/providers"' "$i"
goimports -w "$i"
done
2022-09-08 10:04:17 -04:00
e2eoutput "k8s.io/kubernetes/test/e2e/framework/pod/output"
2018-08-06 21:18:35 -04:00
imageutils "k8s.io/kubernetes/test/utils/image"
2022-01-30 07:37:24 -05:00
admissionapi "k8s.io/pod-security-admission/api"
2015-10-15 13:45:16 -04:00
2022-03-29 02:12:12 -04:00
"github.com/onsi/ginkgo/v2"
2019-05-10 00:32:08 -04:00
"github.com/onsi/gomega"
2015-10-15 13:45:16 -04:00
)
2023-08-10 03:51:03 -04:00
// SeccompProcStatusField is the field of /proc/$PID/status referencing the seccomp filter type.
const SeccompProcStatusField = "Seccomp:"
// ProcSelfStatusPath is the path to /proc/self/status.
const ProcSelfStatusPath = "/proc/self/status"
2016-11-18 15:55:17 -05:00
func scTestPod ( hostIPC bool , hostPID bool ) * v1 . Pod {
2016-07-26 11:13:18 -04:00
podName := "security-context-" + string ( uuid . NewUUID ( ) )
2016-11-18 15:55:17 -05:00
pod := & v1 . Pod {
2017-01-16 22:38:19 -05:00
ObjectMeta : metav1 . ObjectMeta {
2016-06-06 08:05:26 -04:00
Name : podName ,
Labels : map [ string ] string { "name" : podName } ,
Annotations : map [ string ] string { } ,
2015-10-15 13:45:16 -04:00
} ,
2016-11-18 15:55:17 -05:00
Spec : v1 . PodSpec {
HostIPC : hostIPC ,
HostPID : hostPID ,
SecurityContext : & v1 . PodSecurityContext { } ,
Containers : [ ] v1 . Container {
2015-10-15 13:45:16 -04:00
{
Name : "test-container" ,
2018-08-06 21:18:35 -04:00
Image : imageutils . GetE2EImage ( imageutils . BusyBox ) ,
2015-10-15 13:45:16 -04:00
} ,
} ,
2016-11-18 15:55:17 -05:00
RestartPolicy : v1 . RestartPolicyNever ,
2015-10-15 13:45:16 -04:00
} ,
}
return pod
}
2019-01-17 00:45:14 -05:00
var _ = SIGDescribe ( "Security Context" , func ( ) {
2016-04-07 13:21:31 -04:00
f := framework . NewDefaultFramework ( "security-context" )
2023-05-10 09:38:10 -04:00
f . NamespacePodSecurityLevel = admissionapi . LevelPrivileged
2015-10-15 13:45:16 -04:00
2022-10-17 08:47:15 -04:00
ginkgo . It ( "should support pod.Spec.SecurityContext.SupplementalGroups [LinuxOnly]" , func ( ctx context . Context ) {
2015-10-07 15:19:06 -04:00
pod := scTestPod ( false , false )
2015-10-15 13:45:16 -04:00
pod . Spec . Containers [ 0 ] . Command = [ ] string { "id" , "-G" }
2017-06-21 03:13:36 -04:00
pod . Spec . SecurityContext . SupplementalGroups = [ ] int64 { 1234 , 5678 }
2015-10-15 13:45:16 -04:00
groups := [ ] string { "1234" , "5678" }
2022-12-12 04:11:10 -05:00
e2eoutput . TestContainerOutput ( ctx , f , "pod.Spec.SecurityContext.SupplementalGroups" , pod , 0 , groups )
2015-10-15 13:45:16 -04:00
} )
2022-10-13 04:04:30 -04:00
ginkgo . When ( "if the container's primary UID belongs to some groups in the image [LinuxOnly]" , func ( ) {
2022-10-17 08:47:15 -04:00
ginkgo . It ( "should add pod.Spec.SecurityContext.SupplementalGroups to them [LinuxOnly] in resultant supplementary groups for the container processes" , func ( ctx context . Context ) {
2022-10-13 04:04:30 -04:00
uidInImage := int64 ( 1000 )
gidDefinedInImage := int64 ( 50000 )
supplementalGroup := int64 ( 60000 )
agnhost := imageutils . GetConfig ( imageutils . Agnhost )
pod := scTestPod ( false , false )
pod . Spec . Containers [ 0 ] . Image = agnhost . GetE2EImage ( )
pod . Spec . Containers [ 0 ] . Command = [ ] string { "id" , "-G" }
pod . Spec . SecurityContext . SupplementalGroups = [ ] int64 { int64 ( supplementalGroup ) }
pod . Spec . SecurityContext . RunAsUser = & uidInImage
// In specified image(agnhost E2E image),
// - user-defined-in-image(uid=1000) is defined
// - user-defined-in-image belongs to group-defined-in-image(gid=50000)
// thus, resultant supplementary group of the container processes should be
// - 1000: self
// - 50000: pre-defined groups define in the container image of self(uid=1000)
// - 60000: SupplementalGroups
// $ id -G
// 1000 50000 60000
e2eoutput . TestContainerOutput (
2022-12-12 04:11:10 -05:00
ctx ,
2022-10-13 04:04:30 -04:00
f ,
"pod.Spec.SecurityContext.SupplementalGroups with pre-defined-group in the image" ,
pod , 0 ,
[ ] string { fmt . Sprintf ( "%d %d %d" , uidInImage , gidDefinedInImage , supplementalGroup ) } ,
)
} )
} )
2022-10-17 08:47:15 -04:00
ginkgo . It ( "should support pod.Spec.SecurityContext.RunAsUser [LinuxOnly]" , func ( ctx context . Context ) {
2015-10-07 15:19:06 -04:00
pod := scTestPod ( false , false )
2017-06-21 03:13:36 -04:00
userID := int64 ( 1001 )
2017-04-20 06:57:07 -04:00
pod . Spec . SecurityContext . RunAsUser = & userID
2018-12-20 01:20:10 -05:00
pod . Spec . Containers [ 0 ] . Command = [ ] string { "sh" , "-c" , "id" }
2015-10-20 14:03:32 -04:00
2022-12-12 04:11:10 -05:00
e2eoutput . TestContainerOutput ( ctx , f , "pod.Spec.SecurityContext.RunAsUser" , pod , 0 , [ ] string {
2018-12-20 01:20:10 -05:00
fmt . Sprintf ( "uid=%v" , userID ) ,
fmt . Sprintf ( "gid=%v" , 0 ) ,
2015-10-20 14:03:32 -04:00
} )
} )
2021-01-31 22:26:39 -05:00
/ *
Release : v1 .21
Testname : Security Context , test RunAsGroup at pod level
Description : Container is created with runAsUser and runAsGroup option by passing uid 1001 and gid 2002 at pod level . Pod MUST be in Succeeded phase .
[ LinuxOnly ] : This test is marked as LinuxOnly since Windows does not support running as UID / GID .
* /
2022-10-17 08:47:15 -04:00
framework . ConformanceIt ( "should support pod.Spec.SecurityContext.RunAsUser And pod.Spec.SecurityContext.RunAsGroup [LinuxOnly]" , func ( ctx context . Context ) {
2017-05-13 02:29:25 -04:00
pod := scTestPod ( false , false )
userID := int64 ( 1001 )
groupID := int64 ( 2002 )
pod . Spec . SecurityContext . RunAsUser = & userID
pod . Spec . SecurityContext . RunAsGroup = & groupID
pod . Spec . Containers [ 0 ] . Command = [ ] string { "sh" , "-c" , "id" }
2022-12-12 04:11:10 -05:00
e2eoutput . TestContainerOutput ( ctx , f , "pod.Spec.SecurityContext.RunAsUser" , pod , 0 , [ ] string {
2017-05-13 02:29:25 -04:00
fmt . Sprintf ( "uid=%v" , userID ) ,
fmt . Sprintf ( "gid=%v" , groupID ) ,
} )
} )
2022-10-17 08:47:15 -04:00
ginkgo . It ( "should support container.SecurityContext.RunAsUser [LinuxOnly]" , func ( ctx context . Context ) {
2015-10-07 15:19:06 -04:00
pod := scTestPod ( false , false )
2017-06-21 03:13:36 -04:00
userID := int64 ( 1001 )
overrideUserID := int64 ( 1002 )
2017-04-20 06:57:07 -04:00
pod . Spec . SecurityContext . RunAsUser = & userID
2016-11-18 15:55:17 -05:00
pod . Spec . Containers [ 0 ] . SecurityContext = new ( v1 . SecurityContext )
2017-04-20 06:57:07 -04:00
pod . Spec . Containers [ 0 ] . SecurityContext . RunAsUser = & overrideUserID
2018-12-20 01:20:10 -05:00
pod . Spec . Containers [ 0 ] . Command = [ ] string { "sh" , "-c" , "id" }
2015-10-20 14:03:32 -04:00
2022-12-12 04:11:10 -05:00
e2eoutput . TestContainerOutput ( ctx , f , "pod.Spec.SecurityContext.RunAsUser" , pod , 0 , [ ] string {
2018-12-20 01:20:10 -05:00
fmt . Sprintf ( "uid=%v" , overrideUserID ) ,
fmt . Sprintf ( "gid=%v" , 0 ) ,
2015-10-20 14:03:32 -04:00
} )
} )
2015-10-07 15:19:06 -04:00
2021-01-31 22:26:39 -05:00
/ *
Release : v1 .21
Testname : Security Context , test RunAsGroup at container level
Description : Container is created with runAsUser and runAsGroup option by passing uid 1001 and gid 2002 at containr level . Pod MUST be in Succeeded phase .
[ LinuxOnly ] : This test is marked as LinuxOnly since Windows does not support running as UID / GID .
* /
2022-10-17 08:47:15 -04:00
framework . ConformanceIt ( "should support container.SecurityContext.RunAsUser And container.SecurityContext.RunAsGroup [LinuxOnly]" , func ( ctx context . Context ) {
2017-05-13 02:29:25 -04:00
pod := scTestPod ( false , false )
userID := int64 ( 1001 )
groupID := int64 ( 2001 )
overrideUserID := int64 ( 1002 )
overrideGroupID := int64 ( 2002 )
pod . Spec . SecurityContext . RunAsUser = & userID
pod . Spec . SecurityContext . RunAsGroup = & groupID
pod . Spec . Containers [ 0 ] . SecurityContext = new ( v1 . SecurityContext )
pod . Spec . Containers [ 0 ] . SecurityContext . RunAsUser = & overrideUserID
pod . Spec . Containers [ 0 ] . SecurityContext . RunAsGroup = & overrideGroupID
pod . Spec . Containers [ 0 ] . Command = [ ] string { "sh" , "-c" , "id" }
2022-12-12 04:11:10 -05:00
e2eoutput . TestContainerOutput ( ctx , f , "pod.Spec.SecurityContext.RunAsUser" , pod , 0 , [ ] string {
2017-05-13 02:29:25 -04:00
fmt . Sprintf ( "uid=%v" , overrideUserID ) ,
fmt . Sprintf ( "gid=%v" , overrideGroupID ) ,
} )
} )
2022-10-17 08:47:15 -04:00
ginkgo . It ( "should support volume SELinux relabeling [Flaky] [LinuxOnly]" , func ( ctx context . Context ) {
2022-12-12 04:11:10 -05:00
testPodSELinuxLabeling ( ctx , f , false , false )
2015-10-07 15:19:06 -04:00
} )
2022-10-17 08:47:15 -04:00
ginkgo . It ( "should support volume SELinux relabeling when using hostIPC [Flaky] [LinuxOnly]" , func ( ctx context . Context ) {
2022-12-12 04:11:10 -05:00
testPodSELinuxLabeling ( ctx , f , true , false )
2015-10-07 15:19:06 -04:00
} )
2022-10-17 08:47:15 -04:00
ginkgo . It ( "should support volume SELinux relabeling when using hostPID [Flaky] [LinuxOnly]" , func ( ctx context . Context ) {
2022-12-12 04:11:10 -05:00
testPodSELinuxLabeling ( ctx , f , false , true )
2015-10-07 15:19:06 -04:00
} )
2022-10-17 08:47:15 -04:00
ginkgo . It ( "should support seccomp unconfined on the container [LinuxOnly]" , func ( ctx context . Context ) {
2016-06-06 08:05:26 -04:00
pod := scTestPod ( false , false )
2020-05-26 04:32:50 -04:00
pod . Spec . Containers [ 0 ] . SecurityContext = & v1 . SecurityContext { SeccompProfile : & v1 . SeccompProfile { Type : v1 . SeccompProfileTypeUnconfined } }
pod . Spec . SecurityContext = & v1 . PodSecurityContext { SeccompProfile : & v1 . SeccompProfile { Type : v1 . SeccompProfileTypeRuntimeDefault } }
2023-08-10 03:51:03 -04:00
pod . Spec . Containers [ 0 ] . Command = [ ] string { "grep" , SeccompProcStatusField , ProcSelfStatusPath }
2022-12-12 04:11:10 -05:00
e2eoutput . TestContainerOutput ( ctx , f , "seccomp unconfined container" , pod , 0 , [ ] string { "0" } ) // seccomp disabled
2016-06-06 08:05:26 -04:00
} )
2022-10-17 08:47:15 -04:00
ginkgo . It ( "should support seccomp unconfined on the pod [LinuxOnly]" , func ( ctx context . Context ) {
2016-06-06 08:05:26 -04:00
pod := scTestPod ( false , false )
2020-05-26 04:32:50 -04:00
pod . Spec . SecurityContext = & v1 . PodSecurityContext { SeccompProfile : & v1 . SeccompProfile { Type : v1 . SeccompProfileTypeUnconfined } }
2023-08-10 03:51:03 -04:00
pod . Spec . Containers [ 0 ] . Command = [ ] string { "grep" , SeccompProcStatusField , ProcSelfStatusPath }
2022-12-12 04:11:10 -05:00
e2eoutput . TestContainerOutput ( ctx , f , "seccomp unconfined pod" , pod , 0 , [ ] string { "0" } ) // seccomp disabled
2016-06-06 08:05:26 -04:00
} )
2022-10-17 08:47:15 -04:00
ginkgo . It ( "should support seccomp runtime/default [LinuxOnly]" , func ( ctx context . Context ) {
2016-06-06 08:05:26 -04:00
pod := scTestPod ( false , false )
2020-05-26 04:32:50 -04:00
pod . Spec . Containers [ 0 ] . SecurityContext = & v1 . SecurityContext { SeccompProfile : & v1 . SeccompProfile { Type : v1 . SeccompProfileTypeRuntimeDefault } }
2023-08-10 03:51:03 -04:00
pod . Spec . Containers [ 0 ] . Command = [ ] string { "grep" , SeccompProcStatusField , ProcSelfStatusPath }
2022-12-12 04:11:10 -05:00
e2eoutput . TestContainerOutput ( ctx , f , "seccomp runtime/default" , pod , 0 , [ ] string { "2" } ) // seccomp filtered
2016-06-06 08:05:26 -04:00
} )
2022-10-17 08:47:15 -04:00
ginkgo . It ( "should support seccomp default which is unconfined [LinuxOnly]" , func ( ctx context . Context ) {
2016-06-06 08:05:26 -04:00
pod := scTestPod ( false , false )
2023-08-10 03:51:03 -04:00
pod . Spec . Containers [ 0 ] . Command = [ ] string { "grep" , SeccompProcStatusField , ProcSelfStatusPath }
2022-12-12 04:11:10 -05:00
e2eoutput . TestContainerOutput ( ctx , f , "seccomp default unconfined" , pod , 0 , [ ] string { "0" } ) // seccomp disabled
2016-06-06 08:05:26 -04:00
} )
2015-10-15 13:45:16 -04:00
} )
2015-10-07 15:19:06 -04:00
2022-12-12 04:11:10 -05:00
func testPodSELinuxLabeling ( ctx context . Context , f * framework . Framework , hostIPC bool , hostPID bool ) {
2015-10-07 15:19:06 -04:00
// Write and read a file with an empty_dir volume
// with a pod with the MCS label s0:c0,c1
pod := scTestPod ( hostIPC , hostPID )
volumeName := "test-volume"
mountPath := "/mounted_volume"
2016-11-18 15:55:17 -05:00
pod . Spec . Containers [ 0 ] . VolumeMounts = [ ] v1 . VolumeMount {
2015-10-07 15:19:06 -04:00
{
Name : volumeName ,
MountPath : mountPath ,
} ,
}
2016-11-18 15:55:17 -05:00
pod . Spec . Volumes = [ ] v1 . Volume {
2015-10-07 15:19:06 -04:00
{
Name : volumeName ,
2016-11-18 15:55:17 -05:00
VolumeSource : v1 . VolumeSource {
EmptyDir : & v1 . EmptyDirVolumeSource {
Medium : v1 . StorageMediumDefault ,
2015-10-07 15:19:06 -04:00
} ,
} ,
} ,
}
2016-11-18 15:55:17 -05:00
pod . Spec . SecurityContext . SELinuxOptions = & v1 . SELinuxOptions {
2015-10-07 15:19:06 -04:00
Level : "s0:c0,c1" ,
}
pod . Spec . Containers [ 0 ] . Command = [ ] string { "sleep" , "6000" }
2017-10-25 11:54:32 -04:00
client := f . ClientSet . CoreV1 ( ) . Pods ( f . Namespace . Name )
2022-12-12 04:11:10 -05:00
pod , err := client . Create ( ctx , pod , metav1 . CreateOptions { } )
2015-10-07 15:19:06 -04:00
2016-04-07 13:21:31 -04:00
framework . ExpectNoError ( err , "Error creating pod %v" , pod )
2022-12-12 04:11:10 -05:00
framework . ExpectNoError ( e2epod . WaitForPodRunningInNamespace ( ctx , f . ClientSet , pod ) )
2015-10-07 15:19:06 -04:00
testContent := "hello"
testFilePath := mountPath + "/TEST"
2019-11-21 22:32:00 -05:00
tk := e2ekubectl . NewTestKubeconfig ( framework . TestContext . CertDir , framework . TestContext . Host , framework . TestContext . KubeConfig , framework . TestContext . KubeContext , framework . TestContext . KubectlPath , f . Namespace . Name )
err = tk . WriteFileViaContainer ( pod . Name , pod . Spec . Containers [ 0 ] . Name , testFilePath , testContent )
2019-08-20 22:01:49 -04:00
framework . ExpectNoError ( err )
2019-11-21 22:32:00 -05:00
content , err := tk . ReadFileViaContainer ( pod . Name , pod . Spec . Containers [ 0 ] . Name , testFilePath )
2019-08-20 22:01:49 -04:00
framework . ExpectNoError ( err )
2019-05-10 00:32:08 -04:00
gomega . Expect ( content ) . To ( gomega . ContainSubstring ( testContent ) )
2015-10-07 15:19:06 -04:00
2022-12-12 04:11:10 -05:00
foundPod , err := f . ClientSet . CoreV1 ( ) . Pods ( f . Namespace . Name ) . Get ( ctx , pod . Name , metav1 . GetOptions { } )
2019-05-15 01:31:38 -04:00
framework . ExpectNoError ( err )
2015-10-07 15:19:06 -04:00
// Confirm that the file can be accessed from a second
// pod using host_path with the same MCS label
2022-02-21 09:45:15 -05:00
volumeHostPath := fmt . Sprintf ( "%s/pods/%s/volumes/kubernetes.io~empty-dir/%s" , framework . TestContext . KubeletRootDir , foundPod . UID , volumeName )
ginkgo . By ( fmt . Sprintf ( "confirming a container with the same label can read the file under --kubelet-root-dir=%s" , framework . TestContext . KubeletRootDir ) )
2015-10-07 15:19:06 -04:00
pod = scTestPod ( hostIPC , hostPID )
pod . Spec . NodeName = foundPod . Spec . NodeName
2016-11-18 15:55:17 -05:00
volumeMounts := [ ] v1 . VolumeMount {
2015-10-07 15:19:06 -04:00
{
Name : volumeName ,
MountPath : mountPath ,
} ,
}
2016-11-18 15:55:17 -05:00
volumes := [ ] v1 . Volume {
2015-10-07 15:19:06 -04:00
{
Name : volumeName ,
2016-11-18 15:55:17 -05:00
VolumeSource : v1 . VolumeSource {
HostPath : & v1 . HostPathVolumeSource {
2015-10-07 15:19:06 -04:00
Path : volumeHostPath ,
} ,
} ,
} ,
}
pod . Spec . Containers [ 0 ] . VolumeMounts = volumeMounts
pod . Spec . Volumes = volumes
pod . Spec . Containers [ 0 ] . Command = [ ] string { "cat" , testFilePath }
2016-11-18 15:55:17 -05:00
pod . Spec . SecurityContext . SELinuxOptions = & v1 . SELinuxOptions {
2015-10-07 15:19:06 -04:00
Level : "s0:c0,c1" ,
}
2022-12-12 04:11:10 -05:00
e2eoutput . TestContainerOutput ( ctx , f , "Pod with same MCS label reading test file" , pod , 0 , [ ] string { testContent } )
2020-02-13 22:10:25 -05:00
2015-10-07 15:19:06 -04:00
// Confirm that the same pod with a different MCS
// label cannot access the volume
2020-02-13 22:10:25 -05:00
ginkgo . By ( "confirming a container with a different MCS label is unable to read the file" )
2015-10-07 15:19:06 -04:00
pod = scTestPod ( hostIPC , hostPID )
pod . Spec . Volumes = volumes
pod . Spec . Containers [ 0 ] . VolumeMounts = volumeMounts
pod . Spec . Containers [ 0 ] . Command = [ ] string { "sleep" , "6000" }
2016-11-18 15:55:17 -05:00
pod . Spec . SecurityContext . SELinuxOptions = & v1 . SELinuxOptions {
2015-10-07 15:19:06 -04:00
Level : "s0:c2,c3" ,
}
2022-12-12 04:11:10 -05:00
_ , err = client . Create ( ctx , pod , metav1 . CreateOptions { } )
2016-04-07 13:21:31 -04:00
framework . ExpectNoError ( err , "Error creating pod %v" , pod )
2015-10-07 15:19:06 -04:00
2022-12-12 04:11:10 -05:00
err = e2epod . WaitForPodNameRunningInNamespace ( ctx , f . ClientSet , pod . Name , f . Namespace . Name )
2016-04-07 13:21:31 -04:00
framework . ExpectNoError ( err , "Error waiting for pod to run %v" , pod )
2015-10-07 15:19:06 -04:00
2020-02-13 22:10:25 -05:00
// for this to work, SELinux should be in enforcing mode, so let's check that
isEnforced , err := tk . ReadFileViaContainer ( pod . Name , "test-container" , "/sys/fs/selinux/enforce" )
if err == nil && isEnforced == "1" {
_ , err = tk . ReadFileViaContainer ( pod . Name , "test-container" , testFilePath )
2023-08-31 07:49:05 -04:00
gomega . Expect ( err ) . To ( gomega . HaveOccurred ( ) , "expecting SELinux to not let the container with different MCS label to read the file" )
2020-02-13 22:10:25 -05:00
}
2015-10-07 15:19:06 -04:00
}