容器化是一项蓬勃发展的技术。在不久的未来,多达百分之七十五的全球组织可能会运行某种类型的容器化技术。因为普遍使用的技术更容易成为黑客攻击的目标,所以保护容器的安全就显得尤其重要。本文将演示如何使用 POSIX 权能Capability 来保护 Podman 容器的安全。Podman 是 RHEL8 中默认的容器管理工具。html
肯定 Podman 容器的权限模式
容器以特权模式或无特权模式运行。在特权模式下,容器的 uid 0 被映射到宿主机的 uid 0。对于某些状况,无特权的容器缺少对宿主机资源的充分访问能力。但无论其操做模式如何,包括强制访问控制Mandatory Access Control(MAC:如 apparmor、SELinux 等)、seccomp 过滤器、删除权能Capability、命名空间等在内的技术有助于确保容器的安全。linux
要从容器外部肯定特权模式:git
$ podman inspect --format="{{.HostConfig.Privileged}}" <container id>
若是上面的命令返回 true
,那么容器在特权模式下运行。若是返回 false
,那么容器在非特权模式下运行。github
要从容器内部肯定特权模式:centos
$ ip link add dummy0 type dummy
若是该命令容许你建立一个接口,那么你运行的是一个特权容器,不然你运行的是一个非特权容器。安全
权能
命名空间隔离了容器的进程,使其没法任意访问宿主机的资源,也没法访问在同一宿主机上运行的其余容器的资源。然而,在特权容器内的进程仍然能够作一些事情,如改变 IP 路由表、跟踪任意进程和加载内核模块。权能Capability容许人们对容器内的进程能够访问或更改的资源施加更细微的限制,即便容器在特权模式下运行也同样。权能还容许人们为无特权的容器分配它原本不会拥有的特权。服务器
例如,若是要将 NET_ADMIN
功能添加到一个无特权的容器中,以便在容器内部建立一个网络接口,你能够用下面的参数运行 podman
:网络
[root@vm1 ~]# podman run -it --cap-add=NET_ADMIN centos [root@b27fea33ccf1 /]# ip link add dummy0 type dummy [root@b27fea33ccf1 /]# ip link
上面的命令演示了在一个无特权的容器中建立一个 dummy0
接口。若是没有 NET_ADMIN
权能,非特权容器将没法建立接口。上面的命令演示了如何将一个权能授予一个无特权的容器。app
目前,大约有 39 种权能能够被授予或拒绝。特权容器默认会被授予许多权能。建议从特权容器中删除不须要的权能,以使其更加安全。less
要从容器中删除全部权能:
$ podman run -it -d --name mycontainer --cap-drop=all centos
列出一个容器的权能:
$ podman exec -it 48f11d9fa512 capsh --print
上述命令显示没有向容器授予任何权能。
请参考 capabilities
手册页以获取完整的权能列表:
$ man capabilities
可使用 capsh
命令来列出目前拥有的权能:
$ capsh --print
做为另外一个例子,下面的命令演示了如何从容器中删除 NET_RAW
权能。若是没有 NET_RAW
权能,就不能从容器中 ping
互联网上的服务器。
$ podman run -it --name mycontainer1 --cap-drop=net_raw centos >>> ping google.com (will output error, operation not permitted)
最后一个例子,若是你的容器只须要 SETUID
和 SETGID
权能,你能够删除全部权能,而后只从新添加这两个权能来实现这样的权限设置。
$ podman run -d --cap-drop=all --cap-add=setuid --cap-add=setgid fedora sleep 5 > /dev/null; pscap | grep sleep
上面的 pscap
命令会显示容器被授予的权能。
我但愿你喜欢这个关于如何使用权能来保护 Podman 容器的简短探索。
谢谢!
via: https://fedoramagazine.org/podman-with-capabilities-on-fedora/
做者:shiwanibiradar 选题:lujun9972 译者:geekpi 校对:wxy
