注:

使用 OCI 函数将 Oracle Cloud Infrastructure 登录到 Microsoft Azure Sentinel

简介

Oracle Cloud Infrastructure (OCI) 函数是一个完全托管的多租户、高度可扩展的按需函数即服务平台。它基于企业级 Oracle Cloud Infrastructure 构建,由 Fn 项目开源引擎提供支持。

服务连接器中心是一个云消息总线平台,它提供了一个单一平台来描述、执行和监视在 Oracle Cloud Infrastructure 服务之间移动数据时的交互。使用服务连接器中心服务可以在 Oracle Cloud Infrastructure 中的服务之间传输数据。

通过使用服务连接器和函数服务,您可以将来自 OCI 云环境的日志生成与自动、可伸缩地将环境中的所有信息安全记录发送到安全信息和事件管理 (SIEM) Microsoft Azure Sentinel 实例。

目标

使用 OCI 函数将 OCI 日志摄取到 Microsoft Azure Sentinel。

先决条件

任务 1:启动 OCI 实例

  1. 通过 Web 控制台创建新的 OCI 实例并默认激活其任何插件,转至“实例”页并单击创建实例

    创建 OCI 实例

  2. 填写创建实例所需的所有信息。

    填充实例设置所需的信息

  3. 转到页面末尾,然后单击显示高级选项

    显示实例高级选项

  4. 某些选项卡将显示在屏幕上。单击 Oracle Cloud Agent 并选择在实例创建完成后要处于活动状态的插件。

    Oracle Cloud Agent 选项

  5. 在实例准备就绪可供使用后,在此选项卡上选择的所有插件都将自动激活。

    Oracle Cloud Agent 插件设置

  6. 选择插件后,单击页面末尾的创建

    创建 OCI 实例

任务 2:配置 OCI 日志记录设置

任务 2.1:配置 Windows 实例定制日志

创建 Windows 实例后,必须配置 OCI 环境以通过服务器上安装的 Oracle Agent 捕获事件查看器日志。

  1. 开始之前,请确保要从中收集日志的服务器上“定制日志”插件处于活动状态。在 OCI 控制台中,转至计算实例

    确保定制日志插件处于活动状态

  2. 选择要监视的实例。

    选择新创建的实例

  3. 单击 Oracle Cloud Agent 选项卡,并确保启用名为定制日志监视的插件。

    激活自定义日志监视插件

    • 如果未在实例中启用插件,请启用该插件。之后,让我们配置 OCI 日志记录,以便该代理可以捕获 Windows 事件查看器事件。

任务 2.2:配置服务器的动态组

要从一个或多个 Windows 服务器捕获事件查看器日志,必须创建动态组。此组将包含应捕获其日志的所有 Windows 实例。

  1. 要创建动态组,请单击 OCI 控制台的主菜单并转至身份与安全身份

    访问“身份”菜单

  2. 从“身份”菜单中,访问 *Domains 子菜单。

    访问“域”菜单

  3. 单击您的身份域(在本教程示例中,我们使用默认)。

    访问默认域配置

  4. 现在,在身份域内,单击动态组菜单,以便可以创建将包含要监视的所有 Windows 服务器的动态组。完成此操作后,单击创建动态组

    创建一组动态服务器

  5. 将打开一个新页面。填写有关创建动态组(名称和说明)的信息,然后在匹配规则中单击规则构建器链接,以便能够创建规则来选择将分组在此动态组中的实例。

    构建动态组规则

  6. 我们将创建的示例规则将对区间中的所有现有服务器进行分组。为此,只需捕获区间 ID 并将其插入字段中,如下图中所示。

    填写所需值

:您可以使用高级筛选器并创建动态组来仅捕获具有特定标记的实例。为此,我们建议阅读 OCI 的官方文档,网址为:编写匹配规则以定义动态组

任务 2.3:创建日志记录组

您还需要创建一个日志记录组,以便能够集中由安装在您的环境中的 Windows 服务器上的代理发送的所有日志。

  1. 单击 OCI 控制台的主菜单并转至观察和管理日志组

    创建您的日志组

  2. 访问服务页时,单击创建日志组

    创建您的日志组

  3. 在日志组创建页内,填写请求的信息,然后单击创建

    填充所需的信息

