วิธี Harden แล็ปท็อป Linux ป้องกัน MAC และ Fingerprint Leak

Linux Hardening ป้องกัน MAC และ Fingerprint Leak

Harden แล็ปท็อป Linux ป้องกัน MAC และ fingerprinting leak โดย randomize wifi MAC ต่อการเชื่อมต่อ ปิด IPv6 รัน DNS-over-TLS harden Firefox ด้วย resistFingerprinting เข้ารหัสดิสก์ด้วย LUKS หมุน /etc/machine-id และแทน NTP plaintext ด้วย NTS-authenticated time sync ขั้นตอนด้านล่างใช้ได้กับ distro ส่วนใหญ่ รวม Arch, Manjaro, Fedora, Debian, Ubuntu และ Linux ที่ใช้ systemd ส่วนใหญ่

11 ชั้น Hardening
DoT DNS เข้ารหัส
LUKS Full Disk Encryption
Linux NetworkManager systemd-resolved Firefox RFP LUKS chrony NTS

ทำไมแล็ปท็อป Linux ต้อง harden fingerprint?

แล็ปท็อปที่ join network นอกบ้าน — ร้านกาแฟ โรงแรม coworking lounge สนามบิน WiFi conference — แนะนำตัวกับ network เหล่านั้นตลอด posture เริ่มต้นบน distro Linux ส่วนใหญ่ leak MAC จริงของฮาร์ดแวร์ hostname ระบบ ทุก domain ที่ query ผ่าน DNS นาฬิการะบบพร้อม NTP traffic ที่มีแบรนด์ distro และ browser quirk พอ re-identify อุปกรณ์เดิมข้าม session สำหรับคนทำงานผ่าน public WiFi กับบัญชี sensitive นี่คือ attack surface ที่มีความหมาย ทุก venue ที่แล็ปท็อปไปคือจุด correlation ที่เป็นไปได้

randomize MAC address บน Linux อย่างไร?

ตั้ง NetworkManager ให้ clone MAC locally-administered ใหม่ทุกการเชื่อมต่อ สร้าง /etc/NetworkManager/conf.d/wifi.conf ด้วยเนื้อหาด้านล่าง แล้ว restart 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

ลืมทุก network ที่บันทึกไว้

ทุก SSID ที่แล็ปท็อป Linux เคยเชื่อมต่ออยู่ใน NetworkManager profile ใต้ /etc/NetworkManager/system-connections/ ใครมี physical access — หรือ local exploit ที่อ่านได้ — enumerate list นั้นและ reconstruct ประวัติการเดินทางของอุปกรณ์หลายเดือน ลบ profile ที่ไม่ใช้และให้ connection ใหม่ inherit default ที่ harden แล้ว สำหรับแล็ปท็อปที่เดินทาง นี่ใกล้ essential กว่า optional

ทำไมต้องปิด IPv6 เพื่อ privacy?

IPv6 address fingerprint ง่ายกว่า IPv4 เพราะ SLAAC อาจฝัง MAC ใน address privacy extension (RFC 4941) ลดปัญหาแต่เพิ่ม moving part ถ้าไม่ใช้ IPv6 จริงๆ ปิดที่ kernel level และใน NetworkManager protocol surface น้อยลง fingerprint vector น้อยลง ไม่เสีย function สำหรับ use case ส่วนใหญ่

# /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 leak บน Linux อย่างไร?

route ทุก DNS query ผ่าน systemd-resolved ด้วย DNS-over-TLS และบอก NetworkManager ให้ ignore DNS ที่ DHCP push symlink /etc/resolv.conf ไป /run/systemd/resolve/stub-resolv.conf แล้วเพิ่ม ipv4.ignore-auto-dns=true ใน NetworkManager connection default เพื่อไม่ใช้ resolver ของ router verify ด้วย resolvectl query example.com — response ควรบอก "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 การตั้งค่าเดียวนี้ unify canvas hash, timezone, screen dimensions, user-agent และ font list กับ RFP user คนอื่น — เข้ากลุ่มใหญ่แทนที่จะโดดเด่น อย่าเพิ่ม extension ซ้อน — แต่ละตัวเพิ่ม 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 ยัง leak ผ่าน mDNS, NetBIOS, SMB broadcast และ DHCP ถ้ายังไม่ปิด hostname ไม่ซ้ำอย่าง "user-laptop" หรือ "founder-thinkpad" คือ identifier คงที่ข้ามทุก network ที่อุปกรณ์ join ใช้ default แบบ Windows — นั่นคือ population hostname ใหญ่ที่สุดบนโลก กลมกลืน อย่าโดดเด่น

