教程:为审核日志事件启用安全通知

在本教程中,你会了解如何创建监视 Microsoft Entra 审核日志的Azure 逻辑应用。 逻辑应用可根据不同的审核日志事件向用户发送安全电子邮件通知。

本教程重点介绍当用户身份验证方法发生更改时通过电子邮件发送的安全通知。 还可以使用逻辑应用来创建工作流,用于发送其他审核日志事件的安全通知。 这些安全通知可帮助用户进行更新并通知他们任何有风险的活动。 用户可以快速执行正确的步骤进行报告。

安全通知的屏幕截图。

先决条件

若要使用此功能,需满足以下条件:

  • Azure 订阅。 如果没有 Azure 订阅,可以注册试用版
  • 一个 Microsoft Entra 租户。
  • 至少是 Microsoft Entra 租户安全管理员的用户。
  • 在 Azure 订阅中有事件中心命名空间和事件中心。 了解如何创建事件中心
  • 启用要流式传输到事件中心的日志。 了解如何将日志流式传输到事件中心。 仅选择希望发送安全通知的日志。 在本教程中,我们将对审核日志进行流式传输。
  • 逻辑应用支持的服务(例如 Office 365 Outlook 或 Outlook.com)提供的电子邮件帐户。 对于其他受支持的电子邮件提供程序,请查看Azure 逻辑应用的连接器

创建逻辑应用

  1. 登录到 Azure 门户。
  2. 在主页中的“Azure 服务”下,选择“逻辑应用”
  3. 选择 添加
  4. 在“创建逻辑应用”中,请配置逻辑应用:
    1. 选择要在其中创建逻辑应用的“订阅”

    2. 选择为事件中心创建的“资源组”

    3. 输入“逻辑应用名称”,系统会立即检查该名称是否可用。

    4. 为逻辑应用选择“区域”。

    5. 对于“计划类型”,请选择“消耗”层。 选择符合组织大小和需求的区域和计划类型。 要了解各层之间的差异,请参阅标准和消耗逻辑应用工作流

    6. 不要更改任何其他设置。

      备注

      仅部分区域支持区域冗余。 根据所在位置,区域冗余部分可能会自动启用或禁用。 有关详细信息,请参阅通过区域冗余和可用性区域保护逻辑应用免受区域故障的影响

      应用程序名称的屏幕截图。

    7. 选择“查看 + 创建”。 请检查逻辑应用设置,然后选择“创建”

    8. 等待部署完成。

选择空白模板

  1. Azure 成功部署逻辑应用资源后,选择“转到资源”或通过在 Azure 搜索框中键入名称查找并选择逻辑应用资源。

    转到资源的屏幕截图。

  2. 向下滚动,越过“模板”下的视频,然后选择“空白逻辑应用”。 选择模板后,设计器会显示一个空白的工作流。

    空白逻辑应用的屏幕截图。

逻辑应用设计器

  1. 在连接器和触发器部分,选择“事件中心”或在搜索栏中进行搜索。

    事件中心的屏幕截图。

  2. 选择“当事件在事件中心触发器中可用时”。 首次使用事件中心触发器时,系统将提示创建与事件中心的连接。 有关更多信息和步骤,请参阅创建事件中心连接

  3. 在“事件中心名称”中,请选择在先决条件中创建的事件中心。 选择希望逻辑应用在其中发送安全通知的事件中心。

  4. 在“希望检查项目的频率”下,选择希望检查事件中心的频率。 在本教程中,我们每隔一 (1) 分钟检查一次事件。

    检查事件的频率的屏幕截图。

初始化变量

