無(wú)服務(wù)安全性的策略、工具和實(shí)踐
譯文【51CTO.com快譯】不可否認(rèn),我們?cè)诘靡嬗跓o(wú)服務(wù)器帶來(lái)的效率、可擴(kuò)展性、以及成本優(yōu)勢(shì)等功能與便利的同時(shí),必須保證無(wú)服務(wù)器應(yīng)用的安全性。在本文中,我將向您介紹如何使用AWS Lambda和相關(guān)工具,來(lái)開(kāi)發(fā)無(wú)服務(wù)器功能,以及那些行之有效的無(wú)服務(wù)器安全策略和優(yōu)秀實(shí)踐。
總體而言,無(wú)服務(wù)器的安全性處置方法可分為兩類(lèi):運(yùn)行時(shí)(runtime)安全和靜態(tài)(static)安全。
運(yùn)行時(shí)安全
毫不夸張地說(shuō),無(wú)服務(wù)器的相關(guān)功能一旦開(kāi)始運(yùn)行并被調(diào)用,其安全隱患就出現(xiàn)了。特別是涉及到有用戶(hù)輸入信息時(shí),暴露的攻擊面會(huì)更大。例如:惡意用戶(hù)可能通過(guò)SQL注入的方式,竊取甚至刪除后臺(tái)的數(shù)據(jù)。同樣,跨站點(diǎn)腳本(XSS)攻擊可以將腳本注入到運(yùn)行在無(wú)服務(wù)器的微虛擬機(jī)(microVM)上。如此,就算無(wú)服務(wù)器已執(zhí)行完了所提供的功能(或是超時(shí)了),microVM仍會(huì)spin down,而此時(shí)XSS攻擊便可以在無(wú)服務(wù)器環(huán)境中站穩(wěn)腳跟,通過(guò)啟動(dòng)其他進(jìn)程來(lái)興風(fēng)作浪。
我們既可以將無(wú)服務(wù)器的安全保護(hù)作為一個(gè)功能性層面來(lái)運(yùn)行,也可以將其作為并行的進(jìn)程來(lái)運(yùn)行。而此類(lèi)保護(hù)既可以驗(yàn)證用戶(hù)輸入的完整性,又能夠監(jiān)控文件、進(jìn)程和連接是否存在著任何異?;驉阂庑袨?。
不過(guò),在函數(shù)每一次被調(diào)用時(shí),安全保護(hù)都被激活。這往往會(huì)增加運(yùn)行時(shí)間,特別是在無(wú)服務(wù)器的情況下,每次就會(huì)增加100ms的運(yùn)行成本。而且,如果需要加載較大的代碼包,那么此類(lèi)延遲的增加,就會(huì)對(duì)整體性能造成較大的負(fù)面影響。話(huà)雖如此,對(duì)于那些金融服務(wù)和關(guān)鍵性基礎(chǔ)設(shè)施的應(yīng)用而言,由于安全性比性能更為重要,因此運(yùn)行時(shí)安全對(duì)于它們的無(wú)服務(wù)功能來(lái)說(shuō),是必不可少的。
實(shí)際上,無(wú)服務(wù)器功能已經(jīng)自帶了不少安全機(jī)制。例如:惡意攻擊無(wú)法在運(yùn)行時(shí)中更改函數(shù)的代碼,畢竟它僅能作為一個(gè)實(shí)例被執(zhí)行。同時(shí),無(wú)服務(wù)器功能通常運(yùn)行在AWS Lambda等云端服務(wù)上,而云服務(wù)提供商自身已經(jīng)提供了免受DDoS攻擊、DNS攻擊、TCP SYN攻擊、以及會(huì)話(huà)劫持攻擊的能力。因此,用戶(hù)只需遵循編程時(shí)的各種優(yōu)秀實(shí)踐,并保持每個(gè)函數(shù)在邏輯上盡量簡(jiǎn)單,即可達(dá)到運(yùn)行時(shí)安全的效果。畢竟,隨著應(yīng)用的迭代,代碼量的逐漸增多,功能性超時(shí)也會(huì)隨之增加。因此,我們需要持續(xù)通過(guò)運(yùn)行時(shí)安全,來(lái)保護(hù)無(wú)服務(wù)器的各項(xiàng)功能。
靜態(tài)安全
靜態(tài)安全是從執(zhí)行前的檢查階段,以及執(zhí)行后的取證分析階段,來(lái)保護(hù)無(wú)服務(wù)器的各項(xiàng)功能。
具體而言,執(zhí)行前的檢查可遵循如下安全檢查列表(其中,前三點(diǎn)是無(wú)服務(wù)器安全性特有的要求):
1. 為每項(xiàng)功能分配一個(gè)角色,以定義其對(duì)于資源的訪(fǎng)問(wèn)權(quán)限。建議做法是:授予必要且最低的訪(fǎng)問(wèn)權(quán)限。
2. 為了避免由于錯(cuò)誤的配置所導(dǎo)致的安全漏洞,請(qǐng)將所有資源都組織到同一個(gè)應(yīng)用之中。
3. 在訪(fǎng)問(wèn)規(guī)則上,應(yīng)當(dāng)設(shè)置為:每個(gè)資源都需要用單獨(dú)的憑據(jù)來(lái)訪(fǎng)問(wèn),并對(duì)憑據(jù)進(jìn)行安全管理。
4. 嚴(yán)格地限制功能發(fā)布、路由更改、以及負(fù)載分布的變更等權(quán)限。
5. 持續(xù)掃描功能庫(kù),并及時(shí)修復(fù)發(fā)現(xiàn)的漏洞。
為了將上述安全措施集成到CI/CD流程中,光靠人工干預(yù)顯然是不夠的,我們需要通過(guò)安全自動(dòng)化的規(guī)模性能力,來(lái)保護(hù)各項(xiàng)功能與資源。
第二階段則是通過(guò)一系列來(lái)自云提供商的工具,在執(zhí)行后進(jìn)行取證分析。例如,我們可以使用AWS CloudWatch、AWS X-Ray、AWS Security Hub、AWS GuardDuty、以及最新的Amazon Detective,來(lái)監(jiān)控和分析AWS Lambda無(wú)服務(wù)器的各項(xiàng)功能。
無(wú)服務(wù)器功能的開(kāi)發(fā)工具與實(shí)踐
由于AWS Lambda具有對(duì)Java、Go、PowerShell、Python、Node.js、C#和Ruby的原生支持,因此在以下的示例中,我們將使用Python、Node.js或Ruby語(yǔ)言,通過(guò)基于Web的AWS控制臺(tái),來(lái)創(chuàng)建一項(xiàng)無(wú)服務(wù)器功能(如下面的屏幕截圖所示)。值得注意的是,AWS提供的用于編寫(xiě)函數(shù)的文本編輯器,并不適合創(chuàng)建那些會(huì)用到多個(gè)文件、軟件庫(kù)、以及依賴(lài)項(xiàng)的大型函數(shù)。
當(dāng)然,您也可以選擇使用AWS的命令行界面(CLI)工具,在本地開(kāi)發(fā)和提交各項(xiàng)功能。您可以參考這里,來(lái)進(jìn)一步了解AWS CLI的安裝和配置。
同時(shí),您可以把在本地開(kāi)發(fā)好的所有源代碼文件,放入一個(gè)zip文件,然后上傳到AWS CLI中(如下所示)。
我們需要通過(guò)更強(qiáng)大的開(kāi)發(fā)工具,以及專(zhuān)用的開(kāi)發(fā)環(huán)境,來(lái)開(kāi)發(fā)更為復(fù)雜的服務(wù),以及在CI/CD管道中引入可擴(kuò)展的自動(dòng)化靜態(tài)安全。這里羅列了各種強(qiáng)大的、適合開(kāi)發(fā)人員的AWS工具。此外,Lumigo網(wǎng)站也提供了一些較為實(shí)用的工具,具體請(qǐng)參見(jiàn)--https://lumigo.io/blog/comparison-of-lambda-deployment-frameworks/。
無(wú)服務(wù)器框架(Serverless Framework,SLS)是目前最受歡迎的開(kāi)發(fā)工具,它在GitHub上獲得了超過(guò)38,000顆星。AWS無(wú)服務(wù)器應(yīng)用程序模型(Serverless Application Model,SAM)則是另一款十分流行的工具。它們都能夠讓開(kāi)發(fā)人員在serverless.yml文件中,構(gòu)建無(wú)服務(wù)器項(xiàng)目。此類(lèi)項(xiàng)目可以被轉(zhuǎn)換為CloudFormation模板。AWS將它用來(lái)創(chuàng)建各種所需的資源。具體而言,SLS和SAM能夠提供:
1. 基礎(chǔ)架構(gòu)即代碼(Infrastructure-as-code)定義了CloudFormation中的資源,其中包括:無(wú)服務(wù)器功能、API網(wǎng)關(guān)、Amazon S3存儲(chǔ)等。
2. 本地功能性測(cè)試。
3. 多階段性的CI/CD管道集成。
4. 完全開(kāi)源的修改潛力。
此外,SLS還提供了1000多個(gè)現(xiàn)有插件的列表。這些插件不但可以極大地改善和簡(jiǎn)化無(wú)服務(wù)器的功能開(kāi)發(fā),還可以按需被編寫(xiě)出新的插件。以下代碼段便是一個(gè)小型插件的示例:
在開(kāi)發(fā)人員能夠使用SLS,來(lái)創(chuàng)建有效的無(wú)服務(wù)器項(xiàng)目時(shí),無(wú)服務(wù)器棧(Serverless Stack)為他們提供了寶貴的分步說(shuō)明。同時(shí),作為一套出色的初學(xué)者教程,該資源方便了開(kāi)發(fā)人員獲取有關(guān)無(wú)服務(wù)器開(kāi)發(fā)的工作流,以及如何使用AWS基本組件的經(jīng)驗(yàn)。
構(gòu)建安全的無(wú)服務(wù)器功能
以下便是我們?cè)陂_(kāi)發(fā)安全的無(wú)服務(wù)器應(yīng)用時(shí),值得遵循的六項(xiàng)優(yōu)秀實(shí)踐與規(guī)則:
1. 通過(guò)將資源定義與函數(shù)區(qū)分開(kāi)來(lái),讓您的代碼庫(kù)井然有序。您可以利用不同資源作為參數(shù),而不是經(jīng)過(guò)硬編碼的字符串。同時(shí),您可以通過(guò)共享代碼,來(lái)盡量減小程序包的大小。
如下兩個(gè)示例,演示了良好的代碼庫(kù)組織結(jié)構(gòu)。其中,第一個(gè)展示了共享庫(kù)的多項(xiàng)功能:
第二個(gè)例子是由無(wú)服務(wù)器棧提供的:
2.遵循最小特權(quán)原則,將身份和訪(fǎng)問(wèn)管理(IAM)中的角色限制為單個(gè)功能級(jí)別上。
3.使用諸如AWS SSM代理之類(lèi)的服務(wù),來(lái)管理好密鑰。
4.單個(gè)無(wú)服務(wù)器功能僅能執(zhí)行一項(xiàng)任務(wù)。如果某個(gè)函數(shù)的輸出需要進(jìn)一步處理的話(huà),請(qǐng)將該輸出保存到數(shù)據(jù)存儲(chǔ)庫(kù)中,并由該保存動(dòng)作來(lái)觸發(fā)新的函數(shù)。記住:不要使用當(dāng)前函數(shù)去調(diào)用另一個(gè)函數(shù)。
5.盡量少用遠(yuǎn)程連接。無(wú)論多么復(fù)雜,函數(shù)的大部分都應(yīng)該在本地處理其輸入,然后返回對(duì)應(yīng)的結(jié)果。注意:遠(yuǎn)程連接不但會(huì)增加延遲,而且可能導(dǎo)致在調(diào)試和擴(kuò)展時(shí)出現(xiàn)問(wèn)題。
6.盡量少用依賴(lài)性。最好將它們放置在前文提到的共享層中,并持續(xù)執(zhí)行安全掃描。
這些便是我想在本文中和您討論的,各種無(wú)服務(wù)安全性的策略、工具和實(shí)踐。
原文標(biāo)題:Examining Serverless Security Strategies, Tools, and (Current) Best Practices,作者: Selvam Thangaraj
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】