hostnamectl set-hostname DESKTOP-A3KF9Z2X

NTP leak ล่ะ?

systemd-timesyncd เริ่มต้นส่ง NTP packet plaintext ไป pool server ที่มีแบรนด์ distro ทุก 60–1024 วินาที นั่นคือ liveness beacon distro identifier และ MITM vector — attacker หมุน clock เพื่อ invalidate TLS cert หรือพัง 2FA แทนด้วย chrony ผ่าน 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 ระดับ kernel อย่างไร?

วางไฟล์ใน /etc/sysctl.d/50-kernel-harden.conf ด้วยการตั้งค่าด้านล่าง บล็อก local-privilege-escalation primitive ทั่วไป — kernel pointer leak, ptrace snooping, unprivileged eBPF abuse, kexec rootkit, userfaultfd exploit — โดยไม่พังการใช้งานประจำวัน อย่าตั้ง kernel.unprivileged_userns_clone=0: จะพัง Firefox sandbox, Flatpak และ app อื่นที่ต้องใช้ user namespace จริงๆ

# /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

ควรเข้ารหัสอะไร?

ทุก partition ที่แตะดิสก์ ตรวจด้วย lsblk — ถ้า / และ /home ไม่อยู่บน crypto_LUKS ดิสก์เป็น plaintext ต่อใครขโมยแล็ปท็อป swap ต้องเข้ารหัสแยก ผ่าน /etc/crypttab ด้วย random key ทุก boot หรือเป็น LUKS volume ปิด core dump เพื่อไม่เขียน memory content — รวม key และ session cookie — ลงดิสก์

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 generate /etc/machine-id ตอนติดตั้ง และ process ไม่มี privilege ก็อ่านได้ เป็น ID 32 ตัวอักษรคงที่ที่ระบุ install เฉพาะเครื่องตลอดไป — คงที่กว่า cookie ใดๆ regenerate แล้วให้ /var/lib/dbus/machine-id เป็น symlink ไปที่นั้น แล้ว reboot สิ่งที่เคย key จาก machine-id จะเห็น 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 เหล่านี้เทียบ priority อย่างไร?

ชั้น Hardening ความเสี่ยงที่ปิด ความพยายาม Priority
MAC randomizationHardware ID leak ทุกครั้ง join WiFiต่ำCritical
DHCP hostname suppressionHostname broadcast ไป router/DHCP logต่ำCritical
DNS-over-TLSDNS plaintext ที่ ISP และ router เห็นต่ำCritical
LUKS full-disk encryptionข้อมูล plaintext บนอุปกรณ์ที่ถูกขโมยปานกลาง (reinstall)Critical
Firefox resistFingerprintingBrowser-level cross-site identificationต่ำHigh
IPv6 disableSLAAC MAC embedding, fingerprint surface เพิ่มต่ำHigh
machine-id rotationLocal install identifier คงที่ต่ำMedium
Kernel sysctlsLocal privilege escalation primitiveต่ำMedium
chrony NTSNTP plaintext, distro fingerprinting, clock MITMปานกลางMedium
Coredump maskingKey และ secret เขียนลงดิสก์ตอน crashต่ำMedium

สรุป

MAC randomization, DHCP-hostname suppression, DoT, LUKS และ Firefox resistFingerprinting คือ baseline — งานบ่ายๆ ครึ่งวันที่ปิด leak ดังที่สุดบนแล็ปท็อป Linux ใดๆ เพิ่ม machine-id rotation, kernel sysctls, chrony NTS และ coredump masking ถ้าอุปกรณ์เดินทางหรือเจอ network ที่ไม่ไว้ใจ VPN ยังเป็น win ใหญ่ที่สุดที่เหลือบนทั้งหมดนี้ เพราะ hardening local ไม่ซ่อน public IP จริงจากอินเทอร์เน็ต สำหรับ threat model ที่เน้น public WiFi ที่ร้านกาแฟ โรงแรม และสนามบิน นี่คือ setup ที่ใช้

คำถามที่พบบ่อย

MAC randomization พัง WiFi captive portal ไหม?

บางครั้ง captive portal มัก bind session กับ MAC ดังนั้น MAC สุ่มใหม่ตอน reconnect บังคับ login ใหม่ ถ้าเจ็บปวดที่ venue นั้น เปลี่ยน connection เดียวจาก "random" เป็น "stable" ใน NetworkManager — stable ให้ MAC คงที่ต่อ SSID โดยไม่เปิดเผย hardware MAC

Firefox resistFingerprinting พออย่างเดียวไหม?

