浏览器调教指南 - Chromium 篇 (Chrome/MSEdge)

前言

接着昨天的 浏览器调教指南 - Firefox 篇,今天介绍 Chromium 系浏览器的调教方法。 前文已经给出定义,不再赘述,本篇的重点显然是 Chrome/Chromium 和 MSEdge。 其他套壳浏览器不够「主流」,特性也不吸引我,绝大部分还没原版安全,自行解决。 不过文中的方法大概率通用,就是替换一下关键词的事儿。

Flags

在连篇累牍介绍 policy-templates 之前,先上点简单的开胃菜。 提到调教 Chromium,首先想到的肯定是 chrome://flags。

随便举几个例子 1

  • Anonymize local IPs exposed by WebRTC,隐私设置,但会影响 mDNS
  • Block insecure private network requests
  • Block scripts loaded via document.write,防范 PDF 中的脚本攻击
  • One time permission,类似 Android 的「仅允许一次」权限管理
  • Parallel downloading,多线程下载
  • Reduce Accept-Language request header,隐藏 UA 中的小版本号

除此之外值得一提的是很多 flags 都有对应的命令行参数,可以写在快捷方式 / Linux Desktop File 里,避免每次重装都要手动设置,具体列表参见 List of Chromium Command Line Switches

考虑到部分 flags(QUIC、ECH2 等)可以通过 policy-templates 设定,这里不再多讲。 况且 flags 本质还是测试中的功能,保不准哪天就删了。 而 policy-templates 面向企业用户,得罪金主自砸饭碗的事要少得多。

Policy Template

在 Firefox 篇的对应小节我曾提到,Chromium 系的 policy-templates 方法不够通用,详细解释一下:

  1. 不同浏览器 policy-templates 存放路径不一样(废话),而 Chromium 套壳满地都是,企业部署方案修改起来牵一发而动全身
    • Chrome 存放在 /etc/opt/chrome/policies
    • Chromium 存放在 /etc/chromium/policies
    • MSEdge、Vivaldi、Brave、Arc、Yandex 各有各的地盘……
  2. 同一个浏览器,安装源(发行版的软件包管理器、Snap、Flatpak 等)不同,存放路径也可能不同。前文已经提及,不再赘述。
  3. 同一个浏览器在不同平台的部署方式不一样(虽然也是废话,但人家 Firefox 就一样)
    • Linux 用 JSON
    • Windows 用注册表或者组策略 3
    • macOS 又用 profile manager,并且使用 Apple 莫名其妙的 plist 格式
  4. 同一个浏览器,不同更新通道,可用策略不一样(废话),所以使用的模板也不一样
    • 以 Chrome 为例,Stable/Beta/Dev,各有各的模板
    • 这听起来可能没什么,主要 Chrome/Chromium 的 policy-templates 是一个 超大压缩包,虽然也有网页版,但使用体验远不如前者,而且还没有翻译(压缩包版本有),也没有更新日志 4,多通道并存的情况下很容易陷入版本管理地狱
  5. 由于 Chromium 系浏览器在很多系统都有大量用户,像 Chrome OS 乃至 Android 都有独立的解决方案,此外还支持分级配置,复杂场景的解决方案很复杂,当然,个人使用基本碰不到这类问题

分级配置

简单来说分为两种,Managed v.s. Recommended:

  • 前者会强制锁定某一设置,用户不能修改
  • 后者则仅设置推荐的默认值,允许用户修改,但修改后会提醒与组织要求冲突
  • 此外,有的策略只能配置为强制实施,不能推荐……

听起来是不是很麻烦?在 Firefox 通过 user.js(等同于推荐)和 autoconfig(等同于强制)实现,类似烦恼会大大减少╮(╯_╰)╭

示例

实话实说我觉得讲到这里就可以了,点到为止,后面的示例也就是画龙点睛。

讲解示例之前先说几个坑:

  • 使用注册表配置 Windows 上的 Chromium 系浏览器时要注意,.reg 文件的编码是 UTF-16-LE
  • 如果通过 git 管理 policy-templates,不能通过 .gitattibutes 自动设置 EOL,不然注册表大概率会炸
  • Linux 要注意配置文件的权限,我在部署脚本最后移除了目录的写入权限
