使用Intune自定义属性追踪Microsoft Defender PUA策略变更

本文详细介绍如何通过双脚本方案监控macOS设备上Microsoft Defender潜在不受欢迎应用(PUA)策略的意外变更,包含完整的Bash脚本实现和Intune集成方案,解决企业环境中的安全配置漂移问题。

追踪Microsoft Defender PUA策略变更与Intune自定义属性

在端点安全不断演变的战场上,Microsoft Defender for Endpoint作为警惕的守护者,抵御着不断上升的网络威胁。但即使是最好的守护者有时也会有点……健忘。当您的Microsoft Defender PUA策略设置在macOS设备上开始神秘更改时会发生什么?

不断变化的PUA策略之谜

在您拉响安全警报之前——别担心!我们已在多个租户中测试,这种情况仅发生在特定租户中,强烈表明这是独特的配置问题,而非广泛存在的错误或安全风险。

问题描述

设想这样一个场景:您已在macOS设备群中配置并部署了Microsoft Defender for Endpoint PUA策略(潜在不受欢迎应用程序)。一切运行顺利,直到某天,您偶然注意到某些设备的设置与通过Intune部署的设置不同。您未进行任何策略更改,但设置却自行漂移了。

经过调查,我们发现某些macOS设备上的Microsoft Defender PUA策略会偶尔在"audit"和"off"模式之间切换,无需管理员干预。

解决方案挑战

Intune本身不提供设备级别策略更改的详细历史跟踪,因此我们需要一种方法来:

  • 监控每个设备上的当前PUA策略状态
  • 跟踪配置更改发生的时间
  • 将这些信息报告回Intune以供查看

双脚本解决方案

为解决这一挑战,我开发了一个双脚本系统,共同提供PUA策略变更的全面跟踪:

增强的MDATP策略检查器:侦探

第一个脚本负责检查Microsoft Defender PUA策略的当前状态并维护更改历史记录。

核心功能

该脚本执行多项功能:

  • 验证Microsoft Defender进程是否正在运行
  • 定位并验证MDATP命令行工具
  • 检索当前Microsoft Defender PUA策略配置
  • 记录当前状态和更改历史

脚本核心

核心功能围绕运行mdatp threat policy list命令并分析其输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#-------------------------------------------------------------------------------
# Function: analyze_pua_configuration
# Purpose: Analyze the PUA configuration from the threat policy
# Uses global variable PUACHECK
#-------------------------------------------------------------------------------
analyze_pua_configuration() {
    log "INFO" "Analyzing PUA configuration"
    
    if echo "$PUACHECK" | grep -q "Threat type: potentially_unwanted_application"; then
        # PUA policy exists, determine the action setting
        if echo "$PUACHECK" | grep -q "Action: audit"; then
            log "INFO" "PUA status: Audit (PUAs are detected but not blocked)"
            
            # Store for historical tracking
            echo "$(date +"%Y-%m-%d %H:%M:%S") - PUA_ACTION=audit" >> "$POLICY_FILE"
            echo "audit" > "$CURRENT_POLICY_FILE"
            
            if [ "$DEBUG" -eq 1 ]; then
                echo "=== Enhanced MDATP Policy & Health Checker Completed Successfully ==="
            fi
            
            echo "PASSED: PUA in Audit Mode"
            return 0
        elif echo "$PUACHECK" | grep -q "Action: block"; then
            log "INFO" "PUA status: Block (PUAs are actively blocked)"
            
            # Store for historical tracking
            echo "$(date +"%Y-%m-%d %H:%M:%S") - PUA_ACTION=block" >> "$POLICY_FILE"
            echo "block" > "$CURRENT_POLICY_FILE"
            
            if [ "$DEBUG" -eq 1 ]; then
                echo "=== Enhanced MDATP Policy & Health Checker Completed Successfully ==="
            fi
            
            echo "PASSED: PUA in Block Mode"
            return 0
        else
            log "WARNING" "PUA status: Unknown (policy exists but action is undefined)"
            
            # Store for historical tracking
            echo "$(date +"%Y-%m-%d %H:%M:%S") - PUA_ACTION=unknown" >> "$POLICY_FILE"
            echo "unknown" > "$CURRENT_POLICY_FILE"
            
            if [ "$DEBUG" -eq 1 ]; then
                echo "=== Enhanced MDATP Policy & Health Checker Completed with Warnings ==="
            fi
            
            echo "FAILED: PUA status Unknown"
            return 1
        fi
    else
        log "WARNING" "No PUA configuration found"
        
        # Store for historical tracking
        echo "$(date +"%Y-%m-%d %H:%M:%S") - [WARNING] No PUA configuration found" >> "$POLICY_FILE"
        echo "NOT_CONFIGURED" > "$CURRENT_POLICY_FILE"
        
        if [ "$DEBUG" -eq 1 ]; then
            echo "=== Enhanced MDATP Policy & Health Checker Completed with Warnings ==="
        fi
        
        echo "FAILED: PUA Not Configured"
        return 1
    fi
}

此代码片段显示脚本如何提取PUA策略操作(audit/block/off)并以两种不同方式存储:

  • 在维护所有检查记录的历史日志中
  • 在仅包含最新值的当前状态文件中

