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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
通過Distroless加固容器安全

谷歌現(xiàn)在通過提供 Distroless 鏡像向全世界開放這種能力。谷歌構(gòu)建的這些鏡像的目標是只包含你的應用程序及其依賴項,同時它們將沒有常規(guī) Linux 發(fā)行版的所有特性,包括 shell。

使用Distroless鏡像來保護Kubernetes上的容器。容器改變了我們看待技術(shù)基礎(chǔ)設(shè)施的方式。這是我們運行應用程序方式的一次巨大飛躍。容器編排和云服務(wù)一起為我們提供了一種近乎無限規(guī)模的無縫擴展能力。根據(jù)定義,容器應該包含「應用程序」及其「運行時依賴項」。然而,在現(xiàn)實中,它們包含的遠不止這些。標準容器基礎(chǔ)映像包含標準Linux發(fā)行版中可以找到的包管理器、shell和其他程序。雖然這些都是構(gòu)建容器鏡像所必需的,但它們不應該成為最終鏡像的一部分。例如,一旦你把包安裝好了,就不再需要在容器中使用apt等包管理工具了。這不僅使你的容器里充滿了不必要的軟件包和程序,而且還為網(wǎng)絡(luò)罪犯提供了攻擊特定程序漏洞的機會。你應該始終了解容器運行時中存在什么,并且應該精確地限制其只包含應用程序所需的依賴項。除了那些必要的,你不應該安裝任何東西。一些領(lǐng)先的科技巨頭,如谷歌,有多年在生產(chǎn)中運行容器的經(jīng)驗,已經(jīng)采用了這種方法。

谷歌現(xiàn)在通過提供Distroless鏡像向全世界開放這種能力。谷歌構(gòu)建的這些鏡像的目標是只包含你的應用程序及其依賴項,同時它們將沒有常規(guī)Linux發(fā)行版的所有特性,包括shell。「這意味著雖然可以像以前一樣運行應用程序的容器,但不能在容器運行的時候進入容器內(nèi)」。這是一個重大的安全改進,因為你現(xiàn)在已經(jīng)為黑客通過shell進入你的容器關(guān)上了大門。

Distroless 基礎(chǔ)鏡像

谷歌為大多數(shù)流行的編程語言和平臺提供了 Distroless 的基礎(chǔ)鏡像。

以下基礎(chǔ)鏡像是正式發(fā)布的版本:

gcr.io/distroless/static-debian10

gcr.io/distroless/base-debian10

gcr.io/distroless/java-debian10

gcr.io/distroless/cc-debian10

gcr.io/distroless/nodejs-debian10

下面的基礎(chǔ)鏡像仍在實驗階段,不推薦用于生產(chǎn)環(huán)境:

gcr.io/distroless/python2.7-debian10

gcr.io/distroless/python3-debian10

gcr.io/distroless/java/jetty-debian10

gcr.io/distroless/dotnet

構(gòu)建 Distroless 鏡像

谷歌在內(nèi)部使用 Bazel 來構(gòu)建容器映像,但是我們可以使用 Docker 來做同樣的事情。關(guān)于使用 Distroless 鏡像的一個有爭議的問題是:當我們有一個 Distroless 鏡像時,我們?nèi)绾问褂?Dockerfile 來構(gòu)建我們的應用程序呢?

通常,Dockerfile 以一個標準的 OS 基礎(chǔ)鏡像開始,然后是創(chuàng)建適當?shù)倪\行時構(gòu)建所需執(zhí)行的多個步驟。這包括包的安裝,為此需要像 apt 或 yum 這樣的包管理器。

有兩種方法:

先在 Docker 外部構(gòu)建好你的應用程序,然后使用 Dockerfile 中的 ADD 或 COPY 指令將二進制包復制到容器中。

使用多階段 Docker 構(gòu)建。這是 Docker 17.05 及以后版本的一個新特性,它允許你將構(gòu)建分為不同的階段。第一階段可以從標準的 OS 基礎(chǔ)鏡像開始,可以幫助你構(gòu)建應用程序;第二階段可以簡單地從第一階段獲取構(gòu)建的文件并使用 Distroless 作為基礎(chǔ)鏡像。

為了理解它是如何工作的,讓我們使用多階段構(gòu)建流程進行一個實際操作練習。