ส่วนใหญ่ unify canvas, font, screen size, timezone และ user-agent ให้ browser ตรงกับ RFP user คนอื่น แต่ไม่บล็อก tracker domain หรือ third-party request ระดับ network — สำหรับนั้นติดตั้ง uBlock Origin และเปิด Privacy และ Annoyances filter list ข้าม extension เกิน uBO เพราะแต่ละตัวเพิ่ม uniqueness

ต้องปิด IPv6 ไหมถ้าเปิด privacy extension แล้ว?

เฉพาะเมื่อไม่ใช้บริการ IPv6 จริงๆ privacy extension (RFC 4941) หมุน IPv6 interface identifier ตาม schedule ซึ่งจัดการปัญหา MAC embedding ถ้าไม่ใช้ IPv6 ปิดทั้งหมดเอา protocol stack ทั้งก้อนออกจาก attack surface โดยไม่เสีย function

ทำไมไม่ใช้ VPN หรือ Tor แล้วข้ามทั้งหมดนี้?

VPN และ Tor ปกป้อง public IP และเข้ารหัส transport แต่ไม่ซ่อน MAC จริงจาก WiFi local hostname จาก mDNS broadcast DNS query จาก router ที่ hostile หรือ browser fingerprint จากเว็บไซต์ network-level privacy และ host-level privacy เป็นชั้นที่ซ้อนกัน — ต้องมีทั้งสอง

kernel hardening sysctls พัง app ปกติไหม?

ชุดที่ระบุไว้ไม่พัง kernel.yama.ptrace_scope=2 หมายความว่าต้อง sudo เพื่อ attach debugger — โอเคบนแล็ปท็อปส่วนตัว น่ารำคาญเล็กน้อยบนเครื่อง developer หลีกเลี่ยง kernel.unprivileged_userns_clone=0 ซึ่งพัง Firefox sandbox, Flatpak และ app ที่ใช้ unprivileged user namespace จริงๆ

คู่มือนี้ครอบคลุม Linux hardening ทั่วไป คำสั่งและ config path สมมติ distro ที่ใช้ systemd กับ NetworkManager — ปรับตาม distro และ threat model ของคุณ

Frequently Asked Questions

MAC randomization พัง WiFi captive portal ไหม?

บางครั้ง captive portal มัก bind session กับ MAC ดังนั้น MAC สุ่มใหม่ตอน reconnect บังคับ login ใหม่ ถ้าเจ็บปวดที่ venue นั้น เปลี่ยน connection เดียวจาก "random" เป็น "stable" ใน NetworkManager — stable ให้ MAC คงที่ต่อ SSID โดยไม่เปิดเผย hardware MAC

Firefox resistFingerprinting พออย่างเดียวไหม?

ส่วนใหญ่ unify canvas, font, screen size, timezone และ user-agent ให้ browser ตรงกับ RFP user คนอื่น แต่ไม่บล็อก tracker domain หรือ third-party request ระดับ network — สำหรับนั้นติดตั้ง uBlock Origin และเปิด Privacy และ Annoyances filter list ข้าม extension เกิน uBO เพราะแต่ละตัวเพิ่ม uniqueness

ต้องปิด IPv6 ไหมถ้าเปิด privacy extension แล้ว?

เฉพาะเมื่อไม่ใช้บริการ IPv6 จริงๆ privacy extension (RFC 4941) หมุน IPv6 interface identifier ตาม schedule ซึ่งจัดการปัญหา MAC embedding ถ้าไม่ใช้ IPv6 ปิดทั้งหมดเอา protocol stack ทั้งก้อนออกจาก attack surface โดยไม่เสีย function

ทำไมไม่ใช้ VPN หรือ Tor แล้วข้ามทั้งหมดนี้?

VPN และ Tor ปกป้อง public IP และเข้ารหัส transport แต่ไม่ซ่อน MAC จริงจาก WiFi local hostname จาก mDNS broadcast DNS query จาก router ที่ hostile หรือ browser fingerprint จากเว็บไซต์ network-level privacy และ host-level privacy เป็นชั้นที่ซ้อนกัน — ต้องมีทั้งสอง

kernel hardening sysctls พัง app ปกติไหม?

ชุดที่ระบุไว้ไม่พัง kernel.yama.ptrace_scope=2 หมายความว่าต้อง sudo เพื่อ attach debugger — โอเคบนแล็ปท็อปส่วนตัว น่ารำคาญเล็กน้อยบนเครื่อง developer หลีกเลี่ยง kernel.unprivileged_userns_clone=0 ซึ่งพัง Firefox sandbox, Flatpak และ app ที่ใช้ unprivileged user namespace จริงๆ