重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
這篇文章主要介紹“Docker容器運行時權限和Linux系統功能簡單介紹”,在日常操作中,相信很多人在Docker容器運行時權限和Linux系統功能簡單介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Docker容器運行時權限和Linux系統功能簡單介紹”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
相關Docker參數
--cap-add: Add Linux capabilities --cap-drop: Drop Linux capabilities --privileged=false: Give extended privileges to this container --device=[]: Allows you to run devices inside the container without the --privileged flag.
出于容器之間和容器與宿主機的安全隔離保護,在默認的Docker配置下,Docker容器是沒有系統權限的。例如不能在一個Docker容器內,再運行一個Dokcer服務(譯者注:或者在容器內修改系統時間)。這是因為在默認情況下,容器內的進程不允許訪問任何宿主機上的設備。只有獲得設備訪問授權的容器,才可以訪問所有設備(請參閱關于 cgroups設備的文檔)。
當容器管理員執行docker run --privileged
時,將允許Docker容器訪問宿主機上的所有設備,并在AppArmor或SELinux中設置一些配置,使容器內的進程可以與容器外運行的進程幾乎一樣權限來訪問宿主機。(有關運行--privileged
參數的更多信息,請訪問
Docker博客。)
如果想限制對特定設備的訪問,可以使用--device
參數。它允許您指定從容器內訪問的一個或多個設備。
$ docker run --device=/dev/snd:/dev/snd ...
開啟--device
參數后,容器內的進程默認將獲得這些設備的read
、write
和mknod
權限。您也可以為每個--device
參數,附加第三個:rwm
選項來覆蓋默認的設置:
$ docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdc Command (m for help): q $ docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk /dev/xvdc You will not be able to write the partition table. Command (m for help): q $ docker run --device=/dev/sda:/dev/xvdc:w --rm -it ubuntu fdisk /dev/xvdc crash.... $ docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc fdisk: unable to open /dev/xvdc: Operation not permitted
除了--privileged
之外,操作員還可以使用--cap-add
和--cap-drop
對功能進行細粒度控制。默認情況下,Docker有一個保留的默認功能列表。
下表列出了Linux功能選項,這些選項是默認允許的,可以刪除。
功能項 | 功能描述 |
---|---|
SETPCAP | 修改進程的權限 |
MKNOD | 使用mknod(2)創建特殊文件 |
AUDIT_WRITE | 將記錄寫入內核審計日志 |
CHOWN | 任意更改文件UIDs和GIDs(見chown(2)) |
NET_RAW | 使用 RAW 和 PACKET 套接字 |
DAC_OVERRIDE | 繞過文件的讀、寫和執行權限檢查 |
FOWNER | 繞過對進程的文件系統UID與文件的UID進行權限匹配的檢查操作 |
FSETID | 當文件被修改時,不要清除set-user-ID和set-group-ID權限位 |
KILL | 繞過發送信號的權限檢查 |
SETGID | 自定義處理進程GID和補充GID列表 |
SETUID | 自定義處理進程UID |
NET_BIND_SERVICE | 將套接字綁定到互聯網域名專用端口(端口號小于1024)。 |
SYS_CHROOT | 使用chroot(2),更改根目錄 |
SETFCAP | 設置文件功能 |
下表顯示了默認情況下未授予的功能,可以手動添加這些功能。
功能項 | 功能描述 |
---|---|
SYS_MODULE | 加載和卸載內核模塊 |
SYS_RAWIO | 執行I / O端口操作(iopl(2)和ioperm(2)) |
SYS_PACCT | 使用acct(2),打開或關閉進程計數 |
SYS_ADMIN | 執行一系列系統管理操作 |
SYS_NICE | 提高進程的nice值(nice(2),setpriority(2))并更改任意進程的nice值 |
SYS_RESOURCE | 覆蓋資源限制 |
SYS_TIME | 設置系統時鐘(settimeofday(2),stime(2),adjtimex(2)); 設置實時(硬件)時鐘 |
SYS_TTY_CONFIG | 使用vhangup(2); 在虛擬終端上使用各種特權的ioctl(2)操作 |
AUDIT_CONTROL | 啟用和禁用內核審核; 更改審核過濾器規則; 檢索審核狀態和過濾規則 |
MAC_ADMIN | 允許MAC配置或狀態更改。 為Smack LSM而實現的功能 |
MAC_OVERRIDE | 覆蓋強制訪問控制(MAC)。 為Smack Linux安全模塊(LSM)實現 |
NET_ADMIN | 執行各種與網絡相關的操作 |
SYSLOG | 執行syslog(2)的權限操作。 |
DAC_READ_SEARCH | 繞過文件讀取權限檢查以及目錄讀取和執行權限檢查 |
LINUX_IMMUTABLE | 設置FS_APPEND_FL和FS_IMMUTABLE_FL i-node 標志 |
NET_BROADCAST | 使套接字可以實現廣播,并監聽廣播包 |
IPC_LOCK | 鎖定內存(mlock(2),mlockall(2),mmap(2),shmctl(2)) |
IPC_OWNER | 繞過對System V IPC對象操作的權限檢查 |
SYS_PTRACE | 使用ptrace(2)跟蹤任意進程 |
SYS_BOOT | 使用reboot(2)和kexec_load(2),重新引導并加載新內核以供程序執行 |
LEASE | 在任意文件上建立Lease租約(請參閱fcntl(2)) |
WAKE_ALARM | 觸發喚醒系統的操作 |
BLOCK_SUSPEND | 開啟可以阻止系統掛起的功能 |
更多的參考信息可以在 capabilities(7) - Linux man page Linux手冊頁中找到
--cap-add --cap-drop
兩個參數都支持值ALL
,所以如果Docker管理員想要獲得除了MKNOD
以外的所有Linux功能,可以使用:
$ docker run --cap-add=ALL --cap-drop=MKNOD ...
如果想與系統的網絡堆棧進行交互,應該使用--cap-add=NET_ADMIN
來修改網絡接口,而不是使用--privileged
。
$ docker run -it --rm ubuntu:14.04 ip link add dummy0 type dummy RTNETLINK answers: Operation not permitted $ docker run -it --rm --cap-add=NET_ADMIN ubuntu:14.04 ip link add dummy0 type dummy
要安裝一個基于FUSE的文件系統,您需要結合--cap-add
和--device
:
$ docker run --rm -it --cap-add SYS_ADMIN sshfs sshfs sven@10.10.10.20:/home/sven /mnt fuse: failed to open /dev/fuse: Operation not permitted $ docker run --rm -it --device /dev/fuse sshfs sshfs sven@10.10.10.20:/home/sven /mnt fusermount: mount failed: Operation not permitted $ docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs # sshfs sven@10.10.10.20:/home/sven /mnt The authenticity of host '10.10.10.20 (10.10.10.20)' can't be established. ECDSA key fingerprint is 25:34:85:75:25:b0:17:46:05:19:04:93:b5:dd:5f:c6. Are you sure you want to continue connecting (yes/no)? yes sven@10.10.10.20's password: root@30aa0cfaf1b5:/# ls -la /mnt/src/docker total 1516 drwxrwxr-x 1 1000 1000 4096 Dec 4 06:08 . drwxrwxr-x 1 1000 1000 4096 Dec 4 11:46 .. -rw-rw-r-- 1 1000 1000 16 Oct 8 00:09 .dockerignore -rwxrwxr-x 1 1000 1000 464 Oct 8 00:09 .drone.yml drwxrwxr-x 1 1000 1000 4096 Dec 4 06:11 .git -rw-rw-r-- 1 1000 1000 461 Dec 4 06:08 .gitignore ....
默認的seccomp配置文件將根據所選的功能進行調整,以允許使用功能所允許的功能,所以從Docker1.12之后的版本,不應該對此進行調整。在Docker 1.10和1.11中沒有這種情況,在添加功能時可能需要使用一個自定義的seccomp配置文件或使用--security-opt seccomp=unconfined
。
到此,關于“Docker容器運行時權限和Linux系統功能簡單介紹”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯-成都網站建設公司網站,小編會繼續努力為大家帶來更多實用的文章!