使用適應性身分驗證 - Amazon Cognito

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

使用適應性身分驗證

透過調適式身分驗證,您可以將使用者集區設定成封鎖可疑的登入,或是新增第二個要素身分驗證,以便回應更高的風險等級。每次嘗試登入時,Amazon Cognito 都會針對有關登入請求是否可能來自洩漏來源的風險情況進行評分。此風險分數是以應用程式提供的裝置和使用者因素,以及 Amazon Cognito 從請求衍生的其他因素為基礎。Amazon Cognito 風險評估的一些因素包括 IP 地址和使用者代理程式 、使用者代理程式,以及與其他登入嘗試的地理距離。當 Amazon Cognito 偵測到使用者工作階段中的風險,且使用者尚未選擇MFA方法時,適應性身分驗證可以開啟或需要使用者集區中的使用者的多重要素身分驗證 (MFA)。當您MFA為使用者啟用 時,無論如何設定適應性身分驗證,他們都會在身分驗證期間收到提供或設定第二個因素的挑戰。從使用者的角度來看,您的應用程式提供協助,讓他們設定 MFA,並可選擇使用 Amazon Cognito 防止他們再次登入,直到設定了其他因素為止。

Amazon Cognito 會將有關登入嘗試、其風險層級和失敗挑戰的指標發佈至 Amazon CloudWatch。如需詳細資訊,請參閱檢視威脅防護指標

若要將適應性身分驗證新增到使用者集區,請參閱 使用者集區進階安全功能

適應性身分驗證概觀

從 Amazon Cognito 主控台的進階安全索引標籤中,您可以選擇適應性身分驗證的設定,包括在不同風險層級應採取的動作,以及自訂通知訊息給使用者。您可以為所有應用程式用戶端指派全域進階安全組態,但將用戶端層級組態套用至個別應用程式用戶端。

Amazon Cognito 適應性身分驗證會為每個使用者工作階段指派下列其中一個風險層級:無風險

當您將 Enforcement method (強制執行方法) 從 Audit-only (僅供稽核使用) 變更為 Full-function (全功能) 時,請仔細考量您的選擇。您套用至風險等級的自動回應會影響 Amazon Cognito 指派給具有相同特性的後續使用者工作階段的風險等級。例如,在您選擇不採取任何動作或 Allow (允許) Amazon Cognito 最初評估為高風險的使用者工作階段後,Amazon Cognito 會將類似工作階段視為較低的風險。

針對每個風險層級,有下列選項可供您選擇:

選項

動作

允許 使用者無需額外的要素即可登入。
選用 MFA 已經設定第二個要素的使用者必須通過第二個挑戰,才能成功登入。電話號碼 SMS和TOTP軟體權杖是可用的第二個因素。沒有設定第二個要素的使用者只能使用一組憑證登入。
需要 MFA 已經設定第二個要素的使用者必須通過第二個挑戰,才能成功登入。Amazon Cognito 會阻擋未設定第二要素的使用者登入。
封鎖 Amazon Cognito 會阻擋指定風險層級的所有登入嘗試。
注意

您不需要驗證電話號碼,即可將 用於 SMS作為第二個身分驗證因素。

將使用者裝置和工作階段資料新增至API請求

當您使用 API註冊、登入和重設密碼時,您可以將使用者工作階段的相關資訊收集並傳遞給 Amazon Cognito 進階安全性。此資訊包括使用者的 IP 地址和唯一裝置識別碼。

您的使用者與 Amazon Cognito 之間可能有一個中介網路裝置,如代理服務或應用程式伺服器。您可以收集使用者的內容資料,並將資料傳遞給 Amazon Cognito,讓調整性身分驗證根據使用者端點的特性來計算風險,而非根據您的伺服器或代理。如果您的用戶端應用程式直接呼叫 Amazon Cognito API操作,自我調整身分驗證會自動記錄來源 IP 地址。但是,它不會記錄如 user-agent 等其他裝置資訊,除非您也收集裝置指紋。