#!/bin/bash
# Setup Google Chrome/Chromium policies on GNU/Linux

# Configure path
POLICY_PATH="/etc/chromium/policies"
# POLICY_PATH="/etc/opt/chrome/policies"

...

# Restrict permission
sudo chmod -w ${POLICY_PATH}/managed
sudo chmod -w ${POLICY_PATH}/recommended
  • 配置结果可以在 chrome://policy 查看,Status 都是 OK 就 OK 了
  • 最后这个倒也不算坑,不如说是 Firefox 的坑,在 Chromium 系的 policy-templates 是可以写注释的!

允许 ManifestV2 扩展

先来个实用的,Chrome 127 开始逐步停用基于 ManifestV2(下称 MV2,类推可得 MV3)的扩展(比如 uBlock Origin),通过注册表允许继续使用 MV2 扩展的文章铺天盖地,不过多解释,直接上配置。

Linux Chromium,强制允许全部 ManifestV2 扩展 5

{
    // /etc/chromium/policies/managed/managed-policies.json
    "ExtensionManifestV2Availability": 2
}

Windows Chrome/Chromium/MSEdge 的注册表(看这前缀就知道麻烦了吧= =,一样的内容要写三遍),保存为 ChromeExtensionManifestV2Availability_On.reg 然后导入即可:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]
"ExtensionManifestV2Availability"=dword:00000002

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Chromium]
"ExtensionManifestV2Availability"=dword:00000002

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge]
"ExtensionManifestV2Availability"=dword:00000002

配置插件

第二个示例和 Firefox 篇一样,通过 ExtensionAllowedTypesExtensionInstallForcelist 配置插件:

{
    "ExtensionAllowedTypes": [
        "extension",
        // "theme",
        "user_script",
        "hosted_app",
        "legacy_packaged_app",
        "platform_app"
    ],
    "ExtensionInstallForcelist": [
        "cjpalhdlnbpafiamejdnhcphjbkeiagm",
        "njdfdhgcmkocbgbhcioffdbicglldapd",
        "jinjaccalgkegednnccohejagnlnfdag",
        "hlkenndednhfkekhgcdicdfddnkalmdm"
    ]
}

这部分和 Firefox 篇差不多,就没什么好说的,知道可以写注释即可。 这里我也只是简单配置了允许的扩展类型和强制安装 4 个扩展。

Windows 注册表写法稍微有点不一样,但也是一目了然,同样支持注释:

Windows Registry Editor Version 5.00
; chrome version: 127

[HKEY_LOCAL_MACHINE\Software\Policies\Chromium\ExtensionAllowedTypes]
"1"="extension"
; "2"="theme"
"2"="user_script"
"3"="hosted_app"
"4"="legacy_packaged_app"
"5"="platform_app"

[HKEY_LOCAL_MACHINE\Software\Policies\Chromium\ExtensionInstallForcelist]
"1"="cjpalhdlnbpafiamejdnhcphjbkeiagm"
"2"="njdfdhgcmkocbgbhcioffdbicglldapd"
"3"="jinjaccalgkegednnccohejagnlnfdag"
"4"="hlkenndednhfkekhgcdicdfddnkalmdm"

需要注意,部分应用程序(游戏为主)本身基于浏览器,配置 ExtensionAllowedTypes 可能会影响正常运行。 举个例子,比如烂大街的 RPG Maker、TyranoScript 和新兴 gal 引擎 WebGal,底层无非就是 Electron/NW.js,有的可能干脆用更底层的 V8(比较少见),在导出游戏时可能没有自带的浏览器, 这时则会调用系统已有的浏览器,那么自然也会受 policy-templates 制约 6

这种时候,可以写个批处理删除对应注册表,临时放行,结束之后再重新导入,或者直接不配置这一项。 随手写的脚本,保存为 allow-nwjs-game.bat 使用管理员权限运行即可:

@echo off
echo "Delete reg to allow Electron/NW.js..."

reg delete "HKEY_LOCAL_MACHINE\Software\Policies\Chromium\ExtensionAllowedTypes" /f
reg delete "HKEY_LOCAL_MACHINE\Software\Policies\Google\Chrome\ExtensionAllowedTypes" /f
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\ExtensionAllowedTypes" /f
if %errorlevel%==0 (
    echo ExtensionAllowedTypes policy deleted.
) else (
    echo ExtensionAllowedTypes policy deletion failed!
)

