日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
如何在Kubernetes中運(yùn)行不受信任的容器

如何在 Kubernetes 中運(yùn)行不受信任的容器

作者:Manto 2022-06-27 05:48:24

安全

云安全

云計(jì)算 對(duì)于潛在的攻擊者來(lái)說(shuō),在大公司內(nèi)啟動(dòng)他們的容器是一個(gè)千載難逢的機(jī)會(huì)。但容器技術(shù)自身能讓我們輕松自衛(wèi)嗎?

創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營(yíng)銷,包括成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營(yíng)銷策劃推廣、電子商務(wù)、移動(dòng)互聯(lián)網(wǎng)營(yíng)銷等。創(chuàng)新互聯(lián)為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,創(chuàng)新互聯(lián)核心團(tuán)隊(duì)十年專注互聯(lián)網(wǎng)開(kāi)發(fā),積累了豐富的網(wǎng)站經(jīng)驗(yàn),為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹(shù)立了良好口碑。

IT 世界每天都在越來(lái)越多地采用基于容器的基礎(chǔ)架構(gòu)。但是,每個(gè)人都不清楚優(yōu)點(diǎn),缺點(diǎn)甚至局限性。

考慮到即使是大公司也在靠近基于容器的基礎(chǔ)設(shè)施,但是可能的攻擊區(qū)域和數(shù)據(jù)泄露的潛在影響卻無(wú)人在意。

Docker(containerd)和 LXC 等技術(shù)并不是真正孤立的系統(tǒng),因?yàn)樗鼈兣c托管的操作系統(tǒng)共享相同的 Linux 內(nèi)核。

對(duì)于潛在的攻擊者來(lái)說(shuō),在大公司內(nèi)啟動(dòng)他們的容器是一個(gè)千載難逢的機(jī)會(huì)。但容器技術(shù)自身能讓我們輕松自衛(wèi)嗎?

當(dāng)前的容器技術(shù)

已經(jīng)重復(fù)了很多次,容器是一種打包、共享和部署應(yīng)用程序的新方式,而不是所有功能都打包在一個(gè)軟件或操作系統(tǒng)中的單一應(yīng)用程序。

目前,容器沒(méi)有利用任何新的東西,但它們是在 Linux 命名空間和 cgroup 之上創(chuàng)建的演變。命名空間創(chuàng)建了一個(gè)虛擬和隔離的用戶空間,并為應(yīng)用程序提供其系統(tǒng)資源的隔離,例如文件系統(tǒng)、網(wǎng)絡(luò)和進(jìn)程。這種抽象允許應(yīng)用程序獨(dú)立啟動(dòng),而不會(huì)干擾在同一主機(jī)上運(yùn)行的其他應(yīng)用程序。

所以,多虧了命名空間和 cgroup 的結(jié)合,我們絕對(duì)可以在一個(gè)隔離的環(huán)境中啟動(dòng)許多在同一主機(jī)上運(yùn)行的應(yīng)用程序。

容器與虛擬機(jī)

很明顯,與虛擬機(jī)環(huán)境相比,容器技術(shù)解決了在隔離性、可移植性和精簡(jiǎn)架構(gòu)方面的問(wèn)題。但我們不要忘記,虛擬機(jī)允許我們隔離我們的應(yīng)用程序,尤其是在內(nèi)核級(jí)別,因此黑客逃離容器并破壞系統(tǒng)的風(fēng)險(xiǎn)遠(yuǎn)高于逃離虛擬機(jī)。

大多數(shù) Linux 內(nèi)核漏洞可能適用于容器,這可能允許它們升級(jí)和破壞受影響的命名空間以及同一操作系統(tǒng)中的其他命名空間。

這些安全問(wèn)題導(dǎo)致研究人員嘗試從主機(jī)創(chuàng)建真正分離的命名空間。具體稱為“沙盒”,現(xiàn)在有幾種解決方案可以提供這些功能:gVisor 或例如 Kata Containers。

Kubernetes 中的容器運(yùn)行時(shí)

我們可以在容器編排器 Kubernetes 中更深入地研究這類技術(shù)。

