docker容器權限設置--cap-add | --cap-drop | privileged


docker 容器的權限設置

Dcoker容器在使用的過程中,默認的docker run時都是以普通方式啟動的,有的時候是需要使用在容器中使用iptables進行啟動的,沒有使用iptables的權限,那么怎樣才能在容器中使用iptables呢?要如何開啟權限呢?

那么在docker進行run的時候如何將此容器的權限進行配置呢?主要是使用--privileged或--cap-add、--cap-drop來對容器本身的能力的開放或限制。

--cap-add list                   Add Linux capabilities # 添加某些權限
--cap-drop list                  Drop Linux capabilities # 關閉權限
--privileged                     Give extended privileges to this container # default false

以下將舉例來進行說明:

默認run容器的情況下,查看iptables的設置:

root@42dd128c89db:/# iptables -nL
iptables v1.6.0: can't initialize iptables table `filter': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.

顯然就連iptables的查看都不允許,就像前面說的,有的時候,我們有需求進行網絡設置,即入站、出站網絡端口設置,我們可以在啟動容器的時候如下設置:

docker run --cap-add NET_ADMIN --name demo imageName bash

通過這樣簡單的設置,我們就可以方便的在容器里面管理網絡了。

當然,路子夠野的也可以通過--privileged設置,默認false,即關閉了一些權限的,如果設置為true,或者在docker run 的時候加上 --privileged,此時我們就放開了權限。

docker run --privileged --name demo imageName bash

對於iptables需要的權限進行開放,而對於其它的權限不予開放,那么在啟動docker的時候使用如下的命令參數進行限制權限的過度開放:

docker run--cap-add NET_ADMIN --cap-add NET_RAW -d -p 4489:4489/tcp  --name bbb aaa

總結:

  • 1.privileged,權限全開,不利於宿主機安全
  • 2.cap-add/cap-drop,細粒度權限設置,需要什么開什么

docker-compose的設置

  containers:
      - name: snake
        image: docker.io/kelysa/snake:lastest
        imagePullPolicy: Always
        securityContext:
          privileged: true
          capabilities:
            add: ["NET_ADMIN","NET_RAW"]

Linux capabilities

進一步了解:Linux Capabilities 簡介

Capabilities的主要思想在於分割root用戶的特權,即將root的特權分割成不同的能力,每種能力代表一定的特權操作。
例如:能力CAP_SYS_MODULE表示用戶能夠加載(或卸載)內核模塊的特權操作,而CAP_SETUID表示用戶能夠修改進程用戶
身份的特權操作。在Capbilities中系統將根據進程擁有的能力來進行特權操作的訪問控制。

    在Capilities中,只有進程和可執行文件才具有能力,每個進程擁有三組能力集,分別稱為cap_effective, 
cap_inheritable, cap_permitted(分別簡記為:pE,pI,pP),其中cap_permitted表示進程所擁有的最大能力集;
cap_effective表示進程當前可用的能力集,可以看做是cap_permitted的一個子集;而cap_inheitable則表示進程可以
傳遞給其子進程的能力集。系統根據進程的cap_effective能力集進行訪問控制,cap_effective為cap_permitted的子集,
進程可以通過取消cap_effective中的某些能力來放棄進程的一些特權。可執行文件也擁有三組能力集,對應於進程的三組
能力集,分別稱為cap_effective, cap_allowed 和 cap_forced(分別簡記為fE,fI,fP),
其中,cap_allowed表示程序運行時可從原進程的cap_inheritable中集成的能力集,
cap_forced表示運行文件時必須擁有才能完成其服務的能力集;而cap_effective則表示文件開始運行時可以使用的能力。

(一)Linux內核中Capabilities的實現機制
     Linux內核從2.2版本開始,就加進的Capabilities的概念與機制,並隨着版本升高逐步得到改進。在linux中,root權限被分割成一下29中能力:

CAP_CHOWN:修改文件屬主的權限

CAP_DAC_OVERRIDE:忽略文件的DAC訪問限制

CAP_DAC_READ_SEARCH:忽略文件讀及目錄搜索的DAC訪問限制

CAP_FOWNER:忽略文件屬主ID必須和進程用戶ID相匹配的限制

CAP_FSETID:允許設置文件的setuid位

CAP_KILL:允許對不屬於自己的進程發送信號

CAP_SETGID:允許改變進程的組ID

CAP_SETUID:允許改變進程的用戶ID

CAP_SETPCAP:允許向其他進程轉移能力以及刪除其他進程的能力

CAP_LINUX_IMMUTABLE:允許修改文件的IMMUTABLE和APPEND屬性標志

CAP_NET_BIND_SERVICE:允許綁定到小於1024的端口

CAP_NET_BROADCAST:允許網絡廣播和多播訪問

CAP_NET_ADMIN:允許執行網絡管理任務

CAP_NET_RAW:允許使用原始套接字

CAP_IPC_LOCK:允許鎖定共享內存片段

CAP_IPC_OWNER:忽略IPC所有權檢查

CAP_SYS_MODULE:允許插入和刪除內核模塊

CAP_SYS_RAWIO:允許直接訪問/devport,/dev/mem,/dev/kmem及原始塊設備

CAP_SYS_CHROOT:允許使用chroot()系統調用

CAP_SYS_PTRACE:允許跟蹤任何進程

CAP_SYS_PACCT:允許執行進程的BSD式審計

CAP_SYS_ADMIN:允許執行系統管理任務,如加載或卸載文件系統、設置磁盤配額等

CAP_SYS_BOOT:允許重新啟動系統

CAP_SYS_NICE:允許提升優先級及設置其他進程的優先級

CAP_SYS_RESOURCE:忽略資源限制

CAP_SYS_TIME:允許改變系統時鍾

CAP_SYS_TTY_CONFIG:允許配置TTY設備

CAP_MKNOD:允許使用mknod()系統調用

CAP_LEASE:允許修改文件鎖的FL_LEASE標志

參考:
https://blog.csdn.net/yygydjkthh/article/details/50737237
https://www.it1352.com/1534884.html
http://blog.itpub.net/69950985/viewspace-2661212/
http://blog.csdn.net/zhao_cancan/article/details/38366541


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM