欢迎回到我们关于 OpenAI 的大型语言模型 (LLM) 和 Microsoft Sentinel 的系列文章。在第一部分中,我们使用 OpenAI 和 Sentinel 的内置 Azure Logic Apps 连接器构建了一个基本剧本,以解释在事件中发现的 MITRE ATT&CK 策略,并讨论了一些可能影响 OpenAI 模型的不同参数,例如温度和频率惩罚。接下来,我们使用 Sentinel 的 REST API 扩展此功能以查找计划的分析规则并返回规则检测逻辑的摘要。
如果您一直在关注,您可能会注意到我们的第一个剧本从 Sentinel 事件中查找了 MITRE ATT&CK 战术,但没有在 GPT3 提示中包含任何事件技术。为什么不?好吧,启动你的 OpenAI API Playground,让我们去兔子洞旅行(向 Lewis Carroll 道歉)。
- 模式:完整
- 型号:text-davinci-003
- 温度:1
- 最大长度:500
- 最高 P: 1
- 频率惩罚:0
- 存在惩罚:0
- 提示:“请解释以下MITRE ATT&CK战术和技巧:[“DefenseEvasion”],[“T1564”]”
这是我们的第一个结果:
这是对 MITRE ATT&CK Tactic TA0005,Defense Evasion 的一个很好的总结,但是技术描述是怎么回事?T1564 是 Hide Artifacts – 进程注入 (T1055) 和 Rootkit (T1014) 还有其他命名技术。让我们再试一次。
差远了!“利用远程服务”是横向移动策略中的技术 T1210。再一次:
那么发生了什么?ChatGPT 不应该比这更好吗?!
好吧,是的。ChatGPT 在总结 MITRE ATT&CK 技术代码方面确实很棒,但我们还没有问过它。我们一直在文本完成模式下使用 OpenAI 的另一种顶级生成式预训练 Transformer-3.5 (GPT-3.5) 模型“text-davinci-003” 。ChatGPT 在聊天完成模式中使用“gpt-3.5-turbo”模型。差异很大。以下是 ChatGPT 对上述相同查询的响应示例:
但是我们 Azure 逻辑应用程序中的 OpenAI 连接器没有为我们提供基于聊天的操作,我们也无法选择 Turbo 模型,那么我们如何才能将 ChatGPT 引入我们的 Sentinel 工作流中呢?就像我们在第二部分中关闭 Sentinel Logic App 连接器以直接调用 Sentinel REST API 的 HTTP 操作一样,我们可以对 OpenAI 的 API 执行相同的操作。让我们探索构建使用聊天模型而不是文本完成模型的逻辑应用工作流的过程。
我们将参考 OpenAI 的两个参考文档:聊天创建 API 参考和聊天完成指南。为了使这篇博文保持合理的长度,我将总结一些您需要在您自己的环境中复制我们的示例的设置任务:
- 用于存储您的 OpenAI API 凭证的 Key Vault
- 一种授权您的逻辑应用程序从 Key Vault 读取机密的方法(我推荐使用 Azure RBAC 的托管身份)
- 允许您的逻辑应用程序连接到 Key Vault 的网络访问(我使用连接器文档中适当 Azure 区域的已定义 IP 地址和 CIDR 范围)
现在,让我们打开我们的逻辑应用程序设计器并开始构建功能。就像以前一样,我们正在使用 Microsoft Sentinel 事件触发器。我们将在此之后执行 Key Vault 操作“Get secret”,我们将在其中指定存储 API 密钥的秘密名称:
接下来,我们需要为我们的 API 请求初始化和设置一些变量。这不是绝对必要的;我们可以简单地在我们的 HTTP 操作中写出请求,但这将使以后更改提示和其他参数变得容易得多。OpenAI Chat API 调用中的两个必需参数是“模型”和“消息”,因此让我们初始化一个字符串变量来存储模型名称和一个用于消息的数组变量。
“消息”参数是聊天模型的主要输入。它被构造为一组消息对象,每个对象都有一个角色,例如“系统”或“用户”,以及内容。让我们看一下 Playground 中的示例:
System 对象允许我们为此聊天会话设置 AI 模型的行为上下文。User 对象是我们的问题,模型将回复一个 Assistant 对象。如果需要,我们可以将先前的响应包含在 User 和 Assistant 对象中,以便为 AI 模型提供“对话历史记录”。
回到我们的逻辑应用程序设计器中,我使用了两个“附加到数组变量”操作和一个“初始化变量”操作来构建“消息”数组:
同样,这一切都可以一步完成,但我选择分别分解每个对象。如果我想修改我的提示,我只需要更新 Prompt 变量。
接下来,让我们将温度参数调整到一个非常低的值,以使 AI 模型更具确定性。“Float”变量非常适合存储此值。
最后,让我们将它们与一个 HTTP 操作放在一起,如下所示:
- 方法:邮寄
- 类型: https: //api.openai.com/v1/chat/completions
- 身体:
{ "model": @{variables('model')}, "messages": @{variables('messages')}, "temperature": @{variables('temperature')} }
- 身份验证:原始
- 价值:
Bearer @{body('Get_OpenAI_API_token_from_Key_Vault')?['value']}
- 价值:
和以前一样,让我们在没有任何评论操作的情况下运行这个剧本,以确保在我们将它连接回 Sentinel 实例之前一切正常。如果一切顺利,我们将在助手消息中获得 200 状态代码和 MITRE ATT&CK 战术和技巧的精彩总结。
现在是简单的部分:使用 Sentinel 连接器添加事件评论。我们将使用 Parse JSON 操作解析响应正文,然后使用 ChatGPT 回复中的文本初始化一个变量。因为我们知道响应格式,所以我们知道可以使用以下表达式从索引 0 的 Choices 项中提取回复:
@{body('Parse_JSON')?['choices']?[0]?['message']?['content']}
以下是已完成的逻辑应用程序流程的鸟瞰图:
让我们试试吧!我在本 OpenAI 和 Sentinel 系列的第一部分中包含了该剧本的前一次迭代留下的评论 – 将达芬奇文本完成的输出与 Turbo 模型的聊天交互进行比较很有趣。
原创文章,作者:校长,如若转载,请注明出处:https://www.yundongfang.com/Yun219032.html