Firefox 隐私加固:基础篇

2020年05月30日 • 更新于 2020年06月15日

本文只关注浏览器的隐私保护,与去广告无关。我使用 Firefox 的最新版,享受所有新特性,所以旧版本和 ESR 版本不在我的讨论范围之内。虽然本文主要针对 Firefox 提供建议,但是其中大部分内容在其他主流浏览器内也是通用的。

事先声明:这个小站绝对没跟踪你哦。我没有兴趣跟踪用户。我没有投放广告,也没有使用 Google Analytics 等等统计分析技术。

现实的情况是,没有哪个正规网站服务敢公然挑战你的网络安全,但却肆无忌惮侵犯你的隐私。仅从我个人的感受来说,隐私和安全往往不能兼得。很多网站以保障用户安全为幌子侵犯隐私,一般我会拒绝使用此类服务。现阶段对付流氓网站服务的最好做法,除了等待法律法规的完善,就是要采取各种反制措施,提升自己的「paranoid」等级。是的,使用各种技术保护隐私,外网称其为 paranoid privacy,一般为褒义。可以在外网上搜索这个词,即可找到大量讨论。

那么,什么程度的妄想恰到好处呢?那就看你对于自己的个人信息采取什么态度了。但这个前提是要我们先有隐私保护意识,以及认识隐私相关的各项技术。所以,本文也是在做一种呼吁:尽管我们可以不完全认同窃取隐私技术的方方面面,但必须要了解它们。危险的是,如果认为网站的跟踪方式只是获取 IP 地址,那就大错特错了。即使是用代理 IP 地址匿名访问,网站一样有办法知道真实身份。如果在某些服务上登录过账号,网站可以分享浏览信息给其他合作的第三方服务。甚至可以在我们退出账号后持续跟踪,而不要认为退出账号后就匿名了。

所以在一开始,不妨先进行测试,了解下自己的浏览器隐私状况。

跟踪测试

著名的测试有 Panopticlick,由电子前哨基金会 (EFF) 提供。另外还需要关心测试结果中的浏览器指纹,所以需要选择查看指纹的完整结果。

关于指纹的结果中,表格第一列是测试内容。第二列是信息熵,熵越大信息量越大 (不代表字节数),对方获取到的关于我们身份的信息也越多。因为我们希望保护隐私,所以我们希望这个值越小越好,说明泄漏的身份信息也越少。第三列是每隔多少个浏览器出现一次相同值,这个值越大,代表在大范围人群中也保持唯一。所以我们也希望这个值越小越好,说明在人群中越普通。这两个数值需要结合起来看。需要注意的是,信息熵足够小的情况下,不意味着信息在人群中很普通,也有可能出现第三个值特别大的局面。

另外有两个我觉得很好的测试

那么,这些结果意味着什么?有必要了解网站采取的跟踪形式了。

跟踪形式

网站想要跟踪我们,必须要把我们区分开来,给我们每个人增加一个 ID。通过 ID,可以知道持有这个 ID 的用户之前访问过什么,对什么内容感兴趣,方便持续追踪。

我将它们分为三种情况来讨论:

  1. 网站主动设置隐藏 ID
  2. 浏览器指纹
  3. 个人信息

第一种情况,网站可以为浏览会话主动设置隐藏 ID,方式可以是使用最广泛的 cookie。只要不清理 cookie,下次访问同网站,依旧可以知道来自于同一个人。

第二种情况,相当于每个人的浏览器都携带了一个 ID,无需网站主动设置隐藏 ID,只需要调用浏览器的一些 API 即可获取。这是因为我们每个人使用的硬件环境、系统环境、浏览器环境都有微妙的差异,不要惊讶,浏览器指纹几乎就是全球唯一 ID。网站甚至都可以无需使用上一种情况说到的 cookie 了。

第三种情况,则是网站获取我们的一些个人偏好,比如使用的系统、语言、屏幕尺寸等等,当然这也算是隐私的一部分。收集足够多的个人信息,可以表明这些信息来自同一个人,就好像是 ID 一样。当然,网站一般不会当这些信息当作 ID 对待,通常是执法调查部门用来分析个人特征,从茫茫人海中找出匿名者。

阻断跟踪者的企图

与跟踪者的第一场战役,就从使用扩展提供的基础保护开始吧。即使是简单安装和基础设置,都能大大提升隐私保护。当然,你可能在很多地方都看过了关于隐私保护相关的推荐扩展列表。这份列表是我自己整理的,以及附带我个人的看法。

