監視應用程式登入健全狀況以復原

若要增加基礎結構的復原能力,請為您的重要應用程式設定應用程式登入健全狀況的監視,以便在發生影響的事件時收到警示。 為了協助您完成這項工作,您可以根據登入健康情況活頁簿來設定警示。

此活頁簿可讓系統管理員監視您租使用者中應用程式的驗證要求。 它提供下列重要功能:

  • 將活頁簿設定為以近乎即時的資料監視所有或個別的應用程式。

  • 設定警示,在驗證模式變更時通知您,以便您可以調查並採取動作。

  • 比較一段時間的趨勢,例如,每週的周數,也就是活頁簿的預設設定。

注意

若要查看所有可用的活頁簿,以及使用這些活頁簿的必要條件,請參閱 如何使用報表的 Azure 監視器活頁簿

在受影響的事件期間,可能會發生兩件事:

  • 應用程式的登入次數可能會捨棄 precipitously,因為使用者無法登入。

  • 登入失敗的次數可能會增加。

本文將逐步解說如何設定登入健康情況活頁簿,以監視使用者登入的中斷情形。

必要條件

設定應用程式登入健康情況活頁簿

若要存取活頁簿,請開啟 Azure 入口網站,選取 [ Azure Active Directory],然後選取 [活頁 簿]。

您將會看到使用中的活頁簿、條件式存取,以及疑難排解。 應用程式登入健康情況活頁簿會出現在 [使用方式] 區段中。

當您使用活頁簿時,它可能會出現在最近修改過的活頁簿區段中。

顯示 Azure 入口網站中活頁簿圖庫的螢幕擷取畫面。

應用程式登入健康情況活頁簿可讓您以視覺化方式呈現登入所發生的情況。

根據預設,活頁簿會顯示兩個圖形。 這些圖表會比較您的應用程式 () 目前的情況,與一周之前的相同期間。 藍線是最新的,而橙色的行則是上周。

顯示登入健全狀況圖表的螢幕擷取畫面。

第一個圖表是每小時的使用量, (成功的使用者數目)。 將您目前的成功使用者數目與一般使用期限比較,可協助您找出可能需要調查的下降。 成功使用率的下降有助於偵測失敗率無法解決的效能和使用量問題。 例如,如果使用者無法連線到您的應用程式來嘗試登入,就不會發生任何失敗,只會出現使用方式的下降。 您可以在下一節中找到此資料的範例查詢。

第二個圖形為每小時失敗率。 失敗率尖峰可能表示您的驗證機制有問題。 只有在使用者可以嘗試進行驗證時,才能測量失敗率。 如果使用者無法取得嘗試的存取權,將不會顯示失敗。

您可以設定警示,在使用量或失敗率超過指定的閾值時通知特定群組。 您可以在下一節中找到此資料的範例查詢。

設定查詢和警示

您會在 Azure 監視器中建立警示規則,並可定期自動執行儲存的查詢或自訂記錄搜尋。

使用下列指示,根據圖表中反映的查詢建立電子郵件警示。 下列範例腳本會在下列情況下傳送電子郵件通知

  • 在兩天前,成功的使用量會從相同的小時下降90%,如同上一節中的每小時使用量圖表。

  • 失敗率會在兩天前的相同小時內增加90%,如同上一節中的每小時失敗率圖形。

若要設定基礎查詢並設定警示,請完成下列步驟。 您將使用範例查詢作為設定的基礎。 此區段結尾會顯示查詢結構的說明。

如需有關如何使用 Azure 監視器建立、查看和記錄管理警示的詳細資訊,請參閱 記錄管理警示

  1. 在活頁簿中,選取 [ 編輯],然後選取位於圖形右側上方的 查詢圖示

    顯示 [編輯活頁簿] 的螢幕擷取畫面。

    查詢記錄隨即開啟。

    顯示查詢記錄的螢幕擷取畫面。

  2. 針對新的 Kusto 查詢複製其中一個範例腳本。

  3. 在視窗中貼上查詢,然後選取 [ 執行]。 確定您看到下圖中所示的已完成訊息,以及該訊息下方的結果。

    顯示執行查詢結果的螢幕擷取畫面。

  4. 反白顯示查詢,然後選取 [+ 新增警示規則]。

    顯示 [新增警示規則] 畫面的螢幕擷取畫面。

  5. 設定警示條件。 在 [條件] 區段中, 每當平均自訂記錄搜尋大於邏輯定義計數時,請選取此連結。 在 [設定信號邏輯] 窗格中,滾動至警示邏輯

    顯示 [設定警示] 畫面的螢幕擷取畫面。

    • 臨界值:0。 此值會對任何結果發出警示。

    • 評估期間 (分鐘):2880。 此值會查看一小時的時間

    • 頻率 (分鐘):60。 此值會將前一個小時的評估期間設定為每小時一次。

    • 選取 [完成] 。

  6. 在 [ 動作 ] 區段中,設定下列設定:

    顯示 [建立警示規則] 頁面的螢幕擷取畫面。

    • 在 [ 動作] 底下,選擇 [ 選取動作群組],然後新增您想要收到警示通知的群組。

    • 在 [ 自訂動作 ] 底下選取 [ 電子郵件警示]。

    • 新增主旨

  7. 在 [ 警示規則詳細資料] 底下,設定下列設定:

    • 新增描述性名稱和描述。

    • 選取要加入警示的 資源群組

    • 選取警示的預設 嚴重性

    • 如果您想要立即上線,請選取 [ 在建立時啟用警示規則 ],否則請選取 [ 隱藏警示]。

  8. 選取 [建立警示規則]。

  9. 選取 [ 儲存],輸入查詢的名稱, 並將其另存為具有警示類別的查詢。 然後再次選取 [ 儲存 ]。

    顯示 [儲存查詢] 按鈕的螢幕擷取畫面。

