簡體   English   中英

AWS API Gateway定制授權者有用嗎?

[英]Is AWS API Gateway custom authorizer useful?

我希望為AWS Lambda / zappa使用一些“無服務器api服務器”,該服務器使用自定義API網關授權方進行用戶身份驗證。 在無服務器的AWS Lambda服務中,使用自定義授權器而不是直接在代碼控制器中檢查已頒發的JWT令牌是否具有可觀的安全性或成本優勢? 對我來說,檢查代碼會更方便。

更新我去了預請求掛鈎,但是有標頭級授權者,它對於CORS來說更容易使用,但是我相信zappa不支持它。 還可以通過招搖上傳來為Options設置模擬API,如果成功則將更新。

我認為嚴格來講並沒有安全性或成本優勢。 好處是,它是處理您的授權的單個位置,單個代碼段。 這樣可以避免您必須在API背后部署的每個Lambda函數中復制該授權代碼。 並且它允許您更新單個功能以對授權邏輯進行任何更改。

從它為您的授權邏輯提供單一事實來源的角度來看,它允許您實現關注點分離 ,這可以說是增強了應用程序的安全性。

話雖這么說,如果您的整個API包含一個Lambda函數,那么其好處就有些可疑了。 我認為,當您的API具有許多Lambda功能或您的API網關位於傳統的HTTP服務器之前時,API網關自定義授權者將真正受益。

@Mark B提出了很好的觀點,我當然不會對他的回答提出任何質疑。 盡管如此,我還是想為對話做貢獻。

為您量身定制的答案可能取決於JWT的來源以及如何獲取,使用和刷新它們。 在以下情況下,使用自定義授權者可能很有意義:

用例1

如果要在幾種不同的授權方式后面保護單個Lambda,則自定義授權者可能會很有用。 例如,您可以創建三個不同的API網關端點,每個端點都調用相同的Lambda,但使用不同的授權者。 這與Mark關於DRY好處的觀點聯系在一起。

用例2

定制授權者使您能夠在授權者代碼中內聯構建IAM權限。 無需為呼叫者分配一個預先存在的IAM角色,您可以構建自己喜歡的任意權限集。 請注意,如果您以某種方式使用(不受信任的)用戶輸入來分配IAM權限,則這很容易成為令人討厭的攻擊手段。

用例3

Lambda非常適合隱藏秘密。 例如,您有一個前端JS應用程序,並且需要參與需要客戶端ID和客戶端密鑰的OAuth 2.0流。 或者,您需要調用需要某種API密鑰的端點。 顯然,您無法將這些秘密公開給瀏覽器。

這些值可以加密並存儲在 Lambda函數特定的環境變量中 盡管您當然可以在后端lambda上采用這種方法,但是使用授權者具有以下好處:

我喜歡能夠盡可能嚴格地限制這些秘密的范圍。 通過使用授權者,我的應用程序可以很高興地不知道這些秘密。 這與Mark關於關注點分離的觀點聯系在一起。

IAM和最低權限

我更喜歡我的后端代碼永遠不會被未經授權的各方調用。 因此,實際上我在創建的每個API網關資源上都使用了某種類型的授權者。 我曾經使用過自定義授權者,但它們是我的最后選擇。 我大部分時間都依靠IAM授權,使用Cognito將令牌交換為臨時IAM憑據。

如果您在后端Lambda中而不是在授權者中執行授權,則在圍繞您的后端Lambda定義IAM控制時,您將不會受到太多限制。 這違反了最低特權原則 這不僅僅是代碼組織和應用程序體系結構的問題; 這是合法的安全問題。 本質上,您要暴露的攻擊面要多得多。

此外,當您的后端增長時,IAM的真正威力也將熠熠生輝。 您的后端Lambda可能需要寫入S3,調用其他Lambda,發布到SNS或SQS,與RDS或DynamoDB交互等。我建議“最佳實踐”指示所有此訪問都受嚴格的IAM約束。政策。 以我的經驗,使用API​​網關授權者(任何類型,不一定是自定義)來分配角色是完成此任務的最直接方法。

到成本部分的問題。 授權者將為另外一個lambda呼叫和新的CPU時間分別收取100ms的最低費用。 如果后端中有許多短的lambda,這可能是一筆不小的費用,可能會使它們中的每一個的成本加倍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM