收集 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 结算日志

  1. 在运行 NPS 的 Windows Server 上,打开服务器管理器
  2. 依次前往工具 > 网络策略服务器
  3. 在 NPS 控制台中,展开左侧导航栏中的会计
  4. 右键点击会计,然后选择配置会计
  5. 会计配置向导中,点击下一步
  6. 选择将日志记录到本地计算机上的文本文件,然后点击下一步
  7. 配置日志文件属性页面中,配置以下内容:
    • 目录:保留默认值 (%systemroot%\System32\LogFiles) 或指定自定义路径
    • 格式:选择 DTS 兼容(Microsoft 建议采用的结构化 XML 格式)
    • 创建新的日志文件:根据日志量选择每天每周
  8. 点击下一步
  9. 查看摘要并点击 Finish

启用 NPS 审核日志记录

  1. 在 NPS 服务器上以管理员身份打开命令提示符
  2. 运行以下命令以启用 NPS 审核日志记录:

    auditpol /set /subcategory:"Network Policy Server" /success:enable /failure:enable
    
  3. 验证审核政策是否已启用:

    auditpol /get /subcategory:"Network Policy Server"
    

在 NPS 服务器上安装和配置 NXLog

下载并安装 NXLog

  1. 在 NPS 服务器上,从 NXLog 网站下载 NXLog Enterprise Edition。
  2. 运行安装程序并按照安装向导操作。
  3. 接受默认安装路径 (C:\Program Files\nxlog) 或指定自定义路径。
  4. 完成安装。

配置 NXLog 以收集 NPS 日志

  1. 在 NPS 服务器上,前往 NXLog 配置目录:
    • 默认路径:C:\Program Files\nxlog\conf
  2. 以管理员权限在文本编辑器(例如记事本)中打开文件 nxlog.conf
  3. 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>
    
  4. 在该配置文件中,替换以下占位符:

    • your-gcs-bucket-name:您的 GCS 存储桶名称(在下一部分中创建)
    • 验证 LOGDIR 路径是否与 NPS 日志文件位置一致
  5. 保存文件。

