docker_practice/security/kernel_capability.md

27 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

## 內核能力機制
能力機制Capability是 Linux 內核一個強大的特性,可以提供細粒度的權限訪問控制。
Linux 內核自 2.2 版本起就支持能力機制,它將權限劃分為更加細粒度的操作能力,既可以作用在進程上,也可以作用在文件上。
例如,一個 Web 服務進程只需要綁定一個低於 1024 的端口的權限,並不需要 root 權限。那麽它只需要被授權 `net_bind_service` 能力即可。此外,還有很多其他的類似能力來避免進程獲取 root 權限。
默認情況下Docker 啟動的容器被嚴格限制只允許使用內核的一部分能力。
使用能力機制對加強 Docker 容器的安全有很多好處。通常,在服務器上會運行一堆需要特權權限的進程,包括有 ssh、cron、syslogd、硬件管理工具模塊例如負載模塊、網絡配置工具等等。容器跟這些進程是不同的因為幾乎所有的特權進程都由容器以外的支持系統來進行管理。
* ssh 訪問被主機上ssh服務來管理
* cron 通常應該作為用戶進程執行,權限交給使用它服務的應用來處理;
* 日誌系統可由 Docker 或第三方服務管理;
* 硬件管理無關緊要,容器中也就無需執行 udevd 以及類似服務;
* 網絡管理也都在主機上設置,除非特殊需求,容器不需要對網絡進行配置。
從上面的例子可以看出,大部分情況下,容器並不需要“真正的” root 權限,容器只需要少數的能力即可。為了加強安全,容器可以禁用一些沒必要的權限。
* 完全禁止任何 mount 操作;
* 禁止直接訪問本地主機的套接字;
* 禁止訪問一些文件系統的操作,比如創建新的設備、修改文件屬性等;
* 禁止模塊加載。
這樣,就算攻擊者在容器中取得了 root 權限,也不能獲得本地主機的較高權限,能進行的破壞也有限。
默認情況下Docker采用 [白名單](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go) 機制,禁用 [必需功能](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go) 之外的其它權限。
當然,用戶也可以根據自身需求來為 Docker 容器啟用額外的權限。