Amazon ECS任務和容器安全最佳實務 - Amazon Elastic Container Service

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

Amazon ECS任務和容器安全最佳實務

您應該將容器映像視為對抗攻擊的第一道防線。不安全、構造不良的映像可允許攻擊者逸出容器的邊界並取得主機的存取。您應該執行以下操作以減輕發生這種情況的風險。

建議您在設定任務和容器時進行下列操作。

建立最小或使用 distroless 映像

首先從容器映像中刪除所有無關的二進位檔案。如果您使用來自 Amazon ECR Public Gallery 的不熟悉映像,請檢查映像,以參考每個容器層的內容。您可以使用 Dive 之類的應用程式來執行此操作。

或者,您可以使用僅包含應用程式及其執行期相依項的 distroless 映像。此映像不包含套件管理工具或 Shell。Distroless 映像可改善「掃描器的訊號雜訊,並減少您所需要確定來源的負擔」。如需詳細資訊,請參閱有關無損 GitHub 的文件。

Docker 具有一種機制,用於從稱為 scratch 的保留最小映像建立映像。如需詳細資訊,請參閱 Docker 文件中的使用 scratch 建立簡單的父映像。使用 Go 等語言,您可以建立一個靜態連結的二進位檔案並在 Dockerfile 中作為參考。以下範例展示如何完成這項操作。

############################ # 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 基本掃描使用開放原始碼映像掃描解決方案 Clair 。Amazon ECR增強型掃描使用 Amazon Inspector 。掃描影像後,結果會記錄到 Amazon 中的 Amazon ECR事件串流 EventBridge。您也可以在 Amazon ECR主控台內或撥打 DescribeImageScanFindings 來查看掃描結果API。應刪除或重建具有 HIGHCRITICAL 漏洞的映像。如果已部署的映像出現漏洞,則應盡快更換。

Docker Desktop Edge 2.3.6.0 以上版本可以掃描本機映像。掃描由 Snyk 提供支援,其為一種應用程式安全服務。當發現漏洞時,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

建立一組精選映像

為組織中的不同應用程式堆疊建立一組經過審查的映像,而不是允許開發人員建立自己的映像。透過執行此動作,開發人員可以放棄學習如何編寫 Dockerfile 並專注於編寫程式碼。當變更合併至您的程式碼庫中時,CI/CD 管道可以自動編譯資產,然後將其儲存在成品儲存庫中。最後,請先將成品複製到適當的映像,再將其推送至 Docker 登錄檔,例如 Amazon ECR。至少您應該建立一組基礎映像,開發人員可以從中建立自己的 Dockerfile。您應避免從 Docker Hub 推送映像。您並非永遠知道映像中的內容,而前 1000 個映像中大約有五分之一存在漏洞。這些映像及其漏洞的清單可以在 https://vulnerablecontainers.org/ 找到。

掃描應用程式套件和程式庫是否有漏洞

現在,使用開放原始碼程式庫很普遍。如同使用作業系統和 OS 套件,這些程式庫可能存在漏洞。作為開發生命週期的一部分,這些程式庫應在發現嚴重漏洞時進行掃描和更新。

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

執行靜態程式碼分析

建置容器映像之前,您應該先執行靜態程式碼分析。此分析會針對您的原始程式碼執行,並用來識別惡意行為 (例如故障注入) 可能利用的編碼錯誤和程式碼。您可以使用 Amazon Inspector 。如需詳細資訊,請參閱Amazon Inspector 使用者指南中的使用 Amazon Inspector 掃描 Amazon ECR容器映像Amazon Inspector

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

您應以非根使用者身分執行容器。在預設情況下,容器以 root 使用者身份執行,除非在 Dockerfile 中包含該 USER 指令。Docker 指派的預設 Linux 功能會限制可做為 root 執行的動作,但僅限於稍微限制。例如,做為 root 執行的容器仍不允許存取裝置。

作為 CI/CD 管道的一部分,您應該檢查 Docerfile 來查找 USER 指令,如果缺少該指令,則建置失敗。如需詳細資訊,請參閱下列主題:

  • Dockerfile-lint 是 的開放原始碼工具 RedHat ,可用來檢查檔案是否符合最佳實務。

  • Hadolint 是建置符合最佳實務 Docker 映像檔的另一種工具。

使用唯讀的根檔案系統

您應該使用唯讀的根檔案系統。容器的根檔案系統預設為可寫入。當您使用 RO (唯讀) 根檔案系統設定容器時,會強制您明確定義資料可以保存的位置。這會減少您的受攻擊面,因為除非特別授予許可,否則無法寫入容器的檔案系統。

注意

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

使用 CPU和記憶體限制設定任務 (Amazon EC2)

您應該設定具有 CPU和 記憶體限制的任務,以將下列風險降至最低。任務的資源限制會針對任務內所有容器可以預留的 CPU和 記憶體數量設定上限。如果未設定限制,任務可以存取主機CPU和記憶體。這可能會導致部署在共用主機上的任務會剝奪其他任務系統資源的問題。

注意

Amazon ECS on AWS Fargate tasks 需要您指定 CPU和記憶體限制,因為這些值會用於計費目的。一個任務掛載所有系統資源不是 Amazon ECS Fargate 的問題,因為每個任務都在自己的專用執行個體上執行。如果您未指定記憶體限制,Amazon 會為每個容器ECS配置至少 4MB。同樣地,如果未設定任務CPU的限制,Amazon ECS容器代理程式會指派至少 2 個 CPUs。

搭配 Amazon 使用不可變標籤 ECR

使用 Amazon 時ECR,您可以且應該使用具有不可變標籤的組態映像。這樣可以防止將已更改或更新版本的映像推送至具相同標籤的映像儲存庫。這樣可以防止攻擊者將破解版本的映像推送至具相同標籤的映像。透過使用不可變標籤,您可以有效地強制自己為每次變更推送具有不同標籤的新映像。

避免將容器作為特殊權限 (Amazon EC2) 執行

您應該避免以特權方式執行容器。對於背景,在主機上使用擴展權限執行作為 privileged 執行的容器。這表示容器會繼承在主機上指派給 root 的所有 Linux 功能。應嚴格限制或禁止其使用。如果privileged不需要,我們建議將 Amazon ECS容器代理程式環境變數設定為 ECS_DISABLE_PRIVILEGEDtrue,以防止容器在特定主機privileged上執行 。或者,您可以使用 AWS Lambda 掃描任務定義,以使用 privileged 參數。

注意

執行 Amazon on ECS 上privileged不支援的容器 AWS 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 核心功能的詳細資訊,請參閱 KernelCapabilities。透過執行以下操作,您可以了解正在使用哪些功能:

  • 安裝作業系統套件 libcap-ng 並執行 pscap 公用程式,以列出每個程序正在使用的功能。

  • 您也可以使用 capsh 來解讀程序正在使用哪些功能。

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

您應該使用客戶受管金鑰 (CMK) 來加密推送至 Amazon 的影像ECR。推送至 Amazon 的影像ECR會以 AWS Key Management Service (AWS KMS) 受管金鑰自動加密靜態。如果您寧願使用自己的金鑰,Amazon ECR 現在支援使用客戶受管金鑰進行 AWS KMS 加密 (CMK)。使用 啟用伺服器端加密之前CMK,請檢閱文件中列出的靜態加密考量事項。