如何运行没有Root权限的Docker?干货来了!
作者 |?Vaibhav Raizada
譯者 | 天道酬勤責編 | 徐威龍
封圖|?CSDN 下載于視覺中國
在本文中,我們討論了如何在沒有root權限的情況下運行Docker,以便更好地管理容器中的安全性。
?
Docker作為Root用戶
?
Docker以root用戶身份運行其容器。但是你的工作負載真的需要root權限嗎?答案是很少需要。盡管如此,默認情況下,你的容器仍將以root用戶身份運行。這可能會帶來嚴重的安全問題。實際上,以root用戶身份在容器內部運行的進程實際上是在主機本身上以root用戶身份運行的進程。這給惡意嘗試獲得對主機本身的不受限制的訪問提供了機會。
你可以自己檢查它,只需在常用的任何圖像上使用以下命令:
Shell$?kubectl?run?-i?--tty?hello-world?--image=hello-world?--restart=Never?--?sh /?#?ps?aux PID???USER?????TIME??COMMAND 1???root?????0:10??sh顯然,作為一種最佳實踐,我們應該避免以超root用戶身份運行容器。因此,我們如何解決此問題,讓我們看看如何以非root用戶身份運行容器。
?
將非超級用戶添加到Dockerfile
?
創建一個僅具有容器內工作負載所需權限的用戶。你可以在容器圖像本身的Dockerfile中使用RUN命令創建用戶。
DockerfileRUN?groupadd?--gid?5000?newuser?\&&?useradd?--home-dir?/home/newuser?--create-home?--uid?5000?\--gid?5000?--shell?/bin/sh?--skel?/dev/null?newuser上面的代碼行創建了一個用戶newuser以及該用戶的home和shell。現在,只需將用戶添加到Dockerfile中,如以下示例所示:
DockerfileFROM?ubuntu:18.04 COPY?.?/myapp RUN?make?/myapp ... USER?newuser CMD?python?/myapp/hello.py從第7行(USER newuser)開始,每個命令都以newuser而不是root身份運行。這樣做很簡單,對不對?
但是,我們并不總是僅使用自定義的圖像。我們還使用了許多第三方圖像,因此我們無法像上面那樣將非root用戶注入到這些圖像中。
默認情況下,這些第三方Docker圖像將以root用戶身份運行,除非我們對其進行處理。如果你使用的圖像來自一個不太流行的源 ,那么該圖像甚至可能嵌入了惡意命令,這可能會損害集群的安全性。
Kubernetes Pod安全上下文和Pod安全策略可以為我們提供幫助。
?
使用Pod安全上下文
?
你可以使用Pod安全上下文將Pod的執行限制為特定的非root用戶。要為Pod指定這些安全設置,請在Pod規范中添加securityContext字段。
YAMLapiVersion:?v1 kind:?Pod metadata:name:?my-pod spec:securityContext:runAsUser:?5000runAsGroup:?5000volumes:-?name:?my-volemptyDir:?{}containers:-?name:?my-containerimage:?hello-worldcommand:?["sh",?"-c",?"sleep?10?m"]volumeMounts:-?name:?my-volmountPath:?/data/hellosecurityContext:allowPrivilegeEscalation:?false在以上規范中,runAsUser指定pod內的任何容器僅使用userID 5000運行。這是我們專門為非root用戶創建的用戶。? runAsGroup指定所有進程的群組ID。如果我們不提及這一點,則群組ID將是root(0)。
現在,你可以創建此pod并檢查容器中運行的進程:
Shell$?kubectl?apply?-f?my-pod.yaml $?kubectl?exec?-it?my-pod?–?sh ps PID???USER?????TIME??COMMAND1???5000?????0:00??sleep?10?m6???5000?????0:00??sh如上所示,PID 1正在以userID 5000而不是root用戶身份運行的。
使用Kubernetes Pod安全策略
Kubernetes Pod安全策略定義了Pod必須運行的條件, 否則,它不會在集群中提供。換句話說,如果不滿足這些條件,Kubernetes將阻止Pod運行。?
下面給出了一個示例PodSecurityPolicy:
YAMLapiVersion:?policy/v1beta1 kind:?PodSecurityPolicy metadata:name:?my-psp spec:privileged:?false#Required?to?prevent?escalations?to?root.allowPrivilegeEscalation:?falseallowedCapabilities:-?'*'volumes:-?'nfs'hostNetwork:?truehostPorts:-?min:?8000max:?8000hostIPC:?truehostPID:?truerunAsUser:#Require?the?container?to?run?without?root.rule:?'MustRunAsNonRoot'seLinux:rule:?'RunAsAny'supplementalGroups:rule:?'RunAsAny'fsGroup:rule:?'RunAsAny'該安全策略實現以下目的:
限制容器在權限模式下運行。
限制需要root的容器。
限制訪問除NFS卷以外的esvolumes的容器。
僅允許容器訪問主機端口100。
激活策略:
Shell$?kubectl?create?-f?my-psp.yaml檢查策略:
Shell$?kubectl?get?psp NAME????PRIV???RUNASUSER?????????FSGROUP???SELINUX???VOLUMES My-psp??false??MustRunAsNonRoot??RunAsAny??RunAsAny??[nfs]現在已經創建了策略,你可以通過嘗試以root權限運行容器來對其進行測試。
Shell$?kubectl?run?--image=my-root-containerpod安全策略將禁止其運行并給出一個錯誤消息:?
Shell$?kubectl?get?pods NAME?????????READY????STATUS my-root-pod??0/1??????container?has?runAsNonRoot?and?image?will?run?as?root?
結論
?
在這篇文章中,我們強調了在root用戶的默認設置下運行Docker容器的固有風險。我們還提出了多種方法來克服這種風險。
如果你正在運行自定義圖像,那么可以創建一個新的非root用戶并在Dockerfile中指定它。
如果使用的是第三方圖像,則可以在Pod或容器級別設置安全上下文。
還有一種方法是創建一個Pod安全策略,該策略將不允許任何容器以root權限運行。
如果有不清楚的地方或其他意見,歡迎評論告訴我們。
原文:https://dzone.com/articles/docker-without-root-privileges
2020 AI?開發者萬人大會將于6月26日通過線上直播形式,讓開發者們一站式學習了解當下?AI?的前沿技術研究、核心技術與應用以及企業案例的實踐經驗,同時還可以在線參加精彩多樣的開發者沙龍與編程項目。參與前瞻系列活動、在線直播互動,不僅可以與上萬名開發者們一起交流,還有機會贏取直播專屬好禮,與技術大咖連麥。
今日福利:評論區留言入選,都可獲得價值299元的「2020 AI開發者萬人大會」在線直播門票一張。??快來動動手指,寫下你想說的話吧!
推薦閱讀:破解面試難題8個角度帶你解讀SQL面試技巧! GitHub 接連封殺開源項目惹眾怒,CEO 親自道歉! 5 億微博數據疑泄露,Python 爬蟲如何避免踩天坑? 我就不信 35 歲做不了程序員! 在非托管錢包中可能會出現價值3000萬美元的BCH SIM 交換黑客攻擊嗎? 對標Pytorch,清華團隊推出自研AI框架“計圖” 真香,朕在看了!總結
以上是生活随笔為你收集整理的如何运行没有Root权限的Docker?干货来了!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为美国研发中心将迁至加拿大;高通CEO
- 下一篇: 雅士利牵手阿里云实现新零售改造,双11全