跳过主要内容

Nutanix Frame™平台记录会话和审核日志信息有关用户和管理员在框架桌面AS-A-Service(DAAS)中所做的操作的信息。此会话和审核日志信息可从框架控制台下载。企业通常希望将本会话和审核事件数据与其安全信息和事件管理(SIEM)解决方案中其他来源的信息相结合,以便获得对其企业中发生的情况的更全面的看法。在此博客中,我们将演示如何在PowerShell脚本中使用Frame Admin API从框架检索审核数据,并将其插入Splunk®活动经理,这是市场上最受欢迎的SIEM之一。

操作的概念

操作的概念非常简单:

  1. 使用框架管理API调用以获取框架的审核数据
  2. 将数据格式化为易于消化的东西
  3. 使用Splunk HTTP事件收集器(HEC)将数据放入Splunk中

要实施此集成,您将需要框架和Splunk的凭据。对于框架,可以通过遵循框架文档来获得凭据如何提供API凭据。对于Splunk,可以在Splunk的文档页面

就我的示例而言,我们想在框架客户实体中收集数据,因此我们用客户审核员框架控制台内的角色。

图1.客户审核员凭证“src=

图1.客户审核员凭证
  • 姓名:您的API提供商的名字
  • 角色客户审核员
  • 实体:默认情况下,选择您的框架客户实体。

创建API提供商后,您可以通过转到最右边的三个点来获得新的API密钥和秘密,以获取API提供商并选择管理

您还需要框架客户ID可以通过为您的框架客户实体进入框架控制台找到;点击客户实体最右边的三个点并选择更新按钮。

图2.选择更新客户“src=

图2.选择更新客户

您要使用的网页将具有与以下几个相似的URL:

https://安慰nutanixcom/frame/customer/9096416D-C243-48DE-950D-F40352231990/basic-info

之间的信息顾客基本信息(在这种情况下,9096416D-C243-48DE-950D-F40352231990)是客户ID。

现在,您应该拥有PowerShell脚本所需的五个值。

$ clnt_id=“”
$ clnt_secret=“”
$ CUST_ID=“”
$ splunkserver=“”
$ hec_token=“”

PowerShell脚本

拥有5个必需值后,您可以将这些值插入以下脚本:

#Requires -Version 5
<#
。笔记
===================================================================
创建于:07/21/2021
组织:Nutanix框架
文件名:getaudittrail.ps1
===================================================================
。描述
从框架客户中获取审核步道,并将其放入Splunk