完成此步骤后,让我们开始创建安装在 OCI 实例中的 Oracle Cloud Agent 的事件查看器日志捕获。

任务 2.4:配置 OCI 日志记录

  1. 配置实例后,动态组和日志组,转至观察和管理,然后单击日志记录

    访问日志记录服务

  2. 在“OCI 日志记录”页面中,单击代理配置,以便我们可以创建允许将 Windows 事件查看器日志发送到 OCI 日志记录的配置。在代理配置页中,单击创建代理配置

    创建代理配置

  3. 填写页面上的所有必需字段,然后选择您在上一步中创建的动态组。

    填充所需的信息

    • 填写这些初始项目时,向下滚动页面并填写代理配置字段,通知您希望捕获每个可用通道(应用程序、安全性和系统)的“Windows 事件日志”。在此处,您需要重复为每个通道创建日志输入的过程。

    • 配置完成后,您的代理配置页将可用,如下所示。

      代理配置详细信息

      注:上面创建的代理配置用于捕获在 Linux 服务器上的 /var/log/messages 文件中生成的事件查看器日志和日志。

    • 代理配置处于活动状态后,请等待大约 5 分钟,直到可以完成第一个日志收集。要查看所收集的受监视实例的日志,请单击浏览日志菜单,如下图中所示。

      查看日志

任务 3:记下 Microsoft Azure Sentinel 详细信息

重要提示:本文档中并没有提供在 Microsoft Azure 订阅中创建和配置 Microsoft Azure Sentinel 的指导。为此,请访问 Microsoft 网站上的官方产品文档。

任务 4:创建 OCI Vault

现在,我们已经拥有属于 SIEM Sentinel 的 Microsoft Azure Log Analytics Workspace 数据,让我们创建一个 OCI Vault 来存储上一个任务中复制的密钥值。此密钥必须存储在 OCI Vault 中,因此无需将其插入 OCI 函数代码中,我们将在下一步中创建该代码。

  1. 要创建 OCI Vault,请转到 OCI 控制台的主菜单并转至身份与安全性 Vault

    创建 OCI Vault

  2. 加载 Vault 页面后,单击创建 Vault ,选择所需的区间并命名 Vault。

    填充所需的信息

  3. 创建 Vault 之后,您需要创建主加密密钥。此密钥将用于加密您的 Vault 中的所有密钥。为此,请单击下面的图像中所示的创建密钥

    创建主加密密钥 (MEK)

  4. 完成主密钥创建后,单击安全菜单并创建您在上一步中记录的 Microsoft Azure 密钥。

    创建您的密钥

  5. 使用 Microsoft Azure Sentinel Log Analytics 工作区中的主键或辅助键数据填充必要的字段,如任务 3 中所示。

  6. 其他项(Sentinel 工作区 ID 和将存储在 Sentinel 中的表的名称)可以插入 Vault 中,也可以不插入。下面,让我们将其插入函数的代码中。

重要提示:记下在 Vault 中创建的密钥的 OCID。

任务 5:创建和配置 OCI 功能

在 OCI 区域中设置集中式日志记录环境后,Vault 和 Azure 环境已准备就绪,现在可以创建 OCI 功能,将定制日志和审计日志从 OCI 区域发送到 Microsoft Azure Sentinel。

任务 5.1:创建 OCI 函数

  1. 转到 OCI 控制台的主菜单并转至开发人员服务功能

    Acess OCI 函数服务

  2. 加载“函数”页后,单击创建应用程序

    创建应用程序

  3. 填写所需的字段,然后单击创建

    填充所需的信息

  4. 创建后,请注意您的功能将不受任何网络安全组保护。必须将其添加到网络安全组。

    NSG 配置

    重要提示:

    1. 由于函数将访问用于将日志发送到 Microsoft Azure Sentinel 的公共 Microsoft Azure 端点,因此必须在有权访问 Internet 的子网中创建此函数。

    2. 还要验证您的 VNET 安全列表,以确保这些列表都不会阻止您的 OCI 功能访问 Internet。

任务 5.2:配置 OCI 功能和启动

