Как защитить Linux-ноутбук от утечек MAC и fingerprinting

Защита Linux от утечек MAC и fingerprinting

Защитите любой Linux-ноутбук от утечек MAC и fingerprinting: рандомизируйте WiFi MAC при каждом подключении, отключите IPv6, используйте DNS-over-TLS, ужесточите Firefox с resistFingerprinting, зашифруйте диск LUKS, ротируйте /etc/machine-id и замените plaintext NTP на NTS-синхронизацию времени. Шаги ниже не привязаны к дистрибутиву и подходят для Arch, Manjaro, Fedora, Debian, Ubuntu и большинства systemd-based дистрибутивов.

11 Слоёв hardening
DoT Шифрованный DNS
LUKS Полное шифрование диска
Linux NetworkManager systemd-resolved Firefox RFP LUKS chrony NTS

Зачем Linux-ноутбуку защита от fingerprinting?

Ноутбук, подключающийся к сетям вне дома — кофейни, отели, коворкинги, аэропорты, конференционный WiFi — постоянно представляется этим сетям. Стандартная конфигурация большинства дистрибутивов утекает реальный hardware MAC, hostname системы, каждый домен из DNS-запросов, системные часы с NTP-трафиком бренда дистрибутива и достаточно browser-quirks для re-identification устройства между сессиями. Для работы через public WiFi с чувствительными аккаунтами это существенная поверхность риска. Каждая точка доступа становится потенциальной точкой корреляции.

Как рандомизировать MAC-адрес на Linux?

Настройте NetworkManager на клонирование нового locally-administered MAC при каждом подключении. Создайте /etc/NetworkManager/conf.d/wifi.conf с содержимым ниже и перезапустите NetworkManager. Hardware MAC больше не попадёт в эфир.

[device]
wifi.scan-rand-mac-address=yes

[connection]
wifi.cloned-mac-address=random
ethernet.cloned-mac-address=random
connection.stable-id=${CONNECTION}/${BOOT}
ipv4.dhcp-send-hostname=no
ipv4.dhcp-client-id=perconnection
systemctl restart NetworkManager

Удалите все сохранённые сети

Каждый SSID, к которому ноутбук когда-либо подключался, хранится в профилях NetworkManager в /etc/NetworkManager/system-connections/. Любой с физическим доступом — или локальный exploit с read access — может перечислить список и восстановить историю перемещений за месяцы. Удалите неиспользуемые профили и пусть новые подключения наследуют hardened defaults. Для путешествующего ноутбука это ближе к обязательному, чем к опциональному.

Зачем отключать IPv6 для privacy?

IPv6-адреса проще fingerprint-ить, чем IPv4: SLAAC может встроить MAC в адрес. Privacy extensions (RFC 4941) смягчают это, но добавляют moving parts. Если IPv6 не используется активно — отключите на уровне ядра и в NetworkManager. Минус один protocol surface, минус один fingerprint vector, нулевая потеря функций для большинства сценариев.

# /etc/sysctl.d/40-ipv6-disable.conf
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
nmcli connection modify <connection-name> ipv6.method disabled

Как остановить DNS leaks на Linux?

Направьте каждый DNS-запрос через systemd-resolved с DNS-over-TLS и запретите NetworkManager использовать DNS от DHCP. Симлинк /etc/resolv.conf/run/systemd/resolve/stub-resolv.conf, затем добавьте ipv4.ignore-auto-dns=true в defaults NetworkManager, чтобы resolver роутера не использовался. Проверка: resolvectl query example.com — ответ должен содержать "acquired via local or encrypted transport: yes".

# /etc/systemd/resolved.conf
[Resolve]
DNS=1.1.1.2#security.cloudflare-dns.com
FallbackDNS=9.9.9.9#dns.quad9.net
DNSOverTLS=yes
DNSSEC=allow-downgrade
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
systemctl enable --now systemd-resolved

Какие настройки Firefox блокируют fingerprinting?

Включите privacy.resistFingerprinting=true в about:config. Одна настройка унифицирует canvas hash, timezone, screen dimensions, user-agent и font list с каждым другим RFP-пользователем — вы в большой толпе, а не выделяетесь. Не ставьте лишние расширения — каждое добавляет uniqueness. Только uBlock Origin.