一些推荐扩展

  • uBlock Origin - 目前最流行的反广告和反跟踪扩展。用了之后,可以和早先流行的 ABP 说拜拜。

  • Nano Defender - 搭配 uBlock Origin 使用,防止网站试图检测有反广告扩展的存在。也就是「反-反广告」。但是目前只能和 Nano Adblocker 或着 uBlock Origin 搭配,同时 uBlock Origin 需要有 额外的设置步骤。防止被网站检测到有过滤广告的扩展,是有助于提升隐私的。

  • Temporary Containers - 使用 Firefox 的容器特性,生成临时容器,使用完即可销毁。是隐私保护的决定性扩展,用好了这个扩展,基本上就能熟练掌控隐私了。

  • Decentraleyes - 使用本地的资源,从而不需要向 CDN 请求资源。另一方面起到了加速访问的作用。

  • ClearURLs - 清除链接中多余的 URL 参数,支持 JSON 规则,该规则由作者在维护。取代了 Neat URL,因为后者多年不更新了,并且不支持规则。

  • Smart Referer - 请求头的 Referer 可以被用于跟踪。使用该扩展将 referer 伪装成和请求的 URL 一致。支持白名单。当然啦,图片反盗链时也可以派上用场。

  • HTTPS EverywhereSmart HTTPS - 优先使用更安全的 HTTPS。为了解决访问 HTTPS 站点时,URL 中没有携带 HTTPS 协议,需要从 HTTP 跳转到 HTTPS,此过程存在被劫持的问题。即使该网站配置了 HSTS,首次访问时依旧是不安全的连接。HTTPS Everywhere 使用名单让 URL 加上 HTTPS 协议;不在该名单中的域名,则通过 Smart HTTPS 自动尝试 HTTPS 连接。

  • CanvasBlocker - 反指纹跟踪。一些场景下可能影响性能,使用需谨慎。防止了不少 JS API 被用于收集指纹,而不是仅限于名字中提到的 Canvas。

想必注重隐私的你,和我一样安装了很多增强隐私保护的扩展,从而摆脱了形形色色的恼人的跟踪器。这很好。但对于扩展中各项功能的用法,可能不甚了解。该进一步了解更多方法保护隐私了!

关于网站如何使用 Cookie 进行跟踪,相关文章比比皆是,基本上被讨论滥了。既然大家都已经知道了,所以我不愿意重复讲呀。我想说些不一样的。

什么是第三方跟踪 Cookie?简单来说,访问了网站 A,A 悄悄地给网站 G 设置了 Cookie;那之后再访问网站 B,B 也同样使用了网站 G 的广告服务。从 G 的角度来看,访问 A 和 B 的匿名用户是同一个用户,所以可以根据访问 A 的内容,在 B 上精准投放相应广告。这一切,都是在用户的浏览器上实现的。A 不需要主动将匿名用户的信息发送给 G,而是使用 Cookie,相当于让用户浏览器自己发送。

主流浏览器都在集成屏蔽第三方跟踪 Cookie 的功能,现在 Chrome 也紧随其后。但是浏览器自带的屏蔽功能有限,所以现在又提出了第一方隔离 (FPI) 的功能。按上面的例子来说,A 和 B 就叫第一方,G 是第三方。FPI 的意思是,把 A 和 B 使用的第三方 Cookie 隔离开来,A 和 B 之间是无法分享第三方 Cookie 的。由于是根据第一方的域名来隔离第三方的,所以就叫做第一方隔离。注意,第一方是根据域名不同来区分的。

除去传统的 Cookie,跟踪者还有很多办法可以实现类似 Cookie 的功能。

「邪恶的」Etag

Cookie 不是网站唯一能存储 ID 的地方。想一想 Etag 的工作原理,是不是可以被用来设置一个缓存的 ID 呢?更进一步,Etag 不会像 cookie 有超时。只清理 cookie 而不清理缓存,服务器依旧可以根据 Etag 获知 ID。

上文推荐的 ClearURLs 扩展额外实现了过滤 Etag 头部的功能,也就是会每次剥离请求头If-None-Match

感兴趣的话,可以看看 evercookie 是怎么做到在浏览器完全禁止 Cookie 的情况下,依旧能实现多种多样的类似 Cookie 性质的跟踪方式。也可以直接搜索关键词 Cookieless track

如果我们的目的是使用扩展清理登录信息,从而方便切换到其他账号上,这作为一个小技巧是可取的。但必须明白这无益于隐私保护。比如上文提到的 Etag;而且大部分清理 cookie 的扩展都只是在清理 cookie,或者同时提供清理 local storage 的功能,但是要知道,浏览器提供了其他的永久存储 API,比如 IndexedDB 和 worker services 缓存。仅仅清理 cookie 和 local storage,却残留了其他缓存,这不是网站的预期行为,有可能让网站在不完整的缓存下功能异常。所以有可能在退出账号后或者清理 cookie 后,网站依旧可以持续地跟踪。

