mirror of
https://github.com/containers/podman.git
synced 2025-08-06 19:44:14 +08:00
Properly handle default capabilities listed in containers.conf
If user/admin specifies a different list of default capabilties we need to honor these. Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
@ -304,7 +304,7 @@ func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runt
|
|||||||
}
|
}
|
||||||
configSpec := g.Config
|
configSpec := g.Config
|
||||||
|
|
||||||
if err := securityConfigureGenerator(s, &g, newImage); err != nil {
|
if err := securityConfigureGenerator(s, &g, newImage, rtc); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/containers/common/pkg/capabilities"
|
"github.com/containers/common/pkg/capabilities"
|
||||||
|
"github.com/containers/common/pkg/config"
|
||||||
"github.com/containers/libpod/libpod"
|
"github.com/containers/libpod/libpod"
|
||||||
"github.com/containers/libpod/libpod/image"
|
"github.com/containers/libpod/libpod/image"
|
||||||
"github.com/containers/libpod/pkg/specgen"
|
"github.com/containers/libpod/pkg/specgen"
|
||||||
@ -55,30 +56,22 @@ func setLabelOpts(s *specgen.SpecGenerator, runtime *libpod.Runtime, pidConfig s
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func securityConfigureGenerator(s *specgen.SpecGenerator, g *generate.Generator, newImage *image.Image) error {
|
func securityConfigureGenerator(s *specgen.SpecGenerator, g *generate.Generator, newImage *image.Image, rtc *config.Config) error {
|
||||||
|
var (
|
||||||
|
caplist []string
|
||||||
|
err error
|
||||||
|
)
|
||||||
// HANDLE CAPABILITIES
|
// HANDLE CAPABILITIES
|
||||||
// NOTE: Must happen before SECCOMP
|
// NOTE: Must happen before SECCOMP
|
||||||
if s.Privileged {
|
if s.Privileged {
|
||||||
g.SetupPrivileged(true)
|
g.SetupPrivileged(true)
|
||||||
}
|
caplist = capabilities.AllCapabilities()
|
||||||
|
} else {
|
||||||
useNotRoot := func(user string) bool {
|
caplist, err = rtc.Capabilities(s.User, s.CapAdd, s.CapDrop)
|
||||||
if user == "" || user == "root" || user == "0" {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
configSpec := g.Config
|
|
||||||
var err error
|
|
||||||
var caplist []string
|
|
||||||
bounding := configSpec.Process.Capabilities.Bounding
|
|
||||||
if useNotRoot(s.User) {
|
|
||||||
configSpec.Process.Capabilities.Bounding = caplist
|
|
||||||
}
|
|
||||||
caplist, err = capabilities.MergeCapabilities(configSpec.Process.Capabilities.Bounding, s.CapAdd, s.CapDrop)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
privCapsRequired := []string{}
|
privCapsRequired := []string{}
|
||||||
|
|
||||||
// If the container image specifies an label with a
|
// If the container image specifies an label with a
|
||||||
@ -111,20 +104,13 @@ func securityConfigureGenerator(s *specgen.SpecGenerator, g *generate.Generator,
|
|||||||
logrus.Errorf("capabilities requested by user or image are not allowed by default: %q", strings.Join(privCapsRequired, ","))
|
logrus.Errorf("capabilities requested by user or image are not allowed by default: %q", strings.Join(privCapsRequired, ","))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
configSpec := g.Config
|
||||||
configSpec.Process.Capabilities.Bounding = caplist
|
configSpec.Process.Capabilities.Bounding = caplist
|
||||||
configSpec.Process.Capabilities.Permitted = caplist
|
configSpec.Process.Capabilities.Permitted = caplist
|
||||||
configSpec.Process.Capabilities.Inheritable = caplist
|
configSpec.Process.Capabilities.Inheritable = caplist
|
||||||
configSpec.Process.Capabilities.Effective = caplist
|
configSpec.Process.Capabilities.Effective = caplist
|
||||||
configSpec.Process.Capabilities.Ambient = caplist
|
configSpec.Process.Capabilities.Ambient = caplist
|
||||||
if useNotRoot(s.User) {
|
|
||||||
caplist, err = capabilities.MergeCapabilities(bounding, s.CapAdd, s.CapDrop)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
configSpec.Process.Capabilities.Bounding = caplist
|
|
||||||
|
|
||||||
// HANDLE SECCOMP
|
// HANDLE SECCOMP
|
||||||
if s.SeccompProfilePath != "unconfined" {
|
if s.SeccompProfilePath != "unconfined" {
|
||||||
seccompConfig, err := getSeccompConfig(s, configSpec, newImage)
|
seccompConfig, err := getSeccompConfig(s, configSpec, newImage)
|
||||||
|
5
vendor/github.com/containers/buildah/imagebuildah/executor.go
generated
vendored
5
vendor/github.com/containers/buildah/imagebuildah/executor.go
generated
vendored
@ -113,7 +113,10 @@ func NewExecutor(store storage.Store, options BuildOptions, mainNode *parser.Nod
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
capabilities := defaultContainerConfig.Capabilities("", options.AddCapabilities, options.DropCapabilities)
|
capabilities, err := defaultContainerConfig.Capabilities("", options.AddCapabilities, options.DropCapabilities)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
devices := []configs.Device{}
|
devices := []configs.Device{}
|
||||||
for _, device := range append(defaultContainerConfig.Containers.Devices, options.Devices...) {
|
for _, device := range append(defaultContainerConfig.Containers.Devices, options.Devices...) {
|
||||||
|
28
vendor/github.com/containers/common/pkg/config/config.go
generated
vendored
28
vendor/github.com/containers/common/pkg/config/config.go
generated
vendored
@ -709,7 +709,7 @@ func (c *Config) GetDefaultEnv() []string {
|
|||||||
|
|
||||||
// Capabilities returns the capabilities parses the Add and Drop capability
|
// Capabilities returns the capabilities parses the Add and Drop capability
|
||||||
// list from the default capabiltiies for the container
|
// list from the default capabiltiies for the container
|
||||||
func (c *Config) Capabilities(user string, addCapabilities, dropCapabilities []string) []string {
|
func (c *Config) Capabilities(user string, addCapabilities, dropCapabilities []string) ([]string, error) {
|
||||||
|
|
||||||
userNotRoot := func(user string) bool {
|
userNotRoot := func(user string) bool {
|
||||||
if user == "" || user == "root" || user == "0" {
|
if user == "" || user == "root" || user == "0" {
|
||||||
@ -718,36 +718,12 @@ func (c *Config) Capabilities(user string, addCapabilities, dropCapabilities []s
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
var caps []string
|
|
||||||
defaultCapabilities := c.Containers.DefaultCapabilities
|
defaultCapabilities := c.Containers.DefaultCapabilities
|
||||||
if userNotRoot(user) {
|
if userNotRoot(user) {
|
||||||
defaultCapabilities = []string{}
|
defaultCapabilities = []string{}
|
||||||
}
|
}
|
||||||
|
|
||||||
mapCap := make(map[string]bool, len(defaultCapabilities))
|
return capabilities.MergeCapabilities(defaultCapabilities, addCapabilities, dropCapabilities)
|
||||||
for _, c := range addCapabilities {
|
|
||||||
if strings.ToLower(c) == "all" {
|
|
||||||
defaultCapabilities = capabilities.AllCapabilities()
|
|
||||||
addCapabilities = nil
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, c := range append(defaultCapabilities, addCapabilities...) {
|
|
||||||
mapCap[c] = true
|
|
||||||
}
|
|
||||||
for _, c := range dropCapabilities {
|
|
||||||
if "all" == strings.ToLower(c) {
|
|
||||||
return caps
|
|
||||||
}
|
|
||||||
mapCap[c] = false
|
|
||||||
}
|
|
||||||
for cap, add := range mapCap {
|
|
||||||
if add {
|
|
||||||
caps = append(caps, cap)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return caps
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Device parses device mapping string to a src, dest & permissions string
|
// Device parses device mapping string to a src, dest & permissions string
|
||||||
|
Reference in New Issue
Block a user