此处,我们将对三个变量进行初始化。 一个变量是已触发并流式传输到事件中心的事件内容。 另外两个变量是电子邮件正文以及活动的日期和时间的空变量,稍后我们将用活动信息填充这些变量。

  1. 在设计器中的“当事件中心触发器中的事件可用时”下,选择“新建步骤”

  2. 在“选择操作”下,选择“内置”。 在搜索框中输入“变量”,然后选择“初始化变量”

    初始化变量的屏幕截图。

  3. 对于“名称”,请键入“内容”

  4. 对于类型,选择字符串

  5. 将光标置于“值”属性中,将显示“动态内容”

  6. 在“动态内容”窗格中,搜索并选择“内容”

    动态内容的屏幕截图。

  7. 选择新建步骤

  8. 在“选择操作”下,选择“内置”。 在搜索框中输入“变量”,然后选择“初始化变量”

  9. 为变量指定名称,例如“emailBody”

  10. 对于“类型”,请选择“字符串”,并将“值”留空。

    电子邮件正文变量的屏幕截图。

  11. 选择新建步骤

  12. 在“选择操作”下,选择“内置”。 在搜索框中输入“变量”,然后选择“初始化变量”

  13. 为变量指定名称,例如“dateTime”

  14. 对于“类型”,请选择“字符串”,并将“值”留空。

    日期时间初始化变量的屏幕截图。

分析 JSON

现在,我们将通过分析 JSON 对流式传输到事件中心的事件接收到的原始 JSON 进行格式设置,以便我们可以访问该内容中的特定数据。

  1. 在“初始化变量 3”下,选择“新建步骤”

  2. 在“搜索连接器和操作”搜索框中,键入“分析 JSON”

  3. 切换到“操作”选项卡并选择“分析 JSON”

    初始化变量的屏幕截图。

  4. 在“内容”中,选择“添加动态内容”

  5. 在“动态内容”中,选择“变量”下的“内容”

  6. 在“架构”部分中,复制并粘贴以下 JSON 模板:

    {
     "type": "object",
     "properties": {
         "records": {
             "type": "array",
             "items": {
                 "type": "object",
                 "properties": {
                     "time": {
                         "type": "string"
                     },
                     "resourceId": {
                         "type": "string"
                     },
                     "operationName": {
                         "type": "string"
                     },
                     "operationVersion": {
                         "type": "string"
                     },
                     "category": {
                         "type": "string"
                     },
                     "tenantId": {
                         "type": "string"
                     },
                     "resultSignature": {
                         "type": "string"
                     },
                     "durationMs": {
                         "type": "integer"
                     },
                     "correlationId": {
                         "type": "string"
                     },
                     "Level": {
                         "type": "integer"
                     },
                     "properties": {
                         "type": "object",
                         "properties": {
                             "id": {
                                 "type": "string"
                             },
                             "category": {
                                 "type": "string"
                             },
                             "correlationId": {
                                 "type": "string"
                             },
                             "result": {
                                 "type": "string"
                             },
                             "resultReason": {
                                 "type": "string"
                             },
                             "activityDisplayName": {
                                 "type": "string"
                             },
                             "activityDateTime": {
                                 "type": "string"
                             },
                             "loggedByService": {
                                 "type": "string"
                             },
                             "operationType": {
                                 "type": "string"
                             },
                             "userAgent": {},
                             "initiatedBy": {
                                 "type": "object",
                                 "properties": {
                                     "user": {
                                         "type": "object",
                                         "properties": {
                                             "id": {
                                                 "type": "string"
                                             },
                                             "displayName": {},
                                             "userPrincipalName": {
                                                 "type": "string"
                                             },
                                             "ipAddress": {
                                                 "type": "string"
                                             },
                                             "roles": {
                                                 "type": "array"
                                             }
                                         }
                                     }
                                 }
                             },
                             "targetResources": {
                                 "type": "array",
                                 "items": {
                                     "type": "object",
                                     "properties": {
                                         "id": {
                                             "type": "string"
                                         },
                                         "displayName": {},
                                         "type": {
                                             "type": "string"
                                         },
                                         "userPrincipalName": {
                                             "type": "string"
                                         },
                                         "modifiedProperties": {
                                             "type": "array"
                                         },
                                         "administrativeUnits": {
                                             "type": "array"
                                         }
                                     },
                                     "required": [
                                         "id",
                                         "displayName",
                                         "type",
                                         "userPrincipalName",
                                         "modifiedProperties",
                                         "administrativeUnits"
                                     ]
                                 }
                             },
                             "additionalDetails": {
                                 "type": "array"
                             }
                         }
                     }
                 },
                 "required": [
                     "time",
                     "resourceId",
                     "operationName",
                     "operationVersion",
                     "category",
                     "tenantId",
                     "resultSignature",
                     "durationMs",
                     "correlationId",
                     "Level",
                     "properties"
                 ]
             }
         }
     }
    }
    
    
  7. “分析 JSON”操作现在应类似于以下屏幕截图:

    分析 JSON 的屏幕截图。