必要條件

你需要具備以下內(nèi)容:

Docker 版本大于等于 17.05,用于構(gòu)建鏡像

可選的Kubernetes集群用于實踐練習的第二部分。如果你想在 Docker 中運行你的容器,你可以使用等價的docker命令。

GitHub代碼倉

作為實踐練習,將 此代碼倉 Fork 到你的 GitHub 帳號下,然后克隆 GitHub 代碼倉并使用 cd 進入到項目目錄下。

該代碼倉包含一個 Python 的 Flask 應用程序,當你調(diào)用API時,該應用程序會響應 Hello World!。

app.py 文件如下所示:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
   return "Hello World!"

if __name__ == '__main__':
   app.run(host='0.0.0.0', debug=True)

Dockerfile 包含兩個階段:

FROM python:2.7-slim AS build
ADD . /app
WORKDIR /app
RUN pip install --upgrade pip
RUN pip install -r ./requirements.txt

FROM gcr.io/distroless/python2.7
COPY --from=build /app /app
COPY --from=build /usr/local/lib/python2.7/site-packages /usr/local/lib/python2.7/site-packages
WORKDIR /app
ENV PYTHONPATH=/usr/local/lib/python2.7/site-packages
EXPOSE 5000
CMD ["app.py"]

構(gòu)建階段:

從python:2.7-slim的基礎(chǔ)鏡像開始

將應用程序復制到/app目錄下

升級pip并安裝依賴

Distroless 階段:

從 gcr.io/distroless/python2.7 的基礎(chǔ)鏡像開始

將應用程序從構(gòu)建階段的 /app 目錄復制到當前階段的 /app 目錄

將 python 的 site-packages 從構(gòu)建階段復制到當前階段的 site-packages 目錄

設(shè)置工作目錄到 /app,將 python PATH 設(shè)置為 site-packages 目錄,并暴露 5000 端口

使用 CMD 指令運行 app.py

由于 Disroless 鏡像不包含 shell,所以應該在最后使用 CMD 指令。如果不這樣做,Docker 將認為它是一個 shell CMD,并試圖這樣執(zhí)行它,但這是不工作的。

構(gòu)建鏡像:

$ docker build -t /flask-hello-world-distroless .
Sending build context to Docker daemon  95.74kB
Step 1/12 : FROM python:2.7-slim AS build
---> eeb27ee6b893
Step 2/12 : ADD . /app
---> a01dc81df193
Step 3/12 : WORKDIR /app
---> Running in 48ccf6b990e4
Removing intermediate container 48ccf6b990e4
---> 2e5e335be678
Step 4/12 : RUN pip install --upgrade pip
---> Running in 583be3d0b8cc
Collecting pip
 Downloading pip-20.1.1-py2.py3-none-any.whl (1.5 MB)
Installing collected packages: pip
 Attempting uninstall: pip
   Found existing installation: pip 20.0.2
   Uninstalling pip-20.0.2:
     Successfully uninstalled pip-20.0.2
Successfully installed pip-20.1.1
Removing intermediate container 583be3d0b8cc
...................................
Successfully installed Jinja2-2.11.2 MarkupSafe-0.23 click-7.1.2 flask-1.1.2 itsdangerous-0.24 werkzeug-1.0.1
Removing intermediate container c4d00b1abf4a
---> 01cbadcc531f
Step 6/12 : FROM gcr.io/distroless/python2.7
---> 796952c43cc4
Step 7/12 : COPY --from=build /app /app
---> 92657682cdcc
Step 8/12 : COPY --from=build /usr/local/lib/python2.7/site-packages /usr/local/lib/python2.7/site-packages
---> faafd06edeac
Step 9/12 : WORKDIR /app
---> Running in 0cf545aa0e62
Removing intermediate container 0cf545aa0e62
---> 4c4af4333209
Step 10/12 : ENV PYTHONPATH=/usr/local/lib/python2.7/site-packages
---> Running in 681ae3cd51cc
Removing intermediate container 681ae3cd51cc
---> 564f48eff90a
Step 11/12 : EXPOSE 5000
---> Running in 7ff5c073d568
Removing intermediate container 7ff5c073d568
---> ccc3d211d295
Step 12/12 : CMD ["app.py"]
---> Running in 2b2c2f111423
Removing intermediate container 2b2c2f111423
---> 76d13d2f61cd
Successfully built 76d13d2f61cd
Successfully tagged /flask-hello-world-distroless:latest