创建 Google Cloud Storage 存储桶

  1. 前往 Google Cloud 控制台
  2. 选择您的项目或创建新项目。
  3. 在导航菜单中,依次前往 Cloud Storage > 存储分区
  4. 点击创建存储分区
  5. 提供以下配置详细信息:

    设置
    为存储桶命名 输入一个全局唯一的名称(例如 nps-logs-chronicle
    位置类型 根据您的需求进行选择(区域级、双区域、多区域)
    位置 选择营业地点(例如 us-central1
    存储类别 标准(建议用于经常访问的日志)
    访问权限控制 均匀(推荐)
    保护工具 可选:启用对象版本控制或保留政策
  6. 点击创建

为 NXLog 创建 GCS 服务账号

创建服务账号

  1. GCP 控制台中,依次前往 IAM 和管理 > 服务账号
  2. 点击创建服务账号
  3. 提供以下配置详细信息:
    • 服务账号名称:输入 nxlog-nps-uploader(例如)
    • 服务账号说明:输入 Service account for NXLog to upload NPS logs to GCS
  4. 点击创建并继续
  5. 向此服务账号授予对项目的访问权限部分中,添加以下角色:
    1. 点击选择角色
    2. 搜索并选择 Storage Object Creator
  6. 点击继续
  7. 点击完成

下载服务账号密钥

  1. 服务账号页面上,点击您刚创建的服务账号 (nxlog-nps-uploader)。
  2. 前往密钥标签页。
  3. 点击添加密钥 > 创建新密钥
  4. 选择 JSON 作为密钥类型。
  5. 点击创建
  6. JSON 密钥文件将下载到您的计算机。
  7. 将 JSON 密钥文件复制到 NPS 服务器上的以下位置:
    • C:\nxlog-credentials\gcs-service-account.json
  8. 创建目录 C:\nxlog-credentials(如果不存在)。

配置自动 GCS 上传

创建 PowerShell 上传脚本

  1. 在 NPS 服务器上,创建一个新目录:
    • C:\nxlog-scripts
  2. 在该目录中创建一个名为 upload-to-gcs.ps1 的新文件。
  3. 在文本编辑器中打开该文件,然后粘贴以下 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"
    
  4. 在脚本中,替换以下值:

    • $GcsBucket:您的 GCS 存储桶 URI(例如 gs://nps-logs-chronicle/nps-logs/
  5. 保存文件。

安装 Google Cloud SDK

  1. 在 NPS 服务器上,从 Google Cloud SDK 下载 Google Cloud SDK 安装程序。
  2. 运行安装程序并按照安装向导操作。
  3. 在安装过程中,如果尚未安装 Python,请选择安装捆绑的 Python
  4. 完成安装。
  5. 打开新的命令提示符,然后验证安装:

    gsutil version
    

创建用于自动上传的计划任务

  1. 在 NPS 服务器上,打开任务计划程序
  2. 在右侧面板中,点击创建任务
  3. 常规标签页中,配置以下内容:
    • 名称:输入 NXLog GCS Upload
    • 说明:输入 Upload NPS logs to Google Cloud Storage
    • 安全选项:选择无论用户是否已登录,都运行
    • 安全选项:选中以最高权限运行
    • 配置:选择 Windows Server 2016 或您的服务器版本
  4. 触发器标签页中:
    1. 点击 New(新建)。
    2. 开始任务:选择按计划
    3. 设置:选择每日
    4. 重复周期:输入 1 天。
    5. 重复任务的频率:选择每 15 分钟
    6. 的持续时间:选择无限期
    7. 点击确定
  5. 操作标签页中:
    1. 点击 New(新建)。
    2. 操作:选择启动程序
    3. 程序/脚本:输入 powershell.exe
    4. 添加实参:输入 -ExecutionPolicy Bypass -File "C:\nxlog-scripts\upload-to-gcs.ps1"
    5. 点击确定
  6. 条件标签页中:
    • 取消选中仅当计算机使用交流电源时才启动任务
  7. 设置标签页中:
    • 选中在错过预定开始时间后尽快运行任务
    • 检查如果任务失败,则每隔:输入 5 minutes
  8. 点击确定
  9. 输入将运行任务的账号的凭据(必须具有管理员权限)。
  10. 点击确定

测试上传流程

  1. 在 NPS 服务器上,打开任务计划程序
  2. 在左侧面板中,展开任务计划程序库
  3. 右键点击任务 NXLog GCS Upload,然后选择 Run
  4. 等待几秒钟,让任务完成。
  5. 打开 C:\nxlog-scripts\upload.log 中的日志文件,验证上传是否成功。
  6. 前往 GCP 控制台 > Cloud Storage > 存储分区
  7. 点击您的存储桶名称 (nps-logs-chronicle)。
  8. 转到 nps-logs/ 文件夹。
  9. 验证是否包含 NPS 日志的 JSON 文件。

启动 NXLog 服务

  1. 在 NPS 服务器上,打开服务(运行 services.msc)。
  2. 在列表中找到 nxlog 服务。
  3. 右键点击 nxlog 服务,然后选择启动
  4. 验证服务状态是否为 Running
  5. 如需验证 NXLog 是否正在收集日志,请检查 NXLog 日志文件:
    • C:\Program Files\nxlog\data\nxlog.log
  6. 查找表明日志收集成功的消息:

    INFO im_file: monitoring file 'C:\Windows\System32\LogFiles\IN250315.log'
    

检索 Google SecOps 服务账号

Google SecOps 使用唯一的服务账号从您的 GCS 存储桶中读取数据。您必须授予此服务账号对您的存储桶的访问权限。

获取服务账号电子邮件地址

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 点击配置单个 Feed
  4. Feed 名称字段中,输入 Feed 的名称(例如 Microsoft NPS Logs)。
  5. 选择 Google Cloud Storage V2 作为来源类型
  6. 选择 MICROSOFT_NPS 作为日志类型
  7. 点击获取服务账号。系统会显示一个唯一的服务账号电子邮件地址,例如:

    ```none
    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    ```
    
  8. 复制此电子邮件地址,以便在下一步中使用。

  9. 点击下一步

  10. 为以下输入参数指定值:

    • 存储桶网址:输入带有前缀路径的 GCS 存储桶 URI:

      gs://nps-logs-chronicle/nps-logs/
      
      • 替换:
        • nps-logs-chronicle:您的 GCS 存储桶名称。
        • nps-logs/:存储日志的前缀/文件夹路径。
    • 来源删除选项:根据您的偏好选择删除选项:
      • 永不:转移后永不删除任何文件(建议用于测试)。
      • 删除已转移的文件:在成功转移后删除文件。
      • 删除已转移的文件和空目录:成功转移后删除文件和空目录。
    • 文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)
    • 资产命名空间资产命名空间
    • 注入标签:要应用于此 Feed 中事件的标签
  11. 点击下一步

  12. 最终确定界面中查看新的 Feed 配置,然后点击提交

向 Google SecOps 服务账号授予 IAM 权限

  • Google SecOps 服务账号需要您的 GCS 存储桶的 Storage Object Viewer 角色。
  1. 前往 Cloud Storage > 存储分区
  2. 点击您的存储桶名称 (nps-logs-chronicle)。
  3. 前往权限标签页。
  4. 点击授予访问权限
  5. 提供以下配置详细信息:
    • 添加主账号:粘贴 Google SecOps 服务账号电子邮件地址
    • 分配角色:选择 Storage Object Viewer
  6. 点击保存

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 直接复制值

更新日志

查看相应解析器的更改日志

需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。