安全通知电子邮件正文

接下来,我们将撰写安全电子邮件并设置其样式,以提醒用户对其帐户执行的操作。 此处,我们希望通知用户已发生的活动,如果不是他们的操作,则提示他们进行报告。

  1. 在“分析 JSON”下,选择“新建步骤”

  2. 在“选择操作”下,选择“内置”。 在搜索框中输入“for each”,然后从“操作”列表中选择“For each”

    每个步骤的屏幕截图。

  3. 在“从前面步骤选择输出”下,选择“添加动态内容”

  4. 在“动态内容”中,选择“记录”

    记录的屏幕截图。

  5. 在“For each”操作中,选择“添加操作”

    如何为记录添加操作的屏幕截图。

  6. 在“选择操作”下,选择“内置”。 在搜索框中输入“变量”,然后选择“设置变量”

  7. 在“名称”下,选择创建的“dateTime”变量。

  8. 在“值”中,选择“添加动态内容”

  9. 在“动态内容”中,在“分析 JSON”下搜索并选择“time”

    如何选择时间的屏幕截图。

  10. 在“设置变量”下,选择“内置”。 在搜索框中输入“变量”,然后选择“设置变量”

  11. 在“名称”下,选择创建的“emailBody”变量。

  12. 在“值”下,输入希望在安全通知电子邮件正文中显示的文本。 正文可以采用 html 格式。 可以从此模板开始并对其进行自定义。 例如,可以将 href 占位符替换为与组织相关的链接。

    <div>
     <h2>
         You recently changed your authentication methods
     </h2>
     <p>
         We have been notified of the following action: (operation) on (date & time). <br><br>
         If you initiated this, no action is required. <br><br>
         If you haven't, please report it now. <br><br>
         <b>Instructions</b>
         <ol>
             <li>Review your account activity in <a href="https://mysignins.windowsazure.cn/security-info" class="link">Microsoft Security Info</a>.</li>
             <li>If you do not recognize this action, report it immediately:</li>
             <ul>
                 <li>Go to <a href="#" class="link">ReportItNow</a> and select your security event.</li>
                 <li>Provide any additional information in the form and submit.</li>
             </ul>
         </ol>
         <b>Information and Support</b>
         <ul>
             <li>Technical Assistance - Contact <a href="#" class="link">Helpdesk</a> support services</li>
         </ul>
         <b>Do NOT reply to this email. This is an unmonitored mailbox.</b><br>
         For more information, contact the <a href="#" class="link">Security Department</a>
         <br><br>
         <a href="#"><button type="button">Report device</button></a><br><br>
         <div class="footer">
             Contoso, Ltd., 4567 Main St Buffalo, NY 98052<br>
             <br>Facilitated by <br>
             <img src="#" alt="Company Logo" style="height:70px;">
         </div>
         <style>
             .link {
                 text-decoration:none;
                 color: #0078D4
             }
             button {
                 background-color: #0078D4;
                 color: white;
                 padding: 10px;
                 border-radius: 5px;
                 text-decoration: none;
    
             }
             button:hover {
                 cursor: pointer;
             }
             .footer {
                 width: 100%;
                 height: 10%;
                 padding-top: 10px;
                 padding-left: 10px;
                 padding-right: 10px;
                 background-color: rgb(237, 237, 237);
             }
         </style>
     </p>
    </div>
    
    

