Cách Cấu Hình USBGuard trên Linux: Bảo Vệ Server và Máy Trạm Khỏi Tấn Công BadUSB

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Cổng USB Của Bạn Là Cánh Cửa Mở Toang — Cho Đến Khi Bạn Đóng Lại

Sau khi server của tôi bị tấn công brute-force SSH lúc nửa đêm, tôi bắt đầu xem xét mọi bề mặt tấn công một cách nghiêm túc — không chỉ các dịch vụ đối mặt với mạng. Hardening SSH, Fail2Ban, luật tường lửa… đó là những thứ hiển nhiên. Nhưng có một vector vật lý mà hầu hết quản trị viên Linux hoàn toàn bỏ qua: cổng USB.

Hãy tưởng tượng một nhân viên vệ sinh cắm USB vào máy trong phòng server để sạc điện thoại. Hoặc một đồng nghiệp kết nối bàn phím thực chất là Rubber Ducky — thiết bị HID injection giá 80 USD từ Hak5 trông y hệt một USB bình thường. Những cuộc tấn công này có thật, dễ thực hiện và hoàn toàn vô hình với tường lửa của bạn.

USBGuard giải quyết trực tiếp vấn đề này. Xác định thiết bị USB nào được phép trên máy của bạn — theo nhà sản xuất, số serial hoặc cổng — và mọi thứ còn lại sẽ bị chặn trước khi kernel có thể cấp quyền.

Điều Gì Khiến BadUSB Nguy Hiểm Đến Vậy

BadUSB không phải là virus theo nghĩa truyền thống. Đây là cuộc tấn công lập trình lại firmware của thiết bị USB để giả mạo thành loại thiết bị khác — thường là bàn phím hoặc card mạng. Khi bạn cắm vào, hệ điều hành nhận ra một thiết bị HID hợp lệ và cấp toàn quyền truy cập bàn phím. Chỉ trong vài giây, nó có thể gõ lệnh, tải payload hoặc rò rỉ dữ liệu.

Ba đặc điểm khiến nó đặc biệt nguy hiểm:

  • Không có antivirus nào phát hiện được — nó nằm trong firmware, không phải trong file
  • Hoạt động trên mọi hệ điều hành — Linux, macOS, Windows đều tin tưởng thiết bị HID theo mặc định
  • Rất nhanh — toàn bộ payload có thể thực thi trong dưới 10 giây

Ngay cả khi không có ý định xấu, truy cập USB không kiểm soát cũng gây ra vấn đề tuân thủ. HIPAA, PCI-DSS Requirement 12.3.1 và SOC 2 CC6.7 đều đề cập đến kiểm soát phương tiện lưu động trên các hệ thống xử lý dữ liệu nhạy cảm.

Khái Niệm Cốt Lõi: USBGuard Hoạt Động Như Thế Nào

USBGuard chạy như một daemon hệ thống và chặn các sự kiện cấp quyền thiết bị USB ở tầng kernel. Khi thiết bị kết nối, USBGuard kiểm tra nó theo bộ quy tắc. Nếu khớp với quy tắc allow, thiết bị được cấp quyền. Nếu khớp với quy tắc block — hoặc không khớp gì khi chính sách mặc định là block — thiết bị vẫn chưa được cấp quyền và hệ điều hành không thể sử dụng nó.

Ba điều đáng biết trước khi bạn chỉnh config:

Nhận Dạng Thiết Bị

USBGuard nhận dạng thiết bị qua vendor ID, product ID, số serial, device class và cổng USB. Quy tắc có thể rộng như “cho phép tất cả bàn phím từ nhà sản xuất này” hoặc hẹp như “chỉ cho phép đúng USB drive này theo số serial trên đúng cổng đó.”

Mục Tiêu Chính Sách

Mỗi quy tắc kết thúc bằng một trong ba mục tiêu: allow, block hoặc reject. Block giữ thiết bị chưa được cấp quyền nhưng vẫn cho phép kết nối. Reject đẩy thiết bị ra khỏi bus hoàn toàn — thiết bị biến mất khỏi lsusb.

Chính Sách Ngầm Định

