Update kyaml to specify user for function

This commit is contained in:
Donny Xia
2020-08-18 12:48:41 -07:00
parent 8293f3002d
commit d03cf061e8
4 changed files with 41 additions and 2 deletions

View File

@@ -133,6 +133,9 @@ type Filter struct {
// StorageMounts is a list of storage options that the container will have mounted. // StorageMounts is a list of storage options that the container will have mounted.
StorageMounts []runtimeutil.StorageMount `yaml:"mounts,omitempty"` StorageMounts []runtimeutil.StorageMount `yaml:"mounts,omitempty"`
// User username used to run the application in container,
User string
Exec runtimeexec.Filter Exec runtimeexec.Filter
} }
@@ -174,14 +177,18 @@ func (c *Filter) getCommand() (string, []string) {
if c.Network != "" { if c.Network != "" {
network = c.Network network = c.Network
} }
// run as nobody by default
user := c.User
if user == "" {
user = "nobody"
}
args := []string{"run", args := []string{"run",
"--rm", // delete the container afterward "--rm", // delete the container afterward
"-i", "-a", "STDIN", "-a", "STDOUT", "-a", "STDERR", // attach stdin, stdout, stderr "-i", "-a", "STDIN", "-a", "STDOUT", "-a", "STDERR", // attach stdin, stdout, stderr
"--network", network, "--network", network,
// added security options // added security options
"--user", "nobody", // run as nobody "--user", user,
"--security-opt=no-new-privileges", // don't allow the user to escalate privileges "--security-opt=no-new-privileges", // don't allow the user to escalate privileges
// note: don't make fs readonly because things like heredoc rely on writing tmp files // note: don't make fs readonly because things like heredoc rely on writing tmp files
} }

View File

@@ -88,6 +88,26 @@ metadata:
}, },
}, },
}, },
{
name: "root user",
functionConfig: `apiVersion: apps/v1
kind: Deployment
metadata:
name: foo
`,
expectedArgs: []string{
"run",
"--rm",
"-i", "-a", "STDIN", "-a", "STDOUT", "-a", "STDERR",
"--network", "none",
"--user", "root",
"--security-opt=no-new-privileges",
},
instance: Filter{
Image: "example.com:version",
User: "root",
},
},
} }
for i := range tests { for i := range tests {

View File

@@ -52,6 +52,9 @@ type ContainerSpec struct {
// Mounts are the storage or directories to mount into the container // Mounts are the storage or directories to mount into the container
StorageMounts []StorageMount `json:"mounts,omitempty" yaml:"mounts,omitempty"` StorageMounts []StorageMount `json:"mounts,omitempty" yaml:"mounts,omitempty"`
// User is the username/uid that application runs as in continer
User string `json:"user,omitempty" yaml:"user,omitempty"`
} }
// ContainerNetwork // ContainerNetwork

View File

@@ -87,6 +87,9 @@ type RunFns struct {
// this is a variable so it can be mocked in tests // this is a variable so it can be mocked in tests
functionFilterProvider func( functionFilterProvider func(
filter runtimeutil.FunctionSpec, api *yaml.RNode) (kio.Filter, error) filter runtimeutil.FunctionSpec, api *yaml.RNode) (kio.Filter, error)
// User username used to run the application in container,
User string
} }
// Execute runs the command // Execute runs the command
@@ -380,11 +383,17 @@ func (r *RunFns) ffp(spec runtimeutil.FunctionSpec, api *yaml.RNode) (kio.Filter
atomic.AddUint32(&r.resultsCount, 1) atomic.AddUint32(&r.resultsCount, 1)
} }
if !r.DisableContainers && spec.Container.Image != "" { if !r.DisableContainers && spec.Container.Image != "" {
// command line username has higher priority
user := spec.Container.User
if r.User != "" {
user = r.User
}
// TODO: Add a test for this behavior // TODO: Add a test for this behavior
cf := &container.Filter{ cf := &container.Filter{
Image: spec.Container.Image, Image: spec.Container.Image,
Network: spec.Network, Network: spec.Network,
StorageMounts: r.StorageMounts, StorageMounts: r.StorageMounts,
User: user,
} }
cf.Exec.FunctionConfig = api cf.Exec.FunctionConfig = api
cf.Exec.GlobalScope = r.GlobalScope cf.Exec.GlobalScope = r.GlobalScope