工作與容器安全性 - Amazon Elastic Container Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

工作與容器安全性

您應該將容器影像視為對抗攻擊的第一條防線。不安全,構造不良的映像可能會允許攻擊者逃離容器的邊界並獲得對主機的訪問權限。您應該執行以下操作,以減輕這種情況發生的風險。

Recommendations

我們建議您在設定任務和容器時執行下列動作。

建立最少或使用無散佈影像

首先從容器映像中移除所有無關的二進位檔案。如果您使用來自 Docker Hub 的不熟悉映像,請檢查映像以參考每個容器圖層的內容。您可以使用應用程序,如潛水若要執行此作業。

或者,您可以使用無散佈影像,只包含您的應用程式及其執行階段相依性。它們不包含軟件包管理器或 shell。無散佈影像可改善「訊號到掃描器的雜訊,並減少建立來源的負擔,滿足您所需。」 如需詳細資訊,請參閱 GitHub 文件,無散佈

Docker 有一個機制,用於從名為。如需詳細資訊,請參閱。使用創建一個簡單的父映像中的 Docker 文檔。使用像 Go 這樣的語言,您可以創建一個靜態鏈接的二進製文件並在 Docker 文件中引用它。以下範例示範如何完成此操作。

############################ # STEP 1 build executable binary ############################ FROM golang:alpine AS builder # Install git. # Git is required for fetching the dependencies. RUN apk update && apk add --no-cache git WORKDIR $GOPATH/src/mypackage/myapp/ COPY . . # Fetch dependencies. # Using go get. RUN go get -d -v # Build the binary. RUN go build -o /go/bin/hello ############################ # STEP 2 build a small image ############################ FROM scratch # Copy our static executable. COPY --from=builder /go/bin/hello /go/bin/hello # Run the hello binary. ENTRYPOINT ["/go/bin/hello"] This creates a container image that consists of your application and nothing else, making it extremely secure.

上一個範例也是多階段組建的範例。從安全性的角度來看,這些類型的組建是有吸引力的,因為您可以使用它們來最小化推送到容器登錄的最終映像的大小。容器映像沒有建置工具和其他無關的二進位檔案,藉由減少映像的攻擊面,改善您的安全性狀態。如需多階段組建的詳細資訊,請參閱建立多階段組建

掃描影像是否有弱點

與其虛擬機器對應部門類似,容器映像可能包含具有弱點的二進位檔案和應用程式程式庫,或隨著時間而開發弱點。防止漏洞攻擊的最佳方式是使用影像掃描器定期掃描影像。儲存在 Amazon ECR 中的影像可透過推送或隨選掃描 (每 24 小時一次)。Amazon ECR 目前使用克萊爾,這是一個開放原始碼映像掃描解決方案。掃描影像後,結果會記錄到亞馬遜事件橋中的亞馬遜 ECR 事件串流。您也可以在 Amazon ECR 主控台中查看掃描結果,或呼叫描述影像搜尋結果API。影像與HIGHCRITICAL弱點應該被刪除或重建。如果已部署的映像發生弱點,應儘快取代該弱點。

Docker 桌面邊緣 2.3.6.0或更新版本可以scan本機映像。掃描是由斯尼克,一種應用程序安全服務。當發現漏洞時,Snyk 會利用 Dockerfile 中的漏洞識別層和相依性。它還建議安全的替代方案,例如使用較少弱點的較薄基本映像,或將特定套件升級到較新版本。藉由使用 Docker 掃描,開發人員可以先解決潛在的安全性問題,再將其映像推送至登錄。

移除影像中的特殊權限

存取權限旗標setuidsetgid允許使用可執行文件的擁有者或組的權限運行可執行文件。移除具有這些存取權限的所有二進位檔案,因為這些二進位檔案可用來提升權限。考慮刪除所有 shell 和實用程序,如nccurl,可用於惡意目的。您可以使用setuidsetgid存取權限,請使用下列命令。

find / -perm /6000 -type f -exec ls -ld {} \;

要從這些文件中刪除這些特殊權限,請將以下指令添加到您的容器映像。

RUN find / -xdev -perm /6000 -type f -exec chmod a-s {} \; || true

建立一組策劃的影像

不要讓開發人員建立自己的映像,而是為組織中的不同應用程式堆疊建立一組經過審核的映像。藉由這樣做,開發人員可以放棄學習如何撰寫 Docker 檔案,並專注於撰寫程式碼。隨著變更合併到程式碼庫中,CI/CD 管線可以自動編譯資產,然後將其儲存在成品儲存庫中。最後,在將工件推送到 Docker 註冊表(如 Amazon ECR)之前,將工件複製到適當的映像中。至少你應該創建一組基本圖像,開發人員可以從. 您應避免從 Docker Hub 拉取映像檔。您並不總是知道圖像中的內容,而前 1000 張圖像中的五分之一有可能性。這些映像檔及其弱點的清單可以在https://vulnerablecontainers.org/

掃描應用程式套件和程式庫中的弱點

開放原始碼程式庫的使用現在很常見。與作業系統和作業系統套件一樣,這些程式庫可能會有漏洞。作為開發生命週期的一部分,這些程式庫應該在發現嚴重弱點時進行掃描和更新。

