// modifyHostConfig applies security context config to dockercontainer.HostConfig. func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig *dockercontainer.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, &v1.SELinuxOptions{ User: sc.SelinuxOptions.GetUser(), Role: sc.SelinuxOptions.GetRole(), Type: sc.SelinuxOptions.GetType(), Level: sc.SelinuxOptions.GetLevel(), }, ) } }
// ModifyHostConfig is called before the Docker runContainer call. The // security context provider can make changes to the HostConfig, affecting // security options, whether the container is privileged, volume binds, etc. func (p SimpleSecurityContextProvider) ModifyHostConfig(pod *api.Pod, container *api.Container, hostConfig *dockercontainer.HostConfig, supplementalGids []int64) { // Apply supplemental groups if container.Name != leaky.PodInfraContainerName { // TODO: We skip application of supplemental groups to the // infra container to work around a runc issue which // requires containers to have the '/etc/group'. For // more information see: // https://github.com/opencontainers/runc/pull/313 // This can be removed once the fix makes it into the // required version of docker. if pod.Spec.SecurityContext != nil { for _, group := range pod.Spec.SecurityContext.SupplementalGroups { hostConfig.GroupAdd = append(hostConfig.GroupAdd, strconv.Itoa(int(group))) } if pod.Spec.SecurityContext.FSGroup != nil { hostConfig.GroupAdd = append(hostConfig.GroupAdd, strconv.Itoa(int(*pod.Spec.SecurityContext.FSGroup))) } } for _, group := range supplementalGids { hostConfig.GroupAdd = append(hostConfig.GroupAdd, strconv.Itoa(int(group))) } } // Apply effective security context for container effectiveSC := DetermineEffectiveSecurityContext(pod, container) if effectiveSC == nil { return } if effectiveSC.Privileged != nil { hostConfig.Privileged = *effectiveSC.Privileged } if effectiveSC.Capabilities != nil { add, drop := MakeCapabilities(effectiveSC.Capabilities.Add, effectiveSC.Capabilities.Drop) hostConfig.CapAdd = add hostConfig.CapDrop = drop } if effectiveSC.SELinuxOptions != nil { hostConfig.SecurityOpt = modifySecurityOption(hostConfig.SecurityOpt, dockerLabelUser, effectiveSC.SELinuxOptions.User) hostConfig.SecurityOpt = modifySecurityOption(hostConfig.SecurityOpt, dockerLabelRole, effectiveSC.SELinuxOptions.Role) hostConfig.SecurityOpt = modifySecurityOption(hostConfig.SecurityOpt, dockerLabelType, effectiveSC.SELinuxOptions.Type) hostConfig.SecurityOpt = modifySecurityOption(hostConfig.SecurityOpt, dockerLabelLevel, effectiveSC.SELinuxOptions.Level) } }