那么要清理的话,最好是彻底清理整个网站的所有缓存。那么,有没有什么便捷的方法,在关闭某个网页后就快速清除所有缓存呢?那就是接下来要提到的临时容器了。

真正的利器:临时容器

Firefox 自带的容器是持久化的,此特性被称呼为身份标签页。所以有了临时容器 Temporary Containers 这个扩展。「临时」这个概念代表着,当你每次打开新标签页时,可以让该标签页处于一个临时容器中,当关闭之后,所有相关的缓存都会灰飞烟灭,但却不会影响这个容器外的内容。在另一个角度上,临时容器同样能实现类似 FPI 的功能,但却能实现比 FPI 更复杂的场景。完全可以按照自己的意愿隔离不同标签页。正确使用临时容器,是掌控自己隐私的第一步。强烈推荐使用。

如果想保持账号登录状态,可以让临时容器持久化,也就是转变为身份标签页。这在 Temporary Containers 里被称呼为 Action: Convert Temporary To Permanent Container。

另外,还可以使用扩展 Firefox Multi-Account Containers快速打开一个身份标签页;使用扩展 Containerise 设定规则,使特定的 URL 在指定的身份标签页中打开。

也许有人会笑话,使用临时容器是在拿大炮打蚊子。怎么说呢,我现在每次打开一个标签页,都会自动生成一个临时容器,熟练使用容器就是件很自然的事情。

浏览器指纹

Cookie 和 Etag 等等不够用了,该面对现代跟踪方式了。上文说到的 Cookie 和 Etag 都是网站主动设置的 ID,但是浏览器自己就带有 ID,这就是浏览器指纹。

跟踪者最爱的 Canvas

Canvas 指纹测试

使用 Canvas 越来越流行了,但同时也引入了泄漏隐私的担忧。这是近年来隐私保护的一大挑战。这个问题比你我想象的严重的多,实际上 Canvas 早就被滥用了。比如,从 Android 10 起限制 APP 获取真实的设备号,但从根本上依旧不能彻底限制 APP,因为像字节跳动这类公司连手机上的 Canvas 都不放过:Tiktok 利用设备指纹跟踪用户

启用隐藏的 RFP 反指纹跟踪

为此,Firefox 引入了 RFP,限制各种收集指纹的行为。但这是隐藏的设置项,熟悉 Firefox 的朋友都知道,这是about:config中列出的设置项。以下内容,需要结合我的 下一篇文章,使用user.js才能更好地设置。不推荐直接在about:config里修改。

about:config 设置:

privacy.resistFingerprinting: true

开启 RFP 后,很多选项需要保持默认值,改变它们反而会修改指纹。比如说media.video_stats.enabled最好不要修改,需要保持为默认值。RFP 是一系列设置的集合,包含了很多反收集指纹的设置,不单单是下列内容:

  • 特定的 Canvas API 受保护,使用时需要确认
  • 使用 UTC 时区
  • Canvas 指纹会被修改成和 Tor 浏览器一致
  • User-Agent 被修改成和 Tor 浏览器一致
  • 询问语言设置
  • ……

Tor 浏览器伪装 UA 为Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0。RFP 会保持和 Tor 浏览器一致。

另外可以注意到,RFP 使 Firefox 的 Canvas 指纹变成和 Tor 浏览器一样。实际上这是 RFP 的策略,就是尽可能和 Tor 用户看上去一样。只要大家都看上去一样,那么跟踪者将不能有效区分被跟踪者。所以,RFP 使用了 Tor 的指纹。如果启用了 CanvasBlocker 扩展,它将提示启用 RFP 后不再随机生成 Canvas 指纹。

可惜的是,在启用 RFP 后,Canvas 的性能受到影响。比如在 b 站上,使用 Canvas 绘制的弹幕,会出现卡顿的现象,只能被迫切回 CSS 渲染模式。同时也会影响一些地图服务、使用 Canvas 绘制的图表……如果遇到性能问题,我通常选择另外打开一个没有启用 RFP 的浏览器实例。毕竟这些状况很少发生。

其他值得关注的指纹

Flash 插件

什么?还有网站在用 Flash?赶紧抛弃它吧。Flash 也会提供指纹。

媒体设备 ID

即使关闭了 WebRTC,获取媒体设备 ID 的 API 仍旧可用。对应的就是 AmIUnique 的测试结果中的media.device那项,你也可以在控制台中用以下 JS 获取:

navigator.mediaDevices.enumerateDevices().then((devices)=> {devices.forEach((d)=>{console.log(d.kind+d.label+d.deviceId)})})

about:config 设置:

media.peerconnection.enabled: false

media.navigator.enabled: false

Web Audio API

我已经关闭了这项功能。

about:config 设置:

dom.webaudio.enabled: false

更多的信息熵

窗口尺寸

