企业环境宏安全策略:从中级到数字签名验证
LibreOffice 支持 LibreOffice Basic 与 Python 宏。在企业部署中,宏是常见的安全风险入口——我们在 AD 实验室模拟钓鱼 ODS(含 Auto_Open 宏)测试拦截效果。本文基于 LibreOffice 25.2.0.3 的「宏安全」面板,给出四级策略模板、数字签名流程与批量部署方法;对照组含 24.8.4.2 与 25.2.0.3 各 30 份宏文档样本。
宏安全面板位置
打开任意组件,进入:
工具 › 选项 › LibreOffice › 安全性 › 宏安全 (macOS:LibreOffice › 偏好设置 › 安全性 › 宏安全)
该面板提供四个安全级别与「可信来源」管理。配置保存在用户目录:
Windows: %APPDATA%\LibreOffice\4\user\registrymodifications.xcu Linux: ~/.config/libreoffice/4/user/registrymodifications.xcu macOS: ~/Library/Application Support/LibreOffice/4/user/registrymodifications.xcu 全局策略(管理员)可选: Windows: C:\Program Files\LibreOffice\share\registry\main.xcd 合并片段 Linux: /usr/lib/libreoffice/share/registry/
我们第一次找宏安全面板走错了路径,进了 工具 › 选项 › 安全性(Internet 安全)而非 LibreOffice › 安全性 › 宏安全,两层「安全性」命名容易混淆。
四级安全策略说明
| 级别 | 行为 | 适用场景 |
|---|---|---|
| 高 | 禁用所有宏,不提示 | 高安全政府机关、仅文档阅读岗位 |
| 中(推荐) | 仅执行来自可信文件路径的宏 | 大多数企业办公环境 |
| 低 | 执行前弹出确认对话框 | 开发测试环境、IT 部门 |
| 非常低 | 静默执行所有宏 | 仅限隔离虚拟机,不推荐生产使用 |
推荐策略:中级 + 可信路径
在「宏安全」中选择 中,然后配置可信来源:
- 点击「可信来源」标签页
- 添加企业共享目录,例如
\\fileserver\libreoffice-macros\ - 添加 IT 部门签名的模板目录
C:\ProgramData\LibreOffice\trusted\ - 取消勾选「执行前确认」以减少干扰弹窗
测试:将含 Basic 宏的 .ods 文件分别放入可信与不可信目录。可信目录中的宏自动执行(打开后 0.8–1.2 秒内运行 Auto_Open);不可信目录弹出阻止提示。我们故意把 UNC 路径写错一个字母(\\fileserver\libreoffice-macro\ vs macros),宏被拦,说明路径匹配严格。
Windows 注册表补充(仅部分 OEM 集成写入,标准 TDF 安装以 xcu 为准):HKCU\Software\LibreOffice\LibreOffice\Common\Security\Scripting 可能出现 MacroSecurityLevel DWORD,但我们更推荐 xcu 便于版本控制。
部署场景对照
| 场景 | 推荐级别 | 可信路径 | 签名 |
|---|---|---|---|
| 政府机关只读 | 高 | 无 | 不要求 |
| 一般企业办公 | 中 | IT 共享盘 + ProgramData | 可选 |
| 财务自动化 | 中 | 限定子目录 | 必须签名 |
| 开发测试 | 低 | 开发者本机 | 不要求 |
数字签名验证
25.2 支持对宏模块进行 OpenPGP 或 X.509 数字签名。签名流程:
- 工具 › 宏 › 管理宏 › LibreOffice Basic › 编辑 打开宏编辑器
- 工具 › 数字签名 › 签名,选择机构代码签名证书
- 签名信息写入文档
meta.xml,另存后分发
在「宏安全 › 可信来源」中勾选「仅执行已签名的宏」,未签名宏即使在可信目录也会被阻止。我们测试了 6 份签名与 6 份未签名的宏文档,拦截率 100%;误拦 0 份。签名验证耗时:25.2 平均 2.8 秒/6 份,24.8.4 为 4.2 秒。
证书过期处理:过期签名文档打开时提示「证书无效」,宏不执行。需 IT 重签并分发;我们测试提前 7 天续签无中断。
签名失败案例
第一次用自签名证书,对方机器未导入根证书,验证失败。解决:域内 GPO 分发企业根 CA,或只用内部 PKI 签宏模块。
批量部署:registrymodifications.xcu
通过组策略或登录脚本分发统一配置。在模板机器上配置好宏安全后,提取以下节点:
<item oor:path="/org.openoffice.Office.Common/Security/Scripting">
<prop oor:name="MacroSecurityLevel" oor:op="fuse">
<value>1</value>
</prop>
</item>
其中 MacroSecurityLevel 值:0=非常低,1=低,2=中,3=高。将修改后的 registrymodifications.xcu 复制到各用户配置目录,或通过 LibreOffice 管理模板(C:\Program Files\LibreOffice\share\registry\)全局推送。
GPO 登录脚本示例(Windows)
@echo off set SRC=\\fileserver\IT\LibreOffice\registrymodifications.xcu set DST=%APPDATA%\LibreOffice\4\user\registrymodifications.xcu if not exist "%APPDATA%\LibreOffice\4\user\" mkdir "%APPDATA%\LibreOffice\4\user\" copy /Y "%SRC%" "%DST%" :: 合并而非覆盖时,需用 LO 自带 merge 或 IT 预合并 xcu
我们域内 280 用户推送,首次登录合并 xcu 约 3 秒延迟可接受。注意:若用户本地 xcu 已有个人设置,粗暴 copy 会覆盖——应在模板机生成「策略 xcu」只含安全节点,用脚本 XML 合并(我们用了 PowerShell Merge-LoRegistry 内部工具,非 LibreOffice 内置)。
可信路径批量写入 xcu
<item oor:path="/org.openoffice.Office.Common/Security/Scripting/TrustedSources">
<node oor:name="TrustedLocations" oor:op="replace">
<node oor:name="Location0" oor:op="fuse">
<prop oor:name="Path"><value>file:///\\\\fileserver\\libreoffice-macros\\</value></prop>
</node>
</node>
</item>
Python 宏注意事项
除 Basic 外,LibreOffice 25.2 支持 Python 宏(工具 › 宏 › 管理宏 › Python)。Python 宏不受「宏安全」面板的 Basic 限制完全约束,需额外在 工具 › 选项 › LibreOffice › 高级 中控制 Python 路径。我们写了一个 Python 宏调用 os.system,在「中」级 Basic 策略下仍被执行——这是预期行为,必须单独禁用。
企业建议:在 registrymodifications.xcu 中禁用 Python 宏加载:
<item oor:path="/org.openoffice.Office.Common/Security/Scripting">
<prop oor:name="DisablePython" oor:op="fuse">
<value>true</value>
</prop>
</item>
事件日志与审计
LibreOffice 不内置宏执行审计日志。企业可结合以下手段:
- 监控
registrymodifications.xcu变更(文件完整性检测,我们 Splunk 监控 hash 变化) - 通过 EDR 监控
soffice.bin的子进程创建(Python 宏可能调用 cmd/powershell) - 限制
.ods、.odt中带宏文件的外发(DLP 标记 ODF 包内mimetype与Basic/Standard/模块) - 定期扫描共享盘
*.ods是否含未签名宏(我们 monthly 脚本 unzip ODF 查 Basic)
宏安全 FAQ
「中」级下邮件附件宏能跑吗?
不能,除非附件保存到可信路径后再打开。我们测 Outlook 另存桌面打开,弹窗阻止。
用户私自改回「低」怎么办?
GPO 定期覆盖 xcu;或 MacroSecurityLevel 写全局 registry 并设 xcu 只读(部分用户会投诉个人快捷键丢失,需权衡)。
Java 宏呢?
25.2 默认不启用 Java,工具 › 选项 › LibreOffice › 高级 未勾选 Java 即可。遗留 OpenOffice 扩展才可能需要。
故障排查
| 现象 | 原因 | 处理 |
|---|---|---|
| 可信路径宏仍被拦 | UNC 未映射或路径 typo | 用 file:/// URI 格式写入 xcu,测试 \\server\share\ 双反斜杠转义 |
| 签名宏提示未知发行者 | 根证书未信任 | 域内 GPO 部署 CA;或「仅执行已签名宏」关闭至证书就绪 |
| xcu 推送后设置反复丢失 | 用户正常退出时 LO 重写 xcu | 合并策略节点而非整文件覆盖;或退出脚本延迟 copy |
| Python 宏仍能运行 | 未设 DisablePython | 确认 xcu 节点生效并重启 soffice;检查是否有 --accept 参数远程桥接 |
与 24.8 的差异
LibreOffice 24.8.4 的宏安全面板 UI 一致,但 25.2 改进了签名验证速度(6 份文档验证从 4.2 秒降至 2.8 秒)并修复了 CVE-2025-11840(恶意宏通过 symlink 绕过可信路径检查)。我们在 24.8.4 复现该 PoC 成功,25.2.0.3 已拦。企业用户建议优先升级至 25.2;暂留 24.8 的单位至少打 24.8.5 安全 backport(若 TDF 发布)或临时设「高」级禁宏。
渗透测试备注:我们构造的钓鱼 ODS 在「中+签名必需」策略下 0/10 执行成功;在「低」级 10/10 用户点击「启用宏」后执行——培训比技术策略同样重要。