使用 Amazon Cognito 內容資料收集程式庫產生此資料,並使用 ContextDataUserContextData 參數將其提交至 Amazon Cognito 進階安全性。內容資料收集程式庫包含在 中 AWS SDKs。如需詳細資訊,請參閱將 Amazon Cognito 與 Web 和行動應用程式整合。如果您已在使用者集區中啟用進階安全性功能,便可提交 ContextData。如需詳細資訊,請參閱設定進階安全性功能

當您從應用程式伺服器呼叫下列 Amazon Cognito 驗證API操作時,請在 ContextData 參數中傳遞使用者裝置的 IP。此外,傳遞您的伺服器名稱、伺服器路徑和編碼的裝置指紋資料。

當您呼叫 Amazon Cognito 未經驗證API的操作時,您可以提交UserContextData至 Amazon Cognito 進階安全功能。此資料在 EncodedData 參數中包含裝置指紋。如果您滿足下列條件,則也可以在您的 UserContextData 中提交 IpAddress 參數:

您的應用程式可以在下列 Amazon Cognito 未經驗證API的操作中,將編碼的裝置指紋資料和使用者裝置的 IP 地址填入 UserContextData 參數。

接受其他使用者內容資料 (AWS Management Console)

在您啟動 Accept additional user context data (接受其他使用者內容資料) 功能後,您的使用者集區會接受 UserContextData 參數中的 IP 地址。在下列情況下,您不需要啟動此功能:

  • 您的使用者只會使用驗證API的操作登入,例如 AdminInitiateAuth ,而且您會使用 ContextData 參數。

  • 您只希望未經驗證API的操作將裝置指紋,而不是 IP 地址傳送至 Amazon Cognito 進階安全功能。

在 Amazon Cognito 主控台中如下所示更新您的應用程式用戶端,以新增對其他使用者內容資料的支援。

  1. 登入 Amazon Cognito 主控台

  2. 在導覽窗格中選擇 Manage your User Pools (管理您的使用者集區),然後選擇您要編輯的使用者集區。

  3. 選擇 App integration (應用程式整合) 標籤。

  4. App clients and analytics (應用程式用户端與分析) 下方,選擇或建立應用程式用户端。如需詳細資訊,請參閱設定使用者集區應用程式用戶端

  5. App client information (應用程式用戶端資訊) 容器中選擇 Edit (編輯)

  6. 在您應用程式用戶端的 Advanced authentication settings (進階驗證設定) 中,選擇 Accept additional user context data (接受其他使用者內容資料)

  7. 選擇 Save changes (儲存變更)。

若要設定您的應用程式用戶端以接受 Amazon Cognito 中的使用者內容資料API,請在 CreateUserPoolClientUpdateUserPoolClient請求trueEnablePropagateAdditionalUserContextData設定為 。如需如何從 Web 或行動應用程式啟用進階安全性的詳細資訊,請參閱啟用應用程式中使用者集區進階安全性。當您的應用程式從伺服器呼叫 Amazon Cognito 時,將從用戶端收集使用者內容資料。以下是使用 JavaScript SDK 方法 的範例getData

var EncodedData = AmazonCognitoAdvancedSecurityData.getData(username, userPoolId, clientId);

當您設計應用程式以使用適應性身分驗證時,我們建議您將最新的 Amazon Cognito 納入SDK您的應用程式。的最新版本會SDK收集裝置 ID、模型和時區等裝置指紋資訊。如需 Amazon Cognito 的詳細資訊SDKs,請參閱安裝使用者集區。 SDKAmazon Cognito 進階安全性僅儲存風險分數,並指派給您應用程式以正確格式提交的事件。如果 Amazon Cognito 傳回錯誤回應,請檢查您的請求是否包含有效的秘密雜湊,以及 IPaddress 參數是否為有效的 IPv4或 IPv6 地址。

ContextDataUserContextData 資源

檢視和匯出使用者事件歷史記錄

