mirror of
https://github.com/containers/podman.git
synced 2025-08-01 07:40:22 +08:00
Add support & documentation to run containers with different file types
Udica is adding new features to allow users to define container process and file types. This would allow us to setup trusted communications channels between multiple security domains. ContainerA -> ContainerB -> ContainerC Add tests to make sure users can change file types Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
@ -375,18 +375,18 @@ to podman build, the option given would be `--runtime-flag log-format=json`.
|
|||||||
|
|
||||||
Security Options
|
Security Options
|
||||||
|
|
||||||
"label=user:USER" : Set the label user for the container
|
- `apparmor=unconfined` : Turn off apparmor confinement for the container
|
||||||
"label=role:ROLE" : Set the label role for the container
|
- `apparmor=your-profile` : Set the apparmor confinement profile for the container
|
||||||
"label=type:TYPE" : Set the label type for the container
|
|
||||||
"label=level:LEVEL" : Set the label level for the container
|
|
||||||
"label=disable" : Turn off label confinement for the container
|
|
||||||
"no-new-privileges" : Not supported
|
|
||||||
|
|
||||||
"seccomp=unconfined" : Turn off seccomp confinement for the container
|
- `label=user:USER` : Set the label user for the container processes
|
||||||
"seccomp=profile.json : White listed syscalls seccomp Json file to be used as a seccomp filter
|
- `label=role:ROLE` : Set the label role for the container processes
|
||||||
|
- `label=type:TYPE` : Set the label process type for the container processes
|
||||||
|
- `label=level:LEVEL` : Set the label level for the container processes
|
||||||
|
- `label=filetype:TYPE` : Set the label file type for the container files
|
||||||
|
- `label=disable` : Turn off label separation for the container
|
||||||
|
|
||||||
"apparmor=unconfined" : Turn off apparmor confinement for the container
|
- `seccomp=unconfined` : Turn off seccomp confinement for the container
|
||||||
"apparmor=your-profile" : Set the apparmor confinement profile for the container
|
- `seccomp=profile.json` : White listed syscalls seccomp Json file to be used as a seccomp filter
|
||||||
|
|
||||||
**--shm-size**=*size*
|
**--shm-size**=*size*
|
||||||
|
|
||||||
|
@ -631,19 +631,20 @@ of the container is assumed to be managed externally.
|
|||||||
|
|
||||||
Security Options
|
Security Options
|
||||||
|
|
||||||
"apparmor=unconfined" : Turn off apparmor confinement for the container
|
- `apparmor=unconfined` : Turn off apparmor confinement for the container
|
||||||
"apparmor=your-profile" : Set the apparmor confinement profile for the container
|
- `apparmor=your-profile` : Set the apparmor confinement profile for the container
|
||||||
|
|
||||||
"label=user:USER" : Set the label user for the container
|
- `label=user:USER` : Set the label user for the container processes
|
||||||
"label=role:ROLE" : Set the label role for the container
|
- `label=role:ROLE` : Set the label role for the container processes
|
||||||
"label=type:TYPE" : Set the label type for the container
|
- `label=type:TYPE` : Set the label process type for the container processes
|
||||||
"label=level:LEVEL" : Set the label level for the container
|
- `label=level:LEVEL` : Set the label level for the container processes
|
||||||
"label=disable" : Turn off label confinement for the container
|
- `label=filetype:TYPE` : Set the label file type for the container files
|
||||||
|
- `label=disable` : Turn off label separation for the container
|
||||||
|
|
||||||
"no-new-privileges" : Disable container processes from gaining additional privileges
|
- `no-new-privileges` : Disable container processes from gaining additional privileges
|
||||||
|
|
||||||
"seccomp=unconfined" : Turn off seccomp confinement for the container
|
- `seccomp=unconfined` : Turn off seccomp confinement for the container
|
||||||
"seccomp=profile.json : White listed syscalls seccomp Json file to be used as a seccomp filter
|
- `seccomp=profile.json` : White listed syscalls seccomp Json file to be used as a seccomp filter
|
||||||
|
|
||||||
Note: Labeling can be disabled for all containers by setting label=false in the **libpod.conf** (`/etc/containers/libpod.conf`) file.
|
Note: Labeling can be disabled for all containers by setting label=false in the **libpod.conf** (`/etc/containers/libpod.conf`) file.
|
||||||
|
|
||||||
|
@ -656,11 +656,12 @@ Security Options
|
|||||||
- `apparmor=unconfined` : Turn off apparmor confinement for the container
|
- `apparmor=unconfined` : Turn off apparmor confinement for the container
|
||||||
- `apparmor=your-profile` : Set the apparmor confinement profile for the container
|
- `apparmor=your-profile` : Set the apparmor confinement profile for the container
|
||||||
|
|
||||||
- `label=user:USER` : Set the label user for the container
|
- `label=user:USER` : Set the label user for the container processes
|
||||||
- `label=role:ROLE` : Set the label role for the container
|
- `label=role:ROLE` : Set the label role for the container processes
|
||||||
- `label=type:TYPE` : Set the label type for the container
|
- `label=type:TYPE` : Set the label process type for the container processes
|
||||||
- `label=level:LEVEL` : Set the label level for the container
|
- `label=level:LEVEL` : Set the label level for the container processes
|
||||||
- `label=disable` : Turn off label confinement for the container
|
- `label=filetype:TYPE` : Set the label file type for the container files
|
||||||
|
- `label=disable` : Turn off label separation for the container
|
||||||
|
|
||||||
- `no-new-privileges` : Disable container processes from gaining additional privileges
|
- `no-new-privileges` : Disable container processes from gaining additional privileges
|
||||||
|
|
||||||
|
2
go.mod
2
go.mod
@ -69,7 +69,7 @@ require (
|
|||||||
github.com/opencontainers/runc v1.0.0-rc8
|
github.com/opencontainers/runc v1.0.0-rc8
|
||||||
github.com/opencontainers/runtime-spec v0.1.2-0.20190618234442-a950415649c7
|
github.com/opencontainers/runtime-spec v0.1.2-0.20190618234442-a950415649c7
|
||||||
github.com/opencontainers/runtime-tools v0.9.0
|
github.com/opencontainers/runtime-tools v0.9.0
|
||||||
github.com/opencontainers/selinux v1.2.2
|
github.com/opencontainers/selinux v1.3.0
|
||||||
github.com/opentracing/opentracing-go v1.1.0
|
github.com/opentracing/opentracing-go v1.1.0
|
||||||
github.com/pelletier/go-toml v1.4.0 // indirect
|
github.com/pelletier/go-toml v1.4.0 // indirect
|
||||||
github.com/pkg/errors v0.8.1
|
github.com/pkg/errors v0.8.1
|
||||||
|
4
go.sum
4
go.sum
@ -394,6 +394,8 @@ github.com/opencontainers/selinux v0.0.0-20190118194635-b707dfcb00a1 h1:V8Icxoi2
|
|||||||
github.com/opencontainers/selinux v0.0.0-20190118194635-b707dfcb00a1/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs=
|
github.com/opencontainers/selinux v0.0.0-20190118194635-b707dfcb00a1/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs=
|
||||||
github.com/opencontainers/selinux v1.2.2 h1:Kx9J6eDG5/24A6DtUquGSpJQ+m2MUTahn4FtGEe8bFg=
|
github.com/opencontainers/selinux v1.2.2 h1:Kx9J6eDG5/24A6DtUquGSpJQ+m2MUTahn4FtGEe8bFg=
|
||||||
github.com/opencontainers/selinux v1.2.2/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs=
|
github.com/opencontainers/selinux v1.2.2/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs=
|
||||||
|
github.com/opencontainers/selinux v1.3.0 h1:xsI95WzPZu5exzA6JzkLSfdr/DilzOhCJOqGe5TgR0g=
|
||||||
|
github.com/opencontainers/selinux v1.3.0/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs=
|
||||||
github.com/openshift/imagebuilder v1.1.0 h1:oT704SkwMEzmIMU/+Uv1Wmvt+p10q3v2WuYMeFI18c4=
|
github.com/openshift/imagebuilder v1.1.0 h1:oT704SkwMEzmIMU/+Uv1Wmvt+p10q3v2WuYMeFI18c4=
|
||||||
github.com/openshift/imagebuilder v1.1.0/go.mod h1:9aJRczxCH0mvT6XQ+5STAQaPWz7OsWcU5/mRkt8IWeo=
|
github.com/openshift/imagebuilder v1.1.0/go.mod h1:9aJRczxCH0mvT6XQ+5STAQaPWz7OsWcU5/mRkt8IWeo=
|
||||||
github.com/opentracing/opentracing-go v0.0.0-20190218023034-25a84ff92183 h1:kwFCLTA0DYhH0JpGMBOZtVVhyRL5ec+unn4mnoJhQI0=
|
github.com/opentracing/opentracing-go v0.0.0-20190218023034-25a84ff92183 h1:kwFCLTA0DYhH0JpGMBOZtVVhyRL5ec+unn4mnoJhQI0=
|
||||||
@ -440,6 +442,8 @@ github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNG
|
|||||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||||
github.com/prometheus/tsdb v0.8.0/go.mod h1:fSI0j+IUQrDd7+ZtR9WKIGtoYAYAJUKcKhYLG25tN4g=
|
github.com/prometheus/tsdb v0.8.0/go.mod h1:fSI0j+IUQrDd7+ZtR9WKIGtoYAYAJUKcKhYLG25tN4g=
|
||||||
|
github.com/rhatdan/oci-selinux v0.0.0-20190809194358-225b95ae1d0b h1:9CE1lDQ/YC1deOJE/elAI+nbE1OzOxSvrs6JXwyn+1s=
|
||||||
|
github.com/rhatdan/oci-selinux v0.0.0-20190809194358-225b95ae1d0b/go.mod h1:T/CPBeRZLtTvck9OtpX3PGw/uDABnTuRPhyTacu5aSo=
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||||
github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
@ -153,4 +153,16 @@ var _ = Describe("Podman run", func() {
|
|||||||
Expect(match).Should(BeTrue())
|
Expect(match).Should(BeTrue())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("podman run selinux file type setup test", func() {
|
||||||
|
session := podmanTest.Podman([]string{"run", "-it", "--security-opt", "label=type:spc_t", "--security-opt", "label=filetype:container_var_lib_t", fedoraMinimal, "ls", "-Z", "/dev"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
match, _ := session.GrepString("container_var_lib_t")
|
||||||
|
Expect(match).Should(BeTrue())
|
||||||
|
|
||||||
|
session = podmanTest.Podman([]string{"run", "-it", "--security-opt", "label=type:spc_t", "--security-opt", "label=filetype:foobar", fedoraMinimal, "ls", "-Z", "/dev"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(127))
|
||||||
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
18
vendor/github.com/opencontainers/selinux/go-selinux/label/label_selinux.go
generated
vendored
18
vendor/github.com/opencontainers/selinux/go-selinux/label/label_selinux.go
generated
vendored
@ -13,11 +13,12 @@ import (
|
|||||||
|
|
||||||
// Valid Label Options
|
// Valid Label Options
|
||||||
var validOptions = map[string]bool{
|
var validOptions = map[string]bool{
|
||||||
"disable": true,
|
"disable": true,
|
||||||
"type": true,
|
"type": true,
|
||||||
"user": true,
|
"filetype": true,
|
||||||
"role": true,
|
"user": true,
|
||||||
"level": true,
|
"role": true,
|
||||||
|
"level": true,
|
||||||
}
|
}
|
||||||
|
|
||||||
var ErrIncompatibleLabel = fmt.Errorf("Bad SELinux option z and Z can not be used together")
|
var ErrIncompatibleLabel = fmt.Errorf("Bad SELinux option z and Z can not be used together")
|
||||||
@ -51,13 +52,16 @@ func InitLabels(options []string) (plabel string, mlabel string, Err error) {
|
|||||||
return "", mountLabel, nil
|
return "", mountLabel, nil
|
||||||
}
|
}
|
||||||
if i := strings.Index(opt, ":"); i == -1 {
|
if i := strings.Index(opt, ":"); i == -1 {
|
||||||
return "", "", fmt.Errorf("Bad label option %q, valid options 'disable' or \n'user, role, level, type' followed by ':' and a value", opt)
|
return "", "", fmt.Errorf("Bad label option %q, valid options 'disable' or \n'user, role, level, type, filetype' followed by ':' and a value", opt)
|
||||||
}
|
}
|
||||||
con := strings.SplitN(opt, ":", 2)
|
con := strings.SplitN(opt, ":", 2)
|
||||||
if !validOptions[con[0]] {
|
if !validOptions[con[0]] {
|
||||||
return "", "", fmt.Errorf("Bad label option %q, valid options 'disable, user, role, level, type'", con[0])
|
return "", "", fmt.Errorf("Bad label option %q, valid options 'disable, user, role, level, type, filetype'", con[0])
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if con[0] == "filetype" {
|
||||||
|
mcon["type"] = con[1]
|
||||||
|
}
|
||||||
pcon[con[0]] = con[1]
|
pcon[con[0]] = con[1]
|
||||||
if con[0] == "level" || con[0] == "user" {
|
if con[0] == "level" || con[0] == "user" {
|
||||||
mcon[con[0]] = con[1]
|
mcon[con[0]] = con[1]
|
||||||
|
14
vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go
generated
vendored
14
vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go
generated
vendored
@ -18,6 +18,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -392,6 +393,14 @@ func SetExecLabel(label string) error {
|
|||||||
return writeCon(fmt.Sprintf("/proc/self/task/%d/attr/exec", syscall.Gettid()), label)
|
return writeCon(fmt.Sprintf("/proc/self/task/%d/attr/exec", syscall.Gettid()), label)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SetTaskLabel sets the SELinux label for the current thread, or an error.
|
||||||
|
This requires the dyntransition permission.
|
||||||
|
*/
|
||||||
|
func SetTaskLabel(label string) error {
|
||||||
|
return writeCon(fmt.Sprintf("/proc/self/task/%d/attr/current", syscall.Gettid()), label)
|
||||||
|
}
|
||||||
|
|
||||||
// SetSocketLabel takes a process label and tells the kernel to assign the
|
// SetSocketLabel takes a process label and tells the kernel to assign the
|
||||||
// label to the next socket that gets created
|
// label to the next socket that gets created
|
||||||
func SetSocketLabel(label string) error {
|
func SetSocketLabel(label string) error {
|
||||||
@ -403,6 +412,11 @@ func SocketLabel() (string, error) {
|
|||||||
return readCon(fmt.Sprintf("/proc/self/task/%d/attr/sockcreate", syscall.Gettid()))
|
return readCon(fmt.Sprintf("/proc/self/task/%d/attr/sockcreate", syscall.Gettid()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PeerLabel retrieves the label of the client on the other side of a socket
|
||||||
|
func PeerLabel(fd uintptr) (string, error) {
|
||||||
|
return unix.GetsockoptString(int(fd), syscall.SOL_SOCKET, syscall.SO_PEERSEC)
|
||||||
|
}
|
||||||
|
|
||||||
// SetKeyLabel takes a process label and tells the kernel to assign the
|
// SetKeyLabel takes a process label and tells the kernel to assign the
|
||||||
// label to the next kernel keyring that gets created
|
// label to the next kernel keyring that gets created
|
||||||
func SetKeyLabel(label string) error {
|
func SetKeyLabel(label string) error {
|
||||||
|
13
vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go
generated
vendored
13
vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go
generated
vendored
@ -96,6 +96,14 @@ func SetExecLabel(label string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SetTaskLabel sets the SELinux label for the current thread, or an error.
|
||||||
|
This requires the dyntransition permission.
|
||||||
|
*/
|
||||||
|
func SetTaskLabel(label string) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SetSocketLabel sets the SELinux label that the kernel will use for any programs
|
SetSocketLabel sets the SELinux label that the kernel will use for any programs
|
||||||
that are executed by the current process thread, or an error.
|
that are executed by the current process thread, or an error.
|
||||||
@ -109,6 +117,11 @@ func SocketLabel() (string, error) {
|
|||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PeerLabel retrieves the label of the client on the other side of a socket
|
||||||
|
func PeerLabel(fd uintptr) (string, error) {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
// SetKeyLabel takes a process label and tells the kernel to assign the
|
// SetKeyLabel takes a process label and tells the kernel to assign the
|
||||||
// label to the next kernel keyring that gets created
|
// label to the next kernel keyring that gets created
|
||||||
func SetKeyLabel(label string) error {
|
func SetKeyLabel(label string) error {
|
||||||
|
2
vendor/modules.txt
vendored
2
vendor/modules.txt
vendored
@ -365,7 +365,7 @@ github.com/opencontainers/runtime-tools/generate/seccomp
|
|||||||
github.com/opencontainers/runtime-tools/filepath
|
github.com/opencontainers/runtime-tools/filepath
|
||||||
github.com/opencontainers/runtime-tools/specerror
|
github.com/opencontainers/runtime-tools/specerror
|
||||||
github.com/opencontainers/runtime-tools/error
|
github.com/opencontainers/runtime-tools/error
|
||||||
# github.com/opencontainers/selinux v1.2.2
|
# github.com/opencontainers/selinux v1.3.0
|
||||||
github.com/opencontainers/selinux/go-selinux/label
|
github.com/opencontainers/selinux/go-selinux/label
|
||||||
github.com/opencontainers/selinux/go-selinux
|
github.com/opencontainers/selinux/go-selinux
|
||||||
# github.com/openshift/imagebuilder v1.1.0
|
# github.com/openshift/imagebuilder v1.1.0
|
||||||
|
Reference in New Issue
Block a user