自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Node.js 應(yīng)用程序的 Docker 安全優(yōu)秀實(shí)踐

開發(fā) 前端
本文將介紹使用 Docker 平臺(tái)時(shí)需要考慮的 12 大 Docker 安全最佳實(shí)踐。

在構(gòu)建、共享和運(yùn)行 Docker容器安全應(yīng)用程序時(shí),您需要考慮一些Docker 安全最佳實(shí)踐。Docker 是一個(gè)開源平臺(tái),用于構(gòu)建、共享和運(yùn)行您的容器化應(yīng)用程序。您可以輕松構(gòu)建包含應(yīng)用程序的 Docker 映像,在團(tuán)隊(duì)內(nèi)部或團(tuán)隊(duì)外部共享它們,并且只需一個(gè)命令即可運(yùn)行您的應(yīng)用程序??雌饋砗苋菀?,對(duì)吧?然而,確實(shí)如此。

您可能已經(jīng)知道 Docker 是什么以及它是如何工作的。因此,我們不會(huì)詳細(xì)介紹它。本博客將介紹使用 Docker 平臺(tái)時(shí)需要考慮的12 大 Docker 安全最佳實(shí)踐。

為什么需要保護(hù) Dockerfile、容器?

容器化因其應(yīng)用程序可以在任何地方部署的靈活性而風(fēng)靡全球。但是,這也引入了一些安全漏洞。Docker 和 Docker 容器使構(gòu)建、共享和部署應(yīng)用程序變得非常容易,因此在部署后很難發(fā)現(xiàn)、檢測(cè)、報(bào)告和修復(fù)安全問題。通過向左移動(dòng)安全性,可以防止和最小化大部分開銷。因此,保護(hù)從 Dockerfile 到 Docker 容器的所有內(nèi)容以確保Docker 容器安全性至關(guān)重要。

12 大 Docker 安全最佳實(shí)踐

從一開始就可以通過各種專業(yè)來提高Docker 容器安全性,即從編寫 Dockerfile 到運(yùn)行 Docker 容器。讓我們繼續(xù)看看可以將 Docker 容器安全性落實(shí)到位的 12 大 Docker 安全最佳實(shí)踐。

1. 使 Docker 主機(jī)和 Docker 引擎與 Docker 映像一起保持最新

Docker 容器在主機(jī)上可用的 Docker 引擎上運(yùn)行。這些主機(jī)可以是 Linux/Mac 或 Windows。Docker 引擎可以是可用版本之一。 使用最新的穩(wěn)定版本至關(guān)重要,它更新了以前版本中的已知問題。這同樣適用于主機(jī)操作系統(tǒng)。

例如,截至 2021 年 12 月 27 日,如果您使用 Ubuntu 作為主機(jī)操作系統(tǒng),那么您可以使用 Ubuntu 20.04 LTS 而不是 Ubuntu 16.04 LTS,對(duì)于 Docker 引擎,您可以使用 20.10.11。查找Docker 發(fā)行說明以獲取更多信息,并檢查 Docker 支持的操作系統(tǒng)平臺(tái)。

