收集 Microsoft 网络策略服务器 (NPS) 日志
本文档介绍了如何使用 Google Cloud Storage V2 将 Microsoft 网络策略服务器 (NPS) 日志注入到 Google Security Operations。
Microsoft 网络策略服务器 (NPS) 是一种 Windows Server 角色,可提供 RADIUS 身份验证、授权和账号管理。借助 NPS,您可以集中管理无线设备、VPN 连接、交换机和远程访问的网络访问策略。NPS 没有原生云导出功能或 API,因此必须使用第三方转发器来收集日志。
准备工作
确保您满足以下前提条件:
- Google SecOps 实例
- 已启用 Cloud Storage API 的 GCP 项目
- 创建和管理 GCS 存储分区的权限
- 管理 GCS 存储分区的 IAM 政策的权限
- 对运行 NPS 的 Windows Server 的特权访问权限
- 拥有管理员访问权限,可在 NPS 服务器上安装 NXLog
配置 NPS 日志记录
启用 NPS 结算日志
- 在运行 NPS 的 Windows Server 上,打开服务器管理器。
- 依次前往工具 > 网络策略服务器。
- 在 NPS 控制台中,展开左侧导航栏中的会计。
- 右键点击会计,然后选择配置会计。
- 在会计配置向导中,点击下一步。
- 选择将日志记录到本地计算机上的文本文件,然后点击下一步。
- 在配置日志文件属性页面中,配置以下内容:
- 目录:保留默认值 (
%systemroot%\System32\LogFiles) 或指定自定义路径 - 格式:选择 DTS 兼容(Microsoft 建议采用的结构化 XML 格式)
- 创建新的日志文件:根据日志量选择每天或每周
- 目录:保留默认值 (
- 点击下一步。
- 查看摘要并点击 Finish。
启用 NPS 审核日志记录
- 在 NPS 服务器上以管理员身份打开命令提示符。
运行以下命令以启用 NPS 审核日志记录:
auditpol /set /subcategory:"Network Policy Server" /success:enable /failure:enable验证审核政策是否已启用:
auditpol /get /subcategory:"Network Policy Server"
在 NPS 服务器上安装和配置 NXLog
下载并安装 NXLog
- 在 NPS 服务器上,从 NXLog 网站下载 NXLog Enterprise Edition。
- 运行安装程序并按照安装向导操作。
- 接受默认安装路径 (
C:\Program Files\nxlog) 或指定自定义路径。 - 完成安装。
配置 NXLog 以收集 NPS 日志
- 在 NPS 服务器上,前往 NXLog 配置目录:
- 默认路径:
C:\Program Files\nxlog\conf
- 默认路径:
- 以管理员权限在文本编辑器(例如记事本)中打开文件
nxlog.conf。 将
nxlog.conf的全部内容替换为以下配置:## NXLog configuration for Microsoft NPS log collection ## Collects NPS logs and forwards to Google Cloud Storage define ROOT C:\Program Files\nxlog define LOGDIR C:\Windows\System32\LogFiles define GCS_BUCKET your-gcs-bucket-name define GCS_PREFIX nps-logs define GCS_CREDENTIALS C:\nxlog-credentials\gcs-service-account.json Moduledir %ROOT%\modules CacheDir %ROOT%\data Pidfile %ROOT%\data\nxlog.pid SpoolDir %ROOT%\data LogFile %ROOT%\data\nxlog.log LogLevel INFO <Extension nps> Module xm_nps </Extension> <Extension json> Module xm_json </Extension> <Input nps_logs> Module im_file File '%LOGDIR%\IN*.log' SavePos TRUE ReadFromLast TRUE Recursive FALSE InputType nps <Exec> # Parse NPS logs (DTS Compliant format) # Add hostname for tracking $Hostname = hostname(); # Convert to JSON to_json(); </Exec> </Input> <Output gcs> Module om_file File '%ROOT%\data\gcs-upload\nps-' + strftime(now(), '%Y%m%d-%H%M%S') + '.json' <Exec> # Rotate output file every hour if (file_size(file_name()) > 100000000) file_cycle(); </Exec> </Output> <Route nps_to_gcs> Path nps_logs => gcs </Route>在该配置文件中,替换以下占位符:
your-gcs-bucket-name:您的 GCS 存储桶名称(在下一部分中创建)- 验证
LOGDIR路径是否与 NPS 日志文件位置一致
保存文件。
创建 Google Cloud Storage 存储桶
- 前往 Google Cloud 控制台。
- 选择您的项目或创建新项目。
- 在导航菜单中,依次前往 Cloud Storage > 存储分区。
- 点击创建存储分区。
提供以下配置详细信息:
设置 值 为存储桶命名 输入一个全局唯一的名称(例如 nps-logs-chronicle)位置类型 根据您的需求进行选择(区域级、双区域、多区域) 位置 选择营业地点(例如 us-central1)存储类别 标准(建议用于经常访问的日志) 访问权限控制 均匀(推荐) 保护工具 可选:启用对象版本控制或保留政策 点击创建。
为 NXLog 创建 GCS 服务账号
创建服务账号
- 在 GCP 控制台中,依次前往 IAM 和管理 > 服务账号。
- 点击创建服务账号。
- 提供以下配置详细信息:
- 服务账号名称:输入
nxlog-nps-uploader(例如) - 服务账号说明:输入
Service account for NXLog to upload NPS logs to GCS
- 服务账号名称:输入
- 点击创建并继续。
- 在向此服务账号授予对项目的访问权限部分中,添加以下角色:
- 点击选择角色。
- 搜索并选择 Storage Object Creator。
- 点击继续。
- 点击完成。
下载服务账号密钥
- 在服务账号页面上,点击您刚创建的服务账号 (
nxlog-nps-uploader)。 - 前往密钥标签页。
- 点击添加密钥 > 创建新密钥。
- 选择 JSON 作为密钥类型。
- 点击创建。
- JSON 密钥文件将下载到您的计算机。
- 将 JSON 密钥文件复制到 NPS 服务器上的以下位置:
C:\nxlog-credentials\gcs-service-account.json
- 创建目录
C:\nxlog-credentials(如果不存在)。
配置自动 GCS 上传
创建 PowerShell 上传脚本
- 在 NPS 服务器上,创建一个新目录:
C:\nxlog-scripts
- 在该目录中创建一个名为
upload-to-gcs.ps1的新文件。 在文本编辑器中打开该文件,然后粘贴以下 PowerShell 脚本:
# PowerShell script to upload NXLog output files to Google Cloud Storage # Uses gsutil command-line tool $ErrorActionPreference = "Stop" # Configuration $LocalLogDir = "C:\Program Files\nxlog\data\gcs-upload" $GcsBucket = "gs://nps-logs-chronicle/nps-logs/" $ArchiveDir = "C:\Program Files\nxlog\data\archive" $LogFile = "C:\nxlog-scripts\upload.log" # Function to write log messages function Write-Log { param([string]$Message) $Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" "$Timestamp - $Message" | Out-File -FilePath $LogFile -Append } Write-Log "Starting GCS upload process" # Check if gsutil is available try { $null = gsutil version } catch { Write-Log "ERROR: gsutil not found. Please install Google Cloud SDK." exit 1 } # Activate service account $ServiceAccountKey = "C:\nxlog-credentials\gcs-service-account.json" if (-not (Test-Path $ServiceAccountKey)) { Write-Log "ERROR: Service account key not found at $ServiceAccountKey" exit 1 } try { gcloud auth activate-service-account --key-file=$ServiceAccountKey 2>&1 | Out-Null Write-Log "Service account activated successfully" } catch { Write-Log "ERROR: Failed to activate service account: $_" exit 1 } # Create archive directory if it doesn't exist if (-not (Test-Path $ArchiveDir)) { New-Item -ItemType Directory -Path $ArchiveDir | Out-Null Write-Log "Created archive directory: $ArchiveDir" } # Get all JSON files in the local log directory $Files = Get-ChildItem -Path $LocalLogDir -Filter "*.json" -File if ($Files.Count -eq 0) { Write-Log "No files to upload" exit 0 } Write-Log "Found $($Files.Count) file(s) to upload" # Upload each file to GCS $SuccessCount = 0 $FailCount = 0 foreach ($File in $Files) { try { # Upload to GCS gsutil cp $File.FullName $GcsBucket 2>&1 | Out-Null # Move to archive on success Move-Item -Path $File.FullName -Destination $ArchiveDir -Force Write-Log "Uploaded and archived: $($File.Name)" $SuccessCount++ } catch { Write-Log "ERROR uploading $($File.Name): $_" $FailCount++ } } Write-Log "Upload complete. Success: $SuccessCount, Failed: $FailCount"在脚本中,替换以下值:
$GcsBucket:您的 GCS 存储桶 URI(例如gs://nps-logs-chronicle/nps-logs/)
保存文件。
安装 Google Cloud SDK
- 在 NPS 服务器上,从 Google Cloud SDK 下载 Google Cloud SDK 安装程序。
- 运行安装程序并按照安装向导操作。
- 在安装过程中,如果尚未安装 Python,请选择安装捆绑的 Python。
- 完成安装。
打开新的命令提示符,然后验证安装:
gsutil version
创建用于自动上传的计划任务
- 在 NPS 服务器上,打开任务计划程序。
- 在右侧面板中,点击创建任务。
- 在常规标签页中,配置以下内容:
- 名称:输入
NXLog GCS Upload - 说明:输入
Upload NPS logs to Google Cloud Storage - 安全选项:选择无论用户是否已登录,都运行
- 安全选项:选中以最高权限运行
- 配置:选择 Windows Server 2016 或您的服务器版本
- 名称:输入
- 在触发器标签页中:
- 点击 New(新建)。
- 开始任务:选择按计划。
- 设置:选择每日。
- 重复周期:输入
1天。 - 重复任务的频率:选择每 15 分钟。
- 的持续时间:选择无限期。
- 点击确定。
- 在操作标签页中:
- 点击 New(新建)。
- 操作:选择启动程序。
- 程序/脚本:输入
powershell.exe。 - 添加实参:输入
-ExecutionPolicy Bypass -File "C:\nxlog-scripts\upload-to-gcs.ps1"。 - 点击确定。
- 在条件标签页中:
- 取消选中仅当计算机使用交流电源时才启动任务。
- 在设置标签页中:
- 选中在错过预定开始时间后尽快运行任务。
- 检查如果任务失败,则每隔:输入
5 minutes。
- 点击确定。
- 输入将运行任务的账号的凭据(必须具有管理员权限)。
- 点击确定。
测试上传流程
- 在 NPS 服务器上,打开任务计划程序。
- 在左侧面板中,展开任务计划程序库。
- 右键点击任务 NXLog GCS Upload,然后选择 Run。
- 等待几秒钟,让任务完成。
- 打开
C:\nxlog-scripts\upload.log中的日志文件,验证上传是否成功。 - 前往 GCP 控制台 > Cloud Storage > 存储分区。
- 点击您的存储桶名称 (
nps-logs-chronicle)。 - 转到
nps-logs/文件夹。 - 验证是否包含 NPS 日志的 JSON 文件。
启动 NXLog 服务
- 在 NPS 服务器上,打开服务(运行
services.msc)。 - 在列表中找到 nxlog 服务。
- 右键点击 nxlog 服务,然后选择启动。
- 验证服务状态是否为 Running。
- 如需验证 NXLog 是否正在收集日志,请检查 NXLog 日志文件:
C:\Program Files\nxlog\data\nxlog.log
查找表明日志收集成功的消息:
INFO im_file: monitoring file 'C:\Windows\System32\LogFiles\IN250315.log'
检索 Google SecOps 服务账号
Google SecOps 使用唯一的服务账号从您的 GCS 存储桶中读取数据。您必须授予此服务账号对您的存储桶的访问权限。
获取服务账号电子邮件地址
- 依次前往 SIEM 设置 > Feed。
- 点击添加新 Feed。
- 点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
Microsoft NPS Logs)。 - 选择 Google Cloud Storage V2 作为来源类型。
- 选择 MICROSOFT_NPS 作为日志类型。
点击获取服务账号。系统会显示一个唯一的服务账号电子邮件地址,例如:
```none chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com ```复制此电子邮件地址,以便在下一步中使用。
点击下一步。
为以下输入参数指定值:
存储桶网址:输入带有前缀路径的 GCS 存储桶 URI:
gs://nps-logs-chronicle/nps-logs/- 替换:
nps-logs-chronicle:您的 GCS 存储桶名称。nps-logs/:存储日志的前缀/文件夹路径。
- 替换:
- 来源删除选项:根据您的偏好选择删除选项:
- 永不:转移后永不删除任何文件(建议用于测试)。
- 删除已转移的文件:在成功转移后删除文件。
- 删除已转移的文件和空目录:成功转移后删除文件和空目录。
- 文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)
- 资产命名空间:资产命名空间
- 注入标签:要应用于此 Feed 中事件的标签
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
向 Google SecOps 服务账号授予 IAM 权限
- Google SecOps 服务账号需要您的 GCS 存储桶的 Storage Object Viewer 角色。
- 前往 Cloud Storage > 存储分区。
- 点击您的存储桶名称 (
nps-logs-chronicle)。 - 前往权限标签页。
- 点击授予访问权限。
- 提供以下配置详细信息:
- 添加主账号:粘贴 Google SecOps 服务账号电子邮件地址
- 分配角色:选择 Storage Object Viewer
点击保存。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| 版本 | additional.fields | 如果非空,则与相应对象合并 |
| 渠道 | additional.fields | |
| 关键字 | additional.fields | |
| 操作码 | additional.fields | |
| 任务 | additional.fields | |
| ThreadID | additional.fields | |
| EventData.%1 | additional.fields | |
| EventData.%2 | additional.fields | |
| 渠道 | channel.value.string_value | 直接复制值 |
| EventData.%1 | event_data_p1.value.string_value | 直接复制值 |
| EventData.%2 | event_data_p2.value.string_value | 直接复制值 |
| 关键字 | keywords.value.string_value | 直接复制值 |
| TimeCreated | metadata.event_timestamp | 从 UNIX_MS 转换为时间戳 |
| EventId | metadata.event_type | 如果 EventId == '4400',则设置为 STATUS_UNCATEGORIZED;如果 EventId == '13',则设置为 STATUS_UPDATE;否则设置为 GENERIC_EVENT |
| EventId | metadata.product_event_type | 直接复制值 |
| 操作码 | opcode.value.string_value | 直接复制值 |
| 计算机 | principal.asset.hostname | 从 principal.hostname 复制的值 |
| 计算机 | principal.hostname | 直接复制值 |
| ProcessID | principal.process.pid | 如果值不为空,则复制值 |
| UserId | principal.user.windows_sid | 使用正则表达式提取以获取 Windows SID |
| EventId | security_result.rule_name | 设置为“EventID: ”+ EventId |
| 级别 | security_result.severity | 转换后:INFO/Informational/Information/Normal/NOTICE 转换为 INFORMATIONAL,ERROR/Error 转换为 ERROR,WARNING/Warning 转换为 INFORMATIONAL,DEBUG 转换为 INFORMATIONAL,Critical 转换为 CRITICAL |
| 任务 | task.value.string_value | 直接复制值 |
| ThreadID | thread_id.value.string_value | 直接复制值 |
| 版本 | version.value.string_value | 直接复制值 |
| metadata.vendor_name | metadata.vendor_name | 设置为“Microsoft” |
| ProviderName | metadata.product_name | 直接复制值 |