當您啟用進階安全威脅防護時,使用者會為每個身分驗證事件Amazon Cognito產生日誌。根據預設,您可以在 Amazon Cognito 主控台的使用者索引標籤中或透過 AdminListUserAuthEventsAPI操作檢視使用者日誌。您也可以將這些事件匯出至外部系統,例如 CloudWatch Logs、Amazon S3 或 Amazon Data Firehose。匯出功能可讓您自己的安全分析系統更容易存取應用程式中使用者活動的安全資訊。

檢視使用者事件歷史記錄 (AWS Management Console)

若要查看該使用者的登入歷史記錄,您可以在 Amazon Cognito 主控台中的 Users (使用者) 索引標籤中選擇使用者。使用者事件歷史記錄將由 Amazon Cognito 保留 2 年。

使用者事件歷史記錄

每個登入事件都有一個事件 ID。事件還具有對應的內容資料,例如位置、裝置詳細資訊和風險偵測結果。

您還可以在事件 ID 與 Amazon Cognito 記錄事件時發放的字符之間建立關聯。ID 和存取權杖在其承載中包含此事件 ID。Amazon Cognito 還會在重新整理權杖使用與原始事件 ID 之間建立關聯。您可以將原始事件 ID 回溯至導致發放 Amazon Cognito 權杖之登入事件的事件 ID。您可以追溯系統中的字符使用記錄,以找出特定的身分驗證事件。如需詳細資訊,請參閱了解使用者集區 JSON Web 權杖 (JWTs)

檢視使用者事件歷史記錄 (API/CLI)

您可以使用 Amazon Cognito API操作AdminListUserAuthEvents或使用 AWS Command Line Interface (AWS CLI) 搭配 admin-list-user-auth事件 來查詢使用者事件歷史記錄。

AdminListUserAuthEvents request

的下列請求內文會AdminListUserAuthEvents傳回一個使用者的最新活動日誌。

{ "UserPoolId": "us-west-2_EXAMPLE", "Username": "myexampleuser", "MaxResults": 1 }
admin-list-user-auth-events request

下列 請求會admin-list-user-auth-events傳回一個使用者的最新活動日誌。

aws cognito-idp admin-list-user-auth-events --max-results 1 --username myexampleuser --user-pool-id us-west-2_EXAMPLE
Response

Amazon Cognito 會將相同的JSON回應內文傳回給這兩個請求。以下是未發現包含風險因素的託管 UI 登入事件的範例回應:

{ "AuthEvents": [ { "EventId": "[event ID]", "EventType": "SignIn", "CreationDate": "[Timestamp]", "EventResponse": "Pass", "EventRisk": { "RiskDecision": "NoRisk", "CompromisedCredentialsDetected": false }, "ChallengeResponses": [ { "ChallengeName": "Password", "ChallengeResponse": "Success" } ], "EventContextData": { "IpAddress": "192.168.2.1", "DeviceName": "Chrome 125, Windows 10", "Timezone": "-07:00", "City": "Bellevue", "Country": "United States" } } ], "NextToken": "[event ID]#[Timestamp]" }

匯出使用者身分驗證事件

設定您的使用者集區,將使用者事件從進階安全威脅防護匯出至外部系統。支援的外部系統 –Amazon S3、 CloudWatch Logs 和 Amazon Data Firehose – 可能會為您傳送或擷取的資料增加 AWS 帳單成本。如需詳細資訊,請參閱匯出進階安全使用者活動日誌

AWS Management Console
  1. 登入 Amazon Cognito 主控台

  2. 選擇 User Pools (使用者集區)。

  3. 從清單中選擇現有的使用者集區,或建立使用者集區

  4. 選擇進階安全索引標籤。尋找匯出使用者活動日誌,然後選擇編輯

  5. 記錄狀態 下,選取啟用使用者活動日誌匯出 旁的核取方塊。

  6. 記錄目的地 下,選擇您要處理日誌的 AWS 服務 :CloudWatch 日誌群組 Amazon Data Firehose 串流 S3 儲存貯體

  7. 您的選擇會將對應的資源類型填入資源選取器。從清單中選擇日誌群組、串流或儲存貯體。您也可以選取建立按鈕,以導覽至 AWS Management Console 所選服務的 ,並建立新的資源。

  8. 選取儲存變更