日志文件

脚本维护多个日志文件,每个都有特定用途:

  • 主日志(${SCRIPT_NAME%.*}.log):包含所有常规脚本执行信息
  • 错误日志(${SCRIPT_NAME%.*}_error.log):仅包含错误以便于故障排除
  • 策略历史日志(pua_policy.log):所有策略状态和更改的历史记录
  • 当前策略文件(current_pua_policy.txt):仅包含最新策略状态

自定义属性脚本:报告器

第二个脚本是我们的报告器,将侦探的发现转化为Intune管理员的可操作情报。

核心功能

此自定义属性脚本:

  • 从第一个脚本创建的日志文件中读取当前策略状态
  • 将其与先前状态进行比较以检测更改
  • 为Intune的自定义属性系统格式化信息
  • 维护更改发生时间的记录

脚本核心

此脚本最关键的部分是其变更检测和报告逻辑:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Format output for Intune Custom Attribute
debug "Formatting output for Intune Custom Attribute"
if [ "$PREVIOUS_STATE" = "INITIAL_CHECK" ]; then
    debug "Initial check - reporting current state only"
    echo "PUA_Policy=$CURRENT_STATE"
elif [ "$CURRENT_STATE" != "$PREVIOUS_STATE" ]; then
    debug "State change detected - reporting change"
    echo "PUA_Policy=Changed from $PREVIOUS_STATE to $CURRENT_STATE on $(date '+%Y-%m-%d')"
else
    debug "No change in state - reporting with last change date"
    echo "PUA_Policy=$CURRENT_STATE (unchanged since $(date -r "$PREVIOUS_STATE_FILE" '+%Y-%m-%d'))"
fi

这种优雅而简单的逻辑处理三种不同场景:

  • 首次运行:仅报告当前状态
  • 检测到更改时:报告更改内容和时间
  • 无更改:报告当前状态和最后修改时间

弹性回退机制

如果我们的主要数据源出现问题怎么办?自定义属性脚本包含智能回退机制:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# First check if the current policy file exists and has content
if [ -f "$CURRENT_POLICY_FILE" ] && [ -s "$CURRENT_POLICY_FILE" ]; then
    local current_state=$(cat "$CURRENT_POLICY_FILE")
    debug "Found current policy file with state: $current_state"
    echo "$current_state"
    return
fi

debug "Current policy file not found, checking policy log file"

# Fallback to parsing the log file if current policy file is unavailable
if [ ! -f "$POLICY_FILE" ]; then
    debug "Policy log file not found, returning NOT_CONFIGURED"
    echo "NOT_CONFIGURED"
    return
fi

脚本协作方式

此解决方案的优点在于这两个脚本如何协同工作:

  • 增强的MDATP脚本定期运行(例如每15分钟/1小时/3小时),检查Defender的PUA配置并记录结果
  • 自定义属性脚本由Intune在收集自定义属性时执行,读取第一个脚本创建的日志并报告更改

这种任务分离创建了一个系统,其中:

  • 繁重的工作在设备本地完成
  • 只有汇总的结果报告回Intune
  • 完整的历史记录保留在macOS设备上以供故障排除

Intune中的显示内容

部署脚本后,管理员将在Intune控制台的"设备 > macOS > 自定义属性 > [pua_custom_attribute_script]“下看到:

这提供了以下可见性:

  • 每个设备上的当前策略状态
  • 策略更改的时间
  • 脚本本身是否正常工作

使用Intune远程收集macOS日志

您知道可以使用Microsoft Intune远程收集macOS设备的日志吗?当您无法物理访问设备故障,或者您太舒服而不想走过办公室时,此强大功能非常适合对设备问题进行故障排除。

  1. 登录Microsoft Intune管理中心
  2. 导航到"设备 > macOS > 脚本"并选择macOS shell脚本
  3. 在设备状态报告中,选择目标设备
  4. 选择"收集日志”
  5. 输入要收集的路径
  6. 示例:/Library/Logs/Microsoft/IntuneScripts/mdatp/pua_policy.log
  7. 单击"确定"启动收集

调试模式:深入了解

两个脚本都包含有用的调试模式,可以通过简单的环境变量激活:

1
sudo DEBUG=1 bash ./enhanced_mdatp_pua.sh

在调试模式下,您将看到大量信息打印到控制台。

替代方案考虑

是否有其他方法可以监控Defender策略?是的,但每个都有局限性:

  • Microsoft Defender for Endpoint(高级搜寻)门户:显示当前合规状态但缺乏详细(历史)更改跟踪
  • Microsoft Sentinel:可以收集和分析Defender日志但需要额外的许可和设置复杂性
  • 第三方监控工具:通常成本高昂,可能与Intune集成不够无缝

结论

通过实施此双脚本解决方案,我们从对Defender PUA策略不确定的状态转变为拥有完整的可见性和更改跟踪。当策略意外更改时,我们可以看到:

  • 哪些设备受到影响
  • 更改发生的时间
  • 更改内容(从什么到什么)

调查仍在继续,我们的脚本站岗放哨,确保没有策略更改被忽视或未记录。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计