微服務和容器安全應用的10個最佳實踐

容器是目前應用系統運行的常用環境,特別是對於複雜的應用系統,開發人員更喜歡使用基於容器的開發架構,因為容器是輕量級的、可移植的,並且易於維護和擴展。由於這些特性,容器非常適用於現代開發模式,如DevOps、無伺服器和微服務等。

開發人員可在容器中封裝了應用程序的輕量級運行時環境。因此,當在容器中開發微服務時,它繼承了容器化的優點,如可移植性、可伸縮性和額外安全層等。同時,在單獨的容器中運行微服務,使用者可以獨立地部署它們,消除了語言、庫和框架之間的兼容性風險。在服務監測方面,容器化使微服務更容易定位和相互通訊,因為它們都運行在位於同一平臺上的容器中,開發人員將更容易編排微服務。

微服務和容器應用的安全挑戰

雖然基於容器的微服務開發應用方法有諸多好處,包括易於擴展和管理,但它們也同樣存在一些的安全問題。在服務開發之前,企業應該了解可能出現的網路安全風險以及如何消除這些風險,將有助於創建可靠又安全的產品。

1. 可被利用的漏洞

一般來說,與微服務和容器相關的安全問題屬於應用編排平臺的整體安全需求中。但是,並非所有的安全風險都可以在業務流程中處理。比如說可能被利用的漏洞。

  • 映像漏洞是基於微服務和容器的應用程序內最常見的安全威脅。它們通常來自不安全的庫或其他依賴項。當容器基於不安全的映像時,就會將該漏洞威脅引入整個應用環境;

  • 應用程序漏洞主要指應用程序的源程式碼缺陷。比如某個應用程序中存在一個緩衝區溢出漏洞,攻擊者可能會利用它來執行惡意程式碼並接管容器;

  • 網路攻擊的漏洞。基於微服務的應用程序比傳統應用程序更復雜,因為它們由許多獨立部件組成。一個應用程序可以包括部署在數千個容器中的數百個微服務,這使得基於微服務的應用程序非常容易受到網路攻擊,因為很難同時確保這麼多元件的整體安全性。

2. 惡意軟體風險

惡意軟體的危害在於,如果企業在啟動容器之前沒有檢測到它,惡意軟體將感染此容器內的微服務以及整個環境。惡意軟體攻擊帶來的安全風險主要包括:

  • 駭客可以訪問一個容器並向其中注入惡意程式碼,通過惡意程式碼可以攻擊該容器、其他容器或主機作業系統中的微服務;

  • 惡意攻擊者會危害企業的CI/CD環境,並將惡意軟體注入用於構建容器映像的源程式碼儲存庫;

  • 攻擊者會破壞容器註冊表並替換包含惡意軟體的圖像;

  • 攻擊者欺騙開發人員從外部來源下載惡意容器映像。

3. 與程式碼訪問相關的風險

訪問和修改程式碼的人越多,安全風險就越大,最常見的情況是:

  • 訪問許可權過大。許多開發公司選擇DevOps方法來使用微服務和容器構建應用程序,這可能導致訪問許可權過於寬泛,增加了在分散式工作環境中惡意修改程式碼的風險。

  • 機密管理薄弱。在安全實踐不佳或違反安全規則的情況下,很多人可以訪問容器。例如,開發人員可能將腳本中編碼的憑證放入容器中,或者將憑證儲存在配置不安全的金鑰管理系統中。

4. 容器間的通訊不受限制

通常情況下,容器不能訪問外部任何資源,這被稱為非特權模式。工程師應該只允許保障應用系統正常工作所必需的容器間通訊。每當容器的通訊許可權超過嚴格要求時,它可能會導致額外的安全風險。由於缺乏經驗或管理不當而導致的錯誤配置,會讓容器獲得過多的特權。

5. 不安全的資料管理

