本文節選自《不一樣的 雙11 技術:阿裡巴巴經濟體雲原生實踐》一書
作者:
王旭,花名循環,螞蟻金服資深技術專家
劉獎,阿裡雲基礎軟體部資深技術專家
秦承剛,花名承剛,螞蟻金服資深技術專家
前不久,我們的同僚艾競說“安全所帶來的信任,是一種無形的産品,支撐着所有金融業務”,我深以為然,作為螞蟻金服的基礎設施部門,我們既要努力推進基礎設施雲原生化,也要保證全鍊路的安全,而安全容器,就是整個安全鍊路中最終“落地”的一環。無獨有偶,基礎設施雲服務,作為雲原生應用的發源地,也在和雲原生應用的互動中前行,安全容器沙箱作為雲服務的演化方向之一也在扮演日益重要的角色。本文中,螞蟻金服和阿裡雲的容器開發者們會共同向大家介紹安全容器的前世今生、它們在 雙11 中的應用、以及未來的發展方向。
容器與安全容器
如果把一套雲原生的系統想成一個有機體,那麼,容器無疑就是其中的細胞,它們每個都是個獨立的個體,又協同工作,它們生生不息讓整個生命體健康運轉。每個細胞都有它自己的隔離系統,正如容器,它的名字(Container, Jail, Zone...)天生就帶着隔離的味道,但是,容器的安全性究竟夠不夠呢?年初 Tripwire 的一份調查揭示了人們對容器安全的種種擔心【1】:
- 42% 的受訪者因為安全顧慮推遲或限制了容器化程序;
- 58% 的在生産環境中使用容器的受訪者承認它們的容器中存在安全缺陷,另外還有 13% 的人覺得自己的容器有安全問題,但不确定,而非常決絕地表示自己的容器非常安全的比例隻有 7%。
面對這樣的威脅,目前可用的容器層的解決方案就是 Linus Torvalds 在 2015 年北美 LinuxCon/ContainerCon 上所說的——“安全問題的唯一正解在于允許那些(導緻安全問題的)Bug 發生,但通過額外的隔離層來阻擋住它們。” 這也就是當今的安全容器技術的基本原理。(注:Linus 所說的思路是安全容器的思路,但安全容器不是從這裡開始的,事實上,主流開源安全容器項目 Kata Containers 【2】的兩個前身——runV 和 Clear Containers 都是在 Linus 上述訪談之前三個月開源的)。
隔離性不僅是安全
Kata Containers 在官方網站上展示的格言就是——
The speed of containers, the security of VMs
而且,這類技術最廣為接受的名字也是“安全容器”。然而,隔離性所帶來的好處遠不止安全性這一點,在阿裡巴巴和螞蟻金服的大規模實踐中,它至少還意味着四個方面的優勢:
- 分層核心可以改善節點排程效率,容器的程序在自己的核心上被排程,對于主機來說,就隻是一個程序,這在節點上運作着大量容器的時候,對節點的排程效率和穩定性都有極大的幫助;
- 良好的封裝可以降低運維的壓力,如果可以把應用程序乃至資料全部放入安全容器中,不對主機展示,那麼對于主機的運維來說,将變得更加簡單;
- 有利于系統的 QoS 保障和計費系統的準确工作,如果所有使用者的相關的計算和資料流量都放在一個完全封裝的安全容器的中,那麼,對于主機管理網的 QoS 保障、對使用者的 SLA 保障、對使用者的計費都将是可操作且集中的;
- 有利于保障使用者的資料隐私,普通容器的情況下,容器的檔案系統資料和程序資料是完全暴露給主機的,對于雲服務場景,這就要求使用者授權服務方來通路使用者資料,否則無異于掩耳盜鈴,但如果可以通過安全容器的沙箱把這些都放在容器中,那麼對于使用者的授權要求也就可以最小化了。
顯而易見,雲原生基礎設施确實是需要更好的隔離技術的,安全容器是大有可為的。
Kata Containers 與阿裡雲安全沙箱
上面已經提到,目前主流的開源安全容器項目是 Kata Containers,核心是用虛拟化技術來作為容器(确切地說是 Kubernetes Pod)的沙箱,進而提供虛拟機級别的隔離性,這個安全級别是在過去多年以來的雲服務中被廣泛接受的。該項目在兩年前的 2017 年 12 月,由 runV 和 Intel 的 Clear Containers 項目合并而成,本文作者之一王旭就是 runV 項目的發起者,也是 Kata Containers 的創立者之一。
在過去兩年中,Kata Containers 在保證了對标準容器鏡像的相容性和對 Kubernetes 生态的相容性的同時,不斷緻力于與相關社群一起,降低沙箱技術的開銷,提升安全容器技術的彈性。引入/支援/推動了 containerd shim-v2 API【3】,Kubernetes RuntimeClass,Rust-VMM,等來降低開銷、減少間接層、改善內建 Kubernetes 效果。
在阿裡巴巴和螞蟻金服内部,基于 Kata Containers 等安全沙箱技術也被應用在内部不同應用等混合部署、阿裡雲 Serverless 服務等場景,支援着各種業務。
gVisor 與程序級虛拟化
Google 在 2018 年釋出了基于程序級虛拟化技術的沙箱産品“gVisor”。gVisor 很輕薄,利用了基本的硬體虛拟化技術提供程序級别的抽象,無需 VMM 支撐。gVisor 的運作就像 Linux 程序一樣,拉起速度快,對記憶體等資源的占用也較小。螞蟻金服在 gVisor 開源之後不久,就開始投入開發。目前已經是 gVisor 社群中,Google 以外的最大貢獻者。同時,螞蟻針對自己的業務場景進行了大量的定制優化。現在已經成功将其應用于生産環境,進行了初步的生産驗證。
gVisor 是安全容器技術,更是全新的作業系統。它實作了一個用 Go 語言寫的“安全核心”。這個核心實作了 Linux Kernel 的絕大部分功能。由于 Go 語言在記憶體安全與類型安全上的優勢,gVisor 的“安全核心”被視為一道重要的防禦縱深。我們在開發中會 review 每一行代碼的“安全性”。為了進一步加強安全,螞蟻搭建了一套 fuzz 測試系統,一刻不停的測試。為了彌補 Go 語言在性能上的不足,螞蟻重構了網絡協定棧,在擷取安全的同時,也大幅提升了性能。
面向雲原生,gVisor 的最大優勢是“資源可伸縮”。它不會預留 CPU 與記憶體資源,跟普通的 Linux 程序并無太大差異。在 gVisor 容器中,不用的資源會立刻還給主控端。我們在嘗試基于 gVisor 的程序級虛拟化技術,打破傳統容器的資源邊界。在 Serverless 等場景下,實作超高密度的容器部署。
未來:從安全容器到雲原生沙箱
就目前來看,雖然雲原生應用期待沙箱有更好的隔離性,但目前的沙箱技術尚有一些需求沒有完全滿足,是以,我們在規劃 2.0 乃至未來的 Kata 的時候,就将演進方向定為:
- 在保持沙箱邊界清晰的同時,可以跨沙箱共享一部分資源,極緻降低開銷;
- 更加按需、彈性、即時地根據應用的需求來提供資源,而不是硬性地切分;
- 讓使用者空間工具、沙箱、容器應用的核心聯合為應用提供服務,因為應用的服務邊界是核心 ABI 而不是模拟的硬體。
可以看到,這也喻示着兩類安全容器技術實際上是彼此靠近的,虛拟化容器也與傳統虛機漸行漸遠,發展成為”雲原生虛拟化“。螞蟻金服和阿裡雲的正在這些方面共同合作,其中的部分工作已經展開,并在推動社群。
開源:從社群來,到社群去
目前,螞蟻金服和阿裡巴巴的安全容器技術都是基于開源社群而開發的,重要的開源社群包括 Kata Containers, gVisor 和 RustVMM。我們已經将一些成果推向社群,并在持續貢獻。并且,秉承開放設計、開放開發的理念,我們也在将自己實踐中的經驗和問題,總結成為對未來的需求,不僅是對社群的修補和改進,更在推動社群在的設計理念、架構、協定方面前進。
未來正在到來,不論是加入社群做貢獻還是直接加入我們,都非常歡迎。
參考連結
【1】
The New Stack: Security Worries Rise as Container Adoption Increases, 2019-01【2】
Kata Containers, https://katacontainers.io【3】
Containerd Runtime V2 (shim-v2) API
本書亮點
- 雙11 超大規模 K8s 叢集實踐中,遇到的問題及解決方法詳述
- 雲原生化最佳組合:Kubernetes+容器+神龍,實作核心系統 100% 上雲的技術細節
- 雙 11 Service Mesh 超大規模落地解決方案
“ 阿裡巴巴雲原生 微信公衆号(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術公衆号。”