使用 Amazon Verified Permissions 進行授權 - Amazon Cognito

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon Verified Permissions 進行授權

Amazon Verified Permissions 是一項授權服務,適用於您建置的應用程式。當您新增 Amazon Cognito 使用者集區做為身分來源時,您的應用程式就可以將使用者集區存取權或身分 (ID) 權杖傳遞給 Verified Permissions 以決定允許或拒絕。Verified Permissions 會根據您使用 Cedar 政策語言撰寫的政策來考量您使用者的屬性和請求內容。請求內容可包括所請求文件、影像或其他資源的識別符,以及您的使用者想要對資源執行的動作。

您的應用程式可以在 或 BatchIsAuthorizedWithTokenAPI請求中提供使用者身分IsAuthorizedWithToken或存取權杖給驗證許可。這些API操作接受您的使用者作為 Principal,並針對他們想要存取ResourceAction上的 做出授權決策。其他自訂Context可以有助於詳細的存取決策。

當您的應用程式在IsAuthorizedWithTokenAPI請求中顯示權杖時,驗證許可會執行下列驗證。

  1. 您的使用者集區是針對所請求的政策存放區設定的 Verified Permissions 身分來源

  2. client_id 或 aud 宣告分別位在您的存取或身分權杖中,兩者之一會符合您提供給 Verified Permissions 的使用者集區應用程式用戶端 ID。若要驗證此宣告,您必須在您的 Verified Permissions 身分來源中設定用戶端 ID 驗證

  3. 您的權杖未過期。

  4. 權杖中的token_use宣告值與您傳遞給 的參數相符IsAuthorizedWithTokenaccess 如果您將其傳遞至 accessToken 參數,且id您將其傳遞至 identityToken 參數,則token_use宣告必須是 。

  5. 權杖中的簽章來自使用者集區的已發佈 JSON Web 金鑰 (JWKs)。您可以在 JWKs 上檢視您的 https://cognito-idp.Region.amazonaws.com/your user pool ID/.well-known/jwks.json

撤銷的權杖和刪除的使用者

Verified Permissions 只會驗證從您的身分來源得知的資訊,以及您使用者的權杖到期時間資訊。Verified Permissions 不會檢查權杖是否撤銷或使用者是否存在。即使您撤銷了使用者的權杖,或是從使用者集區刪除了使用者的設定檔,在權杖過期之前,Verified Permissions 仍會將該權杖視為有效。

政策評估

將您的使用者集區設定為政策存放區身分來源。設定讓您的應用程式在請求中提交使用者的權杖給 Verified Permissions。Verified Permissions 會針對每個請求,將權杖中的宣告與政策進行比較。Verified Permissions 政策與 中的IAM政策類似 AWS。它會宣告主體資源動作。如果請求符合允許的動作,且不符合明確Deny動作,已驗證許可會以 Allow 回應您的請求;否則,它會以 回應Deny。如需詳細資訊,請參閱《Amazon Verified Permissions User Guide》中的 Amazon Verified Permissions policies

自訂權杖

若要變更、新增和移除您要呈現給已驗證許可的使用者宣告,請使用 自訂存取權和身分字符中的內容產生權杖前 Lambda 觸發程序。使用權杖產生前觸發程序,您就可以新增和修改權杖中的宣告。例如,您可以查詢資料庫中的其他使用者屬性,並將這些屬性編碼到您的 ID 權杖中。

注意

由於 Verified Permissions 處理宣告的方式,請勿在您的權杖產生前函數中新增名為 cognitodev 或 custom 的宣告。若您不是採用冒號分隔格式 (如 cognito:username) 顯示這些保留的宣告字首,而是採用完整宣告名稱,那麼您的授權請求便會失敗。

API 使用 Verified Permissions 的授權

您的 ID 或存取權杖可以使用RESTAPIs驗證許可授權請求後端 Amazon API Gateway。您可以建立政策存放區,其中包含使用者集區和 的立即連結API。透過使用 Cognito 和 API Gateway 開始設定選項,驗證許可會將使用者集區身分來源新增至政策存放區,並將 Lambda 授權方新增至 API。當您的應用程式將使用者集區承載符權杖傳遞至 時API,Lambda 授權方會叫用驗證許可。授權方以主體身分傳遞權杖,並以請求路徑和方法作為動作傳遞權杖。

下圖說明API具有已驗證許可的API閘道的授權流程。如需詳細資訊,請參閱 Amazon Verified Permissions 使用者指南中的 API連結政策存放區。

圖表說明 Amazon Verified Permissions API的授權流程。應用程式向 Amazon API Gateway 提出請求API。API 會叫用 Lambda 授權方。授權方向已驗證許可提出API請求。Verified Permissions 會檢查權杖有效性並傳回授權決策。

已驗證的許可會圍繞使用者集區群組 建立API授權。由於 ID 和存取權杖都包含cognito:groups宣告,因此您的政策存放區可以在各種應用程式內容APIs中管理 的角色型存取控制 (RBAC)。

選擇政策存放區設定