Docker 桌面執行使用 Snyk 的本機掃描。它也可以用來尋找開放原始碼程式庫中的弱點和潛在授權問題。它可以直接整合到開發人員工作流程中,讓您能夠減輕開放原始碼程式庫所造成的風險。如需詳細資訊,請參閱下列主題:

執行靜態程式碼分析

您應該在構建容器映像之前執行靜態代碼分析。它會針對您的原始程式碼執行,並用來識別可能被惡意程式碼的程式碼,例如錯誤注入。SonarQube是靜態應用程序安全測試(SAST)的熱門選項,並支持各種不同的編程語言。

以非 root 使用者身分執行容器

您應以非根使用者身分來執行容器。根據預設,容器會以root使用者,除非USER指令包含在您的碼頭文件中。Docker 指派的預設 Linux 功能會限制可以執行為root,但只是微乎其微。例如,以root仍然不允許存取裝置。

作為您的 CI/CD 管道的一部分,您應該 lint Docker 文件來查找USER指令,如果它丟失,則構建失敗。如需詳細資訊,請參閱下列主題:

  • Dockerfile-lint是 RedHat 的一個開源工具,可用於檢查文件是否符合最佳實踐。

  • 哈多林是構建符合最佳實踐的 Docker 映像的另一個工具。

使用唯讀根檔案系統

您應該使用唯讀根檔案系統。在預設情況下,容器的根檔案系統是可寫入的。當您將容器設定為RO(只讀)根文件系統,它強制您明確定義可以保存數據的位置。這會減少您的攻擊面,因為除非特別授予權限,否則無法寫入容器的檔案系統。

注意

擁有唯讀根檔案系統可能會導致某些作業系統套件發生問題,這些套件期望能夠寫入檔案系統。如果您打算使用唯讀根檔案系統,請事先徹底測試。

設定具有 CPU 和記憶體限制的任務 (Amazon EC2)

您應該設定具有 CPU 和記憶體限制的工作,以將下列風險降至最低。任務的資源限制為任務中的所有容器可保留的 CPU 和內存量設置上限。如果未設定任何限制,則工作可以存取主機的 CPU 和記憶體。這可能會導致部署在共用主機上的工作可能會使系統資源的其他工作餓死的問題。

注意

開啟 Amazon ECSAWS Fargate工作會要求您指定 CPU 和記憶體限制,因為它會使用這些值進行計費。Amazon ECS Fargate 的一項任務佔用所有系統資源並不是問題,因為每項任務都是在自己的專用執行個體上執行的。如果您沒有指定記憶體限制,Amazon ECS 會為每個容器配置至少 4MB。同樣地,如果沒有為任務設定 CPU 限制,則 Amazon ECS 容器代理程式會為其指派至少 2 個 CPU。

搭配 Amazon ECR 使用不可變標籤

使用 Amazon ECR,您可以且應該使用具有不可變標籤的映像設定。這可防止將變更或更新版本的影像推送到具有相同標籤的影像儲存庫。這可以防止攻擊者在使用相同標籤的映像上推送受影響版本的映像。通過使用不可變標籤,您可以有效地強制自己為每次更改推送帶有不同標籤的新映像。

避免以特許身分執行容器 (Amazon EC2)

您應該避免以特權身份運行容器。對於背景,容器以privileged會在主機上以延伸權限執行。這意味著容器繼承了分配給root在主機上。它的使用應該受到嚴格限制或禁止。我們建議設定 Amazon ECS 容器代理程式環境變數ECS_DISABLE_PRIVILEGEDtrue來防止容器作為privileged在特定主機上,如果privileged不需要。或者,您可以使用AWS Lambda掃描您的工作定義,以便使用privileged參數。

注意

將容器運行為privileged不支援 Amazon ECSAWS Fargate。

從容器中移除不必要的 Linux 功能

以下是指派給 Docker 容器的預設 Linux 功能清單。如需每個功能的詳細資訊,請參閱Linux 功能概觀

CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_FOWNER, CAP_FSETID, CAP_KILL, CAP_SETGID, CAP_SETUID, CAP_SETPCAP, CAP_NET_BIND_SERVICE, CAP_NET_RAW, CAP_SYS_CHROOT, CAP_MKNOD, CAP_AUDIT_WRITE, CAP_SETFCAP

如果容器不需要上面列出的所有 Docker 內核功能,請考慮將它們從容器中刪除。如需每個 Docker 核心功能的詳細資訊,請參閱核心功能。您可以執行下列操作,找出正在使用中的功能:

  • 安裝 OS 套裝服務程式碼封面-NG並執行pscap公用程式來列出每個處理程序正在使用的功能。

  • 您也可以使用Capsh來解密進程正在使用哪些功能。

  • 請參閱Linux 功能以了解詳細資訊。

使用客戶受管金鑰 (CMK) 加密推送至 Amazon ECR 的映像

您應該使用客戶受管金鑰 (CMK) 來附加推送到 Amazon ECR 的映像。推送到 Amazon ECR 的映像會在靜態時自動使用AWS Key Management Service(AWS KMS) 受管金鑰。如果您寧願使用自己的金鑰,Amazon ECR 現在支援AWS KMS使用客戶管理的金鑰 (CMK) 加密。使用 CMK 啟用伺服器端加密之前,請先檢閱靜態加密