如何运行没有Root权限的Docker?干货来了!
作者 |?Vaibhav Raizada
譯者 | 天道酬勤責(zé)編 | 徐威龍
封圖|?CSDN 下載于視覺中國(guó)
在本文中,我們討論了如何在沒有root權(quán)限的情況下運(yùn)行Docker,以便更好地管理容器中的安全性。
?
Docker作為Root用戶
?
Docker以root用戶身份運(yùn)行其容器。但是你的工作負(fù)載真的需要root權(quán)限嗎?答案是很少需要。盡管如此,默認(rèn)情況下,你的容器仍將以root用戶身份運(yùn)行。這可能會(huì)帶來嚴(yán)重的安全問題。實(shí)際上,以root用戶身份在容器內(nèi)部運(yùn)行的進(jìn)程實(shí)際上是在主機(jī)本身上以root用戶身份運(yùn)行的進(jìn)程。這給惡意嘗試獲得對(duì)主機(jī)本身的不受限制的訪問提供了機(jī)會(huì)。
你可以自己檢查它,只需在常用的任何圖像上使用以下命令:
Shell$?kubectl?run?-i?--tty?hello-world?--image=hello-world?--restart=Never?--?sh /?#?ps?aux PID???USER?????TIME??COMMAND 1???root?????0:10??sh顯然,作為一種最佳實(shí)踐,我們應(yīng)該避免以超root用戶身份運(yùn)行容器。因此,我們?nèi)绾谓鉀Q此問題,讓我們看看如何以非root用戶身份運(yùn)行容器。
?
將非超級(jí)用戶添加到Dockerfile
?
創(chuàng)建一個(gè)僅具有容器內(nèi)工作負(fù)載所需權(quán)限的用戶。你可以在容器圖像本身的Dockerfile中使用RUN命令創(chuàng)建用戶。
DockerfileRUN?groupadd?--gid?5000?newuser?\&&?useradd?--home-dir?/home/newuser?--create-home?--uid?5000?\--gid?5000?--shell?/bin/sh?--skel?/dev/null?newuser上面的代碼行創(chuàng)建了一個(gè)用戶newuser以及該用戶的home和shell。現(xiàn)在,只需將用戶添加到Dockerfile中,如以下示例所示:
DockerfileFROM?ubuntu:18.04 COPY?.?/myapp RUN?make?/myapp ... USER?newuser CMD?python?/myapp/hello.py從第7行(USER newuser)開始,每個(gè)命令都以newuser而不是root身份運(yùn)行。這樣做很簡(jiǎn)單,對(duì)不對(duì)?
但是,我們并不總是僅使用自定義的圖像。我們還使用了許多第三方圖像,因此我們無法像上面那樣將非root用戶注入到這些圖像中。
默認(rèn)情況下,這些第三方Docker圖像將以root用戶身份運(yùn)行,除非我們對(duì)其進(jìn)行處理。如果你使用的圖像來自一個(gè)不太流行的源 ,那么該圖像甚至可能嵌入了惡意命令,這可能會(huì)損害集群的安全性。
Kubernetes Pod安全上下文和Pod安全策略可以為我們提供幫助。
?
使用Pod安全上下文
?
你可以使用Pod安全上下文將Pod的執(zhí)行限制為特定的非root用戶。要為Pod指定這些安全設(shè)置,請(qǐng)?jiān)赑od規(guī)范中添加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在以上規(guī)范中,runAsUser指定pod內(nèi)的任何容器僅使用userID 5000運(yùn)行。這是我們專門為非root用戶創(chuàng)建的用戶。? runAsGroup指定所有進(jìn)程的群組ID。如果我們不提及這一點(diǎn),則群組ID將是root(0)。
現(xiàn)在,你可以創(chuàng)建此pod并檢查容器中運(yùn)行的進(jìn)程:
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正在以u(píng)serID 5000而不是root用戶身份運(yùn)行的。
使用Kubernetes Pod安全策略
Kubernetes Pod安全策略定義了Pod必須運(yùn)行的條件, 否則,它不會(huì)在集群中提供。換句話說,如果不滿足這些條件,Kubernetes將阻止Pod運(yùn)行。?
下面給出了一個(gè)示例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'該安全策略實(shí)現(xiàn)以下目的:
限制容器在權(quán)限模式下運(yùn)行。
限制需要root的容器。
限制訪問除NFS卷以外的esvolumes的容器。
僅允許容器訪問主機(jī)端口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]現(xiàn)在已經(jīng)創(chuàng)建了策略,你可以通過嘗試以root權(quán)限運(yùn)行容器來對(duì)其進(jìn)行測(cè)試。
Shell$?kubectl?run?--image=my-root-containerpod安全策略將禁止其運(yùn)行并給出一個(gè)錯(cuò)誤消息:?
Shell$?kubectl?get?pods NAME?????????READY????STATUS my-root-pod??0/1??????container?has?runAsNonRoot?and?image?will?run?as?root?
結(jié)論
?
在這篇文章中,我們強(qiáng)調(diào)了在root用戶的默認(rèn)設(shè)置下運(yùn)行Docker容器的固有風(fēng)險(xiǎn)。我們還提出了多種方法來克服這種風(fēng)險(xiǎn)。
如果你正在運(yùn)行自定義圖像,那么可以創(chuàng)建一個(gè)新的非root用戶并在Dockerfile中指定它。
如果使用的是第三方圖像,則可以在Pod或容器級(jí)別設(shè)置安全上下文。
還有一種方法是創(chuàng)建一個(gè)Pod安全策略,該策略將不允許任何容器以root權(quán)限運(yùn)行。
如果有不清楚的地方或其他意見,歡迎評(píng)論告訴我們。
原文:https://dzone.com/articles/docker-without-root-privileges
2020 AI?開發(fā)者萬人大會(huì)將于6月26日通過線上直播形式,讓開發(fā)者們一站式學(xué)習(xí)了解當(dāng)下?AI?的前沿技術(shù)研究、核心技術(shù)與應(yīng)用以及企業(yè)案例的實(shí)踐經(jīng)驗(yàn),同時(shí)還可以在線參加精彩多樣的開發(fā)者沙龍與編程項(xiàng)目。參與前瞻系列活動(dòng)、在線直播互動(dòng),不僅可以與上萬名開發(fā)者們一起交流,還有機(jī)會(huì)贏取直播專屬好禮,與技術(shù)大咖連麥。
今日福利:評(píng)論區(qū)留言入選,都可獲得價(jià)值299元的「2020 AI開發(fā)者萬人大會(huì)」在線直播門票一張。??快來動(dòng)動(dòng)手指,寫下你想說的話吧!
推薦閱讀:破解面試難題8個(gè)角度帶你解讀SQL面試技巧! GitHub 接連封殺開源項(xiàng)目惹眾怒,CEO 親自道歉! 5 億微博數(shù)據(jù)疑泄露,Python 爬蟲如何避免踩天坑? 我就不信 35 歲做不了程序員! 在非托管錢包中可能會(huì)出現(xiàn)價(jià)值3000萬美元的BCH SIM 交換黑客攻擊嗎? 對(duì)標(biāo)Pytorch,清華團(tuán)隊(duì)推出自研AI框架“計(jì)圖” 真香,朕在看了!總結(jié)
以上是生活随笔為你收集整理的如何运行没有Root权限的Docker?干货来了!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为美国研发中心将迁至加拿大;高通CEO
- 下一篇: MongoDB+阿里云 最新数据库独家