登錄到 DockerHub 并推送鏡像:

docker login
docker push /flask-hello-world-distroless:latest

登錄到 DockerHub(或者你的私有鏡像倉),你應該會看到容器鏡像可以使用:

Distroless加固容器安全Distroless加固容器安全

如果你看一下壓縮后的大小,它只有 23.36 MB。如果你使用 slim 發(fā)行版作為基礎(chǔ)鏡像,它將占用 56 MB。

Distroless加固容器安全Distroless加固容器安全

你已經(jīng)減少了超過一半的容器占用空間。That’s amazing!

在 Kubernetes 中運行容器

為了測試構(gòu)建是否有效,讓我們在 Kubernetes 集群中運行容器。如果你沒有 Kubernetes,你可以運行等價的 Docker 命令來做相同的活動,因為 Kubectl 和 Docker 命令是相似的。

我在代碼倉中創(chuàng)建了一個 kubernetes.yaml 文件,該文件包含使用我們構(gòu)建的鏡像的 Deployment 和 負載均衡的 Service。

---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: flask-deployment
spec:
 selector:
   matchLabels:
     app: flask
 replicas: 2
 template:
   metadata:
     labels:
       app: flask
   spec:
     containers:
     - name: flask
       image: bharamicrosystems/flask-hello-world-distroless
       ports:
       - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
 name: flask-service
spec:
 selector:
   app: flask
 ports:
   - port: 80
     targetPort: 5000
 type: LoadBalancer

這是一個非常簡單的設(shè)置。負載均衡器監(jiān)聽端口 80 并映射到目標端口 5000。這些 Pods 在默認的 5000 端口上監(jiān)聽 Flask 應用程序。

應用:

$ kubectl apply -f kubernetes.yaml
deployment.apps/flask-deployment created
service/flask-service created

我們查看一下所有的資源,看看我們已經(jīng)創(chuàng)建了什么:

$ kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/flask-deployment-576496558b-hnbxt   1/1     Running   0          47s
pod/flask-deployment-576496558b-hszpq   1/1     Running   0          73s

NAME                    TYPE           CLUSTER-IP   EXTERNAL-IP      PORT(S)        AGE
service/flask-service   LoadBalancer   10.8.9.163   35.184.113.120   80:31357/TCP   86s
service/kubernetes      ClusterIP      10.8.0.1                443/TCP        26m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/flask-deployment   2/2     2            2           88s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/flask-deployment-576496558b   2         2         2       89s

我們看到存在兩個 Pods、一個 Deployment、一個帶有外部 IP 的 LoadBalancer 服務(wù)和一個 ReplicaSet。

讓我們訪問應用程序:

$ curl http://35.184.113.120
Hello World!

我們得到了 Hello World!。這表明 Flask 應用程序在正常工作。

使用 Shell 對應用程序進行訪問

正如我在引言中所描述的,Disroless 容器中沒有 shell,因此不可能進入到容器內(nèi)。然而,讓我們試著在容器中執(zhí)行 exec:

$ kubectl exec -it flask-deployment-576496558b-hnbxt /bin/bash
OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown
command terminated with exit code 126

我們無法連接到容器上。

容器日志呢?如果拿不到容器日志,我們就失去了調(diào)試應用程序的方法。

讓我們試著去拿日志:

$ kubectl logs flask-deployment-576496558b-hnbxt
* Running on http://0.0.0.0:5000/
* Restarting with reloader
10.128.0.4 - - [31/May/2020 13:40:27] "GET / HTTP/1.1" 200 -
10.128.0.3 - - [31/May/2020 13:42:01] "GET / HTTP/1.1" 200 -

所以容器日志是可以被獲取到的!

結(jié)論

使用 Distroless 作為基礎(chǔ)鏡像是一種令人興奮的保護容器安全的方式。由于鏡像小并且僅包含應用程序和依賴項,因此它為應用程序提供了最小的攻擊面。它在更大程度上提高了應用程序的安全性,所以它是保護容器安全的好方法。


分享文章:通過Distroless加固容器安全
網(wǎng)頁URL:http://m.5511xx.com/article/dpcschh.html