Docker容器中用戶權限管理


在Linux系統中有一部分知識非常重要,就是關於權限的管理控制;Linux系統的權限管理是由uid和gid負責,Linux系統會檢查創建進程的uid和gid,以確定它是否有足夠的權限修改文件,而非是通過用戶名和用戶組來確認。同樣,在docker容器中主機上運行的所有容器共享同一個內核也可以理解為共享權限管理方式。

Docker容器的權限管理方式分為了三種情況:
1.默認使用的root權限
不管是以root用戶還是以普通用戶(有啟動docker容器的權限)啟動docker容器,容器進程和容器內的用戶權限都是root!
新建了sleep用戶,以sleep用戶權限啟動容器並在有root權限的磁盤進行權限測試。

docker run -v /data/sleep:/sleep  -d --name sleep-1 ubuntu sleep infinity

在宿主機中/data/sleep路徑新建了leo_zhou文件並在文件寫入“docker”,然后進入sleep-1容器

docker exec -it sleep-1 bash


依然可以正常操作擁有root權限的文件。

2.限制Docker容器啟動的用戶
新增--user參數,使容器啟動用戶變成指定的sleep用戶,發現並不能操作擁有root權限的文件了。會發現容器中的uid號和實際主機中的uid號一樣,也驗證了docker容器使用宿主機的內核。可以一定程度進行權限管理。

3.使用namespace隔離技術
namespace是一種隔離技術,docker就是使用隔離技術開啟特定的namespace創建出一些特殊的進程,不過使用namespace是有條件的。系統會創建dockremap,通過/etc/subuid/etc/subuid對應的id值,映射到容器中去;實際情況還是使用的是dockremap普通權限,達到自動隔離的效果。
①開啟Centos內核中關閉的user namespace的功能。

grubby --args="namespace.unpriv_enable=1 user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
echo "user.max_user_namespaces=15076" >> /etc/sysctl.conf

②修改/etc/docker/daemon.json配置,新增"userns-remap": "default"選項,default默認就是docker自動創建的用戶dockremap,然后重啟docker。
修改此項配置需要慎重,如果是已經部署了一套docker環境,啟用此選項后,會切換到隔離環境,以前的docker容器將無法使用!

③Centos需要手動輸入id值映射范圍

最后systemctl restart docker后再次測試效果,發現文件權限已經變成nobody,但docker容器內部依然是以"root"的權限管理,但實際只有普通用戶的權限,從而達到權限隔離的效果。




免責聲明!

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



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