创建 OCI 函数后,您将在屏幕上看到在环境中配置函数所需的命令。在此,举例来说,我们将逐步通过 Cloud Shell 执行这些设置,但也可以直接在设备上执行这些设置。

  1. 直接在要配置的 OCI 区域的 Web 控制台中打开 Cloud Shell(在本教程中,区域是巴西东部)。

    函数配置区域

  2. 按照“Function(函数)”页面上指示的步骤操作,并在 Cloud Shell 终端中执行请求的命令。

    在 cloud-shell 终端中执行命令

  3. 要执行的前 3 个命令不需要更改,但是,在第四个命令中,您需要提供存储应用程序映像的资料档案库的名称。在我们的示例中,输入的名称为 repo-ocilog-to-azuresiem

    $ fn update context registry gru.ocir.io/xxxxxxxxxa/repo-ocilog-to-azuresiem

    命令执行

  4. 在 Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) 配置文件中生成授权令牌。Auth Token 是访问凭据,可用于与将存储函数的 Docker 映像的 OCI 存储库进行交互。单击 OCI Web 控制台中的用户图标,然后单击我的概要信息

    创建验证令牌

  5. 在用户页面中后,向下滚动并单击 Auth 令牌

    "Automation Token" 菜单

  6. 在“验证令牌”部分中,单击生成令牌

    生成标记

  7. 填写您的验证令牌的名称,然后单击生成令牌

    填充所需的信息

    重要提示:写下此令牌并将其存储在安全的地方。此令牌是将用于存储函数映像的 OCI 注册表的访问密码。

  8. 通过访问 OCI Web 控制台的主菜单并访问开发人员服务功能返回“函数”页。

    返回至“函数”页

  9. 在“Functions(函数)”页面上,访问在前面的步骤中创建的函数。

    访问您的功能

  10. 单击开始菜单并在验证令牌创建步骤后逐步继续。

    “入门”功能菜单

  11. 运行命令 docker login,作为口令,请在执行的最后一步中使用刚从创建验证令牌中复制的字符串。

    按照入门说明进行操作

  12. 现在,在接下来的步骤中,我们将创建、部署和调用函数。要在 Cloud Shell 中初始化函数,请更改屏幕上显示的示例中建议的命令。此更改是必要的,因为要使用的运行时环境在 Python 中(而不是在 Java 中,如创建函数所建议的 hello-world 示例所示)。

    $ fn init --runtime python func-ocilog-to-azuresiem

    调用函数

