容器化是一項蓬勃發展的技術。在不久的未來,多達百分之七十五的全球組織可能會運行某種類型的容器化技術。因爲普遍使用的技術更容易成爲黑客攻擊的目標,所以保護容器的安全就顯得尤其重要。本文將演示如何使用 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