privacy.resistFingerprinting                    = true
privacy.trackingprotection.fingerprinting.enabled = true
privacy.partition.network_state                 = true
network.cookie.cookieBehavior                   = 5
webgl.disabled                                  = true
media.peerconnection.enabled                    = false
network.trr.mode                                = 3
network.trr.uri                                 = https://cloudflare-dns.com/dns-query
network.http.http3.enable                       = false

Зачем менять hostname?

Hostname всё ещё утекает через mDNS, NetBIOS, SMB broadcasts и DHCP, если не отключено. Уникальный hostname вроде "user-laptop" или "founder-thinkpad" — persistent identifier на каждой сети. Используйте Windows-style default — самая большая population hostname на планете. Сливайтесь с толпой.

hostnamectl set-hostname DESKTOP-A3KF9Z2X

Что с NTP leaks?

Стандартный systemd-timesyncd шлёт plaintext NTP на pool-серверы с брендом дистрибутива каждые 60–1024 секунды. Это liveness beacon, идентификатор дистрибутива и MITM vector — атакующий может сдвинуть часы и инвалидировать TLS certs или сломать 2FA. Замените на chrony over NTS (NTP в TLS authentication).

systemctl disable --now systemd-timesyncd
# install chrony via your package manager, then configure:
# /etc/chrony.conf
server time.cloudflare.com iburst nts
server nts.netnod.se       iburst nts
server ptbtime1.ptb.de     iburst nts
minsources 2
rtcsync
systemctl enable --now chronyd

Как сократить attack surface на уровне ядра?

Положите файл в /etc/sysctl.d/50-kernel-harden.conf с настройками ниже. Блокирует типичные local privilege escalation primitives — kernel pointer leaks, ptrace snooping, unprivileged eBPF abuse, kexec rootkits, userfaultfd exploits — без поломки daily use. Не ставьте kernel.unprivileged_userns_clone=0: ломает sandbox Firefox, Flatpak и приложения, которым нужны user namespaces.

# /etc/sysctl.d/50-kernel-harden.conf
kernel.kptr_restrict=2
kernel.dmesg_restrict=1
kernel.unprivileged_bpf_disabled=1
kernel.yama.ptrace_scope=2
kernel.kexec_load_disabled=1
kernel.perf_event_paranoid=3
vm.unprivileged_userfaultfd=0
sysctl --system

Что шифровать?

Каждый раздел, который касается диска. Проверьте lsblk — если / и /home не на crypto_LUKS, диск plaintext для любого, кто украдёт ноутбук. Swap шифруйте отдельно через /etc/crypttab со случайным ключом при каждой загрузке или как LUKS volume. Отключите core dumps — иначе keys и session cookies попадут на диск при crash.

lsblk -o NAME,TYPE,FSTYPE,MOUNTPOINT
# Disable core dumps
systemctl mask systemd-coredump
# /etc/sysctl.d/50-kernel-harden.conf (append)
kernel.core_pattern=|/bin/false

Зачем ротировать /etc/machine-id?

Systemd генерирует /etc/machine-id при установке, и любой unprivileged process может его прочитать. Стабильный 32-символьный ID, идентифицирующий конкретную установку навсегда — persistentнее любой cookie. Регенерируйте, держите /var/lib/dbus/machine-id симлинком на него, reboot. Всё, что key-илось off machine-id, увидит brand new install.

dd if=/dev/urandom bs=16 count=1 | od -An -tx1 | tr -d ' \n' > /etc/machine-id
ln -sf /etc/machine-id /var/lib/dbus/machine-id
reboot

Как эти слои сравниваются по приоритету?

Слой hardening Закрытый риск Усилия Приоритет
MAC randomizationУтечка hardware ID при каждом WiFi joinНизкиеКритический
DHCP hostname suppressionBroadcast hostname в router/DHCP logsНизкиеКритический
DNS-over-TLSPlaintext DNS виден ISP и роутеруНизкиеКритический
LUKS full-disk encryptionPlaintext data на украденном устройствеСредние (reinstall)Критический
Firefox resistFingerprintingBrowser-level cross-site identificationНизкиеВысокий
IPv6 disableSLAAC MAC embedding, лишняя fingerprint surfaceНизкиеВысокий
machine-id rotationPersistent local install identifierНизкиеСредний
Kernel sysctlsLocal privilege escalation primitivesНизкиеСредний
chrony NTSPlaintext NTP, distro fingerprinting, clock MITMСредниеСредний
Coredump maskingKeys и secrets на диск при crashНизкиеСредний