Kubernetes 使用組件 kubelet 來(lái)管理容器。我們可以將其定義為負(fù)責(zé)提供給它的規(guī)范并準(zhǔn)時(shí)準(zhǔn)確地執(zhí)行其操作的船長(zhǎng)。

Kubelet 采用 pod 規(guī)范并使其在分配給它們的主機(jī)上作為容器運(yùn)行,并且可以與任何容器運(yùn)行時(shí)交互,只要它符合 OCI 標(biāo)準(zhǔn)(其實(shí)現(xiàn)是 RunC)

容器運(yùn)行時(shí)的工作原理

RunC最初嵌入到Docker架構(gòu)中,于 2015 年作為獨(dú)立工具發(fā)布。它已成為 DevOps 團(tuán)隊(duì)可以用作容器引擎的一部分的常用的、標(biāo)準(zhǔn)的、跨功能的容器運(yùn)行時(shí)。

RunC 提供了與現(xiàn)有低級(jí) Linux 特性交互的所有功能。它使用命名空間和控制組來(lái)創(chuàng)建和運(yùn)行容器進(jìn)程。

在下面的段落中,我們將介紹運(yùn)行時(shí)類和核心元素。還有一個(gè) RuntimeClass 處理程序,其默認(rèn)值為 RunC(對(duì)于使用 containerd 作為容器運(yùn)行時(shí)的 Kubernetes 安裝)。

RuntimeClass

顧名思義,運(yùn)行時(shí)類允許我們使用各種容器運(yùn)行時(shí)進(jìn)行操作。2014 年,Docker 是 Kubernetes 上唯一可用的運(yùn)行時(shí)容器。從 Kubernetes 1.3 版開(kāi)始,添加了與 Rocket (RKT) 的兼容性,最后在 Kubernetes 1.5 中,引入了容器運(yùn)行時(shí) Iterface (CRI),它具有標(biāo)準(zhǔn)接口和所有容器運(yùn)行時(shí)的可能性,您可以直接與此接口標(biāo)準(zhǔn)省去了開(kāi)發(fā)者適應(yīng)各類容器運(yùn)行時(shí)的麻煩和擔(dān)心版本維護(hù)的麻煩。

事實(shí)上,CRI 允許我們將容器運(yùn)行時(shí)部分與 Kubernetes 分離,最重要的是,允許 Kata Containers 和 gVisor 等技術(shù)以 containerd 的形式連接到容器運(yùn)行時(shí)。

在 Kubernetes 1.14 中,RuntimeClass 再次作為內(nèi)置集群資源引入,其核心是處理程序?qū)傩浴?/p>

處理程序是指接收容器創(chuàng)建請(qǐng)求的程序,對(duì)應(yīng)于容器運(yùn)行時(shí)。

kind: RuntimeClass
apiVersion: node.k8s.io/v1
metadata:
name: #RuntimeClass Name
handler: #container runtime for example: runc
overhead:
podFixed:
memory: "" # 64Mi
cpu: "" # 250m
scheduling:
nodeSelector:
: # container-rt: gvisor
  • handler 字段指向要使用的特定容器運(yùn)行時(shí)或配置。
  • 聲明開(kāi)銷允許集群(包括調(diào)度程序)在做出有關(guān) Pod 和資源的決策時(shí)考慮它。通過(guò)使用這些字段,您可以使用此 RuntimeClass 指定運(yùn)行 pod 的開(kāi)銷,并確保在 Kubernetes 中考慮這些開(kāi)銷。
  • 調(diào)度字段用于確保 Pod 被調(diào)度在正確的節(jié)點(diǎn)上。

默認(rèn)情況下,如果我們有一個(gè)帶有 Docker 或 containerd 的集群,我們的處理程序是 runc,但如果我們使用 gVisor,它將是 runc。

在 Kubernetes 中使用 gVisor 隔離 Linux 主機(jī)和容器

現(xiàn)在我們將了解如何在 Kubernetes 集群中擁有多個(gè)容器運(yùn)行時(shí),并為敏感工作負(fù)載選擇更嚴(yán)格的容器運(yùn)行時(shí)。

