Skip to content

Commit f60dccd

Browse files
authored
Merge pull request #675 from q384566678/add-process-add
generate: add process-cap-add and process-cap-drop option
2 parents f81d4a8 + 9f6de4d commit f60dccd

File tree

4 files changed

+133
-0
lines changed

4 files changed

+133
-0
lines changed

cmd/oci-runtime-tool/generate.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,13 @@ var generateFlags = []cli.Flag{
9494
cli.StringFlag{Name: "os", Value: runtime.GOOS, Usage: "operating system the container is created for"},
9595
cli.StringFlag{Name: "output", Usage: "output file (defaults to stdout)"},
9696
cli.BoolFlag{Name: "privileged", Usage: "enable privileged container settings"},
97+
cli.StringFlag{Name: "process-cap-add", Usage: "add Linux capabilities to all 5 capability sets"},
9798
cli.StringFlag{Name: "process-cap-add-ambient", Usage: "add Linux ambient capabilities"},
9899
cli.StringFlag{Name: "process-cap-add-bounding", Usage: "add Linux bounding capabilities"},
99100
cli.StringFlag{Name: "process-cap-add-effective", Usage: "add Linux effective capabilities"},
100101
cli.StringFlag{Name: "process-cap-add-inheritable", Usage: "add Linux inheritable capabilities"},
101102
cli.StringFlag{Name: "process-cap-add-permitted", Usage: "add Linux permitted capabilities"},
103+
cli.StringFlag{Name: "process-cap-drop", Usage: "drop Linux capabilities to all 5 capability sets"},
102104
cli.BoolFlag{Name: "process-cap-drop-all", Usage: "drop all Linux capabilities"},
103105
cli.StringFlag{Name: "process-cap-drop-ambient", Usage: "drop Linux ambient capabilities"},
104106
cli.StringFlag{Name: "process-cap-drop-bounding", Usage: "drop Linux bounding capabilities"},
@@ -339,6 +341,16 @@ func setupSpec(g *generate.Generator, context *cli.Context) error {
339341
g.ClearProcessCapabilities()
340342
}
341343

344+
if context.IsSet("process-cap-add") {
345+
addCaps := context.String("process-cap-add")
346+
parts := strings.Split(addCaps, ",")
347+
for _, part := range parts {
348+
if err := g.AddProcessCapability(part); err != nil {
349+
return err
350+
}
351+
}
352+
}
353+
342354
if context.IsSet("process-cap-add-ambient") {
343355
addCaps := context.String("process-cap-add-ambient")
344356
parts := strings.Split(addCaps, ",")
@@ -389,6 +401,16 @@ func setupSpec(g *generate.Generator, context *cli.Context) error {
389401
}
390402
}
391403

404+
if context.IsSet("process-cap-drop") {
405+
addCaps := context.String("process-cap-drop")
406+
parts := strings.Split(addCaps, ",")
407+
for _, part := range parts {
408+
if err := g.DropProcessCapability(part); err != nil {
409+
return err
410+
}
411+
}
412+
}
413+
392414
if context.IsSet("process-cap-drop-ambient") {
393415
dropCaps := context.String("process-cap-drop-ambient")
394416
parts := strings.Split(dropCaps, ",")

completions/bash/oci-runtime-tool

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,11 +371,13 @@ _oci-runtime-tool_generate() {
371371
--mounts-remove
372372
--os
373373
--output
374+
--process-cap-add
374375
--process-cap-add-ambient
375376
--process-cap-add-bounding
376377
--process-cap-add-effective
377378
--process-cap-add-inheritable
378379
--process-cap-add-permitted
380+
--process-cap-drop
379381
--process-cap-drop-ambient
380382
--process-cap-drop-bounding
381383
--process-cap-drop-effective

generate/generate.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,69 @@ func (g *Generator) ClearProcessCapabilities() {
10741074
g.Config.Process.Capabilities.Ambient = []string{}
10751075
}
10761076

1077+
// AddProcessCapability adds a process capability into all 5 capability sets.
1078+
func (g *Generator) AddProcessCapability(c string) error {
1079+
cp := strings.ToUpper(c)
1080+
if err := validate.CapValid(cp, g.HostSpecific); err != nil {
1081+
return err
1082+
}
1083+
1084+
g.initConfigProcessCapabilities()
1085+
1086+
var foundAmbient, foundBounding, foundEffective, foundInheritable, foundPermitted bool
1087+
for _, cap := range g.Config.Process.Capabilities.Ambient {
1088+
if strings.ToUpper(cap) == cp {
1089+
foundAmbient = true
1090+
break
1091+
}
1092+
}
1093+
if !foundAmbient {
1094+
g.Config.Process.Capabilities.Ambient = append(g.Config.Process.Capabilities.Ambient, cp)
1095+
}
1096+
1097+
for _, cap := range g.Config.Process.Capabilities.Bounding {
1098+
if strings.ToUpper(cap) == cp {
1099+
foundBounding = true
1100+
break
1101+
}
1102+
}
1103+
if !foundBounding {
1104+
g.Config.Process.Capabilities.Bounding = append(g.Config.Process.Capabilities.Bounding, cp)
1105+
}
1106+
1107+
for _, cap := range g.Config.Process.Capabilities.Effective {
1108+
if strings.ToUpper(cap) == cp {
1109+
foundEffective = true
1110+
break
1111+
}
1112+
}
1113+
if !foundEffective {
1114+
g.Config.Process.Capabilities.Effective = append(g.Config.Process.Capabilities.Effective, cp)
1115+
}
1116+
1117+
for _, cap := range g.Config.Process.Capabilities.Inheritable {
1118+
if strings.ToUpper(cap) == cp {
1119+
foundInheritable = true
1120+
break
1121+
}
1122+
}
1123+
if !foundInheritable {
1124+
g.Config.Process.Capabilities.Inheritable = append(g.Config.Process.Capabilities.Inheritable, cp)
1125+
}
1126+
1127+
for _, cap := range g.Config.Process.Capabilities.Permitted {
1128+
if strings.ToUpper(cap) == cp {
1129+
foundPermitted = true
1130+
break
1131+
}
1132+
}
1133+
if !foundPermitted {
1134+
g.Config.Process.Capabilities.Permitted = append(g.Config.Process.Capabilities.Permitted, cp)
1135+
}
1136+
1137+
return nil
1138+
}
1139+
10771140
// AddProcessCapabilityAmbient adds a process capability into g.Config.Process.Capabilities.Ambient.
10781141
func (g *Generator) AddProcessCapabilityAmbient(c string) error {
10791142
cp := strings.ToUpper(c)
@@ -1190,6 +1253,42 @@ func (g *Generator) AddProcessCapabilityPermitted(c string) error {
11901253
return nil
11911254
}
11921255

1256+
// DropProcessCapability drops a process capability from all 5 capability sets.
1257+
func (g *Generator) DropProcessCapability(c string) error {
1258+
if g.Config == nil || g.Config.Process == nil || g.Config.Process.Capabilities == nil {
1259+
return nil
1260+
}
1261+
1262+
cp := strings.ToUpper(c)
1263+
for i, cap := range g.Config.Process.Capabilities.Ambient {
1264+
if strings.ToUpper(cap) == cp {
1265+
g.Config.Process.Capabilities.Ambient = removeFunc(g.Config.Process.Capabilities.Ambient, i)
1266+
}
1267+
}
1268+
for i, cap := range g.Config.Process.Capabilities.Bounding {
1269+
if strings.ToUpper(cap) == cp {
1270+
g.Config.Process.Capabilities.Bounding = removeFunc(g.Config.Process.Capabilities.Bounding, i)
1271+
}
1272+
}
1273+
for i, cap := range g.Config.Process.Capabilities.Effective {
1274+
if strings.ToUpper(cap) == cp {
1275+
g.Config.Process.Capabilities.Effective = removeFunc(g.Config.Process.Capabilities.Effective, i)
1276+
}
1277+
}
1278+
for i, cap := range g.Config.Process.Capabilities.Inheritable {
1279+
if strings.ToUpper(cap) == cp {
1280+
g.Config.Process.Capabilities.Inheritable = removeFunc(g.Config.Process.Capabilities.Inheritable, i)
1281+
}
1282+
}
1283+
for i, cap := range g.Config.Process.Capabilities.Permitted {
1284+
if strings.ToUpper(cap) == cp {
1285+
g.Config.Process.Capabilities.Permitted = removeFunc(g.Config.Process.Capabilities.Permitted, i)
1286+
}
1287+
}
1288+
1289+
return validate.CapValid(cp, false)
1290+
}
1291+
11931292
// DropProcessCapabilityAmbient drops a process capability from g.Config.Process.Capabilities.Ambient.
11941293
func (g *Generator) DropProcessCapabilityAmbient(c string) error {
11951294
if g.Config == nil || g.Config.Process == nil || g.Config.Process.Capabilities == nil {

man/oci-runtime-tool-generate.1.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,11 @@ read the configuration from `config.json`.
372372

373373
When the operator executes **oci-runtime-tool generate --privileged**, OCI will enable access to all devices on the host as well as disable some of the confinement mechanisms like AppArmor, SELinux, and seccomp from blocking access to privileged processes. This gives the container processes nearly all the same access to the host as processes generating outside of a container on the host.
374374

375+
**--process-cap-add**=[]
376+
Add Linux capabilities to all 5 capability sets.
377+
You can use this command to add multiple capabilities. Each value should be used ',' separated.
378+
e.g. --process-cap-add CAP_FOWNER,CAP_FSETID
379+
375380
**--process-cap-add-ambient**=[]
376381
Add Linux ambient capabilities.
377382
You can use this command to add multiple capabilities. Each value should be used ',' separated.
@@ -397,6 +402,11 @@ read the configuration from `config.json`.
397402
You can use this command to add multiple capabilities. Each value should be used ',' separated.
398403
e.g. --process-cap-add-permitted CAP_FOWNER,CAP_FSETID
399404

405+
**--process-cap-drop**=[]
406+
Drop Linux capabilities to all 5 capability sets.
407+
You can use this command to drop multiple capabilities. Each value should be used ',' separated.
408+
e.g. --process-cap-drop CAP_FOWNER,CAP_FSETID
409+
400410
**--process-cap-drop-all**=true|false
401411
Drop all Linux capabilities
402412
This option conflicts with other cap options, as --process-cap-*.

0 commit comments

Comments
 (0)