微服務體系的分散式框架使得資料安全管理更具挑戰性,因為很難控制對單個服務的訪問和安全授權。因此,工程師必須更加關注如何確保每個服務內資料的機密性、隱私性和完整性。另一個問題是,微服務中的資料不斷地移動、更改,並在不同的服務中用於不同的目的,這為攻擊者創建了更多的資料竊取攻擊點。

6. 錯誤配置工具

在開發和維護微服務架構時,DevOps團隊需要使用大量工具,包括開源和第三方工具。雖然這類工具幫助工程師實現DevOps管道所需的效率,但它們很難保證所需要的安全性。

如果不能準確評估開源工具的安全功能,企業就有可能在微服務和容器中創建漏洞。即使一個工具本身是安全,如果沒有正確設置,也會出現很多安全問題。

微服務和容器安全防護最佳實踐

如何選擇適當的安全措施來應對上面提到的風險可能是一個挑戰。究其原因,容器和微服務都是因為它們應用的簡潔性和快捷性而對開發人員具有如此大的吸引力。如果安全措施使開發流程變得緩慢和複雜,那麼就很可能會被開發人員所牴觸或故意忽視。為了幫助企業在安全的情況下高效利用容器和微服務進行應用系統開發,本文收集整理了10種有用的最佳實踐。

1. 創建不可變容器

開發人員往往保留通過shell訪問映像的途徑,以便修復生產環境中的映像。然而,攻擊者常利用這條途徑來注入惡意程式碼。要避免這種情況,可以創建不可變容器。不可變容器無法被改動。如果使用者需要更新應用程序程式碼、打補丁或更改配置,可以重新構建映像並重新部署容器。如果使用者需要撤回更改,只需重新部署舊映像。需要注意的是,容器的不可變特性會影響到資料永續性。開發人員應該將資料儲存在容器外面,這樣容器被替換時,所有資料仍可供新版本使用。

2. 將自動安全測試集成到CI/CD過程中

有各種工具可以在CI/CD過程中自動測試容器。比如說,HP Fortify和IBM AppScan提供動態和靜態應用程序安全測試。還可以使用JFrog Xray和Black Duck等掃描器實時檢查容器中已知的漏洞。一旦這類工具發現了漏洞,就會將檢測到有問題的部分標註出來,以便檢查和修復。

3. 避免使用特權容器

如果容器在特權模式下運行,它就可以訪問主機上的所有元件。如果這種容器被破壞,攻擊者可以全面訪問伺服器。因此,應該考慮儘量避免使用特權容器。比如在Kubernetes中,可以使用策略控制器(Policy Controller)禁止特權容器。

如果出於某種原因需要使用特權容器,Google雲架構中心提供了幾個替代方案:

  • 通過Kubernetes的securityContext選項為容器提供特定的功能

  • 在sidecar容器或init容器中修改應用程序設置

  • 使用專用註釋修改Kubernetes中的sysctls接口

4. 建立可信映像庫

開源社區會為開發人員提供許多具有容器的開源軟體包。但是出於安全目的,開發者需要知道容器的來源、更新時間以及它們是否含有漏洞和惡意程式碼。最好建立可信映像庫,只從這個可信源運行映像。如果想使用其他來源的映像,建議首先使用掃描工具掃描映像。此外,在將容器部署到生產環境之前,開發人員應檢查腳本中的應用程序簽名。如果在多個雲環境中運行容器,需要建立多個安全映像儲存庫。

5. 使用註冊中心管理映像

Docker Hub、Amazon EC2 Container Registry和Quay Container Registry等註冊中心可以幫助開發人員儲存和管理已創建的映像。可以使用這些註冊中心執行以下操作:

  • 提供基於角色的訪問控制

  • 指定容器的可信源

  • 創建和更新已知漏洞列表

  • 標註易受攻擊的映像