Вердикт

MAC randomization, suppression DHCP-hostname, DoT, LUKS и Firefox resistFingerprinting — baseline, день работы, закрывающий самые громкие утечки на любом Linux-ноутбуке. Добавьте machine-id rotation, kernel sysctls, chrony NTS и coredump masking, если устройство путешествует или видит untrusted networks. VPN — самый большой оставшийся win поверх всего этого: local hardening не скрывает real public IP от интернета. Для threat model вокруг public WiFi в кофейнях, отелях и аэропортах — это setup.

Часто задаваемые вопросы

Ломает ли MAC randomization WiFi captive portals?

Иногда. Captive portals часто привязывают session к MAC, и новый random MAC при reconnect требует fresh login. Если это мешает в конкретной точке — переключите это подключение с "random" на "stable" в NetworkManager: stable даёт consistent MAC per SSID без раскрытия hardware MAC.

Достаточно ли Firefox resistFingerprinting сам по себе?

В основном да. Унифицирует canvas, fonts, screen size, timezone и user-agent с каждым RFP-пользователем. Не блокирует tracker domains и third-party requests на network level — для этого uBlock Origin с Privacy and Annoyances lists. Без лишних расширений — каждое добавляет uniqueness.

Нужно ли отключать IPv6 при включённых privacy extensions?

Только если IPv6-сервисы активно используются. Privacy extensions (RFC 4941) ротируют IPv6 interface identifier по расписанию — решают MAC-embedding problem. Если IPv6 не нужен — полное отключение убирает целый protocol stack с attack surface без потери функций.

Почему не просто VPN или Tor?

VPN и Tor защищают public IP и шифруют transport, но не скрывают real MAC от local WiFi, hostname от mDNS broadcasts, DNS queries от hostile router или browser fingerprint от сайтов. Network-level privacy и host-level privacy — stacked layers, нужны оба.

Сломают ли kernel hardening sysctls обычные приложения?

Указанный набор — нет. kernel.yama.ptrace_scope=2 требует sudo для attach debugger — нормально на personal laptop, слегка annoying на dev machine. Избегайте kernel.unprivileged_userns_clone=0 — ломает sandbox Firefox, Flatpak и apps с unprivileged user namespaces.

Руководство описывает generic Linux hardening. Команды и пути конфигурации предполагают systemd-based дистрибутив с NetworkManager — адаптируйте под свой distro и threat model.

Frequently Asked Questions

Ломает ли MAC randomization WiFi captive portals?

Иногда. Captive portals часто привязывают session к MAC, и новый random MAC при reconnect требует fresh login. Если это мешает в конкретной точке — переключите это подключение с "random" на "stable" в NetworkManager: stable даёт consistent MAC per SSID без раскрытия hardware MAC.

Достаточно ли Firefox resistFingerprinting сам по себе?

В основном да. Унифицирует canvas, fonts, screen size, timezone и user-agent с каждым RFP-пользователем. Не блокирует tracker domains и third-party requests на network level — для этого uBlock Origin с Privacy and Annoyances lists. Без лишних расширений — каждое добавляет uniqueness.

Нужно ли отключать IPv6 при включённых privacy extensions?

Только если IPv6-сервисы активно используются. Privacy extensions (RFC 4941) ротируют IPv6 interface identifier по расписанию — решают MAC-embedding problem. Если IPv6 не нужен — полное отключение убирает целый protocol stack с attack surface без потери функций.

Почему не просто VPN или Tor?

VPN и Tor защищают public IP и шифруют transport, но не скрывают real MAC от local WiFi, hostname от mDNS broadcasts, DNS queries от hostile router или browser fingerprint от сайтов. Network-level privacy и host-level privacy — stacked layers, нужны оба.

Сломают ли kernel hardening sysctls обычные приложения?

Указанный набор — нет. kernel.yama.ptrace_scope=2 требует sudo для attach debugger — нормально на personal laptop, слегка annoying на dev machine. Избегайте kernel.unprivileged_userns_clone=0 — ломает sandbox Firefox, Flatpak и apps с unprivileged user namespaces.