軟體供應鏈安全是指在軟體研發、交付和使用過程中,保障軟體及其相關組件的安全性,防止惡意代碼、漏洞等安全風險的侵入和傳播。本文從供應鏈角度出發給出安全建議。
背景資訊
軟體供應鏈包括三個階段:軟體研發階段、軟體交付階段、軟體使用階段,不同階段的攻擊面如下:
階段 | 攻擊面 |
軟體研發階段 |
|
軟體交付階段 |
|
軟體使用階段 |
|
在應用構建測試中,製品安全是您防禦駭客攻擊的第一道防線。一個不安全的、惡意構造的鏡像可以讓攻擊者進行容器逃逸並獲得對宿主機的存取權限。進入主機,攻擊者就可以訪問敏感資訊或在叢集內使用您的阿里雲賬戶橫向移動。在應用部署時刻,K8s原生的Admission准入機制可以協助您有效驗證部署執行個體的安全性。應用的成功部署並不意味著安全工作的結束,您需要在應用運行時刻即時監控業務應用安全,及時發現並處理運行時安全事件。
保證叢集安全性建議
在Kubernetes環境中,遵循以下建議,以保證叢集生命週期的安全性。
建立最小化的容器鏡像
首先從容器鏡像中刪除所有無關的二進位檔案。若使用的是來自Docker Hub的未知鏡像,請使用Dive等應用程式檢查該鏡像,該應用程式可以向您展示每個鏡像層的內容。更多資訊,請參見Dive。
在將鏡像推送到ACR(Alibaba Cloud Container Registry)後,ACR控制台中也會展示鏡像中層資訊。刪除所有帶有
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
使用多階段構建
使用多階段構建是一種建立最小鏡像的方法。多階段構建可用於
CI/CD
流程中進行自動化的持續整合。多階段構建指在Dockerfile
中使用多個FROM語句,每個FROM指令都可以使用不同的基礎鏡像,並且是一個獨立的子構建階段。使用多階段構建打包應用具有構建安全、構建速度快、鏡像檔案體積小等優點。更多資訊,請參見在Dockerfile中使用構建打包鏡像並運行。為ACR倉庫建立RAM策略
一個組織中的多個開發營運團隊會使用同一個阿里雲賬戶管理雲資源。如果這些團隊不需要共用資產,您可能需要建立一組RAM策略來限制每個團隊可以訪問的命名空間或者倉庫。例如,
cr:ListInstance*
表示授予cr:ListInstance
開頭的所有Action,設定acs:cr:*:*:repository/$instanceid/$namespace/*
為acs:cr:cn-hangzhou:1234567:repository/cri-123456/ns/*
,表示授予cn-hangzhou地區,帳號ID為1234567的使用者以下許可權:查詢ID為cri-123456的執行個體ns命名空間下鏡像倉庫的許可權。{ "Statement": [ { "Effect": "Allow", "Action": [ "cr:ListRepository", "cr:GetImageLayer", "cr:GetRepoTag" ], "Resource": "*" }, { "Action": [ "cr:List*" ], "Effect": "Allow", "Resource": [ "acs:cr:cn-hangzhou:1234567:repository/cri-123456/ns/*", ] } ], "Version": "1" }
在ACR中配置RAM策略的方法,請參見RAM授權資訊和配置使用自訂OSS Bucket時的RAM存取控制。
優先使用ACR企業版
ACR企業版支援雲原生製品加密儲存,支援鏡像安全掃描及多維度漏洞報告,保障儲存及Alibaba Content Security Service。分別提供容器鏡像和Helm Chart的網路存取控制管理,細粒度的Action Trail,保障製品訪問安全。建議生產環境優先使用ACR企業版,並將倉庫存取原則預設置為私人,使用內網VPC網域名稱進行訪問,不開啟公網訪問入口,並配置ACL白名單控制訪問來源。更多資訊,請參見建立企業版執行個體。
使用ACR雲原生應用交付鏈
通過Container Registry的雲原生應用交付鏈功能,您可以自由組合鏡像構建、鏡像掃描、鏡像全球同步和鏡像分發等任務,提供全鏈路可觀測、可追蹤、安全防護能力。更多資訊,請參見建立交付鏈。
ACR能在推送完成後自動進行鏡像安全掃描,若您設定過安全阻斷策略,其會識別鏡像的安全風險並阻斷高風險的容器鏡像。只有通過安全性原則的容器鏡像才會進行交付鏈後續的分發和部署環節。交付鏈能保證容器應用的安全交付和高效部署。您也可以整合安全掃描的相關API,實現自訂周期的鏡像安全掃描功能。
定期掃描鏡像中的漏洞
與建立虛擬機器使用的系統鏡像一樣,容器鏡像同樣包含帶有漏洞的二進位檔案和應用程式,或者隨著時間的推移出現漏洞。因此,最佳的做法是使用鏡像安全掃描工具定期對您使用的容器鏡像進行漏洞掃描。可以在ACR中對新推送的鏡像或者存量的鏡像進行定期掃描(每隔24小時掃描一次)。應刪除或重建具有
HIGH
或CRITICAL
漏洞的鏡像。若已部署的鏡像出現漏洞,應儘快更換。Kubernetes validation webhook
也可用於驗證鏡像是否存在嚴重漏洞。在使用Kubernetes API
之前調用validation webhook
,可用於拒絕不符合webhook
中定義的驗證標準的請求。可以通過調用ACR提供的CreateRepoTagScanTask來確定Pod是否正在拉取具有嚴重漏洞的鏡像。如果發現漏洞,則拒絕Pod的建立,並以事件形式返回帶有CVE列表的訊息。更多資訊,請參見CreateRepoTagScanTask。將USER指令添加到您的Dockerfiles中並以非root使用者運行鏡像
如Pod安全部分所述,您應該避免以root身份運行容器。您可以將其配置為PodSpec的一部分,但在Dockerfile中使用USER指令是一個好習慣。當設定USER指令後,會以指定的使用者運行RUN、ENTRYPOINT或CMD。
從可信軟體源下載依賴包
在軟體研發階段,您應該盡量避免從不可信的軟體源引用軟體包。關於配置阿里雲可信的鏡像和軟體製品源或者下載研發需要的軟體包,請參見阿里雲鏡像站。
您可以使用阿里雲雲效搭建屬於自己的軟體倉庫。雲效製品倉庫Packages是阿里雲出品的一款企業級私人倉庫服務,提供基於Maven、Gradle、NPM等軟體包管理工具的企業級私人倉庫服務,用於管理企業級依賴託管。倉庫支援管理Maven製品和NPM製品,並支援配置遠程倉庫,一鍵遷移現有私庫。提供租戶隔離、許可權控制、高可用儲存等服務,全面保障企業製品安全。
使用鏡像加簽並配置驗簽策略
在應用部署時刻對目標鏡像的安全性校正能夠保證叢集中只部署可信授權方簽名的容器鏡像,降低您環境中發生意外或惡意代碼的風險。
阿里雲Container RegistryACR支援鏡像加簽功能,保障鏡像從分發到部署的全鏈路一致性,避免中間人攻擊和非法鏡像的更新及運行。ACR支援命名空間層級的自動加簽,每次推送容器鏡像後都會匹配加簽規則自動加簽,保障您的容器鏡像內容可信。更多資訊,請參見使用容器鏡像加簽。
在ACK叢集中,您可以通過組件管理安裝Kritis-validation-hook組件,組件在開源Kritis阿里雲Container RegistryACR軟體的基礎上深度整合,支援驗證通過阿里雲Key Management Service簽名的容器鏡像,實現自動驗證容器鏡像簽名。更多資訊,請參見使用kritis-validation-hook組件實現自動驗證容器鏡像簽名、kritis、什麼是Key Management Service。
在開啟鏡像簽名之後,您可以配置驗簽策略,只部署通過驗簽規則的可信鏡像到您的ACK叢集,並且支援配置驗簽規則的白名單,解決第三方組件自動注入的Sidecar容器的鏡像無法通過鏡像驗簽,導致無法部署Pod的問題。更多資訊,請參見kritis-validation-hook組件介紹。
使用阿里雲Security Center
在雲原生應用運行階段,可實現雲端式資訊安全中心的應用運行時威脅檢測與阻斷,即時保障每個應用Pod的安全運行。Security Center雲端式原生的部署能力,實現威脅的資料自動化採集、識別、分析、響應、處置和統一的安全管控。利用多日誌關聯和上下文分析方案,即時檢測命令執行、代碼執行、SQL注入、資料泄露等風險,覆蓋業務漏洞入侵情境。結合K8s日誌和雲平台動作記錄即時進行行為審計和風險識別,實現Container Service和編排平台存在的容器逃逸、AccessKey泄露、未授權訪問風險。更多資訊,請參見什麼是Security Center。