偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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)建真正分離的命名空間。具體稱(chēng)為“沙盒”,現(xiàn)在有幾種解決方案可以提供這些功能:gVisor 或例如 Kata Containers。

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

我們可以在容器編排器 Kubernetes 中更深入地研究這類(lèi)技術(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í)類(lèi)和核心元素。還有一個(gè) RuntimeClass 處理程序,其默認(rèn)值為 RunC(對(duì)于使用 containerd 作為容器運(yùn)行時(shí)的 Kubernetes 安裝)。

RuntimeClass

顧名思義,運(yùn)行時(shí)類(lèi)允許我們使用各種容器運(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)各類(lèi)容器運(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:
<key>: <value> # container-rt: gvisor
  • handler 字段指向要使用的特定容器運(yùn)行時(shí)或配置。
  • 聲明開(kāi)銷(xiāo)允許集群(包括調(diào)度程序)在做出有關(guān) Pod 和資源的決策時(shí)考慮它。通過(guò)使用這些字段,您可以使用此 RuntimeClass 指定運(yùn)行 pod 的開(kāi)銷(xiāo),并確保在 Kubernetes 中考慮這些開(kāi)銷(xiāo)。
  • 調(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 <none> 5m50s v1.21.0

worker2 Ready <none> 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 <<EOF | sudo tee /etc/containerd/config.toml
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 <<EOF | kubectl apply -f -
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 <<EOF | kubectl apply -f -
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 <none> <none>

有關(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)題。

責(zé)任編輯:趙寧寧 來(lái)源: 云原生技術(shù)愛(ài)好者社區(qū)
相關(guān)推薦

2021-09-17 16:28:22

零信任網(wǎng)絡(luò)防御

2024-07-30 08:00:00

Kubernetes數(shù)據(jù)庫(kù)

2021-08-11 10:38:08

云計(jì)算云計(jì)算環(huán)境云應(yīng)用

2021-08-09 09:00:00

Kubernetes云計(jì)算架構(gòu)

2017-09-18 10:05:15

WindowsLinux容器

2020-09-19 18:03:42

Docker

2020-07-13 07:00:21

Kubernetes

2022-01-21 10:58:39

JavaScriptGolangPython

2024-07-08 09:22:16

2020-07-20 07:00:00

KubernetesHostPath

2021-11-11 09:01:01

Helm Chart Kubernetes

2023-11-28 16:20:07

2013-05-14 10:53:43

2021-09-16 17:38:49

UbuntuLinuxJava

2019-07-12 09:30:12

DashboardDockerDNS

2020-04-10 08:00:08

Kubernetes補(bǔ)丁pod

2022-07-01 09:00:00

零信任網(wǎng)絡(luò)安全Kubernetes

2019-12-11 14:27:39

數(shù)據(jù)庫(kù)集群Kubernetes

2014-10-11 11:30:43

CentOSDocker

2021-12-21 15:17:53

Kubernetes緩存Linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)