注意:

将日志从 Oracle Cloud Infrastructure 转发到 Rapid7 InsightOps

简介

Oracle Cloud Infrastructure (OCI) 是一组互补的云服务,可用于在高可用性托管环境中构建和运行一系列应用和服务。OCI 在可从内部部署网络安全访问的灵活叠加虚拟网络中提供高性能计算功能(作为物理硬件实例)和存储容量。

Oracle Cloud 可观察性和可管理性平台旨在满足客户的需求。我们了解到,他们已使用常用的第三方观察工具标准化了运营状况,我们希望能够与这些工具互操作,以便我们的客户继续使用他们投入的 OCI 工具。

在本教程中,我们将介绍如何将日志从 OCI 转发到 Rapid7 InsightOps。Rapid7 InsightOps 是一项易于使用的日志管理和分析服务。它提供了先进的搜索功能、增强的日志分析工具,并且能够监视和查询基础设施的实时状态。

现在,让我们看一下下面所示的解决方案架构的高级表示形式。

体系结构图

目标

先决条件

任务 1:创建 log-Webhook 以将数据发送到 Rapid7 InsightOps

HTTP POST 是将日志消息转发到 Rapid7 InsightOps 的简单方法。

  1. 登录到 Rapid7 InsightOps ,然后在顶部导航中单击添加数据

  2. 单击 Webhook

    Rapid7 InsightOps- 添加数据源

  3. 输入日志的名称并选择现有日志集或创建新日志集。

    Rapid7 InsightOps- 添加日志 Webhook

    :这将显示用于将日志数据发送到的 URL。URL 的最后一部分是日志标记,它标识应将数据发送到的日志。

任务 2:配置要捕获的日志

  1. 在 OCI 控制台中,导航到可观察性和管理日志记录日志组

  2. 选择区间,然后单击创建日志组,侧面板将打开。

  3. 为名称输入 *Rapid7_log_group* ,并根据需要提供说明和标记。

  4. 单击创建以设置新的日志组。

  5. 资源下,单击日志

  6. 根据需要单击创建定制日志启用服务日志。

    例如,我们按照以下步骤为对象存储桶启用写入日志:

    1. 单击启用服务日志。侧面板将打开。

    2. 选择资源区间并在搜索服务字段中键入对象存储

    3. 单击启用日志并在资源字段中选择对象存储桶名称。

    4. 选择之前创建的日志组 Rapid7_log_group ,然后在“日志类别”字段中选择写入访问事件。(可选)提供日志名称,例如 Rapid7_bucket_write

    5. 单击启用以创建新的 OCI 日志。

任务 3:创建用于将日志摄取到 Rapid7 InsightOps 的 Oracle 函数

  1. 在 OCI 控制台中,导航到开发人员服务功能

  2. 单击创建应用程序。为您的应用提供相应下拉列表中的名称(例如 Rapid7_App),选择 VCN、子网、配置 (GENERIC_X86) ,然后单击创建

  3. 按照以下步骤设置 Cloud Shell 环境:

    1. 启动 Cloud Shell 并在 Cloud Shell 上设置 Fn CLI。

    2. 使用您区域的上下文。

      fn list context
      fn use context <region-context>
      
    3. 使用函数的区间 ID 更新上下文。

      fn update context oracle.compartment-id <compartment-id>
      
    4. 提供唯一的资料档案库名称前缀以区分函数图像。

      fn update context registry <region-key>.ocir.io/<tenancy_name>/[repo-name-prefix]
      
    5. 生成 Auth 令牌以启用登录 Oracle Cloud Infrastructure Registry

    6. 使用验证标记作为密码来登录注册表。

      docker login -u '<tenancyname>/<username>' <region-key>.ocir.io
      
    7. 列出区间中的应用程序来验证设置。

      fn list apps
      

