1. 程式人生 > >Docker安全之使用者資源隔離

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>