在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"的權限管理,但實際只有普通用戶的權限,從而達到權限隔離的效果,


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/65530.html
標籤:其他