Chính sách ngầm định là điều xảy ra khi không có quy tắc nào khớp. Đặt nó thành block có nghĩa là các thiết bị không xác định sẽ bị chặn âm thầm. Đây là mặc định bạn muốn trên server.

Cài Đặt

USBGuard có trong repo tiêu chuẩn của hầu hết các bản phân phối:

# Debian / Ubuntu
sudo apt install usbguard

# RHEL / CentOS / Rocky Linux
sudo dnf install usbguard

# Arch Linux
sudo pacman -S usbguard

Sau khi cài đặt, daemon chưa chạy — điều này là có chủ ý. Bạn cần tạo chính sách baseline trước khi khởi động nó, nếu không bạn sẽ tự khóa mình ra khỏi bàn phím và chuột.

Thực Hành: Khóa Chặt Truy Cập USB

Bước 1 — Tạo Chính Sách Từ Thiết Bị Đang Kết Nối

Trước khi khởi động USBGuard, hãy cắm mọi thứ cần được cho phép vĩnh viễn: bàn phím, chuột, USB hub nội bộ, YubiKey, bất cứ thứ gì bạn dùng hàng ngày. Sau đó tạo quy tắc cho tất cả thiết bị đang kết nối:

sudo usbguard generate-policy > /etc/usbguard/rules.conf

Lệnh này tạo quy tắc allow cho mọi thiết bị hiện đang trên bus. Mở file và kiểm tra những gì đã được tạo:

cat /etc/usbguard/rules.conf

Bạn sẽ thấy các mục như:

allow id 046d:c52b serial "" name "USB Receiver" hash "abc123..." parent-hash "def456..." via-port "1-1.2"

Mỗi dòng là một quy tắc. hash là dấu vân tay của device descriptor — không phải firmware, tiếc là vậy, nhưng nó ngăn việc hoán đổi tùy tiện các thiết bị có cùng VID/PID.

Bước 2 — Kích Hoạt và Khởi Động Daemon

sudo systemctl enable --now usbguard

Xác minh nó đang chạy:

sudo systemctl status usbguard

Giờ hãy thử cắm USB drive không có trong chính sách ban đầu. Nó sẽ xuất hiện trong dmesg nhưng không mount — kernel nhận ra nó nhưng USBGuard chưa cấp quyền.

Bước 3 — Liệt Kê và Quản Lý Thiết Bị Kết Nối

USBGuard đi kèm CLI riêng để giao tiếp với daemon:

# Liệt kê tất cả thiết bị USB và trạng thái cấp quyền
sudo usbguard list-devices

# Cho phép thiết bị cụ thể theo ID của nó
sudo usbguard allow-device <id>

# Chặn thiết bị
sudo usbguard block-device <id>

# Từ chối và xóa thiết bị khỏi bus
sudo usbguard reject-device <id>

Khi bạn cắm thiết bị mới và muốn cho phép tạm thời, lấy ID từ list-devices và chạy allow-device. Để làm vĩnh viễn, thêm quy tắc vào rules.conf.

Bước 4 — Viết Quy Tắc Tùy Chỉnh

File quy tắc dùng cú pháp đơn giản. Dưới đây là các mẫu thực tế:

# Chỉ cho phép USB drive cụ thể theo số serial
allow id 0781:5583 serial "AA01234567890" name "SanDisk Ultra"

# Cho phép bất kỳ thiết bị nào từ nhà sản xuất tin cậy (rộng — dùng cẩn thận)
allow id 046d:*

# Chặn tất cả thiết bị lưu trữ USB (mass storage class = 08)
block class 08:*:*

# Cho phép USB hub nhưng không cho phép gì khác với class 09
allow class 09:00:00

# Từ chối bất kỳ thứ gì hiển thị là card mạng
reject class 02:*:*

Quy tắc được đánh giá từ trên xuống dưới. Quy tắc khớp đầu tiên sẽ thắng. Đặt quy tắc cụ thể nhất lên trước.

Sau khi chỉnh sửa rules.conf, tải lại mà không cần khởi động lại daemon:

sudo usbguard reload

Bước 5 — Đặt Chính Sách Ngầm Định

