Docker安全之使用者資源隔離
來源:http://www.zimug.com/453.html
docker進行資源隔離的6種namespace
namespace | 隔離內容 | 核心版本 |
---|---|---|
UTS | 主機名與域名 | Linux 2.6.19 |
IPC | 訊號量,訊息佇列和共享記憶體 | Linux 2.6.19 |
PID | 程序編號 | Linux 2.6.24 |
Network | 網路裝置,網路棧,埠 | 始於Linux 2.6.24 完成於 Linux 2.6.29 |
Mount | 檔案掛載 | Linux 2.4.19 |
User | 使用者使用者組 | 始於 Linux 2.6.23 完成於 Linux 3.8 |
其中User namespace是從docker1.10開始被支援,並且不是預設開啟的.
以上內容不是這篇文章的重點,此篇文章主要是介紹user namespace
一.User namespace的作用
docker 使用namespace進行資源隔離,其中一種是user namespace.user namespace主要隔離了安全相關的識別符號和屬性,包括使用者ID,使用者組Id,root目錄,key(金鑰)以及特殊許可權.
預設的情況下,docker容器使用的root使用者和宿主機的root使用者是同一個使用者,儘管可以限制容器內root使用者的許可權(capability),但本質上仍然和宿主機root使用者是同一個使用者.
有了user namespace之後,我們就可以將宿主機上的普通使用者對映為容器的root使用者,這樣容器中的實際使用者為普通使用者許可權,可以將容器的安全程度提高一個等級!
實驗一:不使用user namespace進行資源隔離
- 執行一個容器
docker run -it ubuntu:14.04 top
- 另外開一個終端,檢視該容器程序在宿主機上的使用者
~$ ps -aux|grep top
root 18724 0.2 0.0 19848 2400 pts/15 Ss+ 14:16 0:00 top
可以看到,執行top命令的使用者是root,即容器中的root使用者就是宿主機的root使用者
實驗二:使用user namespace進行資源隔離
配置實現
- 執行docker deamon程序的時候加入引數
--userns-remap=default
,如:ubuntu中是修改/etc/default/docker中的DOCKER_OPTS,追加配置--userns-remap=default
- 重啟docker deamon,如:ubuntu中是使用
service docker restart
實驗內容
- 執行一個容器
docker run -it ubuntu:14.04 top
- 另外開一個終端,檢視該容器程序在宿主機上的使用者
~$ ps -aux|grep top
165536 19347 0.1 0.0 19848 2424 pts/15 Ss+ 14:32 0:00 top
可以看到,在宿主機上top命令的執行使用的使用者是165536(uid),不是root
- 看看容器內的top命令的輸出
1 root 20 0 19848 2424 2108 R 0.0 0.0 0:00.07 top
容器內,看上去仍然是root使用者.即:有了user namespace之後,我們就可以將宿主機上的普通使用者對映為容器的root使用者.
那麼,有一個問題?這個普通使用者是誰?
二.user namespace的預設對映使用者
上面的實驗中,我們已經使用了user namespace的最簡化配置.即:--userns-remap=default
實際上,docker新建了一個使用者和使用者組都叫做dockremap,容器內的root使用者對映到宿主機的這個dockremap使用者上.
$ cat /etc/passwd
……
dockremap:x:10000:10000:,,,:/home/dockremap:/bin/false
$ cat /etc/subuid
……
dockremap:165536:65536
$ cat /etc/subgid
……
dockremap:165536:65536
三.自定義對映使用者
首先在宿主機上建立使用者及使用者組,在啟動docker deamon的時候傳入如下引數.
--userns-remap=<uid>
--userns-remap=<uid>:<gid>
--userns-remap=<username>
--userns-remap=<username>:<groupname>