當您在政策存放區上設定身分來源時,您必須選擇是否要處理存取或 ID 權杖。此決定對於您的政策引擎運作方式非常重要。ID 權杖包含使用者屬性。存取權杖包含使用者存取控制資訊:OAuth範圍 。雖然這兩種權杖類型都具有群組成員資訊,但我們通常建議使用RBAC具有 Verified Permissions 政策存放區的 存取權杖。存取權杖會新增至群組成員資格,其範圍可有助於授權決策。存取權杖中的宣告會成為授權請求中的內容

當您將使用者集區設定為身分來源時,也必須設定使用者和群組實體類型。實體類型是您可以在 Verified Permissions 政策中參考的主體、動作和資源識別符。政策存放區中的實體可以具有成員關係,其中一個實體可以是實體的成員。使用成員資格,您可以參考主體群組、動作群組和資源群組。對於使用者集區群組,您指定的使用者實體類型必須是群組實體類型的成員。當您設定 API連結的政策存放區或遵循 Verified Permissions 主控台中的引導設定時,您的政策存放區會自動具有此父成員關係。

ID 權杖可以RBAC與屬性型存取控制 (ABAC) 結合。建立 API連結的政策存放區 後,您可以使用使用者屬性群組成員資格來增強政策。ID 權杖中的屬性宣告會成為授權請求中的主體屬性。您的政策可以根據主體屬性做出授權決策。

您也可以設定政策存放區,以接受權杖,其中包含符合您所提供可接受應用程式用戶端清單的 audclient_id宣告。

角色型API授權的政策範例

下列範例政策是由為PetStore範例 設定 Verified Permissions REST 政策存放區所建立API。

permit( principal in PetStore::UserGroup::"us-east-1_EXAMPLE|MyGroup", action in [ PetStore::Action::"get /pets", PetStore::Action::"get /pets/{petId}" ], resource );

在以下情況下,已驗證的許可會從應用程式將Allow決策傳回給授權請求:

  1. 您的應用程式在Authorization標頭中傳遞 ID 或存取權杖,作為承載權杖。

  2. 您的應用程式已傳遞權杖,其中包含包含字串 的cognito:groups宣告MyGroup

  3. 例如,您的應用程式向 https://myapi.example.com/pets或 提出HTTP GET請求https://myapi.example.com/pets/scrappy

Amazon Cognito 使用者的政策範例

您的使用者集區也可以在請求以外的條件下產生對已驗證許可的授權API請求。您可以向政策存放區提交應用程式中的任何存取控制決策。例如,在任何請求傳輸網路之前,您可以使用屬性型存取控制來補充 Amazon DynamoDB 或 Amazon S3 安全,以減少配額使用。

以下範例使用 Cedar 政策語言,允許透過某一個使用者集區應用程式用戶端進行驗證的財務使用者讀取和寫入 example_image.png。您應用程式中的使用者 John 從應用程式用戶端收到 ID 字符,並在GET請求中將其傳遞給需要授權URL的 https://example.com/images/example_image.png。John 的 ID 權杖內有您的使用者集區應用程式用戶端 ID 1234567890example 的 aud 宣告。您的權杖產生前 Lambda 函數還針對 John 插入了一個值為 Finance1234 的新宣告 costCenter

permit ( principal, actions in [ExampleCorp::Action::"readFile", "writeFile"], resource == ExampleCorp::Photo::"example_image.png" ) when { principal.aud == "1234567890example" && principal.custom.costCenter like "Finance*" };

以下請求內文會產生 Allow 回應。

{ "accesstoken": "[John's ID token]", "action": { "actionId": "readFile", "actionType": "Action" }, "resource": { "entityId": "example_image.png", "entityType": "Photo" } }

若您想要在 Verified Permissions 政策中指定主體,請使用下列格式:

permit ( principal == [Namespace]::[Entity]::"[user pool ID]"|"[user sub]", action, resource );

以下是使用者集區中 ID us-east-1_Example為 且具有子 ID 或使用者 ID 的使用者主體範例973db890-092c-49e4-a9d0-912a4c0a20c7

principal == ExampleCorp::User::"us-east-1_Example|973db890-092c-49e4-a9d0-912a4c0a20c7",

當您想要在 Verified Permissions 政策中指定使用者群組時,請使用下列格式:

permit ( principal in [Namespace]::[Group Entity]::"[Group name]", action, resource );

以下是範例

屬性型存取控制

對您的應用程式使用 Verified Permissions 的授權,以及憑證的 Amazon Cognito 身分集區的存取控制功能屬性 AWS ,都是以屬性為基礎的存取控制 (ABAC)。以下是 Verified Permissions 和 Amazon Cognito 的功能比較ABAC。在 中ABAC,系統會檢查實體的屬性,並根據您定義的條件做出授權決定。

服務 流程 結果
Amazon Verified Permissions 從使用者集區 的分析傳回 AllowDeny決策JWT。 根據 Cedar 政策評估,存取應用程式資源成功或失敗。
Amazon Cognito 身分集區 (存取控制的屬性) 根據使用者的屬性,將工作階段標籤指派給使用者。IAM 政策條件可以檢查標籤AllowDeny使用者對 的存取權 AWS 服務。 具有IAM角色臨時 AWS 憑證的標記工作階段。