精簡您的查詢和警示

修改您的查詢和警示以獲得最大效益。

  • 請務必測試您的警示。

  • 修改警示敏感度和頻率,讓您取得重要的通知。 如果系統管理員遇到太多問題,系統管理員可能會變成降低了戒心警示,並遺漏重要的部分。

  • 確定您的系統管理員電子郵件客戶程式中有警示的電子郵件已新增至允許的寄件者清單。 否則,您可能會因為電子郵件客戶程式上的垃圾郵件篩選器而遺漏通知。

  • Azure 監視器中的警示查詢只能包含過去48小時的結果。 這是目前在設計上的限制

範例指令碼

Kusto 增加失敗率的查詢

您可以視需要調整底部的比率,並代表過去一小時內流量的百分比變更,相較于昨天的相同時間。 0.5 表示流量中有50% 的差異。


let today = SigninLogs
| where TimeGenerated > ago(1h) // Query failure rate in the last hour 
| project TimeGenerated, UserPrincipalName, AppDisplayName, status = case(Status.errorCode == "0", "success", "failure")
// Optionally filter by a specific application
//| where AppDisplayName == **APP NAME**
| summarize success = countif(status == "success"), failure = countif(status == "failure") by bin(TimeGenerated, 1h) // hourly failure rate
| project TimeGenerated, failureRate = (failure * 1.0) / ((failure + success) * 1.0)
| sort by TimeGenerated desc
| serialize rowNumber = row_number();
let yesterday = SigninLogs
| where TimeGenerated between((ago(1h) - totimespan(1d))..(now() - totimespan(1d))) // Query failure rate at the same time yesterday
| project TimeGenerated, UserPrincipalName, AppDisplayName, status = case(Status.errorCode == "0", "success", "failure")
// Optionally filter by a specific application
//| where AppDisplayName == **APP NAME**
| summarize success = countif(status == "success"), failure = countif(status == "failure") by bin(TimeGenerated, 1h) // hourly failure rate at same time yesterday
| project TimeGenerated, failureRateYesterday = (failure * 1.0) / ((failure + success) * 1.0)
| sort by TimeGenerated desc
| serialize rowNumber = row_number();
today
| join (yesterday) on rowNumber // join data from same time today and yesterday
| project TimeGenerated, failureRate, failureRateYesterday
// Set threshold to be the percent difference in failure rate in the last hour as compared to the same time yesterday
// Day variable is the number of days since the previous Sunday. Optionally ignore results on Sat, Sun, and Mon because large variability in traffic is expected.
| extend day = dayofweek(now())
| where day != time(6.00:00:00) // exclude Sat
| where day != time(0.00:00:00) // exclude Sun
| where day != time(1.00:00:00) // exclude Mon
| where abs(failureRate - failureRateYesterday) > 0.5

Kusto 查詢中的使用方式

在下列查詢中,我們會比較過去一小時內的流量與昨天的相同時間。 我們將會排除星期六、星期日和星期一,因為預期會在過去一天的流量中有大型變化的日子。

您可以視需要調整底部的比率,並代表過去一小時內流量的百分比變更,相較于昨天的相同時間。 0.5 表示流量中有50% 的差異。

您應調整這些值,以符合您的商務作業模型

 let today = SigninLogs // Query traffic in the last hour
| where TimeGenerated > ago(1h)
| project TimeGenerated, AppDisplayName, UserPrincipalName
// Optionally filter by AppDisplayName to scope query to a single application
//| where AppDisplayName contains "Office 365 Exchange Online"
| summarize users = dcount(UserPrincipalName) by bin(TimeGenerated, 1hr) // Count distinct users in the last hour
| sort by TimeGenerated desc
| serialize rn = row_number();
let yesterday = SigninLogs // Query traffic at the same hour yesterday
| where TimeGenerated between((ago(1h) - totimespan(1d))..(now() - totimespan(1d))) // Count distinct users in the same hour yesterday
| project TimeGenerated, AppDisplayName, UserPrincipalName
// Optionally filter by AppDisplayName to scope query to a single application
//| where AppDisplayName contains "Office 365 Exchange Online"
| summarize usersYesterday = dcount(UserPrincipalName) by bin(TimeGenerated, 1hr)
| sort by TimeGenerated desc
| serialize rn = row_number();
today
| join // Join data from today and yesterday together
(
yesterday
)
on rn
// Calculate the difference in number of users in the last hour compared to the same time yesterday
| project TimeGenerated, users, usersYesterday, difference = abs(users - usersYesterday), max = max_of(users, usersYesterday)
| extend ratio = (difference * 1.0) / max // Ratio is the percent difference in traffic in the last hour as compared to the same time yesterday
// Day variable is the number of days since the previous Sunday. Optionally ignore results on Sat, Sun, and Mon because large variability in traffic is expected.
| extend day = dayofweek(now())
| where day != time(6.00:00:00) // exclude Sat
| where day != time(0.00:00:00) // exclude Sun
| where day != time(1.00:00:00) // exclude Mon
| where ratio > 0.7 // Threshold percent difference in sign-in traffic as compared to same hour yesterday

建立處理常式以管理警示

設定好查詢和警示之後,請建立商務程式來管理警示。

  • 誰將監視活頁簿?

  • 當警示產生時,要調查誰?

  • 通訊需要什麼? 誰將建立通訊,以及誰將收到通知?

  • 如果發生中斷,需要觸發哪些商務處理常式?

下一步

深入瞭解活頁簿