本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon ECS 任務和容器安全最佳實務
您應該將容器映像視為對抗攻擊的第一道防線。不安全、構造不良的映像可允許攻擊者逸出容器的邊界並取得主機的存取。您應該執行以下操作以減輕發生這種情況的風險。
建議您在設定任務和容器時進行下列操作。
建立最小或使用 distroless 映像
首先從容器映像中刪除所有無關的二進位檔案。如果您使用來自 Amazon ECR Public Gallery 的不熟悉映像,請檢查映像,以參考每個容器層的內容。您可以使用 Dive
或者,您可以使用僅包含應用程式及其執行期相依項的 distroless 映像。此映像不包含套件管理工具或 Shell。Distroless 映像可改善「掃描器的訊號雜訊,並減少您所需要確定來源的負擔」。如需詳細資訊,請參閱 上的 GitHub 文件。 https://github.com/GoogleContainerTools/distroless
Docker 具有一種機制,用於從稱為 scratch 的保留最小映像建立映像。如需詳細資訊,請參閱 Docker 文件中的使用 scratch 建立簡單的父映像
############################ # 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 基本掃描使用開放原始碼映像掃描解決方案 ClairHIGH
或 CRITICAL
漏洞的映像。如果已部署的映像出現漏洞,則應盡快更換。
Docker Desktop Edge
-
使用 Amazon ECR 自動化映像合規,並 AWS Security Hub
說明如何透過封鎖對易受攻擊映像的存取,將 Amazon ECR 中的漏洞資訊呈現在 AWS Security Hub 中並自動化修復。
從映像移除特殊權限
存取權標記 setuid
並 setgid
允許執行具有擁有者許可或可執行檔群組的可執行檔。從映像中移除具有這些存取權的所有二進位檔案,因為這些二進位檔案可用來提升權限。考慮刪除所有可用於惡意目的的 Shell 和共用程序,如 nc
和 curl
。您可以使用以下命令找到具有 setuid
和 setgid
存取權的檔案。
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 Word 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 和記憶體。這可能會導致部署在共用主機上的任務會剝奪其他任務系統資源的問題。
注意
AWS Fargate 任務上的 Amazon ECS 需要您指定 CPU 和記憶體限制,因為它會將這些值用於計費目的。一個任務掛載所有系統資源不是 Amazon ECS Fargate 的問題,因為每個任務都在自己的專用執行個體上執行。如果您未指定記憶體限制,Amazon ECS 會為每個容器配置至少 4MB。同樣地,如果任務未設定 CPU 限制,Amazon ECS 容器代理程式會指派至少 2 個 CPUs。
搭配 Amazon ECR 使用不可變的標籤
透過 Amazon ECR,您可以且應該使用具有不可變標籤的組態映像。這樣可以防止將已更改或更新版本的映像推送至具相同標籤的映像儲存庫。這樣可以防止攻擊者將破解版本的映像推送至具相同標籤的映像。透過使用不可變標籤,您可以有效地強制自己為每次變更推送具有不同標籤的新映像。
避免將容器作為特殊權限 (Amazon EC2) 執行
您應該避免以特權方式執行容器。對於背景,在主機上使用擴展權限執行作為 privileged
執行的容器。這表示容器會繼承在主機上指派給 root
的所有 Linux 功能。應嚴格限制或禁止其使用。我們建議將 Amazon ECS 容器代理程式環境變數設定為 ECS_DISABLE_PRIVILEGED
true
,以防止容器在privileged
不需要的情況下在特定主機privileged
上執行 。或者,您可以使用 AWS Lambda 掃描任務定義,以使用 privileged
參數。
注意
執行 Amazon 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。透過執行以下操作,您可以了解正在使用哪些功能:
使用客戶受管金鑰 (CMK) 加密推送至 Amazon ECR 的影像
您應該使用客戶受管金鑰 (CMK) 來加密推送至 Amazon ECR 的影像。推送至 Amazon ECR 的影像會以 a AWS Key Management Service (AWS KMS) 受管金鑰自動進行靜態加密。如果您寧願使用自己的金鑰,Amazon ECR 現在支援使用客戶受管金鑰 (CMK) AWS KMS 加密。使用 CMK 啟用伺服器端加密之前,請先檢閱文件所列的靜態加密考量。