0

我目前使用Cognito用戶池作爲API網關端點的授權者,直至Lambda函數。使用自定義屬性通過API網關對Lambda進行身份驗證Cognito用戶是否安全?

我可以將集成請求傳遞給Lambda,並基於自定義屬性安全地允許或拒絕Lambda內部?

映射: 「管理員」: 「$ context.authorizer.claims [ '定製:管理員']」,

LAMBDA處理程序:

boolean isAdmin = Boolean.parseBoolean(request.getContext().get("administrator")); 

if(isAdmin) etc... 

需要明確的是,用戶是不管理員不應該訪問與管理員相同的API端點。

我需要在此之前/之後做任何其他事情嗎?

在用戶登錄到Cognito之後,我通過包含授權:JWToken標頭,向Javascript API網關發送初始請求。

我需要驗證Lambda函數中令牌的簽名嗎?我認爲API網關已經做到了。

有沒有更好的方法來管理這個安全方面?

我非常希望能夠限制訪問基於用戶游泳池內組API端點,不過我不認爲這是可能的。

本文檔介紹如何通過AWS Identity and Access Management限制訪問權限。如果我沿着這條路走下去,我該如何向API網關發出請求?我仍然使用JWToken授權標題,並將Cognito用作API網關中的授權者嗎?

+0

我現在知道使用自定義屬性來確保endpoing絕對不安全:用戶可以更新自己的屬性。 – comfytoday

回答

0

Cognito用戶池中包含的自定義屬性/聲明支持是安全的,可以在正確使用時用於此類用例。有幾個警告。

首先,確保用戶無法自己修改自定義屬性。添加客戶屬性時,請勿將該屬性標記爲可變。而且,自定義屬性可以被標記爲對每個應用程序可讀或可寫。對於這種用例,您需要將該屬性設置爲用戶可以訪問的應用程序可讀的。有關自定義屬性的詳細信息can be found here

另外需要注意的是,以確保您的請求主體永遠無法繞過你的映射模板,可能允許攻擊者的方式來直接設置屬性被傳遞給你的lambda表達式的管理員。爲此,請編輯您的集成請求並將「請求身體傳遞」設置爲「從不」。

還有其他的選擇可以用於這個用例。最簡潔的方法是爲管理員提供完全獨立的API。然後,您可以爲管理員使用單獨的Cognito用戶池,也可以使用IAM用戶或組。

+0

感謝MikeD,我沒有注意到可變選項。如果我要使用IAM組,我是否仍然以相同的方式對API網關進行身份驗證? IE瀏覽器。標題中帶有Cognito標記。 – comfytoday

相關問題