框架客户凭证需要:
客户ID,客户秘密和客户ID
Splunk配置:
URL到Splunk Server,HTTP Event Collector(HEC)令牌
#>
参数
((



$ clnt_id=
$ clnt_secret=
$ CUST_ID=
$ splunkserver=
$ hec_token=
$ SourceType=“ frameauditdata”

<#
广义功能以创建签名的框架“ get” API调用
#>

功能获取FrameAtcall{

参数
((
[参数(强制性= $ true)]
[细绳]
$ client_id,,,,
[参数(强制性= $ true)]
[细绳]
$ client_secret,,,,
[参数(强制性= $ true)]
[细绳]
$ API

尝试{

#根据框架API凭据创建签名

$时间戳=[数学]::地面(([十进制]((参与日期-uformat“%s”
$ to_sign=$(($时间戳$(($ client_id
$ hmacsha=新对象系统安全密码学HMACSHA256
$ hmacsha键=[text.soding]:: ASCIIgetbytes(($ client_secret
$签名=$ hmacshacomputehash(([text.soding]:: ASCIIgetbytes(($ to_sign
$签名=[System.BitConverter]:: Tostring(($签名代替((' - ',,,,''降低((
#设置HTTP请求标头
$标题= @{
'x-frame-clientid'=$ client_id
'X框架Timestamp'=$时间戳
'X框架'=$签名
'内容类型'='应用程序/json'
}
#设置TLS1.2(PS默认使用1.0)并进行HTTP请求
[Net.ServicePointManager]:: SecurityProtocol =[net.securityprotocolytype]:: TLS12

#调用API并处理返回代码
$响应=Invoke-Restmethod-方法获取-Uri$ API-标题$标题
}
抓住{
#HTTP 401
如果(($ _例外回复状态代码-eq“未经授权”{
写入“检查您的客户端和客户端 - 未经授权”
}
#HTTP 404
Elseif(($ _例外回复状态代码-eq“未找到”{
写入“检查您的客户 - 找不到”
}
#HTTP 403
Elseif(($ _例外回复状态代码-eq“错误的请求”{
写入“检查您的帐户ID- BADREQUEST”
}
# 未处理的异常
别的{
写入“未知错误:$(($ _。有关更多信息,请联系Nutanix支持”
}
}
#从API调用中返回响应
返回$响应
}

<#
通用功能将单个JSON元素放入Splunk可以解析的行中
#>

功能后塑料{

参数
((
$ jsonevent

尝试{

#将框架审核数据的时间转换为“ Epochtime”
$ eventtime= $(([INT64]((参与日期$ jsoneventinserted_at-uformats

#创建一排Splunk Parsable JSON
$行='{{“ time”:“ {0}”,“ id”:“ {1}”,“ accountId”:“ {2}”,“ andyralid”:“ {3}”,“ customerId”:{4}“,,,,“Event":"{5}","Email":"{6}","FirstName":"{7}","LastName":"{8}","IdentityProvider":"{9}"}}'-F$ jsoneventinserted_at,,,,$ jsoneventID,,,,$ jsonevent帐户ID,,,,$ jsoneventagrancom_id,,,,$ jsonevent客户ID,,,,$ jsonevent种类,,,,$ jsoneventUSER_EMAIL,,,,$ jsoneventuser_first_name,,,,$ jsoneventuser_last_name,,,,$ jsoneventUSER_IDP

#设置带有Splunk Hec令牌的HTTP请求标头
$标题= @{
授权=“ splunk$ hec_token
}
#创建请求主体,包括时代时间和事件JSON
$身体='{
“时间”:'+$ eventtime+',,
“ SourceType”:''+$ SourceType+'“”,
“事件”:'+$行+'
}'

#将帖子置于splunk并处理返回代码
$响应=Invoke-Restmethod-方法帖子-Uri$ splunkserver-标题$标题-身体$身体
}
抓住{
#HTTP 401
如果(($ _例外回复状态代码-eq“未经授权”{
写入“无许可”
}
#HTTP 404
Elseif(($ _例外回复状态代码-eq“未找到”{
写入“未找到”
}
#HTTP 403
Elseif(($ _例外回复状态代码-eq“错误的请求”{
写入“ Badrequest。$身体。”
}
# 未处理的异常
别的{
写入“未知错误:$(($ _。正文是$身体。”
}
}
#从邮政请求返回响应
返回$响应
}

#设置一个使用最新午夜UTC的变量。API呼叫将在此时间之前获得事件。

$ to_date=参与日期-格式“ yyyy-mm-dd”

#如果“ lastlogdate“不存在环境变量。将所有日志数据获取到最近的午夜UTC。如果设置了变量。获取数据
#从那时到最近的午夜UTC

$ from_date= [环境] :: getenVironmentVariable('LastLogDate','Machine');
#如有必要,请创建它。
如果 ($ from_date-eq$ null
{
$ req_string=“https://API安慰nutanixCOM/V1/客户/“ +$ CUST_ID+”/审计 - trails?to_date =“+$ to_date+”T00:00:00000000Z
#写出$ req_string
}
别的
{
$ req_string=“https://API安慰nutanixCOM/V1/客户/“ +$ CUST_ID+”/审核 - trails?from_date =“ +$ from_date+”T00:00:00000000Z&to_date =“+$ to_date+”T00:00:00000000Z”
}

#调用框架API
$ res=获取FrameAtcall-client_id$ clnt_id-client_secret$ clnt_secret-API$ req_string
#设置最后的日志日期Evironment变量
[环境]:: setenVironmentVariable((“ LastLogDate”,,,,$ to_date,,,,'机器';

#处理返回的JSON中的每个事件
foreach(($ i$ res
{
写入$ iinserted_at
$ postresponse= splunkdata$ i
}

为简单起见,我们想要一个可以在没有命令参数的情况下运行的脚本,因此我们选择设置脚本以将登录收集到最新的UTC午夜,然后将该日期存储在系统环境变量中。随后的执行仅收集从前设置的日期到最近的UTC午夜的数据。这意味着,直到脚本再次运行,本天午夜UTC之后发生的事件才会被发送到Splunk。

可以在没有任何命令行参数的情况下运行此脚本,并将执行以下操作:

  1. 检查是否LastLogDate设置了环境变量。
    • 如果未设置,则脚本将从客户实体创建的框架审核数据日期检索到当天的00:00:00 UTC。
    • 如果设置了,则脚本将从00:00:00收集帧审核数据LastLogDate直到当天的00:00:00 UTC。
  2. 将LastLogdate环境变量设置为当天。
  3. 通过审核数据循环为每个帧审核日志条目创建一个Splunk条目。
    • 对于Splunk条目,转换inserted_at时间到时代。这允许条目反映它们在帧平台中发生的时间。
    • 将每个帧值映射到将在Splunk中使用的字段。这提供了一个机会,将价值重命名为更适合您的企业的东西。
    • 将条目插入Splunk。

第一次通过脚本可能需要一些时间,特别是如果框架客户已经存在了一段时间。随后的执行应更快,因为将检索审计数据较少。如果脚本是从命令行执行的,它将向您显示插入Splunk的每个事件的时间。

结果

以下是Splunk控制台中审核条目的样本。

图3. Splunk条目“src=

图3. Splunk条目

在此示例中,一旦执行PowerShell脚本,我们就可以在Splunk中搜索与我们框架客户实体“ Nutanix-Demo”中的所有活动相关的活动。

结论

假设您有权通过框架管理员API和Splunk HEC访问框架和Splunk,则使用框架管理API检索审核条目并将其插入Splunk非常容易。可以手动运行PowerShell脚本,也可以通过窗口计划的进程进行设置,因为脚本跟踪了最后一个运行日期作为系统环境变量,并且仅收集“较新的”框架审核数据。

此外,您无需在框架客户级别收集数据。您可以根据需要配置脚本以在组织或帐户级别使用API​​提供商。您还可以查找框架帐户名称(使用帧管理器API),并在Splunk中使用帧帐户名称,而不是框架帐户ID,因为这对于Splunk和Frame Administrator可能更有意义。

您还可以自定义行数据或字段名称以满足企业的需求,也不必将所有数据推入Splunk。PowerShell脚本设置为非常灵活,您可以用呼叫SIEM的API端点替换Splunk HEC帖子。

作者

高级解决方案建筑师
David Horvath是Nutanix框架的高级解决方案建筑师。他已经成为框架团队的一部分已有近五年了,在此之前,他花了20年的时间与美国情报界的各种信息技术项目进行咨询。
高级安全工程师
更多的内容由Thang Nguyen
Thang Nguyen是Nutanix框架的高级安全工程师。在加入Nutanix之前,他曾在美国财政部担任网络安全顾问。
©2020-2022 Nutanix,Inc。保留所有权利。Nutanix,Nutanix徽标和所有Nutanix产品,此处提到的功能和服务名称是美国和其他国家的Nutanix,Inc。的注册商标或商标。本文提到的所有其他品牌名称仅用于识别目的,可能是其各自持有人的商标。这篇文章可能包含指向不属于Nutanix.com一部分的外部网站的链接。Nutanix不控制这些站点,并对任何外部站点的内容或准确性不承担所有责任。我们决定链接到外部站点的决定不应被视为对该站点上任何内容的认可。本文中包含的某些信息可能与从第三方来源以及我们自己的内部估计和研究获得的研究,出版物,调查和其他数据有关。尽管我们认为这些第三方研究,出版物,调查和其他数据是在本文之日起可靠的,但它们尚未独立验证,并且我们对任何信息的充分性,公平性,准确性或完整性都没有任何陈述从第三方来源获得。
Baidu