基於角色的訪問控制非常重要,因為需要控制誰可以改變容器。最好將訪問許可權分開到不同的管理帳戶:一個負責系統管理,另一個負責操作和編排容器。要記住的另一點是,應該確保註冊中心驗證每個容器的簽名,只接受來自可信源的容器。此外,需要充分利用幫助不斷檢查映像內容查找已知漏洞,並報告安全問題的功能。

6. 加固主機作業系統

保障微服務和容器的應用安全,有必要確保主機作業系統的安全。

首先,建議企業使用針對特定容器的主機作業系統(明確旨在只運行容器的簡版主機作業系統),因為它們沒有不必要的功能,因而攻擊面比通用主機系統小很多。

其次,CIS Docker Benchmark提供了加固系統的核對列表,主要的建議如下:

  • 建立使用者身份驗證

  • 設置訪問角色

  • 指定二進位制檔案訪問許可權

  • 收集詳細的審計日誌

為了避免資料洩露,應該限制容器對底層作業系統資源的訪問,並將容器彼此隔離。一個好的做法是在核心模式下運行容器引擎,同時在使用者模式下運行容器。比如說,Linux提供了Linux名稱空間、seccomp、cgroups和SELinux等技術,從而安全地構建和運行容器。

7. 用縱深防禦方法保護微服務

縱深防禦可以結合多種安全機制和控制措施,比如防毒軟體、防火牆和補丁管理,以保護網路和資料的機密性、完整性和可用性。

縱深防禦方法的三大層是:

  • 物理控制——用於物理限制使用者訪問IT系統,比如安保系統和閉路電視系統

  • 技術控制——旨在保護系統和資源的軟硬體

  • 管理控制——通過各種策略和程序,以確保組織關鍵基礎設施的網路安全性

縱深防禦方法是確保微服務安全的最重要原則之一,因為它創建了多層安全以防止攻擊。它包括下列安全措施:過濾傳輸的資料流、驗證和授權對微服務的訪問以及使用加密技術等。要確保內部環境不受任何外部連接的影響,因為這是安全防護的基礎。

8. 嚴格控制API訪問

API是微服務應用程序的關鍵,很多軟體都會有多個獨立的API服務。因此,確保安全身份驗證和授權的API訪問控制對於微服務安全至關重要。當API服務訪問敏感資料時,應該需要提供驗證令牌,令牌要經過數字簽名或得到權威來源的驗證。開發人員和管理員可以使用OAuth/OAuth2伺服器來獲取令牌,以便通過API訪問應用程序。出於安全考慮,還應該使用傳輸層安全(TLS)加密來保護所有客戶機/伺服器通訊。

9. 原生化容器檢測工具

持續性監測容器的運行很有必要,因為它可以幫助使用者:

  • 深入了解容器度量指標和日誌

  • 了解集群、主機以及容器內部正在發生的情況

  • 做出更明智的安全運營決策

然而要確保有效的監視,最好使用容器原生監視工具。比如在使用Docker時,開發人員通常使用Docker Security Scanner或其他專門設計的工具來檢測任何潛在威脅。監視工具會先收集事件,然後對照設置好的安全策略加以對比分析和檢查。

10. 使用服務編排管理器

服務編排是個複雜的過程,可使微服務和容器的部署、管理、擴展和連接實現自動化。編排器負責從註冊中心提取映像,將這些映像部署到容器,並管理容器運行。編排器提供的抽象讓使用者可以指定運行某個映像所必需的容器數量,以及需要為它們分配哪些主機資源。

如果使用編排管理器,不僅可以自動部署微服務,還可以確保一定級別的安全。比如說,編排器便於管理容器集群、隔離工作負載、限制對元資料的訪問以及收集日誌。許多編排管理器還有內建的機密資料管理工具,允許開發人員安全地儲存和共享機密資料,比如API和SSL證書、加密金鑰、身份令牌和密碼。

參考連結:

https://www.apriorit.com/dev-blog/558-microservice-container-security-best-practices