任务 5.2.1:编写 OCI 函数的源代码

  1. 执行 init 命令后,访问新创建的 Function 目录。

    $ cd func-ocilog-to-azuresiem/

    • 请注意,在您刚刚访问的目录中,有一个 Python 文件 (func.py)、一个 YAML 文件 (func.yaml) 和一个要求文件 (requirements.txt)。我们需要编辑其中的两个文件。
  2. 编辑 func.py 文件,删除所有内容并将以下内容插入其中。

    import io
    import json
    import requests
    import datetime
    import hashlib
    import hmac
    import base64
    import logging
    import oci
    import base64
    import sys
    from fdk import response
    
    # Global variable
    logger = logging.getLogger()
    
    # Get Resource Principal Credentials
    # OCI Functions get permission to read vault from OCI IAM
    signer = oci.auth.signers.get_resource_principals_signer()
    
    # Retrieve secret from OCI Vault
    def get_binary_secret(secret_ocid):
        try:
            client = oci.secrets.SecretsClient({}, signer=signer)
            secret_content = client.get_secret_bundle(secret_ocid).data.secret_bundle_content.content.encode('utf-8')
            secret_content_decoded = base64.b64decode(secret_content).decode('UTF-8')
        except Exception as ex:
            logger.critical("ERROR: failed to retrieve the secret content from OCI Vault. ", ex)
            raise
        return secret_content_decoded
    
    # Build the API signature
    def  build_signature(customer_id, shared_key, date, content_length, method, content_type, resource):
        x_headers =  'x-ms-date:'  + date
        string_to_hash = method +  "\n"  + str(content_length) +  "\n"  + content_type +  "\n"  + x_headers +  "\n"  + resource
        bytes_to_hash = bytes(string_to_hash, encoding= "utf-8" )
        decoded_key = base64.b64decode(shared_key)
        encoded_hash = base64.b64encode(hmac.new(decoded_key, bytes_to_hash, digestmod=hashlib.sha256).digest()).decode()
        authorization =  "SharedKey {}:{}" .format(customer_id,encoded_hash)
        return  authorization
    
    # Build and send a request to the POST API (Microsoft Azure Sentinel public endpoint)
    def  post_data(customer_id, shared_key, body, log_type, logger):
        method =  'POST'
        content_type =  'application/json'
        resource =  '/api/logs'
        rfc1123date = datetime.datetime.utcnow().strftime( '%a, %d %b %Y %H:%M:%S GMT' )
        content_length = len(body)
        signature = build_signature(customer_id, shared_key, rfc1123date, content_length, method, content_type, resource)
        uri =  'https://'  + customer_id +  '.ods.opinsights.azure.com'  + resource +  '?api-version=2016-04-01'
    
        headers = {
            'content-type' : content_type,
            'Authorization' : signature,
            'Log-Type' : log_type,
            'x-ms-date' : rfc1123date
        }
    
        response = requests.post(uri,data=body, headers=headers)
        if (response.status_code >= 200 and  response.status_code <=  299 ):
            logger.critical( '===> Upload to Microsoft Azure Sentinel was accepted %s', content_length )
        else:
            logger.critical( "Error during upload.  Response code: {}" .format(response.status_code))
    
    ####
    ## PART 3
    ####
    
    #
    # Entrypoint and initialization
    #
    def handler(ctx, data: io.BytesIO=None):
        logger.info("OCI Function - Handler function init fired.")
    
        # Update the customer ID to your Log Analytics workspace ID
        customer_id =  ‘<PUT_HERE_YOUR_AZURE_LOG_ANALYTICS_WORKSPACE_ID>'
    
        # For the shared key, use either the primary or the secondary Connected Sources client authentication key
        shared_key_OCID = "<PUT_HERE_THE_OCID_OF_YOUR_OCI_VAULT_SHARED_KEY_SECRET>"
        shared_key = get_binary_secret(shared_key_OCID)
    
        # The log type is the name of the event that is being submitted
        log_type =  '<SENTINEL_TABLE_NAME>'
    
        try:
            log_body = data.getvalue()
            post_data(customer_id, shared_key, log_body, log_type, logger)
        except  Exception  as  err:
            logger.error( "Error in main process: {}" .format(str(err)))
        return  response.Response(
            ctx,
            response_data=json.dumps({ "status" :  "Success" }),
            headers={ "Content-Type" :  "application/json" }
        )
    
    
    • 这是将连接到 Azure SIEM 并将 OCI 日志发送到远程端点的 Python 脚本。

    • 除了复制和粘贴此脚本外,您还需要更改其中 3 个字段

      1. _customer_id:代理管理菜单中 Azure 订阅中的 Log Analytics 工作区 ID。

      2. _shared_key:也可以从代理管理菜单获取的主键或辅助键。

      3. _log_type: SIEM Sentinel 使用的 Log Analytics 工作区的名称。进入此工作区的所有日志都由 Sentinel 进行分析。在本示例中,我们使用了 OCILogging

    • 下面是屏幕的一个示例,您可以在其中获取上述信息。

      来自 Log Analytics 工作区的 Azure 值

    注:在 Azure 订阅中配置 Log Analytics 工作区的文档范围之外。为此,请在官方 Microsoft 文档中查找更多信息。

  3. 更改 func.py 文件后,是时候编辑 requirements.txt 文件了。我们将插入一个要求,其中 OCI Functions 软件包管理器将安装必要的 Python 依赖项,以便脚本正常工作。在这种情况下,请在文件的最后一行插入单词 requests

    必需的 Python 模块

  4. 完成此操作后,运行函数的部署步骤。

    $ fn -v deploy --app app-ocilog-to-azuresiem

几分钟后,将成功完成功能配置和 Docker 映像的创建。

必需的 Python 模块

任务 5.2.2:提供 OCI 功能所需的权限