API

為您的使用者活動日誌選擇一種目的地類型。

以下是將 Firehose 串流設定為日誌目的地的SetLogDeliveryConfiguration請求內文範例。

{ "LogConfigurations": [ { "EventSource": "userAuthEvents", "FirehoseConfiguration": { "StreamArn": "arn:aws:firehose:us-west-2:123456789012:deliverystream/example-user-pool-activity-exported" }, "LogLevel": "INFO" } ], "UserPoolId": "us-west-2_EXAMPLE" }

以下是將 Amazon S3 儲存貯體設定為日誌目的地的範例SetLogDeliveryConfiguration請求內文。

{ "LogConfigurations": [ { "EventSource": "userAuthEvents", "S3Configuration": { "BucketArn": "arn:aws:s3:::amzn-s3-demo-logging-bucket" }, "LogLevel": "INFO" } ], "UserPoolId": "us-west-2_EXAMPLE" }

以下是將 CloudWatch 日誌群組設定為日誌目的地的SetLogDeliveryConfiguration請求內文範例。

{ "LogConfigurations": [ { "EventSource": "userAuthEvents", "CloudWatchLogsConfiguration": { "LogGroupArn": "arn:aws:logs:us-west-2:123456789012:log-group:DOC-EXAMPLE-LOG-GROUP" }, "LogLevel": "INFO" } ], "UserPoolId": "us-west-2_EXAMPLE" }

提供事件意見回饋

事件意見回饋會影響即時的風險評估,並可隨著時間改善風險評估演算法。您可以透過 Amazon Cognito 主控台和API操作提供登入嘗試有效性的意見回饋。

注意

您的事件意見回饋會影響 Amazon Cognito 指派給具有相同特性之後續使用者工作階段的風險等級。

在 Amazon Cognito 主控台中,從 Users (使用者) 索引標籤選擇使用者,然後選取 Provide event feedback (提供事件意見回饋)。您可以查看事件詳細資訊,並 Set as valid (設定為有效) 或 Set as invalid (設定為無效)。

主控台會在 Users and groups (使用者和群組) 索引標籤列出登入歷史記錄。如果您選取一個項目,可以將事件標記為有效或無效。您也可以透過使用者集區API操作 AdminUpdateAuthEventFeedback和 AWS CLI 命令 admin-update-auth-event-feedback 提供意見回饋。

當您在 Amazon Cognito 主控台中選取設為有效或在 valid中提供 FeedbackValue值時API,您會告訴 Amazon Cognito 您信任 Amazon Cognito 已評估某種風險層級的使用者工作階段。當您在 Amazon Cognito 主控台中選取設定為無效或在 invalid中提供 FeedbackValue值時API,您會告訴 Amazon Cognito 您不信任使用者工作階段,或者您不認為 Amazon Cognito 評估了高等級的風險。

傳送通知訊息

藉由進階安全保護功能,Amazon Cognito 可以通知您的使用者有風險的登入嘗試。Amazon Cognito 還可以提示使用者選取連結以指示登入是有效或無效。Amazon Cognito 使用此意見回饋來提高使用者集區的風險偵測準確性。

Automatic risk response (自動風險回應) 區段中,選擇低度、中度和高度風險案例適用的 Notify Users (通知使用者)。

通知使用者

Amazon Cognito 會傳送電子郵件通知給您的使用者,無論他們是否已驗證其電子郵件地址。

您可以自訂通知電子郵件訊息,並提供這些訊息的純文字和HTML版本。若要自訂電子郵件通知,請在進階安全組態中,從 Adaptive authentication messages (調整型身分驗證訊息) 開啟 Email templates (電子郵件範本)。若要進一步了解電子郵件範本,請參閱 訊息範本