追踪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设备的日志吗?当您无法物理访问设备故障,或者您太舒服而不想走过办公室时,此强大功能非常适合对设备问题进行故障排除。
- 登录Microsoft Intune管理中心
- 导航到"设备 > macOS > 脚本"并选择macOS shell脚本
- 在设备状态报告中,选择目标设备
- 选择"收集日志”
- 输入要收集的路径
- 示例:/Library/Logs/Microsoft/IntuneScripts/mdatp/pua_policy.log
- 单击"确定"启动收集
调试模式:深入了解
两个脚本都包含有用的调试模式,可以通过简单的环境变量激活:
1
|
sudo DEBUG=1 bash ./enhanced_mdatp_pua.sh
|
在调试模式下,您将看到大量信息打印到控制台。
替代方案考虑
是否有其他方法可以监控Defender策略?是的,但每个都有局限性:
- Microsoft Defender for Endpoint(高级搜寻)门户:显示当前合规状态但缺乏详细(历史)更改跟踪
- Microsoft Sentinel:可以收集和分析Defender日志但需要额外的许可和设置复杂性
- 第三方监控工具:通常成本高昂,可能与Intune集成不够无缝
结论
通过实施此双脚本解决方案,我们从对Defender PUA策略不确定的状态转变为拥有完整的可见性和更改跟踪。当策略意外更改时,我们可以看到:
- 哪些设备受到影响
- 更改发生的时间
- 更改内容(从什么到什么)
调查仍在继续,我们的脚本站岗放哨,确保没有策略更改被忽视或未记录。