// applySandboxSecurityContext updates docker sandbox options according to security context. func applySandboxSecurityContext(lc *runtimeapi.LinuxPodSandboxConfig, config *dockercontainer.Config, hc *dockercontainer.HostConfig, networkPlugin network.NetworkPlugin) { if lc == nil { return } var sc *runtimeapi.LinuxContainerSecurityContext if lc.SecurityContext != nil { sc = &runtimeapi.LinuxContainerSecurityContext{ SupplementalGroups: lc.SecurityContext.SupplementalGroups, RunAsUser: lc.SecurityContext.RunAsUser, ReadonlyRootfs: lc.SecurityContext.ReadonlyRootfs, SelinuxOptions: lc.SecurityContext.SelinuxOptions, NamespaceOptions: lc.SecurityContext.NamespaceOptions, } } modifyContainerConfig(sc, config) modifyHostConfig(sc, hc) modifySandboxNamespaceOptions(sc.GetNamespaceOptions(), hc, networkPlugin) }
// modifyHostConfig applies security context config to dockercontainer.HostConfig. func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, sandboxID string, hostConfig *dockercontainer.HostConfig) { // Apply namespace options. modifyNamespaceOptions(sc.GetNamespaceOptions(), sandboxID, hostConfig) if sc == nil { return } // Apply supplemental groups. for _, group := range sc.SupplementalGroups { hostConfig.GroupAdd = append(hostConfig.GroupAdd, strconv.FormatInt(group, 10)) } // Apply security context for the container. if sc.Privileged != nil { hostConfig.Privileged = sc.GetPrivileged() } if sc.ReadonlyRootfs != nil { hostConfig.ReadonlyRootfs = sc.GetReadonlyRootfs() } if sc.Capabilities != nil { hostConfig.CapAdd = sc.GetCapabilities().GetAddCapabilities() hostConfig.CapDrop = sc.GetCapabilities().GetDropCapabilities() } if sc.SelinuxOptions != nil { hostConfig.SecurityOpt = securitycontext.ModifySecurityOptions( hostConfig.SecurityOpt, &api.SELinuxOptions{ User: sc.SelinuxOptions.GetUser(), Role: sc.SelinuxOptions.GetRole(), Type: sc.SelinuxOptions.GetType(), Level: sc.SelinuxOptions.GetLevel(), }, ) } }