pause

搜索引擎

Chromium 系的搜索引擎我没搞定,不过本来添加就很方便,其他配置感觉都很简单。 误会一场,我想添加的「搜索引擎」在 Chromium 中其实叫 Site search,所以我应该配置的是 SiteSearchSettings,而不是 DefaultSearchProvider(策略组,包含有搜索引擎相关的一系列策略),我说怎么折腾半天也不行……

如果搞定了 Firefox ESR 的搜索引擎配置,Chromium 不要太简单,就是高考难度降级到小学生看图写话。 唯一的潜在难点就是 Windows 用注册表配置的情况,但根据 Complex policies on Windows,实际上 Chromium 已经支持直接读取注册表中的 JSON,所以下面的内容可有可无,不这么写也无所谓,照样可以导入。

[HKEY_LOCAL_MACHINE\Software\Policies\Chromium\SiteSearchSettings\1]
"featured"=dword:00000001
"name"="DuckDuckGo"
"shortcut"="d"
"url"="https://lite.duckduckgo.com/lite?q={searchTerms}"

[HKEY_LOCAL_MACHINE\Software\Policies\Chromium\SiteSearchSettings\2]
"name"="ピクシブ百科事典"
"shortcut"="pixiv"
"url"="https://dic.pixiv.net/search?query={searchTerms}"

顺带一提,featured 只是额外支持通过 @d 触发搜索,但限制三个,而且其实直接 d + Tab 更快……

另外,MSEdge 不支持配置 site search,由于已经卸载 Edge,没有验证是完全没有这功能还是故意阉割 policy-templates,以便强推 New Bing 和 Copilot。

Cookies

最后介绍一下 Cookies 配置,这里只给 Linux Chromium 版本。

recommended-policies.json:

{
    "BlockThirdPartyCookies": true
}

这里特地把屏蔽第三方 cookies 写成推荐,防止你读到这里忘了还有 #分级配置 的设定。

managed-policies.json:

{
    "CookiesAllowedForUrls": [
        "*,https://drive.google.com",
        "https://steampowered.com,https://steamcommunity.com",
        "*,https://*.sharepoint.com",
        "*,https://[*.]live.com",
        "https://[*.]dlsite.com,https://www.nijiyome.jp"
    ],
    "DefaultCookiesSetting": 4
}

DefaultCookiesSetting4 代表浏览器窗口关闭即失效,cookies 不会一直保存。

CookiesAllowedForUrls 略复杂,但比 Firefox 的 SearchEngines 简单多了。 这里需要填两个 URL,允许前者 cookies 在后者使用。

结合上面的例子详细讲一下:

  • "*,https://drive.google.com",最常用的一种,在 Google Drive 允许第三方 cookies,可以用通配符
  • "https://steampowered.com,https://steamcommunity.com",比上面一种复杂,在 Steam 社区允许 Steam 商店的 cookies,从而解决 V 社十多年一直懒得搞的 CORS 跨域问题……不需要因为默认屏蔽了第三方 cookies 而重新登录一次
  • "*,https://*.sharepoint.com",可以同时用通配符匹配各种 SharePoint 二级域名,但显然不能 *,*
  • "*,https://[*.]live.com",也可以使用 [*.] 来同时匹配 *.live.comlive.com,解决一级/二级域名混用的网站
  • "https://[*.]dlsite.com,https://www.nijiyome.jp"(不要瞎点,NSFW 警告)在 DLsite 姊妹站にじ GAME 允许来自 DLsite 的 cookies,和 Steam/OneDrive 的例子差不多,但是这里 [*.] 通配符用在第一个 URL

看到这里,你大概能理解 Firefox 篇#吐槽 的内容。

MSEdge

由于 MSEdge 越更越烂 7,塞了一堆有的没的功能,我已经弃用,以下内容仅供参考。 其实 MSEdge 和 Chromium 在定制化层面差不多,多了几个 flags,少了几个 policy-templates。

Flags

