[英]Adding a header on AWS API gateway using custom authorizer context does not work
[英]Is AWS API Gateway custom authorizer useful?
我希望為AWS Lambda / zappa使用一些“無服務器api服務器”,該服務器使用自定義API網關授權方進行用戶身份驗證。 在無服務器的AWS Lambda服務中,使用自定義授權器而不是直接在代碼控制器中檢查已頒發的JWT令牌是否具有可觀的安全性或成本優勢? 對我來說,檢查代碼會更方便。
更新我去了預請求掛鈎,但是有標頭級授權者,它對於CORS來說更容易使用,但是我相信zappa不支持它。 還可以通過招搖上傳來為Options設置模擬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.