要使 OCI 函数平稳运行,它需要权限来读取 Vault 中的 Azure 密钥。为此,我们将需要为创建的函数创建动态组,对于此动态组,我们将授予必要的权限(最少权限),以便我们的代码能够读取 Vault 并以安全的方式从 Azure 获取共享密钥。

因此,就像我们在上面第 2.2 项中所做的那样,我们创建了一个动态组来聚合将收集日志的服务器,重新跟踪这些步骤并创建一个动态组以包括我们的功能。

在创建动态组期间,您将需要使用匹配规则来捕获函数。在此示例中,我们将创建一个匹配规则,列出我们专门用于本教程的区间的所有函数。

ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxgjxxxxglxxxxiqxxxxjdxxxxnxxxxmxxxxm3xxxxmoxxxxsxxx'}

  1. 捕获区间的 OCID 并将其插入到匹配规则中并创建动态组。

    为函数配置动态组

  2. 创建动态组后,转至 Identity & SecurityPolicies 创建允许函数在读取模式下访问 Vault 的策略。

    创建策略以允许函数访问 Vault

    • 创建动态组后,创建允许该函数访问 Vault 的策略。
  3. 使用下面的策略授予运行 Vault 身份证明读取活动所需的最小访问权限。

    Allow dynamic-group <FUNCTION\_DYNAMIC\_GROUP\_NAME> to read secret-bundles in compartment <COMPARTMENT\_NAME>

    OCI 策略详细信息

任务 5.2.3:运行 OCI 函数

  1. 运行函数以验证其是否正常工作。

    $ fn -v deploy --app app-ocilog-to-azuresiem

    运行函数

现在,要最终确定,我们需要配置 OCI 服务连接器,以便从您的区域获取所有 OCI 日志并使用刚才创建的函数将其发送到 Azure SIEM。

任务 6:配置服务连接器

为了能够发送 OCI 租户区域的日志以供分析 Microsoft Azure Sentinel,必须配置服务连接器。

基本上,此服务将捕获我们已配置的 OCI 日志并将其发送到我们的功能,进而将所有日志转发到 Azure 订阅。

  1. 转到 OCI 控制台的主菜单,然后转到可观察性和管理、** 服务连接器

    “服务连接器”菜单

  2. 在服务连接器内后,单击创建服务连接器

    创建服务连接器

  3. 填写所需的名称和说明字段,选择要创建服务连接器的区间。

    填充所需的信息

  4. 现在,选择将通过服务连接器传输的数据源。在此处,使用日志记录。而且,作为目标(即数据转换的位置)使用函数

    为服务连接器定义源和目标

  5. 要完成配置,请在配置源中选择将日志发送到 OCI 函数的日志。在此步骤中,我们必须选择 \_Audit 日志,再添加一个日志,我们将选择在此过程的初始步骤中创建的日志组。

    完成配置

    • 如果要添加其他日志组,请单击 + 另一个日志
  6. 完成此步骤后,我们现在需要定义目标参数,即我们的 OCI 功能,将数据发送到 Azure 订阅。为此,请选择函数所在的区间,选择应用程序,然后选择函数的名称。然后,只需单击下面的图像中所示的创建

    单击“Create(创建)”按钮

流程已完成。此时,只需等待日志开始自动发送到 Microsoft Azure。

您可以监视由“度量”菜单创建的服务连接器操作。

监视服务连接器度量

任务 7:在 Microsoft Azure Sentinel 上读取日志

  1. 稍后,来自所有服务器的日志将发送到 Microsoft Azure 订阅,如下图所示。

    登录 Microsoft Azure Sentinel

  2. 根据 Microsoft Azure Sentinel 配置,在触发 SIEM 规则时,事件将开始显示在界面中。

    正在创建的 SIEM 事件

    • 为巴西东部地区服务器打开的事件(我们创建了一些称为“[实验室]正则表达式事件”的自定义规则,以生成我们的示例事件)。

      正在创建的 SIEM 事件

    • 为 Us-Phoenix 区域服务器打开意外事件。

      打开服务请求

确认

作者 - Rodrigo Pace de Barros(Oracle LAD A-Team 云安全解决方案工程师)

更多学习资源

探索 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 频道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心