向电子邮件正文添加动态内容

  1. 如果使用上述模板,请将其复制并粘贴到“设置变量”操作的“值”字段中。

  2. 在粘贴模板的“值”字段中,返回到文本的前几行并突出显示“(内容)”。 参阅下图。

  3. 突出显示该文本后,将看到操作框右侧弹出“动态内容”。 在“动态内容”的搜索栏中,搜索并选择“operationName”。

    如何选择操作名称的屏幕截图。

  4. 同样,在粘贴模板的值字段内,返回到前几行文本并突出显示“(日期和时间)。 参阅下图。

  5. 突出显示该文本后,会看到操作框右侧弹出“动态内容”部分。 转到“表达式”选项卡,在输入框中输入以下代码:

    formatDateTime(variables('dateTime'),'yyyy-MM-dd tH:mm:ss')
    
  6. 在输入框中粘贴上述代码后,选择“确定”

    如何设置变量的屏幕截图。

发送安全电子邮件

  1. 在“设置变量”操作下方,选择“添加操作”

  2. 在“选择操作”下,选择“内置”。 在搜索框中输入“for each”,然后从操作列表中选择名为“For each”的操作。

    如何选择“对于每个操作”的屏幕截图。

  3. 在“从之前的步骤中选择输出”中,从“动态内容”中选择“targetResources”。

    如何选择目标资源的屏幕截图。

  4. 在“For each 2”操作块的“targetResources”下,选择“添加操作”

  5. 在“选择操作”下,选择“内置”。 在搜索框中输入“条件”,然后从操作列表中选择名为“条件”的操作。

    如何选择条件的屏幕截图。

  6. 在“选择值”中,搜索并选择“operationName”

    如何选择操作名称的屏幕截图。

  7. 在“选择值”中,键入希望发送安全通知电子邮件的活动的确切名称。

  8. 在本教程中,我们将为“重置用户密码”活动发送电子邮件。

    如何选择重置用户密码的屏幕截图。

  9. 如果要为多个活动发送安全电子邮件,请选择“条件”操作块中的“添加”,然后选择“添加行”,并在“选择值”中对不同的活动名称重复这些步骤。

电子邮件通知设置

  1. 在“条件”下,有“True”和“False”操作。 选择“True”操作框中的“添加操作”

    如何添加 True 操作的屏幕截图。

  2. 在“选择操作”下,选择“内置”。 在搜索框中输入“电子邮件”,然后选择“Office 365 Outlook”。 可以使用不同的服务来代替 Outlook 电子邮件发送通知。 要查找不同的服务,请转到“选择操作”中的搜索栏并搜索喜欢的服务。

    如何选择 Outlook 的屏幕截图。

  3. 在“操作”下,向下滚动并选择“发送电子邮件 (V2)”

    如何选择发送电子邮件的屏幕截图。

  4. 在“收件人”字段中,在“动态内容”中搜索“userPrincipalName”,然后选择第二个选项。

    如何选择用户主体名称的屏幕截图。

  5. 在“主题”字段中,在“动态内容”中搜索“operationName”并选择该选项。

    如何在动态内容中选择操作名称的屏幕截图。

  6. 在“正文”字段中,在“动态内容”中搜索“emailBody”并选择该选项。

    如何在动态内容中选择电子邮件正文的屏幕截图。

  7. 可以选择“重要性”以更改电子邮件的重要性。

运行工作流

要手动启动工作流,请在设计器工具栏中选择“运行触发器”>“运行”。 当审核日志流式传输到事件中心时,会触发逻辑应用以发送安全通知。

可自定义此工作流以筛选其他日志和活动,或通过不同的服务(如 Teams)发送通知,以创建最佳体验,让用户了解可疑活动。

后续步骤