在本教程中,我使用了之前的項(xiàng)目,在該項(xiàng)目中我使用 containerd 安裝了 Kubernetes 集群。

https://github.com/alessandrolomanto/k8s-vanilla-containerd

初始化 Kubernetes 集群:

make vagrant-start

啟動(dòng)機(jī)器后,驗(yàn)證所有組件是否已啟動(dòng)并運(yùn)行:

vagrant ssh master

kubectl get nodes
NAME      STATUS   ROLES                  AGE     VERSION

master Ready control-plane,master 7m59s v1.21.0

worker1 Ready 5m50s v1.21.0

worker2 Ready 3m51s v1.21.0

在 worker1 上安裝gVisor:

ssh worker1 # Vagrant default password: vagrant

sudo su

安裝最新的 gVisor 版本:

(
set -e
ARCH=$(uname -m)
URL=https://storage.googleapis.com/gvisor/releases/release/latest/${ARCH}
wget ${URL}/runsc ${URL}/runsc.sha512 \\
${URL}/containerd-shim-runsc-v1 ${URL}/containerd-shim-runsc-v1.sha512
sha512sum -c runsc.sha512 \\
-c containerd-shim-runsc-v1.sha512
rm -f *.sha512
chmod a+rx runsc containerd-shim-runsc-v1
sudo mv runsc containerd-shim-runsc-v1 /usr/local/bin
)
FINISHED --2022-04-28 07:24:44--

Total wall clock time: 5.2s

Downloaded: 4 files, 62M in 3.1s (20.2 MB/s)

runsc: OK

containerd-shim-runsc-v1: OK

配置容器運(yùn)行時(shí):

cat <version = 2
[plugins."io.containerd.runtime.v1.linux"]
shim_debug = true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]
runtime_type = "io.containerd.runsc.v1"
EOF

重啟容器服務(wù):

sudo systemctl restart containerd

為 gVisor 安裝 RuntimeClass:

cat <apiVersion: node.k8s.io/v1beta1
kind: RuntimeClass
metadata:
name: gvisor
handler: runsc
EOF

驗(yàn)證:

vagrant@master:~$ kubectl get runtimeclass

NAME HANDLER AGE

gvisor runsc 17s

使用 gVisor RuntimeClass 創(chuàng)建一個(gè) Pod:

cat <apiVersion: v1
kind: Pod
metadata:
name: nginx-gvisor
spec:
runtimeClassName: gvisor
containers:
- name: nginx
image: nginx
EOF

驗(yàn)證 Pod 是否正在運(yùn)行:

kubectl get pod nginx-gvisor -o wide
vagrant@master:~$ kubectl get pod nginx-gvisor -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

nginx-gvisor 1/1 Running 0 31s 192.168.235.129 worker1

有關(guān)更新信息,請(qǐng)關(guān)注官方文檔。https://gvisor.dev/docs/user_guide/install/

結(jié)論

我們已經(jīng)看到當(dāng)前的容器技術(shù)存在弱隔離問(wèn)題??焖傩扪a(bǔ)容器和最低安全上下文特權(quán)等常見(jiàn)做法可以有效限制攻擊面。我們甚至應(yīng)該開(kāi)始像上面的教程那樣實(shí)施運(yùn)行時(shí)安全措施,因?yàn)楝F(xiàn)在可能有多個(gè)容器運(yùn)行時(shí)。

當(dāng)然,這不是每個(gè)人都需要的東西,但是當(dāng)您想要運(yùn)行不受信任的容器而不以任何方式影響主機(jī)時(shí),它肯定會(huì)派上用場(chǎng)。

假設(shè)你是一個(gè)容器托管服務(wù),在同一臺(tái)主機(jī)上啟動(dòng)不同客戶的容器。你會(huì)因?yàn)楣蚕砩舷挛亩鴵p害其他客戶嗎?開(kāi)始思考如何緩解這些問(wèn)題。


標(biāo)題名稱:如何在Kubernetes中運(yùn)行不受信任的容器
分享URL:http://m.5511xx.com/article/cdjihjs.html