Mở file cấu hình chính:

sudo nano /etc/usbguard/usbguard-daemon.conf

Tìm và đặt hai dòng này:

ImplicitPolicyTarget=block
PresentControllerPolicy=keep

ImplicitPolicyTarget=block đảm bảo bất kỳ thiết bị nào không được phép rõ ràng đều bị chặn. PresentControllerPolicy=keep yêu cầu USBGuard để nguyên trạng thái các thiết bị đang kết nối khi khởi động — điều này ngăn việc ngắt kết nối bàn phím khi daemon khởi động lại.

Bước 6 — Thiết Lập Audit Logging

Chặn thiết bị là một nửa công việc. Nửa còn lại là biết điều đó đã xảy ra — với timestamp và định danh cổng. Kích hoạt audit logging trong config:

AuditBackend=LinuxAudit

Sau đó khởi động lại daemon:

sudo systemctl restart usbguard

Các sự kiện USBGuard giờ xuất hiện trong audit log hệ thống. Truy vấn chúng với:

sudo ausearch -ts recent -m USER_DEVICE

Đang chạy SIEM hoặc log shipper? Các sự kiện này tích hợp gọn gàng với pipeline auditd hiện có — không cần cấu hình thêm.

Bước 7 — Cấp Quyền Quản Lý Thiết Bị Cho Người Dùng Không Phải Root

Theo mặc định, chỉ root mới có thể chạy usbguard allow-device. Trên máy trạm nơi người dùng thường cần cắm thiết bị ngoại vi của mình, hãy ủy quyền cụ thể qua IPC ACL:

sudo nano /etc/usbguard/IPCAccessControl.d/90-user.conf
# Cho phép nhóm 'wheel' liệt kê và cho phép thiết bị
[wheel]
Devices=list,allow,block

Cách này sạch hơn so với cấp quyền sudo cho toàn bộ binary usbguard.

Kiểm Tra Cài Đặt Của Bạn

Lấy bất kỳ USB drive nào không có trong rules.conf của bạn và cắm vào. Chạy:

sudo usbguard list-devices | grep -i block

Bạn sẽ thấy ổ đĩa được liệt kê với mục tiêu block. Nó sẽ không mount. lsblk sẽ không hiển thị thiết bị mới. Đó là hành vi mong đợi.

Để xác minh audit logging:

sudo journalctl -u usbguard -f

Cắm vào và rút ra thiết bị — bạn sẽ thấy log entry theo thời gian thực cho mỗi sự kiện.

Cân Nhắc Giữa Server và Máy Trạm

Trên server không có thiết bị ngoại vi vật lý nào, chính sách quyết liệt nhất là hợp lý: tạo ruleset tối thiểu (có thể chỉ USB hub nội bộ), sau đó đặt mọi thứ còn lại thành reject. Dù sao cũng không ai nên cắm bất cứ thứ gì vào server production — và nếu họ thử, bạn muốn biết ngay lập tức.

Máy trạm cần linh hoạt hơn một chút. Dùng block thay vì reject làm chính sách ngầm định, để người dùng vẫn có thể thấy thiết bị bị chặn trong list-devices và yêu cầu cấp quyền. Kết hợp với IPC ACL để họ tự phục vụ cho các thiết bị đã biết là an toàn mà không cần phê duyệt admin mỗi lần.

Kết Luận

Sau khi chính sách ban đầu được thiết lập, USBGuard chạy âm thầm trong nền — không cần bảo trì liên tục. Viết quy tắc, khởi động daemon và bảo mật USB trở thành tự động. BadUSB, Rubber Ducky, cáp O.MG — tất cả đều gặp tường cứng ở tầng driver trước khi một lệnh nào chạy.

Toàn bộ quá trình thiết lập chỉ mất khoảng 15 phút. Hy vọng không ai cắm thứ gì họ không nên không phải là chiến lược bảo mật — đó là lạc quan. Với bất cứ thứ gì chạy trong không gian dùng chung, datacenter hay môi trường tuân thủ quy định, USB whitelisting thuộc về danh sách hardening baseline của bạn ngay cạnh SSH key và cập nhật tự động.

Share: