Cắm USB vào máy — nghe đơn giản, nhưng thực ra khá nguy hiểm
Có một tình huống mình từng gặp: đồng nghiệp để quên USB trên bàn, ai đó nhặt lên cắm vào máy để “kiểm tra xem của ai”. Kết quả? Máy bị cài keylogger lúc nào không hay. Chuyện nghe có vẻ bịa, nhưng đây là kịch bản cực kỳ thực tế của một loại tấn công gọi là BadUSB.
Điểm đáng sợ của BadUSB là thiết bị trông y chang cái USB bình thường, nhưng bên trong vi điều khiển đã bị lập trình lại để giả mạo bàn phím, card mạng, hoặc thiết bị HID khác. Khi cắm vào, nó tự động gõ lệnh, tải malware, hoặc mở cổng hậu — tất cả xảy ra trong vài giây trước khi bạn kịp nhận ra.
Mình dùng Fedora làm máy development chính đã 2 năm và khá hài lòng với tốc độ cập nhật package. Nhưng một điều mình để ý là Fedora có sẵn công cụ USBGuard trong repo chính thức — cho phép kiểm soát chính xác thiết bị USB nào được phép hoạt động trên hệ thống. Đây là lớp bảo vệ mà nhiều người bỏ qua chỉ vì chưa biết đến nó.
USBGuard là gì và nó hoạt động như thế nào?
USBGuard là daemon bảo mật chạy ở tầng kernel, can thiệp vào quá trình USB enumeration (lúc hệ thống nhận diện thiết bị mới). Thay vì để kernel tự động cho phép mọi thiết bị kết nối, USBGuard đối chiếu thiết bị đó với một tập policy rules — tương tự firewall nhưng dành cho USB.
Có 3 trạng thái policy chính:
- allow — thiết bị được phép hoạt động bình thường
- block — thiết bị bị vô hiệu hóa, không dùng được nhưng vẫn thấy trong hệ thống
- reject — thiết bị bị từ chối hoàn toàn ở tầng kernel, không tồn tại với userspace
Điểm mấu chốt: USBGuard không chặn theo tên file hay virus signature. Nó chặn theo đặc điểm phần cứng — vendor ID, product ID, serial number, interface class. Tức là dù thiết bị có vẻ ngoài bình thường nhưng khai báo mình là bàn phím (HID) trong khi bạn chỉ cắm USB storage, nó sẽ bị block ngay.
Cài đặt USBGuard trên Fedora
Fedora có sẵn USBGuard trong repo mặc định, cài một lệnh là xong:
sudo dnf install usbguard usbguard-tools -y
Sau khi cài, kích hoạt và khởi động service:
sudo systemctl enable --now usbguard
Kiểm tra service đang chạy:
sudo systemctl status usbguard
Lưu ý quan trọng: Nếu bạn bật USBGuard mà chưa có policy nào, hành vi mặc định là block tất cả thiết bị USB — kể cả bàn phím và chuột đang cắm. Hãy tạo policy trước khi enable service nếu bạn đang SSH hay dùng USB keyboard.
Tạo policy ban đầu từ thiết bị đang kết nối
Cách đơn giản nhất là để USBGuard tự quét tất cả thiết bị đang cắm và tạo rule allow cho chúng. Chạy lệnh này trước khi start service lần đầu:
sudo usbguard generate-policy > /etc/usbguard/rules.conf
Lệnh này quét `/sys/bus/usb/devices/`, nhận diện tất cả thiết bị đang kết nối và sinh file policy. Xem nội dung để kiểm tra:
cat /etc/usbguard/rules.conf
Đầu ra sẽ trông kiểu này:
allow id 1d6b:0002 serial "" name "xHCI Host Controller" hash "..." parent-hash "..." with-interface 09:00:00
allow id 046d:c52b serial "" name "USB Receiver" hash "..." parent-hash "..." with-interface { 03:01:01 03:00:00 }
allow id 058f:6387 serial "1234567890" name "Mass Storage" hash "..." parent-hash "..." with-interface 08:06:50
Mỗi dòng là một rule cho một thiết bị. Phần id là vendor:product ID, with-interface là loại giao diện (03 = HID/bàn phím, 08 = mass storage, 09 = hub).
Quản lý thiết bị USB theo thời gian thực
Sau khi service chạy, khi cắm USB mới vào, thiết bị đó sẽ bị block theo policy mặc định. Xem danh sách thiết bị đang bị block:
sudo usbguard list-devices
Đầu ra dạng:
1: allow id 1d6b:0002 serial "" name "xHCI Host Controller" ...
5: block id 0781:5591 serial "4C5300........" name "SanDisk Ultra" ...
Số đầu dòng là device ID. Để cho phép thiết bị tạm thời (đến lần reboot sau):
sudo usbguard allow-device 5
Cho phép vĩnh viễn (thêm vào rules.conf):
sudo usbguard allow-device --permanent 5
Block lại thiết bị đang được phép:
sudo usbguard block-device 5
Viết policy rule thủ công cho các trường hợp phức tạp
Đôi khi bạn muốn viết rule chính xác hơn — ví dụ chỉ cho phép USB storage của một vendor cụ thể. Mở file rule:
sudo nano /etc/usbguard/rules.conf
Ví dụ: chỉ cho phép USB storage của SanDisk (vendor ID 0781), từ chối tất cả thiết bị giả mạo bàn phím (with-interface 03:01:01) trừ bàn phím thật đang dùng:
# Cho phép bàn phím Logitech đang dùng
allow id 046d:c52b name "USB Receiver" with-interface { 03:01:01 03:00:00 }
# Cho phép USB SanDisk bất kỳ product ID, chỉ interface mass storage
allow id 0781:* with-interface 08:06:50
# Reject mọi thiết bị khai báo là HID keyboard mà không phải bàn phím đã biết
reject with-interface 03:01:01
# Block tất cả còn lại (không reject để vẫn log được)
block
Sau khi sửa, reload policy:
sudo systemctl reload usbguard
Theo dõi sự kiện USB qua audit log
USBGuard tích hợp với Linux audit subsystem. Mọi sự kiện kết nối USB đều được ghi lại:
sudo journalctl -u usbguard -f
Hoặc xem audit log đầy đủ:
sudo ausearch -m USER_DEVICE | tail -20
Đây là phần mình thấy hữu ích nhất — khi có ai cắm USB vào máy lúc mình vắng, log ngay lập tức ghi lại vendor ID, product ID, timestamp. Dễ điều tra sau sự cố.
Cấu hình IPC permission để dùng không cần sudo
Mặc định chỉ root mới chạy được usbguard CLI. Để cho user thường có quyền list và allow device (không cần gõ sudo mỗi lần), sửa file IPC ACL:
sudo nano /etc/usbguard/usbguard-daemon.conf
Tìm dòng IPCAllowedUsers và thêm username của bạn:
IPCAllowedUsers=root hieu
Hoặc theo group:
IPCAllowedGroups=wheel
Restart service để áp dụng:
sudo systemctl restart usbguard
Tổng kết
USBGuard giải quyết đúng vấn đề mà antivirus thông thường bỏ sót: thiết bị phần cứng độc hại hoạt động ở tầng thấp hơn file system, nơi signature-based detection không can thiệp được. Với vài bước cài đặt, bạn có ngay một lớp kiểm soát USB rõ ràng — chỉ thiết bị đã whitelist mới được phép chạy, còn lại bị chặn từ gốc.
Workflow thực tế mình đang dùng: generate policy lúc mới cài, thêm rule reject with-interface 03:01:01 để chặn BadUSB giả bàn phím, và bật audit log. Mỗi lần cắm USB mới thì usbguard allow-device --permanent một lần là xong. Quen rồi thì không thấy phiền, nhưng bù lại yên tâm hơn nhiều khi làm việc ở quán cà phê hay văn phòng chung.