最大化窗口是危险的!看看测试结果,想必明白了吧。也许你会说,这到底和隐私什么关系?窗口最大化的结果因人而异,持续窗口最大化,也可以当作个人特征。为此 Tor 浏览器设计了 letterboxing 特性,不管怎么调整窗口,网页的尺寸永远是一个固定值的整数倍。这也是 Tor 浏览器为什么在任何页面都持续显示一个奇怪的边缘。现在 Firefox 也引入了这个特性,但没有默认启用。这项特性值得尝试。或者,也可以经常手动调整窗口大小。

about:config 设置:

privacy.resistFingerprinting.letterboxing: true

User-Agent

相当多的扩展提供伪装 UA 的功能,因为修改 UA 不只是为了保护隐私,还有其他用途。通常来说,试图伪装系统和浏览器版本不是个好注意。通过 JS 的一些 API,依旧能调查出真实的系统和浏览器。特别地,用 HTTP Header Editor 这种扩展进行伪装是不足够的,因为它们只修改了 HTTP 请求头,没有修改 JS 中的值。

URL 参数

使用 URL 参数跟踪用户是不靠谱的方式。比如链接被分享后,不同用户有可能被当作同一个用户对待。所以 URL 参数很少被用来携带用户 ID。通常的使用场景是携带分享 ID、设备信息等等表明渠道来源的数据,跟踪者得此可以统计和分析。

比如 Firefox 直接在地址栏使用 Google 搜索时,URL 会携带client参数向 Google 表明来自 Firefox,这样 Google 方面可以统计来自 Firefox 渠道的贡献量,从而向 Mozilla 支付推广费。

推荐扩展 ClearURLs,它通过自带的规则,过滤跟踪用途的 URL 参数。

Referer

Referer 会直接告诉网站来自哪里。所以用 Smart Referer 伪装下就好了。但也要注意下破坏网页的问题。比如在 b 站上,*.bilivideo.com需要 Referer 来自bilibili.com才能正常播放视频。这种情况就该在扩展里添加额外规则了。

DNT

Do Not Track,通过在请求头中加入一个额外的头部,告诉网站和第三方跟踪器不要跟踪我。这个特性会在所有请求中都加入这个特殊的头部,不是单单只告诉跟踪器。所以呢?这是在广播自己不想被跟踪。然而遗憾的是,这是个君子协定:网站和跟踪器可以选择忽视你的诉求。我们不知道它们最后是否尊重了我们的隐私数据。一般认为,启用 DNT 的用户更特殊,因为现在大部分浏览器没有默认启用它 (我在说 chrome 呢)。对此,Tor 浏览器禁用了它。

额外注意,一些扩展中也有打开此特性的选项,比如 Privacy Badger 在自己的设置中会启用它。

不利之处

反跟踪是有代价的,那就是牺牲了一些便利。除了上文提到的性能问题,再比如,登录账号将会需要更多的验证码 (Google 的验证码我已经吐了)。更糟的是,有可能不知道是哪个扩展和设置破坏了网页,此时需要手动排查。所以,我准备了一个临时的 Firefox 配置来应急,配置名字是「dev」,使用命令行firefox -p dev来启动它。

一些观点

  • 个人数据没价值,没必要保护?

嗷!商业网站积极地收集用户数据,就是为了从用户数据上榨取价值呀!

  • 使用了反跟踪技术,屏蔽广告,破坏了正常的互联网商业环境?

再次说明,本文与去广告无关。反跟踪和屏蔽广告是两码事。我不想被各大商业网站收集信息和获取精准用户画像。我只认同在特定时期、特定条件下,公民有义务牺牲自己的隐私,但不认同有商业公司进行商业化运作。

况且我本来就没实行严格的反跟踪策略。每个人采取不同的方式自由取舍,是正常的。如果我真的需要严格的隐私策略,那为何不直接用 Tor 呢?我只想不那么麻烦的日常使用而已。这像是在进行一场旷日持久的个人与商业公司的军备竞赛,但其实我更期待的是类似于欧洲的 GDPR。即使不打算启用任何隐私保护设置,了解一下常见的跟踪和反跟踪技术也是大有裨益的。

由于我不是安全专业从事人员,这些内容是不完善的,同时可能存在着事实性错误,毕竟安全隐私是一项庞大的工程,而且各种内容随着技术进步在不断地变化和推陈出新。欢迎大家和我交流反跟踪技术。

推荐阅读

PrivacyTools 英文/ 繁中

ghacks-user.js 的 wiki 页面

关注网络隐私Firefox隐私Cookie指纹
知识共享许可协议

© 2020 rydesun

Firefox 隐私加固:进阶的隐藏策略

Caddy 2 使用 Caddyfile 部署博客网站

加载评论中