Nutanix Frame™平台记录会话和审核日志信息有关用户和管理员在框架桌面AS-A-Service(DAAS)中所做的操作的信息。此会话和审核日志信息可从框架控制台下载。企业通常希望将本会话和审核事件数据与其安全信息和事件管理(SIEM)解决方案中其他来源的信息相结合,以便获得对其企业中发生的情况的更全面的看法。在此博客中,我们将演示如何在PowerShell脚本中使用Frame Admin API从框架检索审核数据,并将其插入Splunk®活动经理,这是市场上最受欢迎的SIEM之一。
操作的概念
操作的概念非常简单:
- 使用框架管理API调用以获取框架的审核数据
- 将数据格式化为易于消化的东西
- 使用Splunk HTTP事件收集器(HEC)将数据放入Splunk中
要实施此集成,您将需要框架和Splunk的凭据。对于框架,可以通过遵循框架文档来获得凭据如何提供API凭据。对于Splunk,可以在Splunk的文档页面。
就我的示例而言,我们想在框架客户实体中收集数据,因此我们用客户审核员
框架控制台内的角色。
- 姓名:您的API提供商的名字
- 角色:
客户审核员
- 实体:默认情况下,选择您的框架客户实体。
创建API提供商后,您可以通过转到最右边的三个点来获得新的API密钥和秘密,以获取API提供商并选择管理。
您还需要框架客户ID可以通过为您的框架客户实体进入框架控制台找到;点击客户实体最右边的三个点并选择更新按钮。
您要使用的网页将具有与以下几个相似的URL:
https://安慰。nutanix。com/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]:: ASCII。getbytes(($ client_secret)
$签名=$ hmacsha。computehash(([text.soding]:: ASCII。getbytes(($ 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]((参与日期$ jsonevent。inserted_at-uformat%s))
#创建一排Splunk Parsable JSON
$行='{{“ time”:“ {0}”,“ id”:“ {1}”,“ accountId”:“ {2}”,“ andyralid”:“ {3}”,“ customerId”:{4}“,,,,“Event":"{5}","Email":"{6}","FirstName":"{7}","LastName":"{8}","IdentityProvider":"{9}"}}'-F$ jsonevent。inserted_at,,,,$ jsonevent。ID,,,,$ jsonevent。帐户ID,,,,$ jsonevent。agrancom_id,,,,$ jsonevent。客户ID,,,,$ jsonevent。种类,,,,$ jsonevent。USER_EMAIL,,,,$ jsonevent。user_first_name,,,,$ jsonevent。user_last_name,,,,$ jsonevent。USER_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。安慰。nutanix。COM/V1/客户/“ +$ CUST_ID+”/审计 - trails?to_date =“+$ to_date+”T00:00:00。000000Z“
#写出$ req_string
}
别的
{
$ req_string=“https://API。安慰。nutanix。COM/V1/客户/“ +$ CUST_ID+”/审核 - trails?from_date =“ +$ from_date+”T00:00:00。000000Z&to_date =“+$ to_date+”T00:00:00。000000Z”
}
#调用框架API
$ res=获取FrameAtcall-client_id$ clnt_id-client_secret$ clnt_secret-API$ req_string
#设置最后的日志日期Evironment变量
[环境]:: setenVironmentVariable((“ LastLogDate”,,,,$ to_date,,,,'机器');
#处理返回的JSON中的每个事件
foreach(($ i在$ res)
{
写入$ i。inserted_at
$ postresponse= splunkdata$ i
}
为简单起见,我们想要一个可以在没有命令参数的情况下运行的脚本,因此我们选择设置脚本以将登录收集到最新的UTC午夜,然后将该日期存储在系统环境变量中。随后的执行仅收集从前设置的日期到最近的UTC午夜的数据。这意味着,直到脚本再次运行,本天午夜UTC之后发生的事件才会被发送到Splunk。
可以在没有任何命令行参数的情况下运行此脚本,并将执行以下操作:
- 检查是否
LastLogDate
设置了环境变量。- 如果未设置,则脚本将从客户实体创建的框架审核数据日期检索到当天的00:00:00 UTC。
- 如果设置了,则脚本将从00:00:00收集帧审核数据
LastLogDate
直到当天的00:00:00 UTC。
- 将LastLogdate环境变量设置为当天。
- 通过审核数据循环为每个帧审核日志条目创建一个Splunk条目。
- 对于Splunk条目,转换
inserted_at
时间到时代。这允许条目反映它们在帧平台中发生的时间。 - 将每个帧值映射到将在Splunk中使用的字段。这提供了一个机会,将价值重命名为更适合您的企业的东西。
- 将条目插入Splunk。
- 对于Splunk条目,转换
第一次通过脚本可能需要一些时间,特别是如果框架客户已经存在了一段时间。随后的执行应更快,因为将检索审计数据较少。如果脚本是从命令行执行的,它将向您显示插入Splunk的每个事件的时间。
结果
以下是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帖子。