任务 4:创建、部署和调用函数

  1. 建议先创建一个样板 Python 函数,并使用如下代码替换自动生成的文件。

    fn init --runtime python rapid7_func
    

    fn init 命令将生成一个名为 rapid7_func 的文件夹,其中包含 3 个文件;func.pyfunc.yamlrequirements.txt

  2. 切换到生成的目录。

    cd rapid7_func
    
    • func.py 的内容替换为以下样例代码。您可以根据自己的要求调整代码。

      import io
      import os
      import json
      import requests
      import logging
      from fdk import response
      
      def process(body):
          try:
              data = body.get("data", {})
              source = body.get("source")
              time = body.get("time")
              oracle = body.get("oracle",{})
              type = body.get("type")
              regionID = body.get("regionID")
              origin = "OCI-CLOUD"
      
              #Get json data, time, type and source information
              payload = {}
              payload.update({"origin":origin})
              payload.update({"time": time})
              payload.update({"type":type})
              payload.update({"regionID":regionID})
              payload.update({"source":source})
              payload.update({"data":data})
              payload.update({"oracle":oracle})
      
              #Rapid7 endpoint URL with token to call the REST interface.Refer for more info https://docs.rapid7.com/insightops/insightops-webhook
              #This is defined in the func.yaml file.
              rapid7host = os.environ['RAPID7_HOST']
      
              #Invoke Rapid7 API with the payload. If the payload contains more than one log this will be ingested as once.
              headers = {'Content-type': 'application/json'}
              x = requests.post(rapid7host, data = json.dumps(payload), headers=headers)
              logging.getLogger().info(x.text)
      
          except (Exception, ValueError) as ex:
              logging.getLogger().error(str(ex))
      
      

      此函数接受日志记录 JSON 并触发 Rapid7 InsightOps 端点以摄取日志。有关顶层日志记录格式的更多信息,请参阅日志记录格式概览

      当使用多个日志调用时,函数会迭代每个日志并触发 Rapid7 InsightOps 端点以分别摄取它们。

      def handler(ctx, data: io.BytesIO=None):
          try:
              body = json.loads(data.getvalue())
              if isinstance(body, list):
                  # Batch of CloudEvents format
                  for log in body:
                      process(log)
              else:
                  # Single log
                  process(body)
          except (Exception, ValueError) as ex:
              logging.getLogger().error(str(ex))
      
    • 按如下方式替换 func.yaml 内容。RAPID7_HOST 必须替换为我们在上一步中获得的 URL。

      schema_version: 20180708
      name: rapid7_func
      version: 0.0.1
      runtime: python
      entrypoint: /python/bin/fdk /function/func.py handler
      memory: 1024
      timeout: 120
      config:
          RAPID7_HOST: https://us2.webhook.logs.insight.rapid7.com/v1/noformat/1a2345b1-1234-1ab2-1a2b-abcd1ef2345g
      
    • 按如下方式替换 requirements.txt 内容。

      fdk
      datetime
      requests
      oci
      
  3. 部署您的函数。

    fn -v deploy --app Rapid7_App
    
  4. 可以通过调用函数来测试该函数。如果未发现错误,该函数将按预期工作。

    fn invoke Rapid7_App rapid7_func
    

任务 5:设置 OCI 服务连接器

  1. 在 OCI 控制台中,导航到可观察性和管理日志记录服务连接器

  2. 单击创建服务连接器以定向到“创建服务连接器”页。

  3. 输入 *Rapid7_SC* 作为名称,可以选择提供说明并选择区间。

  4. 选择“源”作为日志记录,然后选择“目标”作为函数

  5. 配置源连接下,选择区间名称、日志组和日志(第一步中创建的日志组和日志)。

  6. 如果还希望发送审计日志,请单击 +Another 日志并在替换 _Audit 作为日志组时选择相同的区间。

  7. 配置目标选择区间、函数应用程序和函数下(在上一步中创建的函数应用程序函数)。

  8. 如果系统提示您创建策略,请从提示中单击创建

  9. 单击底部的创建以完成创建服务连接器。

任务 6:在 Rapid7 InsightOps 平台产品中可视化 Oracle Cloud Infrastructure 日志

要访问日志,请登录到 Rapid7 InsightOps ,然后导航到日志搜索部分。

Rapid7 InsightOps

:通过 HTTP Post 选项摄取到 Rapid7 InsightOps 中的日志在 Rapid7 InsightIDR 中也可见。

Rapid7 InsightIDR

后续步骤

本教程演示了使用服务连接器中心和函数将 Oracle Cloud Infrastructure (OCI) 日志转发到 Rapid7 InsightOps 平台的过程。在安全信息和事件管理 (Security Information and Event Management,SIEM) 端,必须定义仪表盘以捕获关键度量并配置预警,以便在超过预定义阈值时触发。此外,定义特定查询对于检测 OCI 租户中的恶意活动和识别模式至关重要。这些操作将进一步增强您的安全状况,并主动监视您的云环境。

确认

作者 - Chaitanya Chintala(云安全顾问)

更多学习资源

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

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