安裝更新或補(bǔ)丁非常重要,因?yàn)槊總€(gè)補(bǔ)丁都可以解決CVE-2021-41092等漏洞。這個(gè)特定的補(bǔ)丁修復(fù)了用于從 CLI 登錄 docker 注冊(cè)表的憑據(jù)被發(fā)送到“registry-1.docker.io”而不是預(yù)期的私有注冊(cè)表的錯(cuò)誤;這通常是由于配置錯(cuò)誤的配置文件(通常是 `~/.docker/config.json`)列出了 `credsStore` 或 `credHelpers.

請(qǐng)參考以下截圖了解 Ubuntu OS 的發(fā)布周期。

2. 避免在 Dockerfile 指令中存儲(chǔ)機(jī)密數(shù)據(jù)

Dockerfile 包含用于創(chuàng)建 Docker 映像的指令。COPY、RUN、ADD、CMD、ENTRYPOINT 等。這些是一些可能是 Dockerfile 一部分的命令指令。我們還可以使用 ENV 和 ARGS 在運(yùn)行時(shí)或構(gòu)建時(shí)設(shè)置變量,具體取決于要求。您可以使用 ENV 或 ARGS 指令在 Docker 容器中使用環(huán)境變量。在設(shè)置環(huán)境變量時(shí),您應(yīng)該注意永遠(yuǎn)不要將機(jī)密、憑據(jù)、密碼等分配給 Dockerfile 中的變量,也不應(yīng)該在任何命令中進(jìn)行硬編碼。將此視為 Dockerfile 安全最佳實(shí)踐之一,因?yàn)楹雎运赡軙?huì)導(dǎo)致潛在的安全威脅,并且可能會(huì)花費(fèi)您很多錢。

例如,如果您在 Dockerfile 中硬編碼數(shù)據(jù)庫的密碼或連接詳細(xì)信息,將它們分配給環(huán)境變量,然后將 Dockerfile 上傳到公共存儲(chǔ)庫,則任何有權(quán)訪問存儲(chǔ)庫的人都可以獲得這些憑據(jù)并可以訪問詳細(xì)信息或連接到數(shù)據(jù)庫。

FROM mysql:5.7 ENV DATABASE_USERNAME=admin # < - Setting username is acceptable ENV DATABASE_PASSWORD=mypassword@!@#$ # < - Avoid setting password at any cost

3. 避免使用不受信任的鏡像注冊(cè)表

鏡像注冊(cè)表是存儲(chǔ) Docker 鏡像的地方。它可以是私有的或公共的。Docker Hub 是 Docker 官方的基于云的 Docker 鏡像注冊(cè)表,它是安裝時(shí)的默認(rèn)注冊(cè)表。如果您未配置任何注冊(cè)表,則將從該公共存儲(chǔ)庫中提取圖像。

當(dāng)您從任何公共注冊(cè)表中提取 Docker 鏡像時(shí),請(qǐng)注意來源,因?yàn)槟赡懿恢朗钦l構(gòu)建了它們,它們是如何構(gòu)建的,或者它們是否值得信賴。每當(dāng)您從不受信任的發(fā)布者拉取鏡像時(shí),請(qǐng)不要忘記驗(yàn)證源注冊(cè)表和用于構(gòu)建鏡像的 Dockerfile。此外,您的 Dockerfile 的基本映像,即 FROM 指令。

FROM # < - Verify the base image before you use it

4.提防遞歸復(fù)制

在為需要將文件從本地計(jì)算機(jī)復(fù)制到 Docker Image 的應(yīng)用程序編寫 Dockerfile 時(shí),您應(yīng)該注意使用 COPY 指令復(fù)制的內(nèi)容。您的本地計(jì)算機(jī)上可能有可能包含機(jī)密數(shù)據(jù)或機(jī)密的文件。因此,如果這些文件被復(fù)制到 Docker 映像中,任何有權(quán)訪問容器的人都可以從容器中獲取這些文件。因此,僅復(fù)制容器中需要的文件而不是復(fù)制所有內(nèi)容非常重要,如下面的說明所示,以提高 Docker 容器安全性。

你可以試一試。dockerignor。它可以幫助排除與模式匹配的文件和目錄,并避免使用 ADD 或 COPY 將大型或敏感文件不必要地發(fā)送到圖像。

例如,在以下 COPY 指令中,當(dāng)前位置的所有文件都將復(fù)制到 Docker 映像中。因此,您應(yīng)該始終避免“復(fù)制”。./ ”,并且應(yīng)該在 COPY 指令中明確指定文件名為“ COPY package.json ./ ”

FROM node:12.18.4-alpine WORKDIR /app ENV PATH /app/node_modules/.bin:$PATH COPY . ./ # < - Avoid such kind of COPY instruction

5. 開發(fā)過程中掃描圖像

Docker 鏡像是從 Dockerfiles 構(gòu)建的,Dockerfiles 包含使用基礎(chǔ)鏡像、安裝包、啟動(dòng)應(yīng)用程序等的說明。Dockerfile 也可能包含錯(cuò)誤硬編碼的憑據(jù)。那么,如果您使用的基礎(chǔ)鏡像存在一些漏洞,并且在 Dockerfile 中硬編碼的憑據(jù)從使用該 Dockerfile 構(gòu)建的鏡像創(chuàng)建的容器中泄露,該怎么辦?

掃描鏡像是識(shí)別 Docker 鏡像中已知安全漏洞的過程,以便您可以在將它們推送到 Docker Hub 或任何其他注冊(cè)表之前修復(fù)它們。

您現(xiàn)在可以直接從 Docker Desktop CLI 運(yùn)行 Snyk 漏洞掃描,因?yàn)?Snyk 和 Docker 已經(jīng)合作。

例如,您可以通過提供用于創(chuàng)建映像的 Dockerfile 來獲取有關(guān) Docker 映像的詳細(xì)報(bào)告。

docker scan --file PATH_TO_DOCKERFILE DOCKER_IMAGE

6. 使用固定標(biāo)簽實(shí)現(xiàn)不變性

在 Docker 中,圖像上有標(biāo)簽。Docker 鏡像最常見和默認(rèn)的標(biāo)簽是“l(fā)atest”。因此,如果您沒有為圖像分配標(biāo)簽,則默認(rèn)情況下它將具有“最新”標(biāo)簽。可以發(fā)布多個(gè)具有相同標(biāo)簽的鏡像,即 Docker 鏡像標(biāo)簽不是不可變的。因此,非常重要的是——

更喜歡為您的圖像使用更具體的標(biāo)簽,以便您每次都能獲得相同的圖像。

更喜歡在您的私人存儲(chǔ)庫中保留圖像的副本。

使用 Docker 內(nèi)容信任 (DCT) 將數(shù)字簽名用于客戶端或運(yùn)行時(shí)驗(yàn)證特定圖像標(biāo)簽的完整性和發(fā)布者。訪問官方文檔以了解更多信息。

例如,讓我們說,

  1. Dev1拉取myimage:latest imag,在他/她的電腦上運(yùn)行1.1版本的應(yīng)用,發(fā)現(xiàn)應(yīng)用運(yùn)行流暢。
  2. 稍后,Dev2 拉取相同的圖像myimage:latest并在他們的計(jì)算機(jī)上運(yùn)行該應(yīng)用程序,并發(fā)現(xiàn)該應(yīng)用程序出現(xiàn)了問題。在這里,您確定它們都在運(yùn)行相同版本的應(yīng)用程序嗎?
  3. 答案是否定的,因?yàn)樵?Dev2 拉取鏡像myimage:latest 之前, Dev3 進(jìn)行了更改并推送了同名myimage:latest 應(yīng)用的不穩(wěn)定版本 1.2。
  4. 現(xiàn)在,當(dāng)他們部署鏡像myimage:latest 時(shí), 它將指向應(yīng)用程序的不穩(wěn)定版本 1.2,然后這會(huì)破壞生產(chǎn)環(huán)境。

7. Lint Dockerfile

市場(chǎng)上有各種 Dockerfile linter 可用于確保 Dockerfile 遵循Dockerfile 安全最佳實(shí)踐。如果生成警告,Linter 可以幫助您停止構(gòu)建過程;他們遍歷您的 Dockerfile 并在 Dockerfile 不遵循最佳實(shí)踐的情況下發(fā)出警告。您可以利用Hadolint,這是一個(gè)用于驗(yàn)證內(nèi)聯(lián) bash 和 linting Dockerfile 的開源項(xiàng)目。

8.限制容器資源

默認(rèn)情況下,在主機(jī)上運(yùn)行的 Docker 容器可以利用所有的 RAM 和 CPU。在 Docker 容器遭到入侵的情況下,攻擊者可能會(huì)嘗試使用主機(jī)資源來執(zhí)行惡意活動(dòng)。此外,如果特定容器開始利用主機(jī)上的所有資源,則駐留在同一位置的其他容器可能會(huì)由于資源不可用而受到影響。為避免這種情況,建議對(duì) Docker 容器設(shè)置資源限制,以使它們使用的資源不會(huì)超過分配給它們的資源,并有助于提供 Docker 容器安全性。

例如, 如果宿主機(jī)有 1 個(gè) CPU,下面的第 1 條命令可以保證容器每秒最多使用 50% 的 CPU,第 2 條命令可以將容器的內(nèi)存使用限制為 1 GB。

CPU 限制

docker run -it --cpus=".5" ubuntu /bin/bash

內(nèi)存限制

docker run -it --memory="1g" ubuntu /bin/bash

9. 不要暴露 Docker Daemon Socket

Docker 與名為 /var/run/docker.sock 的 UNIX 域套接字通信,這是Docker API的主要入口點(diǎn)。如果任何人有權(quán)訪問 Docker 守護(hù)程序套接字,也可以獲得 root 訪問權(quán)限。因此,允許任何用戶寫入 /var/run/docker.sock 或?qū)⑻捉幼直┞督o容器對(duì)系統(tǒng)的其余部分來說是一個(gè)很大的 Docker 容器安全風(fēng)險(xiǎn),因?yàn)檫@會(huì)給它提供 root 權(quán)限。因此,永遠(yuǎn)不要在 Docker 容器內(nèi)掛載 /var/run/docker.sock。

例如,永遠(yuǎn)不要使用“-v /var/run/docker.sock:/var/run/docker.sock”之類的選項(xiàng)運(yùn)行 docker run 命令,并將其視為 Docker 安全最佳實(shí)踐之一,可以幫助您保持系統(tǒng)保護(hù)。

10. 以非 root 用戶身份運(yùn)行容器

根據(jù) sysdig.com 的“ 2021 年容器安全和使用報(bào)告”,大多數(shù)鏡像都過于寬松,58% 的容器以 root 身份運(yùn)行。這不被視為 Dockerfile 最佳實(shí)踐;應(yīng)該避免這樣做,因?yàn)樵跇O少數(shù)情況下您確實(shí)需要使用 root 用戶在容器中運(yùn)行您的進(jìn)程。為確保您不使用 root 用戶,請(qǐng)始終使用用戶名指定“USER”指令。

在 Docker 容器中使用非 root 用戶可確保減輕容器運(yùn)行時(shí)中的潛在漏洞并實(shí)現(xiàn) Docker 容器安全性。

例如,始終嘗試創(chuàng)建和使用非 root 用戶在容器中運(yùn)行您的應(yīng)用程序進(jìn)程。你需要的非root用戶可能不存在;因此,您首先必須在使用它之前創(chuàng)建一個(gè)。

FROM alpine:3.12 RUN adduser -D non-root-user && chown -R non-root-user /myapp-data # < - Create a user USER non-root-user # < - use a non-root user

11. 保持 Docker 鏡像盡可能小

在整個(gè) Dockerfile 構(gòu)建過程中創(chuàng)建了許多工件,這些工件僅在構(gòu)建期間是必需的。這些包是編譯或運(yùn)行單元測(cè)試、臨時(shí)文件、機(jī)密等的依賴項(xiàng)所必需的。將這些工件保留在基礎(chǔ)映像中會(huì)增加 Docker 映像的大小,這可能會(huì)減慢下載時(shí)間并擴(kuò)大攻擊面,因?yàn)楦嗟陌且虼耍虞d是 Docker 支持多階段構(gòu)建的原因之一。此功能允許您在構(gòu)建過程中使用大量臨時(shí)映像,同時(shí)僅保留最新的映像和復(fù)制到其中的數(shù)據(jù)。

結(jié)果,您有兩個(gè)圖像:

  1. 圖 1:第一個(gè)圖像是一個(gè)大圖像,其中包含許多依賴項(xiàng),您需要這些依賴項(xiàng)來創(chuàng)建應(yīng)用程序和運(yùn)行測(cè)試。
  2. 圖 2:在大小和庫數(shù)量方面非常小且輕量級(jí)的圖像,只有在生產(chǎn)中運(yùn)行程序所需的工件副本。

通過這種方式,您可以采用多階段構(gòu)建來構(gòu)建您的 Docker 鏡像,這可以減少鏡像的大小并避免安裝不需要的庫,從而增加潛在安全風(fēng)險(xiǎn)的機(jī)會(huì)。

12. 使用最新的 Docker 鏡像

由于定期發(fā)現(xiàn)新的安全漏洞,保持最新的安全補(bǔ)丁是 Docker 安全最佳實(shí)踐。因此,使用經(jīng)常更新的基礎(chǔ)鏡像并在它們之上構(gòu)建自己的鏡像非常重要。沒有必要總是使用最新的版本,它可能包含重大更改,但您應(yīng)該有一個(gè)版本控制策略。以下是您的基本圖像要考慮的幾點(diǎn)。

  1. 堅(jiān)持使用更可能收到安全更新的穩(wěn)定或長(zhǎng)期支持版本。
  2. 在您的基礎(chǔ)映像版本達(dá)到其生命周期結(jié)束且不再接收更新之前,請(qǐng)準(zhǔn)備好刪除舊版本并進(jìn)行遷移。
  3. 定期重建你的鏡像并使用類似的技術(shù)從基本發(fā)行版中獲取最新的包

結(jié)論

我們都知道“預(yù)防勝于治療”,Docker 也是如此。不能簡(jiǎn)單地忽視其安全性,因?yàn)檫@可能導(dǎo)致一場(chǎng)巨大的災(zāi)難。我們現(xiàn)在知道為什么 Docker 容器安全性至關(guān)重要以及為什么必須到位。將安全性向左轉(zhuǎn)移對(duì)于改善 Docker 環(huán)境和減少管理開銷至關(guān)重要。

上面提到的前 12 條建議側(cè)重于 Dockerfile 安全最佳實(shí)踐和 Docker 容器安全最佳實(shí)踐,將幫助您保護(hù) Docker 容器和 Docker 環(huán)境。

與經(jīng)驗(yàn)豐富的團(tuán)隊(duì)一起保護(hù)您的 Docker 容器。

責(zé)任編輯:華軒 來源: qaseven
相關(guān)推薦

2023-10-27 12:11:33

2023-10-26 01:28:02

2020-09-04 15:06:04

Docker容器化Node.js

2023-12-05 08:00:00

云原生

2013-05-17 09:41:02

Node.js云應(yīng)用開發(fā)IaaS

2023-03-05 16:53:42

2022-01-13 08:37:54

SSH安全網(wǎng)絡(luò)安全

2022-01-07 08:00:00

Node.js開發(fā)Web

2022-02-07 19:09:15

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

2023-03-07 14:31:44

Node.jsPython應(yīng)用程序

2020-12-16 08:23:06

DevOps容器安全容器

2020-01-15 14:20:07

Node.js應(yīng)用程序javascript

2022-12-14 14:40:27

Node.js開發(fā)應(yīng)用程序

2022-02-10 10:51:35

數(shù)據(jù)庫

2021-05-19 14:14:29

服務(wù)器安全數(shù)據(jù)

2023-08-09 09:08:02

Node.js開源

2020-05-29 15:33:28

Node.js框架JavaScript

2024-03-22 11:40:40

Node.jsNodeCRUD

2022-05-09 17:33:23

PWA漸進(jìn)式Web應(yīng)用程序離線優(yōu)先

2022-08-24 08:16:33

容器安全容器
點(diǎn)贊
收藏

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