Защита 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 дистрибутивов.
Зачем 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 suppression | Broadcast hostname в router/DHCP logs | Низкие | Критический |
| DNS-over-TLS | Plaintext DNS виден ISP и роутеру | Низкие | Критический |
| LUKS full-disk encryption | Plaintext data на украденном устройстве | Средние (reinstall) | Критический |
| Firefox resistFingerprinting | Browser-level cross-site identification | Низкие | Высокий |
| IPv6 disable | SLAAC MAC embedding, лишняя fingerprint surface | Низкие | Высокий |
| machine-id rotation | Persistent local install identifier | Низкие | Средний |
| Kernel sysctls | Local privilege escalation primitives | Низкие | Средний |
| chrony NTS | Plaintext NTP, distro fingerprinting, clock MITM | Средние | Средний |
| Coredump masking | Keys и 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.