大差不差,随便写几个:

  • Boost screen refresh rate when scrolling,动态刷新率(即 VRR),需要显示器支持
  • Omnibox UI Hide Steady-State URL Trivial Subdomains,禁用之后就能恢复正常的地址栏完整 URL
  • Show block option in autoplay settings,为数不多的好东西,可以屏蔽自动播放,Firefox/Chromium 默认的「屏蔽」只针对有声音的视频……
  • PlayReady DRM for Windows 和 Widevine DRM,解锁高清流媒体,其他浏览器默认只能 720p/1080p,虽然也不是不能看,但和 4K 双杜比肯定比不了

Policy Template

实际配置真差不多,有两点可以表扬:

  1. 扩展稳定渠道,类似 Firefox ESR,偶数为功能更新,奇数为安全更新
  2. 可以设置单独的 Microsoft Edge - 更新策略

好话言尽于此,可以开始骂了。

EdgeUpdate 这东西本身体验就一言难尽,开发者回复不能手动触发的 bug 表示只能通过计划任务触发你敢信?再加上永远有残留安装包和多版本并存死活不肯卸载旧版的 EdgeWebView,整个 Edge 生态在我看来非常畸形。这都可以用脚本解决,关键切换到 Chromium 内核还把我最爱的 PDF 阅读器砍了🙄

此外 M$ 还喜欢掩耳盗铃,Microsoft Edge - 策略的 附加部分 多列了许多配置项,给人感觉好像比 Chromium 多做了很多工作,实际上只是混淆视听,大多数在 Chromium 存在的内容被刻意挪到这里。由于 Edge 策略是分组的,不像 Firefox 那样直接按字母排序,看到最后这部分很容易被诱导。

更阴险的是,很多 Edge 特有的无用功能也都被特地放到这部分,比如 DALL-E 主题生成、必应搜索结果的广告 8、AI 文本生成、集锦、没卵用的电子钱包和更没卵用的 E-tree🤬各种遥测更是防不胜防……

跑题了,浏览器扩展可以从 Edge 商店安装,也可以 Chrome 商店安装,具体可以参考 在企业中管理 Microsoft Edge 扩展,不过坑也不少:

  • 指定从 Chrome 商店安装扩展,始终会报错,企业用户也吐槽好多回,但是死不悔改
  • UpdateURL
    • https://edge.microsoft.com/extensionwebstorebase/v1/crx
    • https://clients2.google.com/service/update2/crx

结语

受限于 Google 的广告业务,Chromium 系本身的调教手段着实有限。做到文中这些虽然算不上杯水车薪,但也只能在一定程度上改善浏览器体验。最好还是早日投入 Firefox ESR 的怀抱,享受极致的调教体验。


  1. Flags 会经常变动,这里列举的仅保证在 Chromium 127 有效 ↩︎

  2. Encrypted ClientHello,Mozilla/Cloudflare 等发布的 TLS1.3 扩展,可以简单理解为(但不等同于)加密的 SNI,详见 MozillaWiki ↩︎

  3. 前文同样提及了使用组策略(GPO)需要加入域的问题,对纯离线环境很不友好,个人使用(而非企业批量部署)建议还是注册表,简单粗暴 ↩︎

  4. MSEdge 会在 Microsoft Security Baselines Blog 定期发布日志, 但一样得单独下载  Microsoft Security Compliance Toolkit 才能查看具体的新增内容,GPO 全是 XML 格式,更新表格同时还用的 Excel 现在策略页面直接就会显示新策略和过时策略,很棒的改动👍 ↩︎

  5. 实际上这里你可以把 2 改成 3(只允许强制安装的 MV2 扩展),某种意义上更安全。不过这样一来,没有通过 policy-templates 强制安装的 MV2 扩展仍然会被禁用,并且提示 blocked by policy ↩︎

  6. 话虽如此,但归根结底还是游戏引擎没有考虑到这种情况,policy-templates 本身并没有问题 ↩︎

  7. 这点在 Windows Server 2022 LTSC 上尤为显著,预装的 MSEdge 86 还是挺好用的,升级到 127 之后页面就塞满各种神鬼妖魔 ↩︎

  8. BingAdsSuppression 无耻程度简直惊天地泣鬼神,无广告搜索体验的前提是强制安全搜索设置为「严格」 ↩︎

Vinfall's Geekademy

Sine īrā et studiō